<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <channel>
    
    <title>Low Weblog</title>
    <link>http://loweblog.com/</link>
    <description>Developer blog by Lodewijk Schutte ~ Low, about ExpressionEngine and more.</description>
    <dc:language>en</dc:language>
    <dc:creator>Low</dc:creator>
    <dc:rights>Copyright 2011</dc:rights>
    <dc:date>2011-08-15T11:38:37+00:00</dc:date>
    <admin:generatorAgent rdf:resource="http://expressionengine.com/" />
    

    <item>
      <title>go to Low</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fgo-to-low%2F&amp;seed_title=go+to+Low</link>
      <guid>http://loweblog.com/freelance/article/go&#45;to&#45;low/</guid>
      <description>So yeah, I moved all my ExpressionEngine add&#45;on&#45;related stuff to gotolow.com. Read the blog post over there to see what&#8217;s what and make the necessary changes in your bookmarks. So remember, for ExpressionEngine add&#45;ons: go to Low.</description>
      <dc:subject>Announcements, ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>So yeah, I moved all my ExpressionEngine add-on-related stuff to <a href="http://gotolow.com/">gotolow.com</a>. Read the <a href="http://gotolow.com/blog/launch">blog post over there</a> to see what&#8217;s what and make the necessary changes in your bookmarks. So remember, for ExpressionEngine add-ons: <a href="http://gotolow.com/">go to Low</a>.</p>
]]></content:encoded>
      <dc:date>2011-08-15T11:38:37+00:00</dc:date>
    </item>

    <item>
      <title>Sound familiar?</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fsound-familiar%2F&amp;seed_title=Sound+familiar%3F</link>
      <guid>http://loweblog.com/freelance/article/sound&#45;familiar/</guid>
      <description>So, I was just listening to @jmathias on the EE Podcast, where &#8212; among other things &#8212; James talked about Pixel &#038; Tonic&#8217;s Assets add&#45;on for ExpressionEngine. He applauded the add&#45;on, but one of the remarks he made was that he thought it is &#8220;inherently wrong to mimic Finder&#8221; because it is &#8220;unfamiliar to a large portion of users&#8221;.</description>
      <dc:subject>ExpressionEngine, Rants</dc:subject>
      <content:encoded><![CDATA[<p>So, I was just listening to <a href="http://twitter.com/jmathias">@jmathias</a> on the <a href="http://ee-podcast.com/episodes/ellislab-qa-with-james-mathias">EE Podcast</a>, where &#8212; among other things &#8212; James talked about <a href="http://pixelandtonic.com/">Pixel &#038; Tonic</a>&#8217;s Assets add-on for <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>. He applauded the add-on, but one of the remarks he made was that he thought it is &#8220;inherently wrong to mimic Finder&#8221; because it is &#8220;unfamiliar to a large portion of users&#8221;.</p>
<p>I must admit, I am an OS X user and I haven&#8217;t yet taken a look at <a href="http://pixelandtonic.com/assets">Assets</a>, but I can say this. Lack of familiarity does not mean bad UX. It just means unfamiliar. If you take the two extreme positions, you could make a file interface either like Windows Explorer or Mac OS X Finder. Choosing either of the two will exclude the other, so no good choice could be made, according to that stance. Trying to come up with something entirely new is very difficult indeed and will very certainly be unfamiliar to all of your users. And this idea is true for any kind of interface, not just a file manager.</p>
<p>To conclude, I think it&#8217;s wrong to dismiss an interface/design/UX, just because it&#8217;s unfamiliar to a certain portion of your users. It most definitely is not &#8220;inherently wrong&#8221;. It&#8217;s a matter of how easy it is to get familiar with the interface, not how familiar you already are. If an interface &#8220;just works&#8221;, familiarity is irrelevant. Plus, do not dismiss the joy of working with a piece of software. If OS X wasn&#8217;t such a joy to work with, I never would have switched from Windows to Mac, despite the fact that I was unfamiliar with Finder the first time I worked on a Mac.</p>
]]></content:encoded>
      <dc:date>2011-07-21T21:25:35+00:00</dc:date>
    </item>

    <item>
      <title>Book review: Building websites with EE2</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fbook-review-building-websites-with-ee2%2F&amp;seed_title=Book+review%3A+Building+websites+with+EE2</link>
      <guid>http://loweblog.com/freelance/article/book&#45;review&#45;building&#45;websites&#45;with&#45;ee2/</guid>
      <description>A couple of months ago, I received an email from Packt Publishing asking me to review their book Building Websites with ExpressionEngine 2. I thought &#8220;why not&#8221; and received a copy to review. Apparently, I wasn&#8217;t the only one &#8212; Tony Geer recently posted his review of the same book. Well then, here&#8217;s mine.</description>
      <dc:subject>ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>A couple of months ago, I received an email from Packt Publishing asking me to review their book <a href="http://link.packtpub.com/UHKowE">Building Websites with ExpressionEngine 2</a>. I thought &#8220;why not&#8221; and received a copy to review. Apparently, I wasn&#8217;t the only one &#8212; Tony Geer <a href="http://www.tonygeer.com/2010/12/18/building-websites-with-expressionengine-2-book-review/">recently posted his review</a> of the same book. Well then, here&#8217;s mine.</p>
<p><a href="http://link.packtpub.com/UHKowE" style="float:left;border:none;margin:0 1em 1em 0;background:none"><img src="http://loweblog.com/images/uploads/ee-book.jpg" alt="Book: Building Websites with ExpressionEngine 2" width="125" height="152" style="border:none" /></a> One of the first things mentioned in the book is who it is intended for. It is made clear it&#8217;s intended for novices and beginners of <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>, not for experienced developers. Considering myself the latter, I wondered if I actually <em>could</em> review the book as I do not belong to the focus group. I decided to look more at the validity of the technical details described in the book.</p>
<h2 style="clear:left">Hands on</h2>
<p>The book takes the approach of guiding the reader through the process of building an example website. This is a good approach of getting to know EE hands-on. That said, it would be even better for novices to not stick to one method or book only, but look into other resources, too. </p>
<p>After the introduction, the book goes on with a chapter about installation on a local server,  which includes instruction on how to hide (or rename) the index.php from your urls. Here I felt like a bit too much attention went to setting up a .htaccess file. After all, hiding the index.php is not an officially supported EE feature. I&#8217;d probably give it a mention and leave it at that.</p>
<p>The book continues with a basic control panel tour, which includes the Template Manager. Combined with the following chapter &#8220;Moving a Website to ExpressionEngine&#8221;, it provides a explanation of EE&#8217;s basic features and workings. The next chapter, &#8220;Creating a Fully-Equipped Channel&#8221; expands on that with features like Comments and RSS.</p>
<p>All the steps are quite verbose and accompanied by plenty of screenshots; I&#8217;m sure newbies would appreciate this do-as-I-do-approach. Even better, there are so-called &#8220;Challenges&#8221; at the end of these chapters to encourage the reader to think for themselves instead of just following instructions. This is a good way of trying to trigger that ever important EE Lightbulb Moment&#8482;.</p>
<p>Personally, I would have preferred to see a more detailed description about the template parser &#8212; explaining a bit more how variables, tags, embeds and snippets work together.</p>
<h2>The basics and a bit more</h2>
<p>After dealing with the basics, the book explains the Member module for a bit. Then two examples are described: how to create a calendar and a Photo Gallery. Now, although practical and explained in detail, I tend to dislike that both these examples require the jQuery plugin FancyBox to work. Also, the html used in these examples isn&#8217;t the prettiest I&#8217;ve ever seen. For example, on page 217 it says:</p>
<blockquote><p>It makes sense to display the thumbnails in a table.</p></blockquote>
<p>No, it doesn&#8217;t. Thumbnails aren&#8217;t tabular data. Just use a list and css to style it the way you want. Despite that the markup has little to nothing to do with EE, it does affect my opinion on the book.</p>
<p>This trend continues for the rest of the book. In chapter 9 &#8220;Beyond the basics&#8221;, other modules like Search, Mailing List and Email are described. All the examples are based on the example site, which should be installed on your local machine. Because of this, the following warning is found throughout the book (eg. page 248):</p>
<blockquote><p>Remember that if you are following along in a localhost environment, you will not actually be able to send outgoing e-mails</p></blockquote>
<p>This may be the case in the author&#8217;s environment, but the MAMP installation on my Mac sure can. I find inaccuracies like this annoying and not very professional.</p>
<p>The final chapter deals with backing up and upgrading EE, as well as extending it with add-ons. I was pleasantly surprised to find own name in the list of developers like <a href="http://pixelandtonic.com/">Pixel &#038; Tonic</a>, <a href="http://www.newism.com.au/">Newism</a> and <a href="http://www.solspace.com/">Solspace</a>. Too bad <a href="http://www.ngenworks.com/">nGen Works</a> is held responsible for <a href="http://buildwithstructure.com/">Structure</a> instead of its authors <a href="http://twitter.com/rockthenroll">Travis Schmeisser</a> and <a href="http://twitter.com/jackmcdade">Jack McDade</a> &#8212; another inaccuracy.</p>
<h2>Conclusion</h2>
<p><a href="http://link.packtpub.com/UHKowE">Building Websites with ExpressionEngine 2</a> is a solid book, especially for its focus group. Despite some glitches in the details, the technical side of things is described in detail and correctly. I have glanced at <a href="http://www.mijingo.com/products/books/expressionengine-2-quickstart-guide/">Ryan Irelan&#8217;s book</a>, and I reckon having both books would be most beneficial to someone just starting out with the excellence that is <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>.</p>
]]></content:encoded>
      <dc:date>2010-12-21T20:58:35+00:00</dc:date>
    </item>

    <item>
      <title>User generated forms in EE</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fuser-generated-forms-in-ee%2F&amp;seed_title=User+generated+forms+in+EE</link>
      <guid>http://loweblog.com/freelance/article/user&#45;generated&#45;forms&#45;in&#45;ee/</guid>
      <description>Recently, I released a new ExpressionEngine add&#45;on: Low Freeform Field. This simple field type generates a drop down list with available Freeform fields and will display the selected field name in your templates. Now, this isn&#8217;t a big deal by itself, but combined with Matrix, it can allow you to create forms with channel entries. Let me show you how.</description>
      <dc:subject>ExpressionEngine, Forms</dc:subject>
      <content:encoded><![CDATA[<p>Recently, I released a new <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> add-on: <a href="http://loweblog.com/software/low-freeform-field/">Low Freeform Field</a>. This simple field type generates a drop down list with available Freeform fields and will display the selected field name in your templates. Now, this isn&#8217;t a big deal by itself, but combined with Matrix, it can allow you to create forms with channel entries. Let me show you how.</p>
<h2>Freeform and Matrix</h2>
<p>First of all, you need to have <a href="http://www.solspace.com/software/detail/freeform/">Freeform</a> installed, a free from managing module by the add-on veterans at <a href="http://www.solspace.com/">Solspace</a>. In Freeform, you can define different form fields that can be populated by any number of forms. The only down side is, you still have to create the HTML for those forms in your templates and there&#8217;s no good way to automate this. Until now.</p>
<p>Secondly, you&#8217;ll need <a href="http://pixelandtonic.com/matrix">Pixel &#038; Tonic&#8217;s Matrix</a>. This field type allows you to create tabular data in channel entries, which can be used in a plethora of ways. You define the columns, and the client can add as many rows to the matrix as desired. <a href="http://pixelandtonic.com/">Pixel &#038; Tonic</a> is also responsible for many other great field types, like <a href="http://pixelandtonic.com/divebar">P&#038;T List</a> which we&#8217;ll use in this example, too.</p>
<h2>Channel and Fields</h2>
<p>Now, to start automating from creation, we&#8217;ll create a designated channel called Forms. To this channel, we&#8217;ll add a couple of custom fields, for example:</p>
<ul>
<li><code>form_description</code>: a textarea for adding a form description;</li>
<li><code>form_fields</code>: a matrix field with all the form fields for this form;</li>
<li><code>form_feedback</code>: a textarea for the message displayed to the user after submitting the form;</li>
<li><code>form_notify</code>: a text input field where you can enter email addresses that will receive form notifications.</li>
</ul>
<p>The fun starts with the Matrix field. To that, we&#8217;ll add the following columns:</p>
<ul>
<li><code>field_name</code>: the <a href="http://loweblog.com/software/low-freeform-field/">Low Freeform Field</a>;</li>
<li><code>field_label</code>: the label associated with the form field;</li>
<li><code>field_type</code>: a drop down to determine the type of input field, eg. text, textarea, select, radio, checkbox&#8230;</li>
<li><code>field_options</code>: if the type is select, radio or checkbox, you can use this field to define the different options. <a href="http://pixelandtonic.com/divebar">P&#038;T List</a> is really useful here;</li>
<li><code>field_required</code>: a checkbox to select whether this field is required or not.</li>
</ul>
<p>You could add more columns if needed. For example, you could add a <code>field_class</code> for custom styling or <code>field_notes</code> if you need to display per-field instructions. Below is a screenshot of the publish form with the above settings, but as you can imagine, the possibilities are endless.</p>
<p><a href="/images/screenshots/user-form.png" rel="lightbox"><img src="/images/screenshots/user-form-thumb.png" alt="Publish form with Matrix and Low Freeform Field" width="540" height="100" /></a></p>
<h2>The template</h2>
<p>To bring it all together, we need to create a clever template. You could get creative and use an embed and relationships to add forms to other entries, but in this case, we&#8217;ll add the code to the index template in the <code>forms</code> template group. A link to a single form would look like this: <code>domain.com/forms/my-custom-form</code>. Here&#8217;s some code to go with it:</p>
<pre><code>&#123;exp:channel:entries channel=&#34;forms&#34; limit=&#34;1&#34;&#125;

  &#60;h1&#62;&#123;title&#125;&#60;/h1&#62;

  &#123;if segment_3 == 'thanks'&#125;
    &#123;form_feedback&#125;
  &#123;/if&#125;

  &#123;if segment_3 != 'thanks'&#125;

    &#123;form_description&#125;

    &#123;exp:freeform:form
      collection=&#34;&#123;title&#125;&#34;
      notify=&#34;&#123;form_notify&#125;&#34;
      required=&#34;&#123;form_fields search:field_required=&#34;y&#34; backspace=&#34;1&#34;&#125;&#123;field_name&#125;&#124;&#123;/form_fields&#125;&#34;
      return=&#34;&#123;segment_1&#125;/&#123;segment_2&#125;/thanks&#34;&#125;

      &#60;fieldset&#62;
        &#123;form_fields&#125;

          &#60;label for=&#34;&#123;field_name&#125;&#34;&#62;
            &#123;field_label&#125;
            &#123;if field_required == 'y'&#125; &#60;span class=&#34;required&#34;&#62;*&#60;/span&#62;&#123;/if&#125;
          &#60;/label&#62;

          &#123;if field_type == 'text'&#125;
            &#60;input type=&#34;text&#34; name=&#34;&#123;field_name&#125;&#34; id=&#34;&#123;field_name&#125;&#34; /&#62;
          &#123;if:elseif field_type == 'textarea'&#125;
            &#60;textarea name=&#34;&#123;field_name&#125;&#34; id=&#34;&#123;field_name&#125;&#34; rows=&#34;10&#34; cols=&#34;40&#34;&#62;&#60;/textarea&#62;
          &#123;if:elseif field_type == 'select'&#125;
            &#60;select name=&#34;&#123;field_name&#125;&#34; id=&#34;&#123;field_name&#125;&#34;&#62;
              &#123;field_options&#125;
                &#60;option value=&#34;&#123;item&#125;&#34;&#62;&#123;item&#125;&#60;/option&#62;
              &#123;/field_options&#125;
            &#60;/select&#62;
          &#123;if:elseif field_type == 'radio'&#125;
            &#123;field_options&#125;
              &#60;label&#62;&#60;input type=&#34;radio&#34; name=&#34;&#123;field_name&#125;&#34; value=&#34;&#123;item&#125;&#34; /&#62; &#123;item&#125;&#60;/label&#62;
            &#123;/field_options&#125;
          &#123;if:elseif field_type == 'checkbox'&#125;
            &#123;field_options&#125;
              &#60;label&#62;&#60;input type=&#34;checkbox&#34; name=&#34;&#123;field_name&#125;[]&#34; value=&#34;&#123;item&#125;&#34; /&#62; &#123;item&#125;&#60;/label&#62;
            &#123;/field_options&#125;
          &#123;/if&#125;

        &#123;/form_fields&#125;
        &#60;button type=&#34;submit&#34;&#62;Submit form&#60;/button&#62;
      &#60;/fieldset&#62;

    &#123;/exp:freeform:form&#125;
  &#123;/if&#125;

&#123;/exp:channel:entries&#125;</code></pre>
<p>After opening the channel:entries tag, we&#8217;ll open the freeform:form tag, using the entry&#8217;s title as the form collection. Using Matrix&#8217; search option, we&#8217;ll define freeform&#8217;s required parameter. We can set more parameters, depending on the channel fields available.</p>
<p>Then we&#8217;ll loop through the <code>form_fields</code>. Use an advanced conditional to account for all the different input types and loop through the <code>field_options</code> if necessary. As you can see, the output is fully customisable.</p>
<h2>Awesomeness achieved</h2>
<p>This approach allows for fairly flexible custom forms, and with a bit of creative thinking, you could make it even better.</p>
<p>[ETA] Great minds think alike, so it seems. Here&#8217;s a write-up for <a href="http://trevordavis.net/blog/freeform-fieldframe-expressionengine-form-builder/">the same idea in EE1</a> that I wasn&#8217;t aware of.</p>
]]></content:encoded>
      <dc:date>2010-10-18T07:24:28+00:00</dc:date>
    </item>

    <item>
      <title>Nesting tags and performance in EE</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fnesting-tags-and-performance-in-ee%2F&amp;seed_title=Nesting+tags+and+performance+in+EE</link>
      <guid>http://loweblog.com/freelance/article/nesting&#45;tags&#45;and&#45;performance&#45;in&#45;ee/</guid>
      <description>Not too long ago, I tweeted:
Pro tip: don&#8217;t ever, ever nest a channel:entries tag inside another tag that loops. Srsly. Don&#8217;t. #eecms
&#8230;which sparked some response. The main reason for not nesting ExpressionEngine&#8217;s channel:entries tags is performance. Let me explain with an example.</description>
      <dc:subject>Categories, ExpressionEngine, Performance, PHP</dc:subject>
      <content:encoded><![CDATA[<p>Not too long ago, I <a href="http://twitter.com/low/status/25056074304">tweeted</a>:</p>
<blockquote><p>Pro tip: don&#8217;t ever, ever nest a channel:entries tag inside another tag that loops. Srsly. Don&#8217;t. #eecms</p></blockquote>
<p>&#8230;which sparked <a href="http://twitter.com/RobertEerhart/status/25058396824">some</a> <a href="http://twitter.com/joelbradbury/status/25062205927">response</a>. The main reason for not nesting ExpressionEngine&#8217;s channel:entries tags is <em>performance</em>. Let me explain with an example.</p>
<h2>Category archives</h2>
<p><a href="http://expressionengine.com/index.php?affiliate=lodewijk&#038;page=user_guide/modules/channel/category_archive.html">EE&#8217;s category archives tag</a> is limited. To overcome this, some people use a channel:entries tag inside a channel:categories tag. Something like this:</p>
<pre><code>&#123;exp:channel:categories channel=&#34;news&#34; style=&#34;linear&#34; disable=&#34;category_fields&#34;&#125;
  &#60;h2&#62;&#123;category_name&#125;&#60;/h2&#62;
  &#123;exp:channel:entries channel=&#34;news&#34; category=&#34;&#123;category_id&#125;&#34; dynamic=&#34;no&#34; disable=&#34;member_data&#124;pagination&#124;category_fields&#34;&#125;
    &#60;h3&#62;&#123;title&#125;&#60;/h3&#62;
    &#123;news_body&#125;
  &#123;/exp:channel:entries&#125;
&#123;/exp:channel:categories&#125;</code></pre>
<p>Now, this will work. However, given enough content, this will slow your site down considerably. The number of queries that will be executed to generate the output is <em>not fixed</em>. Instead, a new channel:entries tag will be generated for each category found, which will result in an <em>unknown number</em> of queries. Dozens at least, hundreds if you have lots of content.</p>
<p>I did a test where I pasted the above code in an empty template, turned on the profiler and checked the number of queries used. With 4 categories and 6 entries, it took <strong>41</strong> queries to generate the page. Then I added a new entry in a new category and reloaded the page. This time it took <strong>45</strong> queries. Just imagine what would happen if there are 20 categories with 200 entries. And that&#8217;s not even a lot.</p>
<h2>Fix it</h2>
<p>To fix this potential problem, we need to make sure the amount of queries needed to generate the page is <em>fixed</em>. We can achieve this by un-nesting the two tags and using PHP on Output. The code is a bit more complicated, but it will improve performance dramatically. Here&#8217;s the code in full. I&#8217;ll explain each bit below.</p>
<pre><code>&#60;?php
  $entries = array();

  &#123;exp:channel:entries channel=&#34;news&#34; dynamic=&#34;no&#34; disable=&#34;member_data&#124;pagination&#124;category_fields&#34;&#125;
    $entry =&#60;&#60;&#60;EOE
      &#60;h3&#62;&#123;title&#125;&#60;/h3&#62;
      &#123;news_body&#125;
EOE;
    &#123;categories&#125;
      $entries[&#123;category_id&#125;][] = $entry;
    &#123;/categories&#125;
  &#123;/exp:channel:entries&#125;
?&#62;

&#123;exp:channel:categories channel=&#34;news&#34; style=&#34;linear&#34; disable=&#34;category_fields&#34;&#125;
  &#60;h2&#62;&#123;category_name&#125;&#60;/h2&#62;
  &#60;?php if (isset($entries[&#123;category_id&#125;])): ?&#62;
    &#60;?=implode(&#34;\n&#34;, $entries[&#123;category_id&#125;])?&#62;
  &#60;?php endif; ?&#62;
&#123;/exp:channel:categories&#125;</code></pre>
<p>First, we&#8217;ll define an array (<code>$entries</code>). Using the channel:entries tag &#8212; without a <code>category=""</code> parameter &#8212; we&#8217;ll fill that array with entries grouped by category. After putting the template chunk for an entry in the <code>$entry</code> variable, we&#8217;ll loop through each related category and add the entry to <code>$entries</code>. What we end up with, is a nested array with all the entries in the right order, grouped by category_id. </p>
<p>To output the entries, we&#8217;ll simply use the channel:categories tag to display each category. We then check if there are entries set in the <code>$entries</code> array for that category_id. If there are, we&#8217;ll echo them to the page after <code>implode</code>-ing them to a string. All done.</p>
<h2>Performance <abbr title="for the win">FTW</abbr></h2>
<p>So, exactly how many queries did we save using this method? I reloaded the page using the above code, with 5 categories and 7 entries: <strong>29</strong> queries. That&#8217;s right, 16 less than the nested method. How many queries would it take if there are 20 categories with 200 entries? 29.</p>
]]></content:encoded>
      <dc:date>2010-09-23T13:07:40+00:00</dc:date>
    </item>

    <item>
      <title>About EECI2010</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fabout-eeci2010%2F&amp;seed_title=About+EECI2010</link>
      <guid>http://loweblog.com/freelance/article/about&#45;eeci2010/</guid>
      <description>Last weekend I got back from my three week stay in California. The first week was all about exploring San Francisco and EECI2010 US, the last two weeks were all about driving on Highway 1 in a Mustang. The conference was a blast. Robert, Janneke and Chris pulled it off once again by putting together a fantastic couple of days full of impeccable presentations, superb locations, good food and plenty of booze. I will never grow tired of drinking beers with my fellow EE geeks, except perhaps if that involves climbing a steep hill more than once.</description>
      <dc:subject>Conferences</dc:subject>
      <content:encoded><![CDATA[<p>Last weekend I got back from my three week stay in California. The first week was all about exploring San Francisco and <a href="http://eeci2010.com/us/">EECI2010 US</a>, the last two weeks were all about driving on Highway 1 in a Mustang. The conference was a blast. Robert, Janneke and Chris pulled it off once again by putting together a fantastic couple of days full of impeccable presentations, superb locations, good food and plenty of booze. I will never grow tired of drinking beers with my fellow EE geeks, except perhaps if that involves climbing a steep hill more than once.</p>
<h2>PHP in templates</h2>
<p>My presentation slash workshop was about using PHP in templates, but also covered EE&#8217;s template parse order. Prior to the presentation, I dove right into EE&#8217;s template class and created <a href="http://loweblog.com/downloads/ee-parse-order.pdf">a little cheat sheet</a> as a handout people could refer to during my talk. I think it went fairly well and judging from the feedback I&#8217;ve read and heard, my audience felt the same way. Here are the slides, if you haven&#8217;t already seen them on SlideShare:</p>
<p><object width="425" height="355">
<param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eeci2010-100604114839-phpapp02&#038;stripped_title=php-in-templates-pain-or-pleasure" />
<param name="allowFullScreen" value="true"/>
<param name="allowScriptAccess" value="always"/><embed name="__sse4412482" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eeci2010-100604114839-phpapp02&#038;stripped_title=php-in-templates-pain-or-pleasure" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></p>
<h2>Next up</h2>
<p>The <a href="http://eeciconf.com/">next EECI conference</a> will be held, like the first edition, in my home town Leiden. Robert already cooked up some excellent speakers and there will also be a so-called DevDay on October 1st (also my birthday, coincidently). What will happen on the DevDay is yet to be announced, but one thing&#8217;s for sure: I&#8217;ll be there eating cake.</p>
]]></content:encoded>
      <dc:date>2010-06-23T10:32:24+00:00</dc:date>
    </item>

    <item>
      <title>Hospitality wanted!</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fhospitality-wanted%2F&amp;seed_title=Hospitality+wanted%21</link>
      <guid>http://loweblog.com/freelance/article/hospitality&#45;wanted/</guid>
      <description>My girlfriend and I are flying to San Francisco this week. The first week, we will be in a hotel, exploring the city and I&#8217;ll be speaking at a conference about ExpressionEngine. Then, after the conference, we&#8217;re planning on renting a car and drive through California. I&#8217;m thinking Napa and Paso Robles (I like my wines), Big Sur and sequoias, and eventually we will fly back to Amsterdam from LAX.</description>
      <dc:subject>Conferences</dc:subject>
      <content:encoded><![CDATA[<p>My girlfriend and I are flying to San Francisco this week. The first week, we will be in a hotel, exploring the city and I&#8217;ll be speaking at <a href="http://eeci2010.com/">a conference about ExpressionEngine</a>. Then, after the conference, we&#8217;re planning on renting a car and drive through California. I&#8217;m thinking Napa and Paso Robles (I like my wines), Big Sur and sequoias, and eventually we will fly back to Amsterdam from LAX.</p>
<p>Of course, the best way to explore a foreign country is with the help of the locals. So here&#8217;s what I thought would be fun&#8230; Why not ask some fellow web geeks if they mind having me and my girlfriend over? I think it would be a fantastic way to meet people and see the country.</p>
<p>To be precise, we will be traveling through California from June 3rd till June 17th, and we would love to stay one or two nights. Drop me an email if you live somewhere around or in between SF and LA and you&#8217;re up for it: low@loweblog.com</p>
]]></content:encoded>
      <dc:date>2010-05-24T17:22:03+00:00</dc:date>
    </item>

    <item>
      <title>Published twice</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fpublished-twice%2F&amp;seed_title=Published+twice</link>
      <guid>http://loweblog.com/freelance/article/published&#45;twice/</guid>
      <description>April 6 2010 will be remembered in ExpressionEngine history as the day where I got published on two of the biggest EE dev sites currently around. I&#8217;ve written up an article about managing aside content on EE Insider and Devot:ee published a Spotlight interview with yours truly about a project I did for Leiden University. Kudos to Ryan Irelan and Jacob Russell for unknowingly aiding me in this Low Offensive.</description>
      <dc:subject>ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>April 6 2010 will be remembered in ExpressionEngine history as the day where I got published on two of the biggest EE dev sites currently around. I&#8217;ve written up an article about managing aside content <a href="http://eeinsider.com/articles/creating-aside-content/">on EE Insider</a> and Devot:ee published <a href="http://devot-ee.com/articles/item/spotlight-lodewijk-schutte-masters-in-leiden/">a Spotlight interview with yours truly</a> about a project I did for Leiden University. Kudos to Ryan Irelan and Jacob Russell for unknowingly aiding me in this Low Offensive.</p>
]]></content:encoded>
      <dc:date>2010-04-07T11:09:35+00:00</dc:date>
    </item>

    <item>
      <title>Simple navigation with Low Variables</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fsimple-navigation-with-low-variables%2F&amp;seed_title=Simple+navigation+with+Low+Variables</link>
      <guid>http://loweblog.com/freelance/article/simple&#45;navigation&#45;with&#45;low&#45;variables/</guid>
      <description>How to build navigation in ExpressionEngine has always been a debatable issue amongst developers. Some use Categories, maybe a devoted Weblog or Channel, others just hard code navigation in the templates. Third party options would include Navigator, Structure or maybe even some kind of Playa setup. But since version 1.1.6, Low Variables offers a simple and elegant solution to building navigation, too.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine, Low Variables</dc:subject>
      <content:encoded><![CDATA[<p>How to build navigation in <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> has always been a debatable issue amongst developers. Some use Categories, maybe a devoted Weblog or Channel, others just hard code navigation in the templates. Third party options would include <a href="http://devot-ee.com/add-ons/modules/navigator/">Navigator</a>, <a href="http://buildwithstructure.com/">Structure</a> or maybe even some kind of <a href="http://www.pixelandtonic.com/playa">Playa</a> setup. But since version 1.1.6, <a href="http://loweblog.com/software/low-variables/">Low Variables</a> offers a simple and elegant solution to building navigation, too.</p>
<h2>Template tags</h2>
<p>The secret lies in <a href="http://loweblog.com/software/low-variables/docs/tags/">Low Variables&#8217; template tags</a>: <code>&#123;exp:low_variables:parse&#125;</code>. Apart from parsing variables early (like path.php vars) or late (like user defined template vars) in the parsing order, you can parse Low Variables using the template tags, which allows you to do extra stuff apart from just a simple string replace.</p>
<p>For example, in the case of multiple valued variables, you can loop through the values. This means you could create a simple navigation menu that your users can manage.</p>
<h2>Create a Select variable</h2>
<p>First you need to create a variable with type Select. In this example, we&#8217;ll name the variable <code>low_site_menu</code>. You can turn early parsing off, since we&#8217;re going to use the template tags to parse it. In the Options field, we&#8217;ll add the menu items, putting each item on a new line and separating paths and labels with <code>&#160;:&#160;</code>. For example:</p>
<pre><code>/ : Home
about-us : About us
services : Services
news : News
contact : Contact
pages/copyright : Copyright</code></pre>
<p>Next, we&#8217;ll allow multiple values to be selected and select the Drag and drop lists as interface. This means your user can turn off any menu item, as well as sort them in a preferred order.</p>
<p><img src="/images/screenshots/lvex-menu.png" width="500" height="220" alt="Low Variables: Select type with menu" /></p>
<h2>Edit your template</h2>
<p>In your template, add the following code:</p>
<pre><code>&#60;ul id="nav"&#62;&#123;exp:low_variables:parse var="low_site_menu" multiple="yes"&#125;
  &#60;li&#62;&#60;a href="&#123;path="&#123;value&#125;"&#125;"&#62;&#123;label&#125;&#60;/a&#62;&#60;/li&#62;&#123;/exp:low_variables:parse&#125;
&#60;/ul&#62;</code></pre>
<p>That&#8217;s it! You could even enter full urls as values and omit the <code>&#123;path=""&#125;</code> variable, so external menu items are possible as well. This approach is very efficient; I compared it to using a <code>&#123;exp:weblog:categories&#125;</code> tag instead, and saved up to 3 queries per request, depending on caching settings.</p>
]]></content:encoded>
      <dc:date>2010-03-04T11:09:48+00:00</dc:date>
    </item>

    <item>
      <title>Custom images with Low Variables</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fcustom-images-with-low-variables%2F&amp;seed_title=Custom+images+with+Low+Variables</link>
      <guid>http://loweblog.com/freelance/article/custom&#45;images&#45;with&#45;low&#45;variables/</guid>
      <description>If you need to give your users the ability to change the header or masthead image of their site, then Low Variables for ExpressionEngine comes in handy once again. And as an added bonus, if you throw in the Low Random plugin, creating rotating headers or mastheads is a piece of cake.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine, Low Variables</dc:subject>
      <content:encoded><![CDATA[<p>If you need to give your users the ability to change the header or masthead image of their site, then <a href="http://loweblog.com/software/low-variables/">Low Variables</a> for <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> comes in handy once again. And as an added bonus, if you throw in the <a href="http://loweblog.com/software/low-random/">Low Random plugin</a>, creating rotating headers or mastheads is a piece of cake.</p>
<h2>Custom header image</h2>
<p>In this example, we&#8217;ve defined the default header image in a CSS file. We&#8217;ll override that by adding a <code>&#60;style&#62;</code> block to our templates. But first, we need to create a variable with type &#8216;Select Files&#8217;. Let&#8217;s name the variable <code>&#123;my_custom_header&#125;</code>. Select the upload destination(s) that the user can choose images from and check the &#8216;Allow uploads&#8217; checkbox.</p>
<p><a href="http://loweblog.com/images/lvex4_imgvar.png" rel="lightbox[lvex]" title="Low Variables: Select Files variable type"><img src="http://loweblog.com/images/lvex4_imgvar_thumb.png" width="151" height="100" alt="Low Variables: Edit Variable form for Select Files variable type" /></a></p>
<p>Then, just add this code to your templates:</p>
<pre><code>&#60;style type="text/css"&#62;
	#header &#123;background-image:url(&#123;my_custom_header&#125;)&#125;
&#60;/style&#62;</code></pre>
<h2>Random masthead image</h2>
<p>For a random image, create a similar variable, for example <code>&#123;my_custom_masthead&#125;</code>. Enable early parsing and allow for multiple files to be selected. We need early parsing to be enabled, because we&#8217;re using the variable as input for the Low Random plugin.</p>
<p><a href="http://loweblog.com/images/lvex4_imgvar2.png" rel="lightbox[lvex]" title="Low Variables: Multiple Select Files variable type"><img src="http://loweblog.com/images/lvex4_imgvar2_thumb.png" width="229" height="100" alt="Low Variables: screenshot Select Files variable type" /></a></p>
<p>Here&#8217;s how it would look in our templates:</p>
<pre><code>&#60;img src="&#123;exp:low_random:items&#125;&#123;my_custom_masthead&#125;&#123;/exp:low_random:items&#125;" alt="" /&#62;</code></pre>
<p>That&#8217;s all there is to it; custom and random images with <a href="http://loweblog.com/software/low-variables/">Low Variables</a>.</p>
]]></content:encoded>
      <dc:date>2010-02-02T11:33:28+00:00</dc:date>
    </item>

    
    </channel>
</rss>
