<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.wimleers.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.wimleers.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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://wimleers.com">
<channel>
 <title>Wim Leers - Drupal</title>
 <link>http://wimleers.com/taxonomy/term/24/0</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.wimleers.com/WimLeers/Drupal" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><item>
 <title>Bachelor thesis on Drupal's page loading performance</title>
 <link>http://wimleers.com/blog/bachelor-thesis-on-drupals-page-loading-performance</link>
 <description>&lt;p&gt;I've alluded to it &lt;a href="http://wimleers.com/blog/how-much-is-too-much"&gt;before&lt;/a&gt;, but now it's also been officially approved: I'll be doing my bachelor thesis on Drupal! I will focus on integrating Drupal with CDNs. Yay! :)&lt;/p&gt;

&lt;p&gt;Don't know what a CDN is? It's short for &lt;em&gt;Content Delivery Network&lt;/em&gt;; a network of (static file or streaming media) servers that are located around the globe. These servers all mirror each others' files. When a user requests a certain file from the CDN, the server that is the closest to the user will serve the file.&lt;br /&gt;
By using a CDN to serve the static components on your web site (CSS, JS, images, fonts), your web site will load much faster: the latency will be lower and the throughput will be greater.&lt;/p&gt;

&lt;p&gt;You'd think that the tools necessary to synchronize ﬁles to a CDN are already available. Unfortunately, that’s not the case. The most important reason is that CDNs have only become cheaper very recently. Most CDNs assume that they are going to be used for the distribution of big ﬁles, and therefore a manual upload – typically via (S)FTP – of each ﬁle is acceptable. It's not acceptable for dynamic (Drupal) web sites though!&lt;/p&gt;

&lt;p&gt;I will take the &lt;a href="http://drupal.org/project/cdn" class="external-link"&gt;CDN integration module&lt;/a&gt; that I wrote, extract the useful pieces and then rewrite it properly (i.e. actually scalable) for Drupal 6. Not only is the goal to write a scalable Drupal module (i.e. synchronization through PHP), but also to create a daemon. This daemon (in C++/&lt;a href="http://trolltech.com/products/qt" class="external-link"&gt;Qt&lt;/a&gt;) will allow for far more efficient synchronization, because you don't have to scan directories recursively for new and changed files anymore, you can take advantage of file system event monitors (&lt;a href="http://en.wikipedia.org/wiki/Inotify" class="external-link"&gt;inotify&lt;/a&gt; on Linux, &lt;a href="http://en.wikipedia.org/wiki/FSEvents" class="external-link"&gt;FSEvents&lt;/a&gt; on Mac OS X and &lt;a href="http://en.wikipedia.org/wiki/Windows_Management_Instrumentation" class="external-link"&gt;WMI&lt;/a&gt; on Windows) to track files without creating overhead.&lt;/p&gt;

&lt;p&gt;Interested? For all details (the above really is just an extract), see my proposal (English, 5 pages) at the bottom of this blog post.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/bachelor-thesis-on-drupals-page-loading-performance"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/bachelor-thesis-on-drupals-page-loading-performance#comments</comments>
 <category domain="http://wimleers.com/tags/bachelor-thesis">bachelor thesis</category>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/hasselt-university">Hasselt University</category>
 <enclosure url="http://wimleers.cachefly.net/wimleers.com/sites/wimleers.com/files/proposal.pdf" length="78702" type="application/pdf" />
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/69</wfw:commentRss>
 <pubDate>Fri, 17 Oct 2008 23:16:22 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">69 at http://wimleers.com</guid>
</item>
<item>
 <title>How much is too much?</title>
 <link>http://wimleers.com/blog/how-much-is-too-much</link>
 <description>&lt;p&gt;So, &lt;a href="http://uhasselt.be/" class="external-link"&gt;university&lt;/a&gt; has started again. We have to pick "broadening courses", I chose economy courses (macroeconomics and operational research). In this semester, I've got 6 courses, all of which – except for one – come with their own project. The one that doesn't have a project (macroeconomics) overlaps with other courses, because it's a trimester course. Painful.&lt;br /&gt;
I'm also trying to convince my professors to be able to do my bachelor thesis on Drupal. By that I mean: develop something that can make Drupal &lt;em&gt;shine&lt;/em&gt; in a certain area. (More on that in a later blog post!) That costs its fair share of time as well.&lt;br /&gt;
So … I'm extremely busy for school; pulling late-nighters 7/7.&lt;/p&gt;

&lt;p&gt;Next, I'm involved in too many projects outside of school: maintaining &lt;a href="http://drupal.org/user/99777" class="external-link"&gt;my Drupal modules&lt;/a&gt; (or at least trying to), table tennis, working for &lt;a href="http://mollom.com/" class="external-link"&gt;Mollom&lt;/a&gt;, working in the local &lt;a href="http://aiesec.be/" class="external-link"&gt;AIESEC&lt;/a&gt; committee, maintaining &lt;a href="http://driverpacks.net/" class="external-link"&gt;DriverPacks.net&lt;/a&gt;, and more.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How much is too much?&lt;/em&gt; Well, this is too much for me. In reality, I've pretty much only been able to work on school stuff the past 3 weeks. So … to create some breathing room for me again, and because I haven't been able to maintain them anyway, I'm giving the following modules away for adoption:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/carousel" class="external-link"&gt;Carousel&lt;/a&gt;, supposed to become the single module for all carousel-goodness (which means it will include the jCarousel and Carousel panel style modules). Me, nor any of my comaintainers have had the time to really push this forward. Porting to Drupal 6 is super easy, patches are already in the issue queue.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/panels_carousel" class="external-link"&gt;Carousel panel style&lt;/a&gt;, title says it all. Not much work to maintain.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/jcarousel" class="external-link"&gt;jCarousel&lt;/a&gt;, the jQuery plugin that makes creating carousels easy.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/money" class="external-link"&gt;Money CCK Field&lt;/a&gt;, title says it all, supports all known currencies and  advanced formatting. Not much work to maintain. Needs to be ported to CCK 2 (Drupal 6).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/panels_tabs" class="external-link"&gt;Tabs panel style&lt;/a&gt;, title says it all. Not much work to maintain.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/views_savedsearches" class="external-link"&gt;Views Saved Searches&lt;/a&gt;, needs a couple minor features  and needs to be ported to Views 2 (Drupal 6).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This means I'm giving up all my modules for adoption, except for AHAH Helper, CDN Integration and Hierarchical Select.&lt;br /&gt;
Let me know via the comments, my contact page or the issue queue if you'd like to become the maintainer of either of those modules.&lt;/p&gt;

&lt;p&gt;Finally, I've upgraded my site a bit … which allowed me to provide you with a &lt;strong&gt;&lt;a href="/demo/hierarchical-select"&gt;demo&lt;/a&gt; of Hierarchical Select 3&lt;/strong&gt;! If you plan to use it, or have postponed trying it, you can do so now very easily!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/how-much-is-too-much"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/how-much-is-too-much#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/hasselt-university">Hasselt University</category>
 <category domain="http://wimleers.com/tags/life">life</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/68</wfw:commentRss>
 <pubDate>Tue, 14 Oct 2008 17:18:07 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">68 at http://wimleers.com</guid>
</item>
<item>
 <title>Another awesome DrupalCon!</title>
 <link>http://wimleers.com/blog/another-awesome-drupalcon</link>
 <description>&lt;p&gt;It's over. My second DrupalCon. &lt;a href="http://szeged2008.drupalcon.org" class="external-link"&gt;DrupalCon Szeged 2008&lt;/a&gt;. I'm posting 2 weeks after date because I had another awesome vacation 2 days after the DrupalCon, to the south of France (in &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Brandonnet,+Aveyron,+France&amp;amp;ie=UTF8&amp;amp;z=13&amp;amp;iwloc=addr" class="external-link"&gt;Brandonnet&lt;/a&gt;), with friends of the table tennis club.&lt;/p&gt;

&lt;img src="http://wimleers.com/sites/wimleers.com/files/imagecache/Original/Wim+Leers/blog/drupalcon_szeged/drupalcon_szeged_banner.jpg" alt="" title=""  class="imagecache imagecache-Original" class="asset-align-center"/&gt;

&lt;p&gt;And it was AWESOME. I met so many new people. I had lots of interesting conversations. Had lots of fun. Saw a different way of life.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/another-awesome-drupalcon"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/another-awesome-drupalcon#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/drupalcon">DrupalCon</category>
 <category domain="http://wimleers.com/tags/drupalconszeged2008">drupalconszeged2008</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/66</wfw:commentRss>
 <pubDate>Mon, 15 Sep 2008 13:57:20 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">66 at http://wimleers.com</guid>
</item>
<item>
 <title>AHAH helper module</title>
 <link>http://wimleers.com/blog/ahah-helper-module</link>
 <description>&lt;p&gt;AHAH-powered forms were virtually impossible in Drupal 5 (see the &lt;a href="#ahah-in-drupal-5"&gt;note&lt;/a&gt; though). In Drupal 6, this is much easier, thanks to the &lt;a href="http://api.drupal.org/?q=api/file/developer/topics/forms_api_reference.html/6#ahah" class="external-link"&gt;#ahah property&lt;/a&gt;. However, it still is really painful to actually use it.&lt;/p&gt;

&lt;h3 id="flaw"&gt;The flaw&lt;/h3&gt;
&lt;p&gt;You have to write a menu callback for each AHAH-enabled form item of your form.
You have to repeat small variations of this piece of code for each callback:&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="drupal6 geshifilter-drupal6" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// Build our new form element.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form_element&lt;/span&gt; = _mymodule_add_something_to_form&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// Build the new form.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form_state&lt;/span&gt; = &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #000066;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'submitted'&lt;/span&gt; =&lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;FALSE&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form_build_id&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;$_POST&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'form_build_id'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// Add the new element to the stored form. Without adding the element&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// to the form, Drupal is not aware of this new elements existence and&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// will not process it. We retreive the cached form, add the element,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// and resave.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt; = &lt;a href="http://api.drupal.org/api/function/form_get_cache/6"&gt;&lt;span style="color: #000066;"&gt;form_get_cache&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$form_build_id&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;$form_state&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'somewhere'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'very'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'deep'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;$form_element&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;a href="http://api.drupal.org/api/function/form_set_cache/6"&gt;&lt;span style="color: #000066;"&gt;form_set_cache&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$form_build_id&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;$form_state&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt; += &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #000066;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;  &lt;span style="color: #ff0000;"&gt;'#post'&lt;/span&gt; =&lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;$_POST&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;  &lt;span style="color: #ff0000;"&gt;'#programmed'&lt;/span&gt; =&lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;FALSE&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// Rebuild the form.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt; = &lt;a href="http://api.drupal.org/api/function/form_builder/6"&gt;&lt;span style="color: #000066;"&gt;form_builder&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'mymodule_someform'&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;$form_state&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;// Render the new output.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$subform&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;$form&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'somewhere'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'choice'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #0000ff;"&gt;$output&lt;/span&gt; = &lt;a href="http://api.drupal.org/api/function/theme/6"&gt;&lt;span style="color: #000066;"&gt;theme&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'status_messages'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; . &lt;a href="http://api.drupal.org/api/function/drupal_render/6"&gt;&lt;span style="color: #000066;"&gt;drupal_render&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$subform&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;a href="http://api.drupal.org/api/function/drupal_json/6"&gt;&lt;span style="color: #000066;"&gt;drupal_json&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #000066;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'status'&lt;/span&gt; =&lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;TRUE&lt;/span&gt;, &lt;span style="color: #ff0000;"&gt;'data'&lt;/span&gt; =&lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;$output&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ok, it does make sense. But it takes some time to get used to – too much – and is a treshold that's big enough for many developers to just not implement AHAH forms. It simply &lt;em&gt;shouldn't&lt;/em&gt;
be this hard.&lt;br /&gt;
This current approach of AHAH forms in Drupal is time consuming, hard to maintain and hard to write tests for.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/ahah-helper-module"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/ahah-helper-module#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/forms-api">Forms API</category>
 <category domain="http://wimleers.com/tags/modules">modules</category>
 <category domain="http://wimleers.com/tags/mollom">Mollom</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/62</wfw:commentRss>
 <pubDate>Fri, 29 Aug 2008 19:07:50 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">62 at http://wimleers.com</guid>
</item>
<item>
 <title>Drupal.behaviors + jQuery: multiple buttons with the same name</title>
 <link>http://wimleers.com/blog/drupal.behaviors-jquery-multiple-buttons-with-the-same-name</link>
 <description>&lt;p&gt;While working for &lt;a href="http://mollom.com/" class="external-link"&gt;Mollom&lt;/a&gt;, I faced the problem of needing multiple buttons with the same name. In my case, this was an absolute necessity on an advanced multi-step form. Sounds super … easy, right? But HTML doesn't support this!&lt;/p&gt;

&lt;p&gt;Thankfully, the combination of &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Drupal.behaviors&lt;/code&gt;&lt;/span&gt; and jQuery makes it easy to create a work-around! jQuery makes it easy to write the necessary code, &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Drupal.behaviors&lt;/code&gt;&lt;/span&gt; makes it trivial to ensure it keeps working even when new content has been added to the page (i.e. after an AHAH callback).&lt;/p&gt;&lt;p&gt;&lt;a href="http://wimleers.com/blog/drupal.behaviors-jquery-multiple-buttons-with-the-same-name"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/drupal.behaviors-jquery-multiple-buttons-with-the-same-name#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/jquery">jQuery</category>
 <category domain="http://wimleers.com/tags/mollom">Mollom</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/58</wfw:commentRss>
 <pubDate>Sat, 23 Aug 2008 14:54:23 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">58 at http://wimleers.com</guid>
</item>
<item>
 <title>Working at Mollom!</title>
 <link>http://wimleers.com/blog/working-at-mollom</link>
 <description>&lt;p&gt;As some of you may already know, I'm working for &lt;a href="http://mollom.com/" class="external-link"&gt;Mollom&lt;/a&gt; now (summer position).&lt;br /&gt;
The reasons for that should be obvious:
&lt;ul&gt;
&lt;li&gt;It's Drupal work.&lt;/li&gt;
&lt;li&gt;I get to work with &lt;a href="http://buytaert.net/" class="external-link"&gt;Dries&lt;/a&gt;. No explanation needed here I think.&lt;/li&gt;
&lt;li&gt;I get to work with &lt;a href="http://schrauwen.info/benjamin/" class="external-link"&gt;Ben&lt;/a&gt;. Don't know him? Remember this: he's &lt;em&gt;really&lt;/em&gt; smart and that shows in his &lt;a href="http://en.wikipedia.org/wiki/Machine_learning" class="external-link"&gt;machine learning&lt;/a&gt; skills and research (he's got a Ph.D. in that field). He made Mollom's algorithms outstanding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why I was I hired, without even having an interview?&lt;br /&gt;
Well, because &lt;a href="http://www.codinghorror.com/blog/archives/000771.html" class="external-link"&gt; certifications don't say much about a person's real skills&lt;/a&gt;. They only indicate a base level. Even college/university diplomas are becoming less valuable. It's your real experience that matters. And you can see my real experience in my &lt;a href="http://drupal.org/user/99777" class="external-link"&gt;Drupal.org profile&lt;/a&gt;. You can tell that I have a lot Drupal experience, and you can find out the quality of my work by looking in my projects' issue queues and the accompanying code.&lt;br /&gt;
&lt;em&gt;That&lt;/em&gt;'s what really matters.&lt;/p&gt;

&lt;p&gt;From day 2, I've be doing daily calls with Dries, and sometimes with Ben too. I &lt;em&gt;really&lt;/em&gt; like this way of working, and actually I wouldn't have taken the job if I couldn't do it this way: there's &lt;em&gt;nothing&lt;/em&gt; I hate more than losing time because of transportation.&lt;br /&gt;
If I have to travel more than one hour per day, I get annoyed. More than 2 hours and I'll just quit.&lt;/p&gt;
&lt;p&gt;The first day had both crazy (the morning) and cool times (the rest of the day). So I jotted down what happened that day. To read it, continue after the break.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/working-at-mollom"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/working-at-mollom#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/mollom">Mollom</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/57</wfw:commentRss>
 <pubDate>Fri, 25 Jul 2008 17:29:16 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">57 at http://wimleers.com</guid>
</item>
<item>
 <title>What you can expect soon…</title>
 <link>http://wimleers.com/blog/what-you-can-expect-soon%E2%80%A6</link>
 <description>&lt;p&gt;I've been very quiet lately, which was especially noticeable on &lt;a href="http://drupal.org/" class="external-link"&gt;Drupal.org&lt;/a&gt;. Right now, I'm in the middle of my exam period (Computer Graphics exam next Wednesday), but as soon as I can (exams will be finished July 2nd), I will resume my Drupal work:
&lt;ol&gt;
&lt;li&gt;Finish &lt;a href="http://drupal.org/project/hierarchical_select" class="external-link"&gt;Hierarchical Select 3&lt;/a&gt; for Drupal 5&lt;/li&gt;
&lt;li&gt;Port Hierarchical Select 3 to Drupal 6&lt;/li&gt;
&lt;li&gt;Finally do that write-up of my svn system for deploying and maintaing Drupal sites (it's ready since last December, just didn't have the time to do the writing).&lt;/li&gt;
&lt;li&gt;Finish the consolidation of the &lt;a href="http://drupal.org/project/jcarousel" class="external-link"&gt;jCarousel&lt;/a&gt; and &lt;a href="http://drupal.org/project/panels_carousel" class="external-link"&gt;Panels Carousel Style&lt;/a&gt; modules into the &lt;a href="http://drupal.org/project/carousel" class="external-link"&gt;Carousel&lt;/a&gt; module.&lt;/li&gt;
&lt;li&gt;Make the current &lt;a href="http://drupal.org/project/cdn" class="external-link"&gt;CDN Integration&lt;/a&gt; for Drupal 5 module scalable (i.e.: stop using a serialized array to keep track of synced files, which was good enough for development purposes, but painfully slow for production).&lt;/li&gt;
&lt;li&gt;Also port the CDN integration module to Drupal 6.&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://wimleers.com/blog/what-you-can-expect-soon%E2%80%A6"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/what-you-can-expect-soon%E2%80%A6#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/qt">Qt</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/54</wfw:commentRss>
 <pubDate>Sun, 15 Jun 2008 16:09:37 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">54 at http://wimleers.com</guid>
</item>
<item>
 <title>Mollom: spam killer minus the annoyance</title>
 <link>http://wimleers.com/blog/mollom-spam-killer-minus-the-annoyance</link>
 <description>&lt;p&gt;I'm late to the Mollom &lt;a href="http://hojtsy.hu/blog/2008-apr-01/thanks-mollom-protecting-blog-spam" class="external-link"&gt;announcing&lt;/a&gt; &lt;a href="http://kkaefer.com/blog/mollom" class="external-link"&gt;party&lt;/a&gt;, because I was on a &lt;a href="http://wimleers.com/blog/mallorca"&gt;vacation&lt;/a&gt;. Nevertheless, I hope I can still interest some of you with a slightly different angle.&lt;/p&gt;

&lt;p&gt;The major issue with spam prevention is that it often (currently virtually always) involves extra steps for normal users. And more steps means less participation. Less participation means less traffic. And less traffic means less popularity, revenue and whatnot. So clearly there is much to be gained to prevent spam &lt;em&gt;without&lt;/em&gt; annoying normal users.

&lt;p&gt;&lt;a href="http://wimleers.com/blog/mollom-spam-killer-minus-the-annoyance"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/mollom-spam-killer-minus-the-annoyance#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/mollom">Mollom</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/52</wfw:commentRss>
 <pubDate>Sun, 06 Apr 2008 21:12:37 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">52 at http://wimleers.com</guid>
</item>
<item>
 <title>Hierarchical Select 2: the developer perspective</title>
 <link>http://wimleers.com/article/hierarchical-select-2-developer-perspective</link>
 <description>&lt;h3 id="api"&gt;API&lt;/h3&gt;
&lt;p&gt;The API of the previous version of HS was a beast. Well, not the API, but
the implementations. This has been fixed in version 2 of HS: it's now
&lt;em&gt;much&lt;/em&gt; more elegant and &lt;strong&gt;much easier&lt;/strong&gt;. If you don't have
to alter any forms, you can easily implement all hooks in less than a hundred
lines, probably even less. The &lt;span class="setting"&gt;content_taxonomy&lt;/span&gt;
implementation for example, is about 75 lines if you don't count the form
altering. That should make HS much more attractive to other Drupal
developers.&lt;/p&gt;

&lt;h3 id="support-hierarchical-select-dynamically"&gt;Support Hierarchical Select Dynamically&lt;/h3&gt;
&lt;p&gt;One of the low-hanging fruits is to support HS dynamically (i.e. use
hierarchical select form items when HS is installed, use normal selects
otherwise).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wimleers.com/article/hierarchical-select-2-developer-perspective"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/article/hierarchical-select-2-developer-perspective#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/hierarchical-select">Hierarchical Select</category>
 <category domain="http://wimleers.com/tags/modules">modules</category>
 <category domain="http://wimleers.com/tags/usability">usability</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/44</wfw:commentRss>
 <pubDate>Mon, 03 Mar 2008 12:10:16 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">44 at http://wimleers.com</guid>
</item>
<item>
 <title>Hierarchical Select 2</title>
 <link>http://wimleers.com/blog/hierarchical-select-2</link>
 <description>&lt;h3 id="what-is-it"&gt;What &lt;em&gt;is&lt;/em&gt; Hierarchical Select?&lt;/h3&gt;
&lt;p&gt;For those who don't know Hierarchical Select yet, or &lt;em&gt;HS&lt;/em&gt; in short,
this is a module that provides a new &lt;em&gt;form element&lt;/em&gt;. If you're new to
Drupal, you may just have frowned upon reading that. A 'form element' in
Drupal's &lt;a
href="http://api.drupal.org/api/5/file/developer/topics/forms_api.html"&gt;Forms
API&lt;/a&gt; is something like a button, select or textarea element in HTML, or a
&lt;a href="http://en.wikipedia.org/wiki/GUI_widget" class="external-link"&gt;GUI widget&lt;/a&gt; in a GUI.&lt;/p&gt;
&lt;p&gt;Now, the goal of HS is actually very narrow: making selections in
hierarchies (hence its name) really simple: &lt;strong&gt;improve usability&lt;/strong&gt;. The prime
example and candidate for this is of course Drupal's &lt;a
href="http://drupal.org/handbook/modules/taxonomy"&gt;Taxonomy module&lt;/a&gt;. The
idea is to first select an item from the root level, then pick one of its
children (if it has any), then one of the children of the selected child (if
it has any), and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/hierarchical-select-2"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/hierarchical-select-2#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/hierarchical-select">Hierarchical Select</category>
 <category domain="http://wimleers.com/tags/modules">modules</category>
 <category domain="http://wimleers.com/tags/usability">usability</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/46</wfw:commentRss>
 <pubDate>Mon, 03 Mar 2008 12:09:52 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">46 at http://wimleers.com</guid>
</item>
<item>
 <title>The Drupal bank card!</title>
 <link>http://wimleers.com/blog/drupal-bank-card</link>
 <description>&lt;p&gt;At the end of 2007, my bank offered free personalized bank cards, meaning that you can put a photo on it. Only hours before the deadline passed (after this deadline, you'd have to pay, bah!), I thought about it. So I quickly started looking for something cool I could put on my bank card.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/drupal-bank-card"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/drupal-bank-card#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/43</wfw:commentRss>
 <pubDate>Tue, 19 Feb 2008 19:36:39 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">43 at http://wimleers.com</guid>
</item>
<item>
 <title>Drupal 6 released!</title>
 <link>http://wimleers.com/blog/drupal-6-released</link>
 <description>&lt;p&gt;Drupal 6 has been &lt;a href="http://drupal.org/drupal-6.0" class="external-link"&gt;released&lt;/a&gt;! So … what's new, what got better and what became easier?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installation became much easier&lt;/li&gt;
&lt;li&gt;There's a new Forms API property: &lt;a href="http://api.drupal.org/api/file/developer/topics/forms_api_reference.html#ahah" class="external-link"&gt;#ahah&lt;/a&gt;. This made JS integration with the Forms API possible, even without writing a single line of code! This level of JS integration into the Forms API will result in much more usable Drupal sites, since usability of websites is typically determined by the usability of the forms.&lt;/li&gt;
&lt;li&gt;Even more new usability improvements through JS: drag &amp;amp; drop administration for menus, blocks, forums,  taxonomy terms and so on.&lt;/li&gt;
&lt;li&gt;Multilingual Drupal has been made &lt;a href="http://drupal.org/project/l10n_client" class="external-link"&gt;much easier&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;New in core: &lt;a href="http://openid.net/" class="external-link"&gt;OpenID&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;New in core: actions &amp;amp; triggers, for custom workflows (e.g. send an e-mail when somebody commented on your blog).&lt;/li&gt;
&lt;li&gt;New in core: the &lt;a href="http://drupal.org/project/update_status" class="external-link"&gt;Update Status module&lt;/a&gt;. What? Never heard of it? Your Drupal life wasn't complete, then!&lt;/li&gt;
&lt;li&gt;New in core: &lt;a href="http://drupal.org/node/146843" class="external-link"&gt;Schema API&lt;/a&gt;, this allows you to write SQL-agnostic database schemas, and you don't even have to write SQL anymore to load/save your modules' objects!&lt;/li&gt;
&lt;li&gt;New in core: &lt;a href="http://drupal.org/node/180528" class="external-link"&gt;Batch API&lt;/a&gt;, this gives Drupal sites the ability to do processing of huge amounts of information. I think this will result in the creation of many "CMS Foo to Drupal importer" modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that's not even everything … see the &lt;a href="http://drupal.org/drupal-6.0" class="external-link"&gt;announcement&lt;/a&gt; at Drupal.org for more details.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wimleers.com/blog/drupal-6-released"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/drupal-6-released#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/42</wfw:commentRss>
 <pubDate>Wed, 13 Feb 2008 16:21:20 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">42 at http://wimleers.com</guid>
</item>
<item>
 <title>Battle plan for Drupal 7: performance</title>
 <link>http://wimleers.com/blog/battle-plan-drupal-7</link>
 <description>&lt;p&gt;My battle plan for Drupal 7 is simple: get as many performance improvements
or &lt;em&gt;performance-improvement-enablers&lt;/em&gt; from my Drupal page loading
performance article into Drupal 7. From high to lower priority:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://drupal.org/node/214934" class="external-link"&gt;#214934: file_url() and
hook_file_server()&lt;/a&gt; – yep, patch for Drupal 5 already available and in
production use here on this site as well as &lt;a
href="http://drupalbin.com/"&gt;DrupalBin&lt;/a&gt;) – for &lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-2"&gt;rule
2&lt;/a&gt;, &lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-3"&gt;rule
3&lt;/a&gt; and &lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-9"&gt;rule
9&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Automatic CSS sprite generator, for &lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-1"&gt;rule
1&lt;/a&gt;. I still have to play with this to figure out if it's a realistic
goal.&lt;/li&gt;
  &lt;li&gt;GZIP CSS and JS files, for &lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-4"&gt;rule
4&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Put JS files at the bottom by default. However, when at least one JS file
is added to the header, both &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;jquery.js&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drupal.js&lt;/code&gt;&lt;/span&gt;
should be added to the header as well. JS files that alter the appearance of
the site heavily (such as carousels) should always be added to the header, and
guidelines for this should be written, and should be very clear. This is for
&lt;a
href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-6"&gt;rule
6&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/blog/battle-plan-drupal-7"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/battle-plan-drupal-7#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/performance">performance</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/39</wfw:commentRss>
 <pubDate>Mon, 04 Feb 2008 18:11:32 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">39 at http://wimleers.com</guid>
</item>
<item>
 <title>CSS sprite generator open sourced!</title>
 <link>http://wimleers.com/blog/css-sprite-generator-open-sourced</link>
 <description>&lt;p&gt;I already mentioned the &lt;a href="http://spritegen.website-performance.org/" class="external-link"&gt;CSS sprite generator&lt;/a&gt; in my article on &lt;a href="http://wimleers.com/article/improving-drupals-page-loading-performance#rule-1"&gt;Drupal's page loading performance&lt;/a&gt;. More great news though: they &lt;a href="https://launchpad.net/css-sprite-generator/" class="external-link"&gt;open sourced&lt;/a&gt; it! See the blog posts by the authors, &lt;a href="http://muffinresearch.co.uk/archives/2008/02/01/css-sprite-generator-code-available-at-launchpadnet/" class="external-link"&gt;Stuart Colville&lt;/a&gt; and &lt;a href="http://www.ejeliot.com/blog/123" class="external-link"&gt;Ed Eliot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's under the BSD license though, so it would never be accepted on Drupal's CVS repositories, which is a must. I contacted the authors, asking if they would be willing to dual-license it under the GPL.&lt;/p&gt;
&lt;p&gt;The effects of such a module – if technically possible to generate CSS sprites completely autonomously – would be enormous. It would reduce the number of HTTP requests per page considerably: all CSS background images would be aggregated into a single image!&lt;br /&gt;
Even on "just" the Garland theme of a default Drupal 6 installation (this includes a logo and a small Drupal banner at the bottom), this would save 7 HTTP requests per page.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wimleers.com/blog/css-sprite-generator-open-sourced"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/blog/css-sprite-generator-open-sourced#comments</comments>
 <category domain="http://wimleers.com/tags/css">CSS</category>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/performance">performance</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/38</wfw:commentRss>
 <pubDate>Sat, 02 Feb 2008 01:23:11 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">38 at http://wimleers.com</guid>
</item>
<item>
 <title>Improving Drupal's page loading performance</title>
 <link>http://wimleers.com/article/improving-drupals-page-loading-performance</link>
 <description>&lt;h3 id="intro"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Google dominates the search engine market for a large part thanks to its
spartan, no-bells-nor-whistles interfaces. But also thanks to its incredible
speed (which is partially thanks to that spartan interface, of course).&lt;/p&gt;
&lt;p&gt; Since you're reading this article, you're probably a Drupal developer.
It's pretty likely that you've had some visitors of your Drupal-powered web
site complain about slow page load times. It doesn't matter whether your
server(s) are shared, VPSes or even dedicated servers. Visitors that live
abroad – i.e. far from where your servers are located – will face the same
performance issues, but at even worse scales.&lt;br /&gt;This article is about
tackling these issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://wimleers.com/article/improving-drupals-page-loading-performance"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://wimleers.com/article/improving-drupals-page-loading-performance#comments</comments>
 <category domain="http://wimleers.com/tags/apache">apache</category>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/performance">performance</category>
 <enclosure url="http://wimleers.cachefly.net/wimleers.com/sites/wimleers.com/files/JS at the bottom - Drupal 5.patch" length="1110" type="" />
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/31</wfw:commentRss>
 <pubDate>Wed, 30 Jan 2008 00:33:14 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">31 at http://wimleers.com</guid>
</item>
<item>
 <title>TextMate command to look up functions at api.drupal.org</title>
 <link>http://wimleers.com/blog/textmate-command-look-functions-api.drupal.org</link>
 <description>&lt;p&gt;Is it also for you a routine to look up the documentation for Drupal hooks at &lt;a href="http://api.drupal.org" class="external-link"&gt;api.drupal.org&lt;/a&gt;?&lt;br /&gt;
If you also use TextMate and are sick of having to command-tab to your browser to get to the documentation, then you'll have a much better alternative in about 15 seconds.&lt;/p&gt;
&lt;p&gt;Go to &lt;em&gt;Bundles &amp;gt; Bundle Editor &amp;gt; Show Bundle Editor&lt;/em&gt;. There, click the plus-button in the bottom left corner to add a new command. Set the input to &lt;em&gt;None&lt;/em&gt;, the output to &lt;em&gt;Show as Tool Tip&lt;/em&gt; and the scope selector to &lt;code&gt;source.php&lt;/code&gt;. Copy/paste the command below and assign a shortcut -- I use CTRL + D.&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;if grep &amp;lt;&amp;lt;&amp;lt;${TM_CURRENT_WORD:-!} -Esq &amp;#039;^[a-zA-Z0-9_]+$&amp;#039;&lt;br /&gt;	then&lt;br /&gt;		FILENAME=${TM_FILEPATH##*/}&lt;br /&gt;		BASENAME=${FILENAME%%.*};&lt;br /&gt;		if [ `echo &amp;quot;$TM_CURRENT_WORD&amp;quot; | grep -E &amp;quot;${BASENAME}_[0-9A-Za-z_]&amp;quot;` ]&lt;br /&gt;		then&lt;br /&gt;			HOOK=${TM_CURRENT_WORD##${BASENAME}}&lt;br /&gt;			URL=&amp;quot;http://api.drupal.org/apis/5/hook${HOOK}&amp;quot;&lt;br /&gt;		else&lt;br /&gt;			URL=&amp;quot;http://api.drupal.org/apis/5/${TM_CURRENT_WORD}&amp;quot;&lt;br /&gt;		fi&lt;br /&gt;		exit_show_html &amp;quot;&amp;lt;meta http-equiv=&amp;#039;Refresh&amp;#039; content=&amp;#039;0;URL=$URL&amp;#039;&amp;gt;&amp;quot;&lt;br /&gt;	else echo &amp;quot;Nothing to lookup (hint: place the caret on a function name)&amp;quot;&lt;br /&gt;fi&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;If you now place the cursor above a Drupal core function and press the shortcut, you'll be presented with a direct lookup of that function at api.drupal.org. Better even, if you place the cursor on a hook implementation, e.g. &lt;code&gt;mymodule_menu&lt;/code&gt;, then you'll get the documentation of &lt;code&gt;hook_menu&lt;/code&gt;. Note that your file must be saved for this to work (and it must be named according to Drupal conventions, i.e. &lt;em&gt;mymodule.module&lt;/em&gt;).&lt;/p&gt;
</description>
 <comments>http://wimleers.com/blog/textmate-command-look-functions-api.drupal.org#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/textmate">TextMate</category>
 <category domain="http://wimleers.com/tags/workflow">workflow</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/9</wfw:commentRss>
 <pubDate>Mon, 26 Nov 2007 07:01:48 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">9 at http://wimleers.com</guid>
</item>
<item>
 <title>CVS diff with new files: fakeadd</title>
 <link>http://wimleers.com/blog/cvs-diff-new-files-fakeadd</link>
 <description>&lt;p&gt;Ever been disgruntled by the fact that you can't do a &lt;code&gt;cvs diff&lt;/code&gt; with new files, because you haven't got write access on a Drupal contrib module's CVS repository and thus can't &lt;code&gt;cvs add&lt;/code&gt; those new files? There's a solution though: edit CVS's &lt;em&gt;Entries&lt;/em&gt; file. But who likes manually modifying files over and over again?&lt;/p&gt;
&lt;p&gt;The solution: &lt;a href="http://www.cygwin.com/ml/binutils/2004-04/msg00537/fakeadd" class="external-link"&gt;fakeadd&lt;/a&gt;! (I've attached the file to this post in case this site ever goes down.) This nice shellscript allows you to update the &lt;em&gt;Entries&lt;/em&gt; file using a simple syntax: &lt;code&gt;fakeadd&amp;nbsp; newfile.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A quick install how-to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Save the file to a location of your choice, I've saved it in &lt;code&gt;~/scripts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open your &lt;code&gt;~/.bash_profile&lt;/code&gt; file (if you're using the bash shell, this is the default shell on OS X) and add the following:&lt;br /&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;# Add custom scripts, such as the CVS fakeadd script.&lt;br /&gt;export PATH=$PATH:~/scripts&lt;/code&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Finally, make the script executable: &lt;code&gt;chmod +x ~/scripts/fakeadd&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;
</description>
 <comments>http://wimleers.com/blog/cvs-diff-new-files-fakeadd#comments</comments>
 <category domain="http://wimleers.com/tags/cvs">CVS</category>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <enclosure url="http://wimleers.cachefly.net/wimleers.com/sites/wimleers.com/files/fakeadd" length="665" type="application/octet-stream" />
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/4</wfw:commentRss>
 <pubDate>Tue, 30 Oct 2007 09:53:16 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">4 at http://wimleers.com</guid>
</item>
<item>
 <title>New module: Hierarchical Select</title>
 <link>http://wimleers.com/blog/new-module-hierarchical-select</link>
 <description>&lt;p&gt;Almost 3 weeks two months ago now, I have released the &lt;a href="http://drupal.org/project/hierarchical_select" class="external-link"&gt;Hierarchical Select&lt;/a&gt; module. (This post was originally written during the DrupalCon, but time has been sparse since then and bugs were there, which is why I'm posting this so late.) It defines a new form element: &lt;em&gt;hierarchical_select&lt;/em&gt;. It makes the selection of something in a hierarchy much more usable. By default, selects of the taxonomy module (on node forms) are forced to use hierarchical selects - if the vocabulary is hierarchical. The same is applied to &lt;a href="http://drupal.org/project/content_taxonomy" class="external-link"&gt;content_taxonomy&lt;/a&gt; CCK fields, when the &lt;em&gt;select&lt;/em&gt; widget is used.&lt;br /&gt;
Note that the hierarchical select form element does not support the selection of multiple items. And obviously, it only selects the "deepest" item.&lt;br /&gt;
I'll immediately skip to the demo, because a &lt;a href="http://wimleers.com/demo/hierarchical-select"&gt;live demo&lt;/a&gt; says so much more than words.&lt;/p&gt;
&lt;h3&gt;And it has an API!&lt;/h3&gt;
&lt;p&gt;This part is only interesting to people who want to make use of this form element for other modules than taxonomy.&lt;/p&gt;
&lt;p&gt;The module comes with an API, so that any module that manages some sort of hierarchy, can define a rendering function that will be used to render the hierarchical selects. It can't be done completely automagically, because it varies greatly from case to case what input data is necessary to generate the necessary tree structure.&lt;br /&gt;
For example: taxonomy needs a &lt;em&gt;vocabulary id&lt;/em&gt; and the id of the currently selected term (&lt;em&gt;term id&lt;/em&gt;). Another module may only require one id, while another may require 3 ids. You will always get the id of the newly selected item in any of the selects back (which is the &lt;em&gt;term id&lt;/em&gt; in the case of taxonomy).&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;hook_hierarchical_select_render($hsid, $selection, $params)&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$hsid&lt;/strong&gt; - hierarchical select id, will just be used as a unique identifier in the HTML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$selection&lt;/strong&gt; - the value of the item that was selected by the user&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$params&lt;/strong&gt; - an array of parameters that are passed around, these are considered "static", e.g. the vocabulary id&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;You can look at &lt;code&gt;modules/taxonomy.inc&lt;/code&gt; for an example implementation. See &lt;code&gt;API.txt&lt;/code&gt; for details.&lt;/p&gt;
&lt;h4&gt;Future: Drupal 6 and CCK 2&lt;/h4&gt;
&lt;p&gt;There's room for improvements in the API. But that'll be for a second version, which will be Drupal 6 only, because of the interesting change in CCK 2: CCK widgets will simply be FAPI form elements. That means that we'll be able to use the hierarchical select form element for several CCK fields!&lt;/p&gt;
</description>
 <comments>http://wimleers.com/blog/new-module-hierarchical-select#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/modules">modules</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/25</wfw:commentRss>
 <pubDate>Sat, 27 Oct 2007 14:05:42 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">25 at http://wimleers.com</guid>
</item>
<item>
 <title>Post-Pre-DrupalCon Social</title>
 <link>http://wimleers.com/blog/post-pre-drupalcon-social</link>
 <description>&lt;p&gt;Last night we had the &lt;a href="http://barcelona2007.drupalcon.org/node/787" class="external-link"&gt;Pre-DrupalCon Social&lt;/a&gt; near La Rambla. For me, it were a lot of new faces (it's my first DrupalCon after all). Among them were the most infamous Drupal developers: eaton, webchick, jeff (well, all Lullabots really), chx, Heine and so on. Geeky stuff, good times!&lt;br /&gt;
After some cosy chatting, we got to dinner. But apparently the venue, &lt;a href="http://www.somos.tv/" class="external-link"&gt;Muebles Ciudad&lt;/a&gt;, only offer Japanese food. So it was a shot in the dark for me, and the first time ever I had to eat with sticks. I finished much later than the rest, but at least I managed to eat &lt;em&gt;something&lt;/em&gt; :P. I don't think I'll eat it again any time soon though. French fries ... hmmmmm.&lt;/p&gt;
&lt;p&gt;At about 10 PM we returned back to the hotel, because &lt;a href="http://www.garfieldtech.com/" class="external-link"&gt;Larry "Crell" Garfield&lt;/a&gt;, my roommate, still had to finish the code examples for his &lt;a href="http://barcelona2007.drupalcon.org/node/350" class="external-link"&gt;Drupal and PHP 5 presentation&lt;/a&gt; of today. Since &lt;a href="http://drupal4hu.com/" class="external-link"&gt;chx&lt;/a&gt; will also be talking in that presentation, he joined us, so they could go through the presentation -- and to show off his brand new &lt;a href="http://drupal.org/project/simpletest_automator" class="external-link"&gt;Simpletest Automator&lt;/a&gt; module of course :). It's a really powerful tool that will hopefully make unit testing in Drupal a common thing.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/wimleers/1405148526" title="Larry &amp;amp; chx" class="external-link"&gt;&lt;img src="/http://farm2.static.flickr.com/1392/1405148526_e87989b1a8_m.jpg" alt="Larry &amp;amp; chx" title="Larry &amp;amp; chx"  class=" flickr-photo-img" height="180" width="240" /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
 <comments>http://wimleers.com/blog/post-pre-drupalcon-social#comments</comments>
 <category domain="http://wimleers.com/tags/barcelona">Barcelona</category>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/drupalcon">DrupalCon</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/22</wfw:commentRss>
 <pubDate>Wed, 19 Sep 2007 07:50:02 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">22 at http://wimleers.com</guid>
</item>
<item>
 <title>New in Panels 2: Mini Panels and Panel Styles</title>
 <link>http://wimleers.com/blog/new-panels-2-mini-panels-and-panel-styles</link>
 <description>&lt;p&gt;A couple of weeks ago, I agreed to work on the &lt;a href="http://drupal.org/node/160392" class="external-link"&gt;Panels Mini&lt;/a&gt; module, which would become part of the second version of &lt;a href="http://angrydonuts.com" class="external-link"&gt;Earl Miles&lt;/a&gt;' outstanding &lt;a href="http://drupal.org/project/panels" class="external-link"&gt;Panels&lt;/a&gt; module. While working on that, I suggested to let modules implement styles for panels. (I was inspired by &lt;a href="http://drupal.org/user/4481" class="external-link"&gt;Nedjo Rogers&lt;/a&gt;' &lt;a href="http://drupal.org/project/panelsblock" class="external-link"&gt;Panelsblock&lt;/a&gt; module, which sort of gives you "tabbed Mini Panels" for Panels 1). All you then would have to do, is: pick the Panel Style in the settings for the Mini Panel (or whatever other Panels implementation chooses to support it) and then change the CSS to get exactly what you want. This should prove to be a real timesaver.&lt;/p&gt;
&lt;h3&gt;More about Panel Styles&lt;/h3&gt;
&lt;p&gt;I've written 2 Panel Styles so far: &lt;a href="http://drupal.org/project/panels_carousel" class="external-link"&gt;Carousel Panel Style&lt;/a&gt; and &lt;a href="http://drupal.org/project/panels_tabs" class="external-link"&gt;Tabs Panel Style&lt;/a&gt;. The latter might be included in Panels 2. Both were sponsored by Paul Ektov.&lt;br /&gt;
To write a Panel Style, you only have to implement 2 hooks, or 4 hooks if you want to offer configuration options. Hopefully that will result in many contributed Panel Styles!&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;hook_panels_panel_style_info()&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;returns an array of Panel Styles that the module implements, along with some metadata&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;hook_panels_panel_style_render()&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;receives the Panel Style configuration and an array of (rendered) panes, returns the rendered HTML&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;hook_panels_panel_style_settings_form()&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;(optional) defines a form if your Panel Style supports some configuration options&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;hook_panels_panel_style_settings_validate()&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;(optional) validation function for the form of the previous hook&lt;/dd&gt;
&lt;/dl&gt;
&lt;h3&gt;(Fancy?) Demo&lt;/h3&gt;
&lt;p&gt;Without further ado, a fairly fancy &lt;a href="http://wimleers.com/demo/mini-panels"&gt;demo of all this&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;I want this yummy stuff too! Where can I get it?&lt;/h3&gt;
&lt;p&gt;Mini Panels and the Panel Styles hooks are available in the Panels 2 CVS, and will be included in Panels 2 alpha 8 when it gets released. Be warned that Panels 2 is still a work in progress!&lt;/p&gt;
</description>
 <comments>http://wimleers.com/blog/new-panels-2-mini-panels-and-panel-styles#comments</comments>
 <category domain="http://wimleers.com/tags/drupal">Drupal</category>
 <category domain="http://wimleers.com/tags/jquery">jQuery</category>
 <category domain="http://wimleers.com/taxonomy/term/37">Panels</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wimleers.com/crss/node/19</wfw:commentRss>
 <pubDate>Fri, 24 Aug 2007 00:15:36 +0000</pubDate>
 <dc:creator>Wim Leers</dc:creator>
 <guid isPermaLink="false">19 at http://wimleers.com</guid>
</item>
</channel>
</rss>
