<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://sprocketcreative.com/blog/all">
  <channel>
    <title>Sprocket</title>
    <link>http://sprocketcreative.com/blog/all</link>
    <description />
    <language>en</language>
          <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/sprocket/all" /><feedburner:info uri="sprocket/all" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <title>Easy Install Profiles</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/mOwfEQNexxY/easy-install-profiles</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    Did I really just say that?        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-filefield field-field-image-entry"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="/blog/2010/02/02/easy-install-profiles" class="imagecache imagecache-content_banner_blog imagecache-linked imagecache-content_banner_blog_linked"&gt;&lt;img src="http://sprocketcreative.com/sites/default/files/imagecache/content_banner_blog/images/blog/entry-image-puddles_0.jpg" alt="" title=""  class="imagecache imagecache-content_banner_blog" width="468" height="201" /&gt;&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;While many people lament Drupal being a product somewhere between a content management framework and a content management system, it&amp;#8217;s often in these less than ideal situations that remarkably creative solutions are born. Examples of this are &lt;span class="caps"&gt;CCK&lt;/span&gt;, Views, Features module, and the list could go on.  If it weren&amp;#8217;t for the painstaking nature of writing &lt;span class="caps"&gt;SQL&lt;/span&gt; in the &amp;#8220;Drupal Way&amp;#8221;, Earl Miles might have never created the Views module.  If it weren&amp;#8217;t for the fact that it&amp;#8217;s virtually impossible to have a clean dev/staging/&lt;span class="caps"&gt;QA&lt;/span&gt;/prod workflow with Drupal, Development Seed probably wouldn&amp;#8217;t have even dreamt of the Features&amp;nbsp;module.&lt;/p&gt;
&lt;p&gt;This brings me to install profiles.  Those of you who&amp;#8217;ve written them before know that things are not as simple as they seem. The system in its current state is not easy to implement. Forced into alternate solutions by the constraints of this system, we&amp;#8217;ve come up with a &lt;span class="caps"&gt;API&lt;/span&gt; design for install profiles patterned loosely after Drupal&amp;#8217;s theme&amp;nbsp;layer.&lt;/p&gt;
&lt;h4&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;What?&amp;#8221;&lt;/h4&gt;
&lt;p&gt;Yeah, so that doesn&amp;#8217;t make much sense does it? Let me try to explain.  Drupal&amp;#8217;s theme layer functions kind of like a hierarchical &lt;a href="http://en.wikipedia.org/wiki/Visitor_pattern"&gt;visitor pattern&lt;/a&gt;. For instance, say you use Zen as your base theme. To create a new sub theme of Zen, in the dot info file of that theme you would&amp;nbsp;write:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Fancy&lt;br /&gt;base theme = zen&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;There you see the base theme is Zen.  You get all the niftyness that Zen includes but then get to modify it and add new things if you&amp;#8217;d like.  Now if you tweaked out this sub theme and added all sorts of custom specialryness, you could then create another theme and have that theme be a sub-theme of your second&amp;nbsp;theme:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Fancier&lt;br /&gt;base theme = fancy&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;So what if you could do something similar with install profiles?  We asked the same thing…and then we tried to answer that question.  In the process of building any custom project, you end up repeating many things.  For instance, how many Drupal sites have you built that didn&amp;#8217;t have Views and &lt;span class="caps"&gt;CCK&lt;/span&gt; installed?  While &lt;a href="http://drupal.org/project/drush"&gt;drush&lt;/a&gt; does speed up the process of enabling all these modules, you still have to remember to do it every single time.  Granted the chances of forgetting to enable Views is slim, but certainly there are other modules in your workflow that you overlook until some point later in the development process when you are asking yourself, &amp;#8220;Now why is that not&amp;nbsp;working?&amp;#8221;&lt;/p&gt;
&lt;p&gt;I know we&amp;#8217;ve done that.  So we have an install profile internally that loads up a file that sets a foundation for our typical custom site, much the way the Zen sub theme helps you easily create a new sub theme.  Here&amp;#8217;s are some portions of our &amp;#8216;basic.info&amp;#8217; file that any custom site starts&amp;nbsp;from:&lt;/p&gt;
&lt;h2&gt;Basic&amp;nbsp;Info&lt;/h2&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;name&amp;nbsp; = Basic&lt;br /&gt;core&amp;nbsp; = 6.x&lt;br /&gt;theme = fancy&lt;/code&gt;&lt;/div&gt;
&lt;h2&gt;Modules&lt;/h2&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;modules[core][] = filter&lt;br /&gt;modules[core][] = help&lt;br /&gt;modules[core][] = menu&lt;br /&gt;modules[core][] = node&lt;br /&gt;modules[core][] = path&lt;br /&gt;modules[core][] = php&lt;br /&gt;modules[core][] = system&lt;br /&gt;modules[core][] = user&lt;/code&gt;&lt;/div&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;; Contrib&lt;br /&gt;modules[contrib][] = admin_menu&lt;br /&gt;modules[contrib][] = date_api&lt;br /&gt;modules[contrib][] = imageapi&lt;br /&gt;modules[contrib][] = imageapi_imagemagick&lt;br /&gt;modules[contrib][] = imagecache&lt;br /&gt;modules[contrib][] = imagecache_ui&lt;br /&gt;modules[contrib][] = token&lt;br /&gt;modules[contrib][] = external&lt;br /&gt;modules[contrib][] = globalredirect&lt;br /&gt;modules[contrib][] = content&lt;br /&gt;modules[contrib][] = fieldgroup&lt;br /&gt;modules[contrib][] = filefield&lt;br /&gt;[snip…]&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;So far this is pretty basic, just listing some modules and setting the theme, but here&amp;#8217;s other things that go in our&amp;nbsp;file:&lt;/p&gt;
&lt;h2&gt;Input&amp;nbsp;Formats&lt;/h2&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;input-formats[WYSIWYG][wysiwyg][editor] = tinymce&lt;br /&gt;input-formats[&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;][wysiwyg][settings][default] = 1&lt;br /&gt;input-formats[&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;][wysiwyg][settings][user_choose] = 0&lt;br /&gt;input-formats[&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;][wysiwyg][settings][show_toggle] = 0&lt;br /&gt;input-formats[&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;][wysiwyg][settings][theme] = advanced&lt;br /&gt;[snip…]&lt;/code&gt;&lt;/div&gt;
&lt;h2&gt;Variables&lt;/h2&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;variables[site_footer]&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1.800.123.4567&lt;br /&gt;variables[site_frontpage] = node/1&lt;br /&gt;[snip…]&lt;/code&gt;&lt;/div&gt;
&lt;h2&gt;Menus&lt;/h2&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;menus[menu-footer-links][title] = Footer Links&lt;br /&gt;&lt;br /&gt;menu-items[login][link_path]&amp;nbsp; = user/login&lt;br /&gt;menu-items[login][link_title] = Login&lt;br /&gt;menu-items[login][weight]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 10&lt;br /&gt;menu-items[login][menu_name]&amp;nbsp; = menu-footer-links&lt;br /&gt;&lt;br /&gt;menu-items[logout][link_path]&amp;nbsp; = logout&lt;br /&gt;menu-items[logout][link_title] = Logout&lt;br /&gt;menu-items[logout][weight]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 10&lt;br /&gt;menu-items[logout][menu_name]&amp;nbsp; = menu-footer-links&lt;br /&gt;&lt;br /&gt;menu-items[front][link_path]&amp;nbsp; = &amp;lt;front&amp;gt;&lt;br /&gt;menu-items[front][link_title] = Home&lt;br /&gt;menu-items[front][weight]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = -10&lt;br /&gt;menu-items[front][menu_name]&amp;nbsp; = primary-links&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Pretty cool, huh? So then when we start a custom project for one of our clients, we can just create a new dot info file and base it off of what we&amp;#8217;ve already&amp;nbsp;built:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;name&amp;nbsp; = Widgets R Us&lt;br /&gt;core&amp;nbsp; = 6.x&lt;br /&gt;theme = widgets_theme&lt;br /&gt;base&amp;nbsp; = basic&lt;br /&gt;&lt;br /&gt;; ------------------------------&lt;br /&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Modules/Features&lt;br /&gt;; ------------------------------&lt;br /&gt;modules[contrib][] = views_customfield&lt;br /&gt;modules[contrib][] = typogrify&lt;br /&gt;modules[contrib][] = draggableviews&lt;br /&gt;&lt;br /&gt;modules[custom][] = widgets_site&lt;br /&gt;&lt;br /&gt;features[] = store&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;All we&amp;#8217;re doing here is just adding a few more modules to what basic already described.  The nice thing about this is I can keep honing the basic.info file every time I work on a new custom&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;The install profile that does all this magic isn&amp;#8217;t publicly available yet, but if people seem interested, we are easy to persuade.&amp;nbsp;:)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/mOwfEQNexxY" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/development">development</category>
 <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <category domain="http://sprocketcreative.com/tags/drupal-planet">drupal planet</category>
 <pubDate>Tue, 02 Feb 2010 15:18:34 +0000</pubDate>
 <dc:creator>James</dc:creator>
 <guid isPermaLink="false">113 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2010/02/02/easy-install-profiles</feedburner:origLink></item>
  <item>
    <title>Sprocket's feature building toolbox</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/Gx2JzvWCHZ4/sprockets-feature-building-toolbox</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    A simple listing of great tools for building features        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-filefield field-field-image-entry"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="/blog/2010/01/21/sprockets-feature-building-toolbox" class="imagecache imagecache-content_banner_blog imagecache-linked imagecache-content_banner_blog_linked"&gt;&lt;img src="http://sprocketcreative.com/sites/default/files/imagecache/content_banner_blog/images/blog/feature-toolbox.jpg" alt="" title=""  class="imagecache imagecache-content_banner_blog" width="468" height="149" /&gt;&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After my &lt;a href="http://sprocketcreative.com/blog/2010/01/20/creating-extending-features-drupal"&gt;last blog entry&lt;/a&gt; on creating and extending features, it occurred to me that a shorter listing of just the favorite tools we use in building features might be a nice help for some.&amp;nbsp; So here goes.&amp;nbsp; Please comment and let us know of other fantastic tools you use in your feature building&amp;nbsp;toolbox.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://openatrium.com"&gt;Open Atrium&lt;/a&gt;:&lt;/h2&gt;
&lt;p&gt;We plan all our features first with the hopes of knowing what we&amp;#8217;re getting into (node types, fields, views, contexts, etc.).&amp;nbsp; Usually this helps us avoid repeating mistakes we&amp;#8217;ve already made.&amp;nbsp; SprocketLabs is our fancy schmancy name for our online project management tool.&amp;nbsp; It&amp;#8217;s really just Open Atrium.&amp;nbsp; SprocketLabs is where we document and plan our features and manage just about everything we&amp;#8217;re doing.&amp;nbsp; The incredible guys at &lt;a href="http://developmentseed.org"&gt;Development Seed&lt;/a&gt; have outdone themselves once again with Open&amp;nbsp;Atrium.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://www.omnigroup.com/applications/OmniGraffle/"&gt;Omnigraffle&lt;/a&gt; &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; &lt;a href="http://konigi.com/tools/omnigraffle-wireframe-stencils"&gt;Stencils&lt;/a&gt;:&lt;/h2&gt;
&lt;p&gt;Unless the feature is something dead simple (ex. little to no user interaction) we typically wire-frame each full node display, view display, etc. ahead of time so we can think through how things will output, in what order, in what region, in what context, etc., etc.&amp;nbsp; I&amp;#8217;m still searching for a simpler tool for wire-framing, but for now I&amp;#8217;ve been using Omnigraffle and &lt;a href="http://konigi.com/tools/omnigraffle-wireframe-stencils"&gt;Konigi&amp;#8217;s wire-frame stencils&lt;/a&gt;.&amp;nbsp; Honestly, a pencil and some paper is still my favorite way to wire-frame, I just haven&amp;#8217;t figured out a super quick way to get my paper on Atrium for client approvals etc. (scanning is annoying).&amp;nbsp; For simpler wireframes I&amp;#8217;ve also used the &lt;a href="http://graffletopia.com/stencils/459"&gt;Web Sketch&lt;/a&gt;&amp;nbsp;stencils.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://drupal.org/project/demo"&gt;Demo&lt;/a&gt;:&lt;/h2&gt;
&lt;p&gt;This module is really poorly named (in my humble opinion) and would be better named something like &amp;#8220;snapshot,&amp;#8221; which I realize is now the name of another backup module for Drupal.&amp;nbsp; The value of demo module in feature creation is that you can create an initial snapshot of your site, without the various elements your feature will provide (ex. node types, fields, etc.).&amp;nbsp; You then build your feature and, once completed, revert back to your snapshot quickly and try out your new feature.&amp;nbsp; It essentially lets you save everything at a point and time (database included) into a snapshot and switch quickly and easily between various&amp;nbsp;snapshots.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://drupal.org/project/drush"&gt;Drush&lt;/a&gt;:&lt;/h2&gt;
&lt;p&gt;If you haven&amp;#8217;t yet heard of drush or begun using it you need to check it out.&amp;nbsp; There are some super smart dudes that created and maintain this project and standing on their shoulders is a no brainer.&amp;nbsp; Regarding features and drush, commands like drush vget can be real time savers in feature&amp;nbsp;development.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://drupal.org/project/variable_dump"&gt;Variable Dump&lt;/a&gt;:&lt;/h2&gt;
&lt;p&gt;Variable dump does exactly what it sounds like.&amp;nbsp; Like Drush, it&amp;#8217;s a very nice tool for quickly getting your variables output when extending your&amp;nbsp;features.&lt;/p&gt;
&lt;h2&gt;Devel&amp;nbsp;Feature:&lt;/h2&gt;
&lt;p&gt;Ok, so this one is a feature that we made ourselves and not a module.&amp;nbsp; This feature is also as much for general Drupal development as it is for just feature development.&amp;nbsp; Here&amp;#8217;s what we did.&amp;nbsp; Our devel feature does the following when&amp;nbsp;enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;enables Devel&amp;nbsp;module&lt;/li&gt;
&lt;li&gt;enables Demo&amp;nbsp;module&lt;/li&gt;
&lt;li&gt;enables Context&amp;nbsp;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;enables Views&amp;nbsp;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;enables Diff&amp;nbsp;module&lt;/li&gt;
&lt;li&gt;enables Rules&amp;nbsp;Admin&lt;/li&gt;
&lt;li&gt;creates a sitewide context that shows specific blocks for user 1 (ex. context devel block, devel execute php block, devel switch user&amp;nbsp;block)&lt;/li&gt;
&lt;li&gt;turns &lt;span class="caps"&gt;OFF&lt;/span&gt; preprocessing on javascript and &lt;span class="caps"&gt;CSS&lt;/span&gt; (via&amp;nbsp;strongarm)&lt;/li&gt;
&lt;li&gt;turns &lt;span class="caps"&gt;OFF&lt;/span&gt; page caching (via&amp;nbsp;strongarm)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, when you disable the feature, it disables what it enabled and turns on what it turned&amp;nbsp;off.&lt;/p&gt;
&lt;h2&gt;Coda&amp;nbsp;Clips:&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re like us and use &lt;a href="http://panic.com/coda"&gt;Coda&lt;/a&gt;, then you know clips can be a &lt;span class="caps"&gt;HUGE&lt;/span&gt; time saver.&amp;nbsp; James recently &lt;a href="http://github.com/q0rban/drupal-coda-clips"&gt;posted his Coda clips&lt;/a&gt; via github for all to use.&amp;nbsp; Many of his clips are just Drupal dev related, but some can be great examples of how to use clips and save some time. We realize some of you are not on a Mac or using Coda.&amp;nbsp; If you&amp;#8217;re using BBedit, Textmate, or Komodo there are similar options (although not called clips probably) and the same sort of thing will still be a great time saver for&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s the short list.&amp;nbsp; Let us know via comments what&amp;#8217;s in your&amp;nbsp;toolbox.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/Gx2JzvWCHZ4" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <category domain="http://sprocketcreative.com/tags/drupal-planet">drupal planet</category>
 <category domain="http://sprocketcreative.com/tags/features">features</category>
 <pubDate>Thu, 21 Jan 2010 17:52:00 +0000</pubDate>
 <dc:creator>Jared</dc:creator>
 <guid isPermaLink="false">112 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2010/01/21/sprockets-feature-building-toolbox</feedburner:origLink></item>
  <item>
    <title>Creating &amp; Extending Features</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/wk54X0Qqkgg/creating-extending-features-drupal</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    AKA - don&amp;#039;t rebuild the same thing 20 times        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Back in October we (James and myself) went to the fabulous DrupalCamp Atlanta and taught a session on &lt;a href="http://www.drupalcampatlanta.com/sessions/creating-and-extending-features"&gt;creating and extending features&lt;/a&gt; in Drupal. &amp;nbsp;At the time, we didn&amp;#8217;t have our fancy new website to blog on, so I thought it might be nice to write about that now and provide a quick summary of the high points and some organized&amp;nbsp;notes.&lt;/p&gt;&lt;p&gt;In the session, we created a simple gallery feature as a demonstration of the key concepts. &amp;nbsp;Thanks to the fabulous &lt;a href="http://drupal.org/project/features"&gt;features module&lt;/a&gt; developed by the magicians over at &lt;a href="http://developmentseed.org"&gt;Development Seed&lt;/a&gt; we&amp;#8217;re now able to take commonly used functionality, etc. and easily save it all into code for reuse (ex. node types, views, contexts, permissions, dependencies, rules, etc.). &amp;nbsp;This has saved us a ridiculous amount of time here at Sprocket and allowed us to devote more of our time and energy to making incredibly beautiful user experiences for our features instead of rebuilding the same functionality each time. &amp;nbsp;Feel free to go to the &lt;a href="http://drupalcampatlanta.com"&gt;DrupalCamp Atlanta&lt;/a&gt; website and &lt;a href="http://www.drupalcampatlanta.com/sessions/creating-and-extending-features"&gt;watch the video&lt;/a&gt; of the session. &amp;nbsp;The outline of what was covered&amp;nbsp;includes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Outline your feature (node types, views, contexts, permissions, dependencies, rules,&amp;nbsp;etc.)&lt;/li&gt;&lt;li&gt;Consider your name spaces&amp;nbsp;carefully!&lt;/li&gt;&lt;li&gt;Build your node types, views, contexts, rules, permissions,&amp;nbsp;etc.&lt;/li&gt;&lt;li&gt;Create your&amp;nbsp;feature&lt;/li&gt;&lt;li&gt;Extend your feature with&amp;nbsp;&lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Outline your&amp;nbsp;feature&lt;/h2&gt;&lt;p&gt;When building a feature, it&amp;#8217;s always a good idea to first outline its parts. &amp;nbsp;A great way to approach this is to simply list out all of the following that will be a part of your&amp;nbsp;feature&lt;/p&gt;&lt;ul&gt;&lt;li&gt;node types&lt;ul&gt;&lt;li&gt;fields&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;views&lt;ul&gt;&lt;li&gt;displays&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;contexts&lt;/li&gt;&lt;li&gt;rules&lt;/li&gt;&lt;li&gt;permissions&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Consider your name spaces&amp;nbsp;carefully!&lt;/h2&gt;&lt;p&gt;Remember when creating your features that your type names for node types need to be unique. &amp;nbsp;For example, if you&amp;#8217;re creating a gallery feature and your node type is an album, you may not want to use &amp;#8220;album&amp;#8221; as your type name. &amp;nbsp;Why? &amp;nbsp;What if you want to use your gallery feature on a site that is a musician&amp;#8217;s site, and you&amp;#8217;ve also created another feature to show off their albums and it also has a node type with a type name of &amp;#8220;album&amp;#8221; in it? &amp;nbsp;Both features won&amp;#8217;t play well together. &amp;nbsp;A good practice is to prefix in ways that add specificity for your feature. &amp;nbsp;For example, your gallery feature might have a node type of &amp;#8220;gallery_album&amp;#8221; and your music artist feature might have a node type of &amp;#8220;audio_album&amp;#8221; for&amp;nbsp;example.&lt;/p&gt;&lt;p&gt;This same concept also applies to the name spacing of your fields. &amp;nbsp;Unless you want all the settings on a field to be exactly the same in all features with that field, then you need a unique name space for your&amp;nbsp;field.&lt;/p&gt;&lt;p&gt;This may seem obvious, but this &lt;span class="caps"&gt;ALSO&lt;/span&gt; applies when you get ready to name your Feature itself and give it a machine&amp;nbsp;name.&lt;/p&gt;&lt;h2&gt;Build your node types, views, contexts, rules, permissions,&amp;nbsp;etc.&lt;/h2&gt;&lt;p&gt;This part is pretty self explanatory if you&amp;#8217;re already doing these sorts of thing with Drupal. &amp;nbsp;The beauty of Features is that once you&amp;#8217;ve done these things you can package it all up into a nice and tidy feature module to reuse on another site or for another&amp;nbsp;project.&lt;/p&gt;&lt;h2&gt;Create your&amp;nbsp;feature&lt;/h2&gt;&lt;p&gt;Before you can begin extending your feature, you need to first create it. &amp;nbsp;While this can be done by hand, features offers a nice &lt;span class="caps"&gt;UI&lt;/span&gt; that makes it pretty fast and simple for those that don&amp;#8217;t have access to &lt;a href="http://drupal.org/project/drush"&gt;Drush&lt;/a&gt;. &amp;nbsp;Remember that you have to actually have the nodes with fields there, the views, the contexts, the permissions etc. before you&amp;#8217;ll be able to select them in the features&amp;nbsp;&lt;span class="caps"&gt;UI&lt;/span&gt;.&lt;/p&gt;&lt;h2&gt;Extend your&amp;nbsp;feature&lt;/h2&gt;&lt;p&gt;This is where I felt the real meat of our DrupalCamp session was. &amp;nbsp;Once you&amp;#8217;ve got a feature, since it&amp;#8217;s just a Drupal module, you can extend it in a number of ways beyond what&amp;#8217;s currently available via the features &lt;span class="caps"&gt;UI&lt;/span&gt;. &amp;nbsp;A few examples&amp;nbsp;include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use hook_strongarm to set some&amp;nbsp;variables&lt;/li&gt;&lt;li&gt;Use hook_init to add &lt;span class="caps"&gt;CSS&lt;/span&gt; that loads with the&amp;nbsp;feature&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Add some strongarm&amp;nbsp;settings&lt;/h4&gt;&lt;p&gt;Strongarm provides a great way for your feature to enforce some variables. &amp;nbsp;While some would argue against the obtrusive nature of that, in certain use cases it&amp;#8217;s a wonderfully simple solution. &amp;nbsp;For example, if you want a twitter feature where the feature is already set to work in a specific way (which node types to include, etc.) and the only thing you want to allow/require users to set is their twitter account info, strongarm makes that possible. &amp;nbsp;This means a user can enable the twitter feature and only have to do one quick task and they&amp;#8217;re ready to go. &amp;nbsp;Another fantastic tool for getting your variables you want to strongarm, check out the &lt;a href="http://drupal.org/project/variable_dump"&gt;variable dump&lt;/a&gt; module or use &lt;code&gt;drush vget [variable name]&lt;/code&gt;. &amp;nbsp;Once you&amp;#8217;ve got some variables you want to strongarm, do the&amp;nbsp;following:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open your features .module&amp;nbsp;file.&lt;/li&gt;&lt;li&gt;Use hook_strongarm to add your variables (see example at bottom of post from my fancy_twitter&amp;nbsp;feature).&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Add some&amp;nbsp;&lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;In many cases styling is tied more to the theme rather than the functionality itself or the feature. &amp;nbsp;However, in some cases it&amp;#8217;s nice to have some styling already preset for a given feature. &amp;nbsp;It&amp;#8217;s pretty easy to do this as well,&amp;nbsp;simply:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open your features .module&amp;nbsp;file.&lt;/li&gt;&lt;li&gt;Use hook_init and drupal_add_css to add your &lt;span class="caps"&gt;CSS&lt;/span&gt; file to your feature module (see example at bottom of post from my fancy_twitter&amp;nbsp;feature).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;Note: When updating your feature in the future, features module will continue to include the extended code you&amp;#8217;ve added to your .module file, but it will &lt;span class="caps"&gt;NOT&lt;/span&gt; grab your actual &lt;span class="caps"&gt;CSS&lt;/span&gt; file and include it when tarring up your feature module for&amp;nbsp;you.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Example implementation of&amp;nbsp;hook_strongarm()&lt;/h4&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**&lt;br /&gt; * Implementation of hook_strongarm().&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;fancy_twitter_strongarm&lt;/span&gt;&lt;span style="color: #007700"&gt;() {&lt;br /&gt;&amp;nbsp; return array (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'twitter_api_url' &lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'twitter.com'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'twitter_expire' &lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'0'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'twitter_import' &lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'twitter_set_source' &lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;h4&gt;Adding &lt;span class="caps"&gt;CSS&lt;/span&gt; with&amp;nbsp;hook_init()&lt;/h4&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**&lt;br /&gt; * Implementation of hook_init().&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;fancy_twitter_init&lt;/span&gt;&lt;span style="color: #007700"&gt;() {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;drupal_add_css&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;drupal_get_path&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'module'&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'fancy_twitter'&lt;/span&gt;&lt;span style="color: #007700"&gt;) .&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/fancy_twitter.css'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;There&amp;#8217;s a lot more I could go into here, but I&amp;#8217;ll leave it at that for now. &amp;nbsp;James is our Drupal magician here at Sprocket and perhaps soon I can get him to do an advanced blog post on further extending&amp;nbsp;features.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/wk54X0Qqkgg" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <category domain="http://sprocketcreative.com/tags/drupal-planet">drupal planet</category>
 <category domain="http://sprocketcreative.com/tags/features">features</category>
 <pubDate>Wed, 20 Jan 2010 20:26:14 +0000</pubDate>
 <dc:creator>Jared</dc:creator>
 <guid isPermaLink="false">111 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2010/01/20/creating-extending-features-drupal</feedburner:origLink></item>
  <item>
    <title>Avoiding Technical Debt (Part 2)</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/qrumFR3M_9I/avoiding-technical-debt-part-2</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    Additional tips on how to avoid technical debt in your endeavors.        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is &lt;strong&gt;Part 2&lt;/strong&gt; of a discussion about Technical Debt.&amp;nbsp; Here I&amp;#8217;ll discuss some more tips on how to avoid it.&amp;nbsp; If you haven&amp;#8217;t read &lt;strong&gt;Part 1, &lt;a href="http://sprocketcreative.com/node/66"&gt;get going&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;Be&amp;nbsp;consistent&lt;/h4&gt;
&lt;p&gt;Being consistent is not easy.&amp;nbsp; We are always refining our processes, finding better ways to accomplish our tasks.&amp;nbsp; Our processes will never be fully consistent, but that doesn&amp;#8217;t mean we can&amp;#8217;t strive for consistency in&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Namespacing&lt;/strong&gt;: Have a consistent way you name your files, your folders, your views, your&amp;nbsp;fields.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structure&lt;/strong&gt;: Having a consistent directory structure for your modules and themes will save you headaches later, as you can more quickly find what you are looking&amp;nbsp;for.&lt;/p&gt;
&lt;h4&gt;Write it&amp;nbsp;down&lt;/h4&gt;
&lt;p&gt;One of the inspirations for writing this post was stumbling on a theme override function in one of our themes.&amp;nbsp; I looked at the function and thought to myself, &amp;#8220;Now why did I override this function?&amp;#8221;&amp;nbsp; If I had taken five seconds at the time to write down in the DocBlock why I needed to override the function, I wouldn&amp;#8217;t have had to search in the module for the original function and track down what was different.&amp;nbsp; This is a prime example of Technical Debt.&amp;nbsp; Saving those five seconds then cost me about 60 seconds today as I had to look up the function to see if it was necessary anymore.&lt;strong&gt;&amp;nbsp; Comment liberally!&lt;/strong&gt;&amp;nbsp; You will never regret writing too much commenting into your&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt;:&lt;/strong&gt; &lt;span class="caps"&gt;CSS&lt;/span&gt; is probably one of the easiest places to incur technical debt since the actual order of the &lt;span class="caps"&gt;CSS&lt;/span&gt; is crucial to the styling.&amp;nbsp; You can&amp;#8217;t just pop open a style sheet and start re-ordering styles without potentially breaking the&amp;nbsp;cascade.&lt;/p&gt;
&lt;p&gt;Things I try to always comment within&amp;nbsp;&lt;span class="caps"&gt;CSS&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When using em spaces, I usually comment in the actual pixel value I&amp;#8217;m shooting for, and the calculations I made to arrive at that&amp;nbsp;number&lt;/li&gt;
&lt;li&gt;Any &lt;span class="caps"&gt;IE&lt;/span&gt; specific hacks and why they were&amp;nbsp;necessary&lt;/li&gt;
&lt;li&gt;Seemingly unnecessary declarations:&amp;nbsp; there are lots of times that I&amp;#8217;ll pull open a &lt;span class="caps"&gt;CSS&lt;/span&gt; file and look at a height declaration, say, and delete it thinking it unnecessary, only to find there was a very good reason for it to be there.&amp;nbsp; &lt;strong&gt;Comment!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Somewhat of an annoyance is the lack of a quick commenting method in &lt;span class="caps"&gt;CSS&lt;/span&gt; files.&amp;nbsp; You have to wrap any comments &lt;code&gt;/* like so */&lt;/code&gt;.&amp;nbsp; Create a snippet and shortcut key in your &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;&lt;span class="caps"&gt;IDE&lt;/span&gt;&lt;/a&gt; or text editor that will quickly add the comment for you.&amp;nbsp; You want to make it as easy as possible to comment, so laziness won&amp;#8217;t get the best of&amp;nbsp;you!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Todo lists&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Get a good &lt;a href="http://lmgtfy.com/?q=GTD+apps"&gt;&lt;span class="caps"&gt;GTD&lt;/span&gt; app&lt;/a&gt; (I use &lt;a href="http://www.omnigroup.com/omnifocus"&gt;OmniFocus&lt;/a&gt;) and keep it synced between your various computers.&amp;nbsp; When you need to do something and you can&amp;#8217;t do it right then, write it down!&amp;nbsp; Not only that, but take the time to write it as if you were writing it to someone else; don&amp;#8217;t just assume you will remember what you meant by, &amp;#8220;Clean out line 32 and check load&amp;nbsp;time.&amp;#8221;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Keep it&amp;nbsp;simple&lt;/h4&gt;
&lt;p&gt;Simplicity and minimalism will create more &amp;#8216;white space&amp;#8217; on your technical canvas.&amp;nbsp; Writing a web application?&amp;nbsp; Write down all the desired features, prioritize them, and then weed out everything that is not crucial functionality.&amp;nbsp; Build the foundation of necessary features, and then expand onto that once the foundation has proven&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focus!&lt;/strong&gt; Writing code requires your concentration.&amp;nbsp; Turn off Twitter, &lt;span class="caps"&gt;IRC&lt;/span&gt;, Chat, your email, yes, even your phone.&amp;nbsp; Set specific times throughout the day to take a break from writing code and check those things.&amp;nbsp; Ask co-workers to postpone non-urgent questions (but give them a specific time when they&lt;em&gt; can&lt;/em&gt; ask you questions!).&amp;nbsp; You will feel the effects of that space, and it will help you to work in a less stressed way.&amp;nbsp; You will find it easier to actually spend that extra 5 seconds writing down comments, or splitting a large module file into separate&amp;nbsp;includes.&lt;/p&gt;
&lt;h4&gt;Experience&amp;nbsp;Freedom&lt;/h4&gt;
&lt;p&gt;I hope these tips were helpful, and that you will soon be experiencing freedom from the weight of your technical debt.&amp;nbsp; I look forward to reading comments on other ways you avoid technical debt in your&amp;nbsp;endeavors.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/qrumFR3M_9I" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/development">development</category>
 <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <pubDate>Thu, 17 Dec 2009 21:43:02 +0000</pubDate>
 <dc:creator>James</dc:creator>
 <guid isPermaLink="false">67 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2009/12/17/avoiding-technical-debt-part-2</feedburner:origLink></item>
  <item>
    <title>design or develop, which should come first in your drupal workflow?</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/87qJMY9n6kE/design-or-develop-which-should-come-first-your-drupal-workflow</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    We&amp;#039;re still on the journey here at Sprocket, so here&amp;#039;s some thoughts from the road.        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-filefield field-field-image-entry"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="/blog/2009/11/25/design-or-develop-which-should-come-first-your-drupal-workflow" class="imagecache imagecache-content_banner_blog imagecache-linked imagecache-content_banner_blog_linked"&gt;&lt;img src="http://sprocketcreative.com/sites/default/files/imagecache/content_banner_blog/images/blog/design-v-dev-workflow_0.jpg" alt="" title=""  class="imagecache imagecache-content_banner_blog" width="468" height="201" /&gt;&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let me begin with the following disclaimer:&amp;nbsp; This brain dump is neither exhaustive or heavily researched.&amp;nbsp; I&amp;#8217;m quite certain there are valuable articles already written on this topic, so if you know of any please let us know via comments.&amp;nbsp; I&amp;#8217;ve wrestled with this issue for a while and haven&amp;#8217;t yet found many writings on it.&amp;nbsp; That being said, here&amp;#8217;s some thoughts from what we&amp;#8217;re learning here at&amp;nbsp;Sprocket.&lt;/p&gt;
&lt;h4&gt;Neither is&amp;nbsp;first&lt;/h4&gt;
&lt;p&gt;This is probably stating the obvious, but just to be sure we&amp;#8217;re clear, neither design or development comes first.&amp;nbsp; Site planning is the first step for every custom project we take on.&amp;nbsp; Whether our client has already done site planning or we&amp;#8217;re asked to assist, any way you slice it, you have to do some planning.&amp;nbsp; Content structure, types of content, roles, features, wire-framing, etc. all need to be fleshed out before you can even begin designing or developing (although in my opinion planning is actually part of design and an essential element - but I&amp;nbsp;digest).&lt;/p&gt;
&lt;h4&gt;Sprocket&amp;#8217;s design&amp;nbsp;priority&lt;/h4&gt;
&lt;p&gt;At Sprocket, we view ourselves as a design agency that does development along side, and not the other way around.&amp;nbsp; That&amp;#8217;s not to say we feel we&amp;#8217;re poor at development - quite the contrary.&amp;nbsp; Our genesis was as a design agency and I feel we approach problems more from a designer&amp;#8217;s vantage point than a developer&amp;#8217;s.&amp;nbsp; That may largely impact our views on this issue from a gut reaction standpoint, but what I&amp;#8217;m finding is that it really doesn&amp;#8217;t alter the fundamental problems that can arise in our&amp;nbsp;workflow.&lt;/p&gt;
&lt;h4&gt;What makes a project&amp;nbsp;successful?&lt;/h4&gt;
&lt;p&gt;To figure out which workflow fits best, I think it&amp;#8217;s helpful to first determine what makes a project successful.&amp;nbsp; If the goal is successful projects, then developing good workflows becomes a strategy for achieving that goal, and specific workflows are tactics to support that strategy (although you could break that down differently I&amp;#8217;m sure . . I&amp;#8217;m just a designer).&amp;nbsp; One of the questions I&amp;#8217;m trying to ask going into any project is &amp;#8220;what are the metrics for success?&amp;#8221;&amp;nbsp; We want to know what the client&amp;#8217;s answer to this question is.&amp;nbsp; However, your client is not the only one with an answer to this.&amp;nbsp; Here&amp;#8217;s a quick list of just a few things that I believe are crucial for Sprocket to deem a project&amp;nbsp;successful.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;profitable&lt;/strong&gt; - This is pretty self&amp;nbsp;explanatory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;portfolio-worthy&lt;/strong&gt; - We want work that we want to show off and can be proud&amp;nbsp;of.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;timely&lt;/strong&gt; - We don&amp;#8217;t want to keep coming back to it forever and never finishing&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;satisfied client&lt;/strong&gt; - Our goal is actually to create fans (topic for another article perhaps), so we really want an excited client, but I&amp;#8217;ll take satisfied if the other elements for success are&amp;nbsp;there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;limited miscommunication&lt;/strong&gt; - This simply means that the client got what they expected, and we didn&amp;#8217;t create or allow unrealistic expectations.&amp;nbsp; Miscommunication is always going to happen at some point between humans, hence &amp;#8220;limited&amp;#8221; instead of&amp;nbsp;&amp;#8220;no.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Design first: pros &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;cons&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The sky&amp;#8217;s the limit&lt;/strong&gt; - You can design whatever you&amp;nbsp;want.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Freedom to focus on usability&lt;/strong&gt; - You need not limit yourself (ex. you need not start from how Views outputs exposed filters by&amp;nbsp;default)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get your client excited with pretty pictures&lt;/strong&gt; - I don&amp;#8217;t know about you, but most of our clients are not very wowed by garland or zen classic when shown&amp;nbsp;concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The sky&amp;#8217;s the limit&lt;/strong&gt; - You may design something, get the client to approve it, and then chat with your developer or dev team and find it takes forever or is nearly impossible to&amp;nbsp;build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing context &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; use cases&lt;/strong&gt; - Often, when designing first, there are elements of both content interaction and management that you may forget to consider.&amp;nbsp; When you develop first you often are in the middle of using and testing which can help you discover all the moving&amp;nbsp;parts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Develop first: pros &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;cons&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Save dev time&lt;/strong&gt; - You tend to more tightly hold yourself to the defaults, limitations, and patterns of the technologies you&amp;#8217;re using when you develop&amp;nbsp;first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid unnecessary and painful design revisions&lt;/strong&gt; - You avoid having to go back to the client to discuss revising the design based on something you figured out you just couldn&amp;#8217;t pull off from a development standpoint. This means you also avoid getting your client excited about an idea that you then find can&amp;#8217;t make a&amp;nbsp;reality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Limit innovation and useability&lt;/strong&gt; - Let&amp;#8217;s face it, there are lots of instances where limiting yourself to drupal&amp;#8217;s (or some contrib module&amp;#8217;s) defaults or patterns is really &lt;span class="caps"&gt;NOT&lt;/span&gt; the best solution for the&amp;nbsp;problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client waits longer to see things they&amp;#8217;re excited about&lt;/strong&gt; - (see pros above for design&amp;nbsp;first)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;A third&amp;nbsp;option?&lt;/h4&gt;
&lt;p&gt;I could probably add to these lists, but I&amp;#8217;ll leave it at that for now.&amp;nbsp; That&amp;#8217;s enough for you to see why I&amp;#8217;ve said this is a journey and something we&amp;#8217;ve not found &lt;span class="caps"&gt;THE&lt;/span&gt; answer to.&amp;nbsp; One of the things we&amp;#8217;ve been trying lately here at Sprocket is to tackle the two congruently.&amp;nbsp; Where we used to be clearly a design first workflow, we&amp;#8217;re now working congruently and allowing the two to inform each other in process.&amp;nbsp; Obviously if you work alone as a free lancer or have one person who does both for you then that becomes pretty difficult.&amp;nbsp; So far the congruent approach has at least been more effective I think than our design first approach was.&amp;nbsp; It can be tricky to figure out client approval processes (I think) without design, but it can be tricky to have the confidence of going to a client for design approval without any attempt at development.&amp;nbsp; As we flesh out this part of our workflow more here at Sprocket, I or James will try to blog a bit more about it.&amp;nbsp; I&amp;#8217;m anxious to hear from others who have insights or creative ideas for how they structure this workflow with their clients and their&amp;nbsp;projects.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/87qJMY9n6kE" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/design">design</category>
 <category domain="http://sprocketcreative.com/tags/development">development</category>
 <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <category domain="http://sprocketcreative.com/tags/project-management">project management</category>
 <category domain="http://sprocketcreative.com/tags/workflow">workflow</category>
 <pubDate>Wed, 25 Nov 2009 20:23:26 +0000</pubDate>
 <dc:creator>Jared</dc:creator>
 <guid isPermaLink="false">32 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2009/11/25/design-or-develop-which-should-come-first-your-drupal-workflow</feedburner:origLink></item>
  <item>
    <title>Avoiding Technical Debt (Part 1)</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/ZqNjuiN0ObU/avoiding-technical-debt-part-1</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    Some common ways we create it and thoughts on avoidance.          &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;#8217;s be honest here&amp;#8230; How many times have you told yourself, &amp;#8220;Self, don&amp;#8217;t forget why you are doing such and such,&amp;#8221; only to come back to that same such and such and realize you&amp;#8217;ve completely forgotten what you swore you would remember?&amp;nbsp; Or maybe didn&amp;#8217;t even remember that you did it at all? The fact is, our memories are not nearly as sharp as we would like to believe. We need help, and thankfully there are many tools available to the developer to provide that&amp;nbsp;help.&lt;/p&gt;
&lt;h4&gt;Realize how stupid you really&amp;nbsp;are&lt;/h4&gt;
&lt;p&gt;Step one in any recovery process is of course to realize that you actually are guilty as charged.&amp;nbsp; You will only start to change bad habits or create good ones if you start to believe that your life will be better for it.&amp;nbsp; I&amp;#8217;m not normally an advocate of talking negatively to yourself, but to start avoiding technical debt you need to realize that you can&amp;#8217;t remember everything, nor should you!&amp;nbsp; I know you&amp;#8217;ve been waiting for this opportunity, so take the time now to tell yourself you&amp;#8217;re stupid.&amp;nbsp;&amp;nbsp;;)&lt;/p&gt;
&lt;h4&gt;Compartmentalize&lt;/h4&gt;
&lt;p&gt;One of the best aids in fighting technical debt before it starts is breaking things out into chunks.&amp;nbsp; Take &lt;a href="http://drupal.org/project/views"&gt;views&lt;/a&gt; for example.&amp;nbsp; Have you noticed how many different files and folders there are in that module?&amp;nbsp; You know what the great thing about that is?&amp;nbsp; Once you know how it&amp;#8217;s architected, it&amp;#8217;s pretty easy to find the exact code you are looking&amp;nbsp;for.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working on a module? &lt;/strong&gt;Once your .module file gets to a certain size, start breaking out that code into separate files.&amp;nbsp; I like to keep all my hook implementations in the .module file, and move everything else out into separate&amp;nbsp;includes.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing Theme integration? &lt;/strong&gt;Break out your &lt;span class="caps"&gt;CSS&lt;/span&gt; into separate files based on what functionality they are associated with.&amp;nbsp; Thanks to Drupal&amp;#8217;s &lt;span class="caps"&gt;CSS&lt;/span&gt; optimization, you can have as many &lt;span class="caps"&gt;CSS&lt;/span&gt; files as you want, and they&amp;#8217;ll all get nicely packaged into one tidy file to reduce the amount of page requests (thereby decreasing load&amp;nbsp;time).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About to commit to a &lt;span class="caps"&gt;VCS&lt;/span&gt;? &lt;/strong&gt;Avoid making a bunch of separate changes to your code and then committing them in one large commit.&amp;nbsp; Break them out into chunks based on the fix they are associated with, and make sure to use meaningful commit&amp;nbsp;messages!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features! &lt;/strong&gt;One tremendous way we&amp;#8217;ve cut back on our technical debt is in creating &lt;a href="http://drupal.org/project/features"&gt;features&lt;/a&gt;.&amp;nbsp; A feature is a module, so break out your &lt;span class="caps"&gt;CSS&lt;/span&gt; based on features, and use &lt;a href="http://api.drupal.org/api/function/hook_init"&gt;hook_init()&lt;/a&gt; and &lt;a href="http://api.drupal.org/api/function/drupal_add_css"&gt;drupal_add_css()&lt;/a&gt; to add it to the styles only when the feature is enabled.&amp;nbsp; Move any hook_form_alter() implementations into the features as well.&amp;nbsp; Everywhere you can, move any code associated with a particular feature into the feature itself, so that you know exactly where to look when something needs&amp;nbsp;fixing.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sprocketcreative.com/node/67"&gt;&lt;strong&gt;On to part&amp;nbsp;2!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/ZqNjuiN0ObU" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/development">development</category>
 <category domain="http://sprocketcreative.com/tags/drupal">drupal</category>
 <pubDate>Fri, 20 Nov 2009 20:51:45 +0000</pubDate>
 <dc:creator>James</dc:creator>
 <guid isPermaLink="false">66 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2009/11/20/avoiding-technical-debt-part-1</feedburner:origLink></item>
  <item>
    <title>What are you saying?</title>
    <link>http://feedproxy.google.com/~r/sprocket/all/~3/-1lpm6N6IMI/what-are-you-saying</link>
    <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    Evaluating your message.        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We like helping our clients think through their message. Since so much of what we do in planning, designing and developing is for their end user, we want to make sure we fully understand the message our client wants to deliver to that user . The following exercise may only take a few minutes, but you may be surprised at what you might learn through the&amp;nbsp;process.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Consider&lt;/strong&gt; your service or product and define in very specific terms what you offer.&amp;nbsp; If you&amp;#8217;re a service business, ask &amp;#8220;what do we sell?&amp;#8221; and not just &amp;#8220;what do we&amp;nbsp;do?&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create&lt;/strong&gt; a detailed profile of your target audience (ex. age, gender, vocation, income level, education level, hair length, height, weight, ethnicity, whatever you can actually&amp;nbsp;define).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Craft&lt;/strong&gt; a clear message for your customer.&amp;nbsp; Make certain it has a singular thought or theme and is not trying to say too many&amp;nbsp;things.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then ask yourself, &amp;#8220;is the message &amp;#8216;hitting the mark&amp;#8217;?&amp;#8221;&amp;nbsp; Whether its through the internet or through print, a consistent and clearly defined message is critical to the success of your service, product, business,&amp;nbsp;etc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sprocket/all/~4/-1lpm6N6IMI" height="1" width="1"/&gt;</description>
     <category domain="http://sprocketcreative.com/tags/approach-design">approach to design</category>
 <category domain="http://sprocketcreative.com/tags/message">message</category>
 <category domain="http://sprocketcreative.com/tags/planning">planning</category>
 <pubDate>Thu, 19 Nov 2009 15:41:42 +0000</pubDate>
 <dc:creator>dwayne</dc:creator>
 <guid isPermaLink="false">70 at http://sprocketcreative.com</guid>
  <feedburner:origLink>http://sprocketcreative.com/blog/2009/11/19/what-are-you-saying</feedburner:origLink></item>
  </channel>
</rss>
