<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://grayside.org"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Grayside.Org</title>
 <link>http://grayside.org</link>
 <description></description>
 <language>en</language>
<item>
 <title>Guzzle for Drupal: SDK Building</title>
 <link>http://grayside.org/2012/12/guzzle-drupal-sdk-building</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;For the last few months I&amp;#8217;ve (intermittently) been thinking about how to build a nice &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt; for working with external APIs from &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; applications, and Drupal in general.&lt;/p&gt;
&lt;p&gt;This post is a sort of round up of my thoughts, hopefully I&amp;#8217;ll find time to complete this project so I can post a detailed followup.&lt;/p&gt;
&lt;h2&gt;Selecting Guzzle&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve come to the conclusion (as has &lt;a href=&quot;https://github.com/amazonwebservices/aws-sdk-for-php&quot;&gt;Amazon&lt;/a&gt;) that &lt;a href=&quot;http://guzzlephp.org/&quot;&gt;Guzzle&lt;/a&gt; is the perfect &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; Client framework to build such a thing in &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;. In the mean time, &lt;a href=&quot;http://drupal.org/node/1862398&quot;&gt;Drupal 8 has gotten fully onboard with the guzzled goodness&lt;/a&gt;. So it&amp;#8217;s looking increasingly like a go-to library.&lt;/p&gt;
&lt;p&gt;Decoupled architecture, careful obedience to the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; spec, lots of valuable (and optional) features, and a maintainer with a deep knowledge of cURL&amp;#8217;s curlicues makes it a good system to lean on.&lt;/p&gt;
&lt;h2&gt;Basic Architecture&lt;/h2&gt;
&lt;p&gt;Guzzle has a very componentized architecture, and in recent months has separated out these components into separately downloadable packages, so you can use &lt;a href=&quot;http://getcomposer.org&quot;&gt;Composer&lt;/a&gt; to get just the pieces you need.&lt;/p&gt;
&lt;p&gt;It also uses a Symphony-driven plugin architecture, which makes many different behaviors easily swappable. Check out the &lt;a href=&quot;http://guzzlephp.org/guide/plugins.html&quot;&gt;existing plugin library&lt;/a&gt; and realize that most of them are ridiculously easy to override with your own version of the plugin, either implementing the interface or extending what&amp;#8217;s there.&lt;/p&gt;
&lt;h2&gt;Laying Out the Client&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Have a single &amp;#8220;Client&amp;#8221; class namespaced to the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; you want to integrate.&lt;/li&gt;
&lt;li&gt;You can use the &lt;a href=&quot;http://guzzlephp.org/guide/service/service_descriptions.html&quot;&gt;Service Definition &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt;&lt;/a&gt; to quickly get something working, but I question the performance of doing so. I have some crazy ideas about coupling a discover service with a Guzzle Mimetype to created an automatic client testing harness.&lt;/li&gt;
&lt;li&gt;You should probably have an abstract &amp;#8220;Command&amp;#8221; (&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; Resource) in place to impose any custom behaviors.&lt;/li&gt;
&lt;li&gt;You should probably group &amp;#8220;categories&amp;#8221; of resources together using a lower level abstract class or interface to impose still more. For example, I want to add some fault tolerance by making certain &amp;#8220;change&amp;#8221; operations enqueue-for-retry on failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Add the Drupal&lt;/h2&gt;
&lt;p&gt;Using the Adapter interfaces, it took me about 20 minutes apiece to put together Drupal caching and logging plugins. These will be brought in place with the proper &lt;code&gt;use&lt;/code&gt; statements in a Drupal-specific Client class I will create as an extension of the generic &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt; client.&lt;/p&gt;
&lt;p&gt;Similarly, I anticipate extending many of the Command classes with Drupal-specific variants to handle mapping (data conversion) from Drupal entities to the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; payload&amp;nbsp;structure.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/guzzle&quot;&gt;guzzle&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/1/composer&quot;&gt;composer&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/sdk&quot;&gt;sdk&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/1/api&quot;&gt;api&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 12 Dec 2012 05:42:44 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">100 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/12/guzzle-drupal-sdk-building#comments</comments>
</item>
<item>
 <title>Drush Snippets: Menu Trace</title>
 <link>http://grayside.org/2012/08/drush-snippets-menu-trace</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Random snippet of the day, find out what modules are involved in building out a given menu route definition. When you type a &lt;span class=&quot;caps&quot;&gt;URI&lt;/span&gt; into your browser, Drupal&amp;#8217;s menu routing system connects that to your page content by processing the path into instructions for how to build the&amp;nbsp;page.&lt;/p&gt;

&lt;p&gt;To use this script, copy the text or clone from github as a file, make it executable. It will automatically run with &lt;code&gt;drush php-script&lt;/code&gt;. You can use &lt;code&gt;--verbose&lt;/code&gt; for &amp;#8220;full array notation&amp;#8221; of each module&amp;#8217;s change to the menu route. Or you can just use &lt;code&gt;--pipe&lt;/code&gt; to get a list of modules and go look at the code&amp;nbsp;directly.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3326438.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;In theory this should work with Drupal 7, but I haven&amp;#8217;t gotten around to testing it&amp;nbsp;yet.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/terms/drupal6&quot;&gt;drupal6&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/drush&quot;&gt;drush&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/snippet&quot;&gt;snippet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 11 Aug 2012 19:08:54 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">99 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/08/drush-snippets-menu-trace#comments</comments>
</item>
<item>
 <title>Extending Drush Commands</title>
 <link>http://grayside.org/2012/04/extending-drush-commands</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;The other day around the office, I was surprised to discover not everyone realizes that you can do some crazy stuff around extending drush commands.&lt;/p&gt;
&lt;p&gt;First step: Read the documentation. Drush is intentionally written to be a command-line foil for Drupal, and if you&amp;#8217;ve built a module, a few minutes digging into the well-done docs will go a long way. Check out the &lt;a href=&quot;http://api.drush.ws&quot;&gt;Drush &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; if you are of a mind, or for a more focused burst of hook goodness, get out your terminal and type:&lt;/p&gt;
&lt;div class=&quot;geshifilter&quot;&gt;
&lt;div class=&quot;text geshifilter-text&quot; style=&quot;font-family:monospace;&quot;&gt;
&lt;pre style=&quot;font-family: monospace; font-weight: normal; font-style: normal&quot;&gt;$&amp;gt; drush topic docs-api&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you have a grasp of the fine hooks you can use to piggy-back on and around any Drush command, you can take it to the next level.&lt;/p&gt;
&lt;h3&gt;Adding&amp;nbsp;Options&lt;/h3&gt;
&lt;p&gt;Adding options to a Drush command allows you to create more sophisticated, controllable extensions to core command behaviors.&lt;/p&gt;
&lt;p&gt;There are several ways of doing this.&lt;/p&gt;
&lt;h4&gt;The command allows this&amp;nbsp;already&lt;/h4&gt;
&lt;p&gt;Let&amp;#8217;s not make this too complicated. Commands are sometimes intended as passthru mechanisms, such as &lt;code&gt;drush rsync&lt;/code&gt;. How does it accept any rsynch command? It has a command definition that includes &lt;span class=&quot;geshifilter&quot;&gt;&lt;code class=&quot;text geshifilter-text&quot;&gt;allow-additional-options =&amp;gt; TRUE&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h4&gt;The user operates in non-strict&amp;nbsp;mode&lt;/h4&gt;
&lt;p&gt;If the developer can set a flag, so can the user! You might have already seen this warning:&lt;/p&gt;
&lt;div class=&quot;geshifilter&quot;&gt;
&lt;div class=&quot;text geshifilter-text&quot; style=&quot;font-family:monospace;&quot;&gt;
&lt;pre style=&quot;font-family: monospace; font-weight: normal; font-style: normal&quot;&gt;Unknown option: --simple. &amp;nbsp;See `drush help help` for available options. To suppress this error, add the option --strict=0.&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This means that any time the user adds &lt;span class=&quot;geshifilter&quot;&gt;&lt;code class=&quot;text geshifilter-text&quot;&gt;--strict=0&lt;/code&gt;&lt;/span&gt; to a drush command invocation (or to their &lt;a href=&quot;http://drush.ws/examples/example.drushrc.php&quot;&gt;drushrc file&lt;/a&gt; for that specific command), your drush code can use &lt;a href=&quot;http://api.drush.ws/api/drush/includes!context.inc/function/drush_get_option/5.x&quot;&gt;&lt;code&gt;drush_get_option()&lt;/code&gt;&lt;/a&gt; to access the submitted value.&lt;/p&gt;
&lt;h4&gt;But for the clever command&amp;nbsp;extension&amp;#8230;&lt;/h4&gt;
&lt;p&gt;You&amp;#8217;ll want to implement &lt;a href=&quot;http://api.drush.ws/api/drush/docs!drush.api.php/function/hook_drush_help_alter/5.x&quot;&gt;&lt;code&gt;hook_drush_help_alter()&lt;/code&gt;&lt;/a&gt;. Using this hook, you can add new options to a drush command that will be be qualified as &amp;#8220;strict&amp;#8221;, &lt;strong&gt;and&lt;/strong&gt; will even show up in the &lt;em&gt;help&lt;/em&gt; entry for the command in the user&amp;#8217;s system.&lt;/p&gt;
&lt;h3&gt;Why didn&amp;#8217;t you show source&amp;nbsp;code?&lt;/h3&gt;
&lt;p&gt;Well, I had this small idea in mind, but it evolved rather quickly into a legitimate project. Go check out &lt;a href=&quot;http://drupal.org/project/drush_notify&quot;&gt;Drush Notify&lt;/a&gt;. It&amp;#8217;s pretty Ubuntu-specific out the gate, but it serves as a great example of a powerful drush &amp;#8220;extension&amp;#8221; that defines no&amp;nbsp;commands.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/drush&quot;&gt;drush&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 21 Apr 2012 07:21:54 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">98 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/04/extending-drush-commands#comments</comments>
</item>
<item>
 <title>Release: Organic Groups 6.x-2.3</title>
 <link>http://grayside.org/2012/03/release-organic-groups-6x-23</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Today was the release of &lt;span class=&quot;caps&quot;&gt;OG&lt;/span&gt; 6, Version 2.3&lt;/p&gt;
&lt;p&gt;We have a fine assortment of changes (see the &lt;a href=&quot;http://drupal.org/node/1507328&quot;&gt;changelog&lt;/a&gt;), ranging across:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extensive og.module commenting.&lt;/li&gt;
&lt;li&gt;Views integration improvements.&lt;/li&gt;
&lt;li&gt;Many &amp;#8220;&lt;span class=&quot;caps&quot;&gt;OG&lt;/span&gt;, what are you thinking?&amp;#8221; bugfixes.&lt;/li&gt;
&lt;li&gt;And even some performance enhancements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This release covers three classes of issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The remaining low hanging fruit languishing in the issue queue over the last two years.&lt;/li&gt;
&lt;li&gt;Lowish-hanging fruit that I had the time to finish myself.&lt;/li&gt;
&lt;li&gt;Development of enhancements and bugfixes I ran into during the work hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I presented last time, I have a bit of a &lt;a href=&quot;http://groups.drupal.org/node/196863&quot;&gt;manifesto on how I&amp;#8217;m approaching changes to &lt;span class=&quot;caps&quot;&gt;OG6&lt;/span&gt;&lt;/a&gt;. Unusual levels of conservatism have led to such oddities in a Drupal project as a function with a @deprecated tag.&lt;/p&gt;
&lt;p&gt;There are still items in progress in the issue queue, but since most everyone has moved on to the fantastic Drupal 7 version of Organic Groups, there are very few people contributing their efforts. That&amp;#8217;s fine, but you can start to expect most changes to &lt;span class=&quot;caps&quot;&gt;OG6&lt;/span&gt; to come by way of my own itches. I don&amp;#8217;t use Notifications, I don&amp;#8217;t use multi-group posting, I don&amp;#8217;t use the audience widget. If you care about these things, please help the many people that share your plight and present some patches and reviews &lt;a href=&quot;http://drupal.org/project/issues/og?version=6.x&quot;&gt;in the&amp;nbsp;queue&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/terms/drupal6&quot;&gt;drupal6&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/organic-groups&quot;&gt;organic groups&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 28 Mar 2012 21:27:05 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">97 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/03/release-organic-groups-6x-23#comments</comments>
</item>
<item>
 <title>Features Module, Then, Now, and in the Future</title>
 <link>http://grayside.org/2012/03/features-module-then-now-and-future</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Between the &lt;a href=&quot;http://drupal.org/project/issues/features&quot;&gt;issues queue&lt;/a&gt;, Twitter, podcasts, and ad hoc discussions, there is a lot of confusion about what the Features module is all about. As someone that has used and developed in it for a long time, I thought I&amp;#8217;d lend my perspective. My sense is the maintainers are on the same page, but don&amp;#8217;t hold them to this post.&lt;/p&gt;
&lt;h2&gt;Then&lt;/h2&gt;
&lt;p&gt;Features is a module to help site builders and command-line gurus easily package up the configuration associated with a specific use case (like a blog), and manage it in code.&lt;/p&gt;
&lt;p&gt;Unfortunately, there is no standard for doing this, so Features develops a mechanism for wrangling exports. This is sad, because it confuses the use case of the Features module itself.&lt;/p&gt;
&lt;h2&gt;Now&lt;/h2&gt;
&lt;p&gt;Unless you are active in the Distributions movement or style of site-building, the sense I get is that this is a common thought process for those that run across Features:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
I need to toss my configuration into code so I can ship my website around. This Features module things has traction. Darn, the &lt;span class=&quot;caps&quot;&gt;UI&lt;/span&gt; sucks, I have to click all these little boxes. And all these info hooks, info alter hooks, and caching layers complicate my day.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Meanwhile, in #drupal-features, a paraphrase:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
We totally need to get the exporting out of Features. It adds complexity and attracts all these irrelevant use cases to the issue queue.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2&gt;Future&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;http://groups.drupal.org/build-systems-change-management/cmi&quot;&gt;Configuration Management Initiative&lt;/a&gt; is exciting. From the perspective of a Features user and developer, it finally defines the standard and mechanism for configuration. That means Features finally has a target for how to pull the out-of-scope pieces out.&lt;/p&gt;
&lt;p&gt;After several conversations at DrupalCon, I&amp;#8217;m expecting we&amp;#8217;ll be seeing a 2.x architectural branch for Features that drops the export stuff. That doesn&amp;#8217;t mean it will become an inconsequential module&amp;#8211;it turns out capturing use cases in configuration is surprisingly complex. People do not agree on what bits and pieces naturally fall together. But that&amp;#8217;s okay, because we are reviving the &lt;a href=&quot;http://drupal.org/project/kit&quot;&gt;Kit&lt;/a&gt; specification. Expect more from me on that in the future, I think standards like that are key to keeping Drupal intuitive as the Distributions-driven approach to Drupal continues to&amp;nbsp;accelerate.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/terms/features&quot;&gt;features&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/cmi&quot;&gt;cmi&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 28 Mar 2012 21:03:03 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">96 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/03/features-module-then-now-and-future#comments</comments>
</item>
<item>
 <title>Release: Organic Groups 6.x-2.2</title>
 <link>http://grayside.org/2012/01/release-organic-groups-6x-22</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;I have just tagged the first &lt;span class=&quot;caps&quot;&gt;OG6&lt;/span&gt; release since March of 2010.&lt;/p&gt;
&lt;p&gt;We have a fine assortment of changes (see the &lt;a href=&quot;http://drupal.org/node&quot;&gt;changelog&lt;/a&gt;), ranging across:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New Hook &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; Documentation&lt;/li&gt;
&lt;li&gt;Views integration improvements&lt;/li&gt;
&lt;li&gt;Localization improvements&lt;/li&gt;
&lt;li&gt;Miscellaneous areas of moderate interest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This release locks in some changes, clarifies the status of Notifications (sticking with the 2.x line for now), and sets up &lt;span class=&quot;caps&quot;&gt;OG6&lt;/span&gt; for a stable position to start looking at what should happen next. I&amp;#8217;ve posted a sort of maintainer&amp;#8217;s philosophy position on how I see &lt;span class=&quot;caps&quot;&gt;OG6&lt;/span&gt; moving forward, you can read it at the &lt;a href=&quot;http://groups.drupal.org/node/196863&quot;&gt;d.g.o address of Organic Groups&lt;/a&gt;. What does all that translate into for my next steps?&lt;/p&gt;
&lt;p&gt;Well, aside from a few clear cases, it&amp;#8217;s still very much up to the community. I&amp;#8217;m going to focus on a few good patches, and see if I can help the &lt;a href=&quot;http://drupal.org/project/issues/search/og?text=&amp;amp;assigned=&amp;amp;submitted=&amp;amp;participant=&amp;amp;status%5B%5D=Open&amp;amp;issue_tags_op=or&amp;amp;issue_tags=gdolove&quot;&gt;groups.drupal.org-related issues&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/issues/search/og?text=&amp;amp;assigned=&amp;amp;submitted=&amp;amp;participant=&amp;amp;status%5B%5D=Open&amp;amp;issue_tags_op=or&amp;amp;issue_tags=performance&quot;&gt;performance&lt;/a&gt;, and &lt;a href=&quot;http://drupal.org/project/issues/search/og?text=&amp;amp;assigned=&amp;amp;submitted=&amp;amp;participant=&amp;amp;status%5B%5D=Open&amp;amp;issue_tags_op=or&amp;amp;issue_tags=og-wtf&quot;&gt;the Weirdness&lt;/a&gt; subqueues. I&amp;#8217;m hoping to have enough cool stuff pulled together to release 2.3 in honor of Drupalcon&amp;nbsp;Denver.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/terms/drupal6&quot;&gt;drupal6&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/organic-groups&quot;&gt;organic groups&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Fri, 13 Jan 2012 19:16:45 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">95 at http://grayside.org</guid>
 <comments>http://grayside.org/2012/01/release-organic-groups-6x-22#comments</comments>
</item>
<item>
 <title>Infinite Null: Sorting NULL to Last</title>
 <link>http://grayside.org/2011/08/infinite-null-sorting-null-last</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;em&gt;Please, keep in mind this post was written for Drupal 6 and Views 2! D7/Views 3 sites might not take so kindly to it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Recently I was looking at creating a new Todo Feature with a due date. I cracked open &lt;span class=&quot;caps&quot;&gt;CCK&lt;/span&gt;’s &lt;em&gt;manage fields&lt;/em&gt; &lt;span class=&quot;caps&quot;&gt;UI&lt;/span&gt; and added a date field, careful to keep in mind that the default value should be &lt;strong&gt;no date&lt;/strong&gt;, which just happens to translate as &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;. You see, for my Todo use case, not all Todos would have a deadline.&lt;/p&gt;
&lt;p&gt;My next step was to create a View of all upcoming items. I wanted the next most urgent todo to float to the top of the list. Sadly, &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt; counts as 0 in database land, so my carefully clicked Sort was preloading all my urgent todos with all the lowest priority tasks.&lt;/p&gt;
&lt;p&gt;Seeing as this was a &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; problem, I googled the ‘net for viable query tweaks. I found a nice article illustrating exactly what I wanted: &lt;a href=&quot;http://www.shawnolson.net/a/730/mysql_sort_order_with_null.html&quot;&gt;MySQL Sort Order with &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;&lt;/a&gt;. The grand secret? Sort first by whether the duedate is &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt; to flip your empty values to the bottom of the result set.&lt;/p&gt;
&lt;p&gt;The fastest way for me to apply this tweak to my feature was to hack the Views query. &lt;code&gt;hook_views_query_alter()&lt;/code&gt; is usually a horrible decision. Once you’ve put it into code, tweaking your View a lot around your alteration can quickly result in a broken query. Meanwhile:&lt;/p&gt;
&lt;div class=&quot;geshifilter&quot;&gt;
&lt;div class=&quot;php geshifilter-php&quot; style=&quot;font-family:monospace;&quot;&gt;
&lt;pre style=&quot;font-family: monospace; font-weight: normal; font-style: normal&quot;&gt;&lt;span style=&quot;color: #009933; font-style: italic;&quot;&gt;/**
&amp;nbsp;* Implementation of hook_views_query_alter().
&amp;nbsp;*/&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; example_views_query_alter&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$view&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$query&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$view&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;example_listing&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.php.net/array_unshift&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;array_unshift&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$query&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;orderby&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;&lt;span class=&quot;caps&quot;&gt;ISNULL&lt;/span&gt;(node_data_field_duedate_field_duedate_value) &lt;span class=&quot;caps&quot;&gt;ASC&lt;/span&gt;&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(For a longer use case on this Views bandaid, see &lt;a href=&quot;http://btmash.com/article/2011-06-09/correcting-views-queries-using-views-query-alter&quot;&gt;Correcting views queries using views_query_alter&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I arrived here by turning on the &lt;a href=&quot;http://drupal.org/project/devel&quot;&gt;Devel&lt;/a&gt; module, and dropping a &lt;code&gt;dpm($query)&lt;/code&gt; into that function first thing. This gave me the array structure of my View, including the various &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; entries for the &lt;span class=&quot;caps&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;BY&lt;/span&gt; arguments. A quick and dirty &lt;code&gt;array_unshift()&lt;/code&gt; forces the &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt; check for my date field (the alias I also found in the $query object, there are more elegant methods) onto the top of the ordering hierarchy.&lt;/p&gt;
&lt;p&gt;Bingo! &lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;-dated nodes are sorted to&amp;nbsp;last.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/sql&quot;&gt;sql&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/views&quot;&gt;views&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/1/views2&quot;&gt;views2&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 25 Aug 2011 04:01:43 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">94 at http://grayside.org</guid>
 <comments>http://grayside.org/2011/08/infinite-null-sorting-null-last#comments</comments>
</item>
<item>
 <title>Configure Drush in Your Git Repository</title>
 <link>http://grayside.org/2011/08/configure-drush-your-git-repository</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;One of the neat features of Drush is it&amp;#8217;s configurability. Setting the defaults for various behaviors and command options allows you to build really simplified, specialized workflows. You can create personal settings defaults by dropping a `drushrc.php` file in one of the places Drush will look, such as inside a .drush folder of your home&amp;nbsp;directory.&lt;/p&gt;
&lt;p&gt;It turns out this little capability has provided some very simple wins for developers at &lt;a href=&quot;http://www.goingon.com&quot;&gt;GoingOn&lt;/a&gt;. We pass around our projects and sites as a subdirectory of a Git repository that contains various things, such as documentation, deployment tools, and drush commands. Unfortunately, this slightly irregular practice disconnects Drush from the Drupal site and excludes those drush commands from the standard directories drush&amp;nbsp;scans.&lt;/p&gt;
&lt;p&gt;We fix this by making Drush aware of the Git Repo. There is a command-line script you can use to check if you are anywhere in a Git repository. By configuring Drush to check for a Git Repo on every drush bootstrapping, we give Drush a chance to pick up a bonus, repository-specific Drush config&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Add this snippet to your drushrc.php&amp;nbsp;file:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;geshifilter&quot;&gt;
&lt;div class=&quot;php geshifilter-php&quot; style=&quot;font-family:monospace;&quot;&gt;
&lt;pre style=&quot;font-family: monospace; font-weight: normal; font-style: normal&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$output&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;a href=&quot;http://www.php.net/exec&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;exec&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;git rev-parse --show-toplevel 2&amp;gt; /dev/null&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$output&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;!&lt;/span&gt;&lt;a href=&quot;http://www.php.net/empty&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;empty&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$output&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #000088;&quot;&gt;$repo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$output&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp; &lt;span style=&quot;color: #000088;&quot;&gt;$options&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;config&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$repo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;/drush/drushrc.php&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #000088;&quot;&gt;$options&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;include&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$repo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;/drush/commands&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #000088;&quot;&gt;$options&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;alias-path&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$repo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;/drush/aliases&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This script checks the current directory for participation in a git repository. If there is one, it looks at the root of the git repository for a &amp;#8216;.drushrc.php&amp;#8217; file to provide repo-specific instructions to Drush. We use this to configure paths to external resources that can vary by code version, as well as setting the Drupal site root for the Drupal site sihpped with that particular&amp;nbsp;repository.&lt;/p&gt;
&lt;p&gt;The last line also seeks out a `scripts/` directory in the repository root, which it will scan recursively for any files ending in `.drush.inc`. This allows us to ship versioned drush commands with each repo instead of documenting a complex individual installation&amp;nbsp;process.&lt;/p&gt;
&lt;p&gt;There are many other things you can do with a little poking about in the options for a drushrc file, to learn more start with the &lt;a href=&quot;http://drush.ws/examples/example.drushrc.php&quot;&gt;drushrc.php example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 7/16/2012&lt;/strong&gt;: Updated code example to the same provided in Drush docs. You can now leverage this trick outside the root directory of your code repository. Also removed not applicable git context resulting in invalid configuration&amp;nbsp;paths.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/drush&quot;&gt;drush&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/86&quot;&gt;git&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 20 Aug 2011 06:53:18 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">93 at http://grayside.org</guid>
 <comments>http://grayside.org/2011/08/configure-drush-your-git-repository#comments</comments>
</item>
<item>
 <title>D7 Upgrade Process: Backports to Close the Gap</title>
 <link>http://grayside.org/2011/08/d7-upgrade-process-backports-close-gap</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;em&gt;The following post originally appeared on the &lt;a href=&quot;http://goingon.com/blog/d7-upgrade-process-backports-close-gap&quot;&gt;GoingOn.com blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After more than a year of continuous investment in &lt;a href=&quot;http://goingon.com&quot;&gt;GoingOn&lt;/a&gt;&amp;#8217;s Drupal 6 platform, the idea of upgrading to Drupal 7 is incredibly daunting. We have custom modules from form behaviors down to the access layer, we have features encapsulating hundreds of exported components, and an aggressive feature release schedule that does not set aside 6 months for a complete rewrite of the codebase just for a new version of Drupal. What to&amp;nbsp;do?&lt;/p&gt;
&lt;p&gt;We’ve been playing around with the idea of iterating our Drupal 6 platform toward Drupal 7. By pulling markup, design patterns, APIs, and architecture in Drupal 7 down into platform incrementally, we hope to shorten the final leap that will come when upgrading the entire&amp;nbsp;system.&lt;/p&gt;
&lt;h5&gt;Driving Current Drupal Version Closer to Expected Drupal&amp;nbsp;Version&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;http://goingon.com/sites/default/files/Drupal_Steps_4.png&quot; alt=&quot;&quot; width=&quot;200&quot; height=&quot;202&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;Usability metaphors in site architecture and development practices sometimes works.&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The extra work involved might well take &lt;em&gt;more aggregate&lt;/em&gt; time to develop, but that time will be amortized across small, manageable pieces that can be more intelligently inserted into the development&amp;nbsp;schedule.&lt;/p&gt;
&lt;p&gt;Here are the backport opportunities we’ve&amp;nbsp;identified:&lt;/p&gt;
&lt;h3&gt;Design&amp;nbsp;Patterns&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/project/vertical_tabs&quot;&gt;Vertical Tabs&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/contextual&quot;&gt;Contextual Links&lt;/a&gt;, Toolbar, &lt;a href=&quot;http://drupal.org/project/elements&quot;&gt;Elements&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/contact&quot;&gt;Contact&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many of the design patterns in Drupal 7 are available through a combination of backport modules and creative theming. The Toolbar module doesn’t have a backport, but peeking into the repository for the &lt;a href=&quot;http://drupal.org/project/admin_menu&quot;&gt;Admin Menu&lt;/a&gt; I spy something that makes it &lt;em&gt;look&lt;/em&gt; like D7’s&amp;nbsp;Toolbar.&lt;/p&gt;
&lt;p&gt;By pulling these patterns from D7, we gain two&amp;nbsp;benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can build out the rest of our user interface around D7 design assumptions, instead of D6 assumptions. This will save effort in a theme redesign and&amp;nbsp;upgrade.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;We can trickle D7 designs in front of our users, allowing them to adjust to a few changes ahead of time instead of waking up one morning to find a completely rearranged&amp;nbsp;website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Our use of Vertical Tabs liberally around node forms is not cutting edge, but has allowed us to package complex forms with a Drupal 7 pattern, instead of resorting to harder-to-maintain multi-step&amp;nbsp;forms.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;System&amp;nbsp;Plumbing*&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/project/drupal_queue&quot;&gt;Drupal Queue&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/adminrole&quot;&gt;Admin Role&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/password&quot;&gt;Password&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/hook_file&quot;&gt;File&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/mailsystem&quot;&gt;Mail System&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/simpletest&quot;&gt;Simpletest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The flow of code that goes on under the hood has a few interface points where it is relatively easy to grab a D6 backport and make your modules look just a little more like Drupal 7&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;Judging by an &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; chat I just overheard the files[] mechanism might be dropped for something simpler in one of the next few point&amp;nbsp;releases.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I hadn’t realized until writing this that &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; Alter was cooked into core. The ability to ignore the special rules around around &lt;a href=&quot;http://api.drupal.org/api/drupal/developer--hooks--core.php/function/custom_url_rewrite_inbound/6&quot;&gt;custom_url_rewrite_inbound()&lt;/a&gt;  and go straight for &lt;a href=&quot;http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_url_inbound_alter/7&quot;&gt;hook_url_inbound_alter()&lt;/a&gt; is great. It also makes our custom code using it D7&amp;nbsp;ready.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;* For purposes of this post, plumbing refers to the flow of code and data between its storage and the rendering process. Pretty broad&amp;nbsp;category.&lt;/p&gt;
&lt;h3&gt;Database &lt;span class=&quot;amp&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;Performance&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://pressflow.org/&quot;&gt;Pressflow&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/dbtng&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DBTNG&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/cache_backport&quot;&gt;Cache&amp;nbsp;Backport&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can get a lot closer to Drupal 7 performance behaviors simply by using Pressflow, which has held backports from and experiments for Drupal 7 for&amp;nbsp;years.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Most members of the Drupal community are already well aware that if performance is important for your project, grabbing Pressflow is an easy and non-threatening win. By using it for D6, you will be coding against session handling that is closer to D7’s, as well as being able to make use of other performance enhancing systems, such as serving images via &lt;a href=&quot;http://drupal.org/project/varnish&quot;&gt;Varnish&lt;/a&gt; as an ongoing improvement across your upgrade&amp;nbsp;process.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Contrib&amp;nbsp;Backports&lt;/h3&gt;
&lt;p&gt;This is a category of another sort. Usually when you think about Contrib modules for D7, you are looking for the upgraded version of the modules you are already using. However, what if there is a D7 module you want to use, or at least, could use? The D6 version of that module has just become a backport to facilitate your upgrade&amp;nbsp;path.&lt;/p&gt;
&lt;p&gt;This is a good solution to deal with unmaintained modules that have since been eclipsed by more energetic projects, as well as custom code you don’t really want to see again. We’re pretty excited to start playing with the &lt;a href=&quot;http://drupal.org/project/boxes&quot;&gt;Boxes &lt;/a&gt;module for this&amp;nbsp;reason.&lt;/p&gt;
&lt;p&gt;I’m going to skip listing competing modules in which one has an upgrade path and not the other. The &lt;a href=&quot;http://groups.drupal.org/similar-module-review&quot;&gt;Similar Module Review&lt;/a&gt; group might have information that will help you find competing modules that may just be a cleaner path&amp;nbsp;forward.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;http://www.lullabot.com/articles/friday-roundup-drupal-8-education-agile-bacon-and-roombas&quot;&gt;Lullabot’s Friday Roundup &lt;/a&gt;(June 24th) for pointing out backports of Password, Contact, and File. Thanks to David Reid for creating and maintaining what seems like most of these&amp;nbsp;modules.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;So, did this work? &lt;/strong&gt;We are still putting together the details of this plan. A followup post in a few months will report on how it goes. If you have thoughts about this approach to the upgrade, additional worthwhile backports, or alternate ideas on how to make the time for an upgrade, please post a&amp;nbsp;comment!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/drupal6&quot;&gt;drupal6&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/84&quot;&gt;drupal7&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/taxonomy/term/85&quot;&gt;upgrade&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 17 Aug 2011 05:40:01 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">92 at http://grayside.org</guid>
 <comments>http://grayside.org/2011/08/d7-upgrade-process-backports-close-gap#comments</comments>
</item>
<item>
 <title>How to Override a Views Field Template from a Module</title>
 <link>http://grayside.org/2010/09/how-override-views-field-template-module</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Some months ago I wanted the solution to overriding a Views Field template entirely from within a module. I spent hours trawling documentation and issues, and playing with a little trial and error. In the end, I came up with a solution:&lt;/p&gt;
&lt;div class=&quot;geshifilter&quot;&gt;
&lt;div class=&quot;php geshifilter-php&quot; style=&quot;font-family:monospace;&quot;&gt;
&lt;pre style=&quot;font-family: monospace; font-weight: normal; font-style: normal&quot;&gt;&lt;span style=&quot;color: #009933; font-style: italic;&quot;&gt;/**
&amp;nbsp;* Implementation of hook_theme().
&amp;nbsp;*/&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; custom_module_theme&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$existing&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;views_view_field__view_name__field_name&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;arguments&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;view&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;field&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;row&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;template&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;views-view-field--view-name--field-name&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;original hook&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;views_view_field&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;path&#039;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; drupal_get_path&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;module&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;custom_module&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;/theme&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;By defining a Views template in this way, you are doing the equivalent to building your template and dropping it into your Theme&amp;#8217;s directory. This is sufficient for Views to notice the existence of the template from within your module. At that point the standard Views logic of finding the most specific template available for each field comes into play. In this case, every instance of &lt;em&gt;field name&lt;/em&gt; in &lt;em&gt;view name&lt;/em&gt; will use this template&amp;#8230; unless, of course, I have a more specific template somewhere that targets that field in a specific display.&lt;/p&gt;
&lt;p&gt;Note that the theme key and template name are the same, but for the swapping of hyphens and underscores. The way both of those are named is critical, else Views will not properly notice the template. All the options listed in &lt;strong&gt;Theme Information&lt;/strong&gt; in the Views &lt;span class=&quot;caps&quot;&gt;UI&lt;/span&gt; is available for use here.&lt;/p&gt;
&lt;p&gt;Note that this is very derivative of the hard work of others, and I will link to it here when I come across it again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://drupal.org/node/627378&quot;&gt;views template overrides in module directory&lt;/a&gt; was one of my key references. Since I checked that thread, the marvelous @dereine posted a patch with the intent to guide Views to find theme templates in module directories as well. It &lt;em&gt;Needs Review&lt;/em&gt;, so if the code above bores you, go review the&amp;nbsp;patch!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Terms:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/taxonomy/term/1&quot;&gt;drupal&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/category/terms/views&quot;&gt;views&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/category/terms/theming&quot;&gt;theming&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 15 Sep 2010 21:07:05 +0000</pubDate>
 <dc:creator>Grayside</dc:creator>
 <guid isPermaLink="false">90 at http://grayside.org</guid>
 <comments>http://grayside.org/2010/09/how-override-views-field-template-module#comments</comments>
</item>
</channel>
</rss>
