<?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 2009</dc:rights>
    <dc:date>2009-05-05T08:45:20+01:00</dc:date>
    <admin:generatorAgent rdf:resource="http://expressionengine.com/" />
    

    <item>
      <title>FOWD, EE and a little tip</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Ffowd-ee-and-a-little-tip%2F&amp;seed_title=FOWD%2C+EE+and+a+little+tip</link>
      <guid>http://loweblog.com/freelance/article/fowd&#45;ee&#45;and&#45;a&#45;little&#45;tip/</guid>
      <description>One of the main reasons why I went to this year&#8217;s Future Of Web Design conference, was to attend Jamie Pittock&#8217;s workshop on ExpressionEngine. As a freelancer, I only see my own EE implementations, so I jumped at the opportunity to see how others use it to deploy sites. The workshop turned out to be both fun and inspirational &#8212; path.php will never be the same again. Kudos to Jamie for putting it together.
The second workshop I attended was about JavaScript by Stuart Langridge. Between the jokes and the put&#45;downs, Stuart had his class do a couple of exercises. I managed to help out my neighbour a bit, who turned out to be an EE enthusiast herself and had recently used one of my add&#45;ons.</description>
      <dc:subject>Conferences, ExpressionEngine, PHP</dc:subject>
      <content:encoded><![CDATA[<p>One of the main reasons why I went to this year&#8217;s <a href="http://events.carsonified.com/fowd/2009/london/content">Future Of Web Design</a> conference, was to attend <a href="http://twitter.com/jamiepittock">Jamie Pittock</a>&#8217;s workshop on <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>. As a freelancer, I only see my own <abbr>EE</abbr> implementations, so I jumped at the opportunity to see how others use it to deploy sites. The workshop turned out to be both fun and inspirational &#8212; path.php will never be the same again. Kudos to Jamie for putting it together.</p>
<p>The second workshop I attended was about JavaScript by <a href="http://www.kryogenix.org/">Stuart Langridge</a>. Between the jokes and the put-downs, Stuart had his class do a couple of exercises. I managed to help out my neighbour a bit, who turned out to be an <abbr>EE</abbr> enthusiast herself and had recently used <a href="http://loweblog.com/freelance/article/ee-yearly-archives-plugin/">one of my add-ons</a>.</p>
<p>I promised <a href="http://twitter.com/gradualist">Emily</a> I&#8217;d write a blog post about a little trick I sometimes use to retrieve certain entries from the database when the default weblog:entries tag won&#8217;t let you. In her case, she needed to get all entries from a given month, <em>regardless of the year</em>. She ended up using categories, which is fine, but here&#8217;s an approach you could also use.</p>
<h2>Check the database</h2>
<p>Weblog entries are stored in the table <code>exp_weblog_titles</code>. In that table you&#8217;ll find values for <code>year</code>, <code>month</code> and <code>day</code>. This means we can filter entries per month, regardless of the year, albeit not with regular EE tags. We&#8217;ll need to get them manually.</p>
<h2>Set up a template, use PHP</h2>
<p>Create a template (for example: <code>archives/month</code>) and turn on PHP <strong>on input</strong>. We&#8217;re going to use PHP to fetch all entry ids for any given month. In this case, a <em>numeric</em> value of the month will be available in <code>&#123;segment_3&#125;</code>: <code>http://domain.com/archives/month/5</code>. The PHP will look something like this:</p>
<pre><code>&#60;?php
global $IN, $DB;

// get database-safe segment
$seg3 = $DB-&#62;escape_str($IN-&#62;fetch_uri_segment(3));

// query to get all entry_ids for a given month
$query = $DB-&#62;query("SELECT entry_id FROM exp_weblog_titles WHERE month = '&#123;$seg3&#125;'");

// initiate ids array
$ids = array();

// loop through results, populate array
foreach ($query->result AS $row):
	$ids[] = $row['entry_id'];
endforeach;
?&#62;</code></pre>
<h2>Use IDs as input for &#123;exp:weblog:entries&#125;</h2>
<p>You now have an array filled with all the right entry_ids. You only need to display them with the <code>&#123;exp:weblog:entries&#125;</code> tag, using the <code>entry_id</code> parameter to limit the entries to the ones you&#8217;ve just retrieved. That would look something like this:</p>
<pre><code>&#123;exp:weblog:entries weblog="articles" entry_id="&#60;?=implode('&#124;', $ids)?&#62;" dynamic="off" disable="pagination"&#125;
	[...]
&#123;/exp:weblog:entries&#125;</code></pre>
<p>You could add further filtering, like statuses or categories, but all the entries will be from the given month, because of the <code>entry_id</code> parameter.</p>
<h2>Remember dynamic=&#8221;off&#8221;</h2>
<p>I&#8217;ve used this approach on many occasions. Use PHP to get the right ids first, then use them as input for your regular EE tags. It works like a charm, but has its down side as well. Because you&#8217;re using the segments in custom way, you&#8217;ll need to set <code>dynamic="off"</code>. This will disable the use of pagination. That might be a bad thing, or on the other hand, it might not matter at all.</p>
]]></content:encoded>
      <dc:date>2009-05-05T08:45:20+01:00</dc:date>
    </item>

    <item>
      <title>EE: Low NoSpam</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-low-nospam%2F&amp;seed_title=EE%3A+Low+NoSpam</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;low&#45;nospam/</guid>
      <description>As far as comment spam prevention goes for ExpressionEngine, Akismet is a popular choice. Today I give you Low NoSpam, which takes the Akismet Combo for EE and adds some more options to protect your Gallery comments, Forum posts and Wiki articles too. And as an added bonus, you&#8217;re no longer limited to use the Akismet service; the new TypePad AntiSpam service will work too.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine, Spam prevention</dc:subject>
      <content:encoded><![CDATA[<p>As far as comment spam prevention goes for <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>, <a href="http://loweblog.com/freelance/article/akismet-for-expression-engine/">Akismet</a> is a <a href="http://expressionengine.com/forums/viewthread/105563/">popular choice</a>. Today I give you Low NoSpam, which takes the Akismet Combo for EE and adds some more options to protect your Gallery comments, Forum posts and Wiki articles too. And as an added bonus, you&#8217;re no longer limited to use the <a href="http://akismet.com/">Akismet</a> service; the new <a href="http://antispam.typepad.com/">TypePad AntiSpam</a> service will work too.</p>
<p>&#8594; <a href="/downloads/low_nospam-v1.0.4.zip" title="low_nospam-v1.0.4.zip, 13 kb">Download Low NoSpam for ExpressionEngine v1.0.4</a> (<a href="http://github.com/lodewijk/low.nospam.ee_addon/tree/master">Also on GitHub</a>)</p>
<h2>What does it do?</h2>
<p>Like the Akismet Combo, Low NoSpam will check comments to see if they&#8217;re considered to be spam by the chosen service, either Akismet or TypePad AntiSpam. It can optionally also check incoming trackbacks, gallery comments, forum posts and wiki articles. Caught (gallery) comments will be set to Closed for further moderation. Caught trackbacks, forum posts and wiki articles will be discarded, since these do not have a native moderating system in EE.</p>
<h2 id="requirements">Requirements</h2>
<p>For this combo to work, you&#8217;ll need ExpressionEngine 1.6.x and an API Key for either <a href="http://akismet.com/personal/">Akismet</a> (free for personal use) or <a href="http://antispam.typepad.com/info/get-api-key.html">TypePad AntiSpam</a> (free). Enter the API Key in the Low NoSpam Check extension settings.</p>
<p>You can disable or uninstall the Akismet for ExpressionEngine combo once you&#8217;ve enabled Low NoSpam.</p>
<h2 id="changelog">Change Log</h2>
<h3>Version 1.0.4, 2009-04-17</h3>
<ul>
<li>Changed check members setting from yes/no to selection of member groups: explicitly select which member groups to check</li>
</ul>
<h3>Version 1.0.3, 2009-03-14</h3>
<ul>
<li>Fixed a bug where comments weren&#8217;t marked as spam and deleted in the Control Panel (introduced in v1.0.2).</li>
<li>Fixed a bug where the upgrade message wasn&#8217;t shown.</li>
</ul>
<h3>Version 1.0.2, 2009-03-12</h3>
<ul>
<li>Fixed a bug where weblog comments weren&#8217;t opened correctly.</li>
<li>Increased compatibility with php4.</li>
</ul>
<h3>Version 1.0.1, 2009-03-06</h3>
<ul>
<li>Fixed a bug in extension where the gallery_id and entry_id weren&#8217;t set correctly if a closed gallery comment was added to the database.</li>
</ul>
]]></content:encoded>
      <dc:date>2009-03-01T20:12:32+01:00</dc:date>
    </item>

    <item>
      <title>EE: Low Random plugin</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-low-random-plugin%2F&amp;seed_title=EE%3A+Low+Random+plugin</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;low&#45;random&#45;plugin/</guid>
      <description>The new year is upon us and I noticed that clients still love their random header images. To make it easier to display randomness, I created this quick plugin for ExpressionEngine: Low Random. Use it when you need random numbers, letters, files or words.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>The new year is upon us and I noticed that clients still love their random header images. To make it easier to display randomness, I created this quick plugin for <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>: Low Random. Use it when you need random numbers, letters, files or words.</p>
<p>&rarr; <a href="/downloads/pi.low_random.zip" title="2KB .zip file">Download the ExpressionEngine Low Random plugin, version 1.0.0</a> (<a href="http://github.com/lodewijk/low.random.ee_addon/tree/master">Also on GitHub</a>)</p>

<h2>&#123;exp:low_random:file&#125;</h2>

<p>The <code>file</code> method will search a given <em>folder</em> for files, matches them against any given <em>filter</em>, and returns a found file name at random.</p>

<h3>Parameters</h3>

<ul>
<li><code>folder</code>: either the server path of the folder, or the numeric Upload Destination id.</li>
<li><code>filter</code>: any number of sub strings the file name should contain, separated by vertical bars.</li>
</ul>

<h3>Examples</h3>

<pre><code>&#123;exp:low_random:file folder="images" filter="masthead|.jpg"&#125;
&#123;exp:low_random:file folder="3" filter=".pdf"&#125;</code></pre>

<h2>&#123;exp:low_random:item&#125;</h2>

<p>The <code>item</code> method will return a random item from the set given in the parameter <em>items</em>.</p>

<h3>Parameters</h3>

<ul>
<li><code>items</code>: any number of items, separated by vertical bars.</li>
</ul>

<h3>Examples</h3>

<pre><code>&#123;exp:low_random:item items="cat|dog|ferret|raptor"&#125;
&#123;exp:low_random:item items="Yes|No|Maybe|Try again later|You're kidding, right?"&#125;</code></pre>

<h2>&#123;exp:low_random:letter&#125;</h2>

<p>The <code>letter</code> method will return a random letter between the given range. It returns a letter in the same case as the given parameters.</p>

<h3>Parameters</h3>

<ul>
<li><code>from</code>: letter to start the range with, defaults to <strong>a</strong>.</li>
<li><code>to</code>: letter to end the range with, defaults to <strong>z</strong>.</li>
</ul>

<h3>Examples</h3>

<pre><code>&#123;exp:low_random:letter&#125;
&#123;exp:low_random:letter from="A" to="F"&#125;</code></pre>

<h2>&#123;exp:low_random:number&#125;</h2>

<p>The <code>number</code> method will return a random number between the given range.</p>

<h3>Parameters</h3>

<ul>
<li><code>from</code>: number to start the range with, defaults to <strong>0</strong>.</li>
<li><code>to</code>: number to end the range with, defaults to <strong>9</strong>.</li>
</ul>

<h3>Examples</h3>

<pre><code>&#123;exp:low_random:number&#125;
&#123;exp:low_random:number from="100" to="999"&#125;</code></pre>]]></content:encoded>
      <dc:date>2009-01-07T01:15:43+01:00</dc:date>
    </item>

    <item>
      <title>EE: Low Seg2Cat extension</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-low-seg2cat-extension%2F&amp;seed_title=EE%3A+Low+Seg2Cat+extension</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;low&#45;seg2cat&#45;extension/</guid>
      <description>If you&#8217;ve ever worked with ExpressionEngine for a bit, you know that there isn&#8217;t just one solution to a problem. Usually, there are several. For example, you could use multiple weblogs to give structure to your content, or you could achieve the same by using categories. Depending on requirements, you&#8217;ll choose which method best suits your needs. I have used both on several occasions.</description>
      <dc:subject>Add&#45;Ons, Categories, ExpressionEngine, Segments</dc:subject>
      <content:encoded><![CDATA[<p>If you&#8217;ve ever worked with <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> for a bit, you know that there isn&#8217;t just one solution to a problem. Usually, there are several. For example, you could use multiple weblogs to give structure to your content, or you could achieve the same by using categories. Depending on requirements, you&#8217;ll choose which method best suits your needs. I have used both on several occasions.</p>
<h2>Using categories</h2>
<p>If there&#8217;s no need for different levels of permissions, but you do need lots of flexibility, using categories might be the right way to go. Categories can be a powerful tool for your site. Straight out of the box, it&#8217;s great. But with a bit of add-on love, it can become even better. That&#8217;s why I created the Low Seg2Cat extension.</p>
<p>&#8594; <a href="/downloads/ext.low_seg2cat.zip" title="2kb zip file">Download the Low Seg2Cat extension version 1.0.2</a> (<a href="http://github.com/lodewijk/low.seg2cat.ee_addon/tree/master">Also on GitHub</a>)</p>
<h2>What does it do?</h2>
<p>Low Seg2Cat loops through the segments of the current <abbr>URI</abbr>, matches them against existing categories, and registers the matching categories as global variables, which you can use in your templates. For example, if your <abbr>URI</abbr> looks like this: <code>http://domain.com/index.php/blog/news/election/</code>, this extension will register several extra global variables. Per segment, it will register&#8230;</p>
<ul>
<li><code>&#123;segment_n_category_id&#125;</code></li>
<li><code>&#123;segment_n_category_name&#125;</code></li>
<li><code>&#123;segment_n_category_description&#125;</code></li>
<li><code>&#123;segment_n_category_image&#125;</code></li>
</ul>
<p>&#8230;where <var>n</var> is the segment number. This means if there&#8217;s a category with url_title &#8216;news&#8217; and one with &#8216;election&#8217;, you&#8217;ll have their ids and names ready to be used in your templates. If no matching category is found for a segment, an empty string is returned. In addition to these, a final variable is also set: <code>&#123;segment_category_ids&#125;</code>, which will return an inclusive stack of all found category ids, for example: 4&#038;12 (if category &#8216;news&#8217; would have an id of 4 and &#8216;election&#8217; would be 12).</p>
<p>Low Seg2Cat gives you easy access to category ids so you can use url_titles in your <abbr>URI<abbr>s without the use of the Category <abbr>URL</abbr> Indicator or custom <abbr>PHP</abbr>.</p>
<h2>Caveats</h2>
<p>If there are multiple categories with the same url_title, but in different groups, this extension will only return one of those. So best make sure your category url_titles are unique.</p>
<h2>Change Log</h2>
<h3>Version 1.0.2, 2009-06-03</h3>
<ul>
<li>Altered the installation/update methods to play nicer with custom table prefixes.</li>
</ul>
<h3>Version 1.0.1, 2009-03-14</h3>
<ul>
<li>Added <code>&#123;segment_n_category_description&#125;</code> and <code>&#123;segment_n_category_image&#125;</code> as global variables.</li>
<li><code>&#123;segment_category_ids&#125;</code> defaults to an empty string.</li>
</ul>
]]></content:encoded>
      <dc:date>2008-11-04T14:45:36+01:00</dc:date>
    </item>

    <item>
      <title>Change your client&#8217;s mind</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fchange-your-clients-mind%2F&amp;seed_title=Change+your+client%26%238217%3Bs+mind</link>
      <guid>http://loweblog.com/freelance/article/change&#45;your&#45;clients&#45;mind/</guid>
      <description>As I read Vitamin&#8217;s latest article by Paul Boag, called The 5 hidden costs of running a CMS, I couldn&#8217;t help but wonder whether the author had been looking over my shoulder the last couple of weeks. It was as if he pulled some quotes from discussions I had with a client, not too long ago. Take this one, for example:
[There is] a substantial problem with content management systems. They are often implemented in the hope they will solve what is an organizational rather than technical problem.</description>
      <dc:subject>Content, Rants</dc:subject>
      <content:encoded><![CDATA[<p>As I read <a href="http://www.thinkvitamin.com/">Vitamin</a>&#8217;s latest article by <a href="http://boagworld.com/">Paul Boag</a>, called <a href="http://www.thinkvitamin.com/features/biz/the-5-hidden-costs-of-running-a-cms">The 5 hidden costs of running a <abbr title="Content Management System">CMS</abbr></a>, I couldn&#8217;t help but wonder whether the author had been looking over my shoulder the last couple of weeks. It was as if he pulled some quotes from discussions I had with a client, not too long ago. Take this one, for example:</p>
<blockquote cite="http://www.thinkvitamin.com/features/biz/the-5-hidden-costs-of-running-a-cms"><p>[There is] a substantial problem with content management systems. They are often implemented in the hope they will solve what is an organizational rather than technical problem.</p></blockquote>
<p>The Brit hits the nail on the head, although I&#8217;d like to take a slightly different approach to his statement. The problem does not lie with the <abbr>CMS</abbr> itself so much, but rather with the people implementing and using it. It is they who expect that a piece of software will cater to all their (or even everyone&#8217;s) online needs and solve all their problems. Some might even think they have real influence and power over the company&#8217;s website just because they have a user name and password to login to the <abbr>CMS</abbr> and edit data. Even though those changes will never appear online without approval of a web editor.</p>
<p>This is a difficult problem, because you need to convince people to think differently about the system they&#8217;re using. Change their minds, so to speak. Do they really need to spend a lot of money to buy a huge content management system that can handle multiple workflows and permissions and whatnot? Or can they suffice with just sending an email to the web editors every now and then? Remember, it&#8217;s not <abbr>CMS</abbr>&#8217;s that kill websites. People do. (And some browsers, but let&#8217;s not go into that&#8230;)</p>
]]></content:encoded>
      <dc:date>2008-08-06T21:45:17+01:00</dc:date>
    </item>

    <item>
      <title>SEO vs. UO</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fseo-vs-uo%2F&amp;seed_title=SEO+vs.+UO</link>
      <guid>http://loweblog.com/freelance/article/seo&#45;vs&#45;uo/</guid>
      <description>My site&#8217;s redesign should be a good opportunity to add my first rant to my developer blog. A rant about a trend I&#8217;ve noticed lately, called Search Engine Optimalisation, or SEO. Of course, this isn&#8217;t a new phenomenon. It&#8217;s probably as old as search engines themselves. Nevertheless, the last couple of months I came across this subject a bit too often.</description>
      <dc:subject>Rants, SEO</dc:subject>
      <content:encoded><![CDATA[<p>My site&#8217;s redesign should be a good opportunity to add my first rant to my developer blog. A rant about a trend I&#8217;ve noticed lately, called Search Engine Optimalisation, or <abbr>SEO</abbr>. Of course, this isn&#8217;t a new phenomenon. It&#8217;s probably as old as search engines themselves. Nevertheless, the last couple of months I came across this subject a bit too often.</p>
<p>When I was at <a href="http://www.vivabit.com/atmedia2008/london/">@Media in London</a> this year, a fair amount of questions was asked about <abbr>SEO</abbr>. But it&#8217;s not just developers who worry about it anymore. More and more, clients think that something special has to be done to their sites in order to optimise them for search engines like Google. They turn to the developers or to someone who actually specialises in <abbr>SEO</abbr>. Then the site is altered or built with this in mind. The site is optimised for search engines.</p>
<p>But isn&#8217;t this the wrong approach? Shouldn&#8217;t we be optimising for our <em>users</em> instead? Something like User Optimalisation (<abbr>UO</abbr>)? Luckily, one excellent method for optimalisation appears to benefit both: building with Web Standards. But I reckon it is wrong to assume that all measures taken to improve the &#8220;findability&#8221; of a website will also benefit its users. Therefore, I think it&#8217;s necessary to get priorities straight and turn some thought processes around.</p>
<p>A client might think that as soon as their site appears on the first search result page of Google, more visitors will come and use their site. Google first, users later. Let&#8217;s turn this around. If you build an <em>accessible</em> website with <em>great content</em>, more users will gradually use your site, maybe even link to it. This will eventually lead to a higher page rank; because people are <em>already using</em> it. Worry about users first, Google later, if at all.</p>
<p>Search engines, after all, are companies with their own agenda, who can change their algorithms any time they want. That pretty much rules out any <abbr>SEO</abbr> certainties. If we forget that our main priority should be our human users, we risk going back to the dark ages of dozens of meaningless <code>meta</code> tags, huge amounts of keywords on the bottom of pages or maybe even <a href="http://www.google.com/support/news_pub/bin/answer.py?answer=68323">putting random numbers in URLs</a>.</p>
]]></content:encoded>
      <dc:date>2008-07-24T01:06:56+01:00</dc:date>
    </item>

    <item>
      <title>EE: Low CP extension</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-low-cp-extension%2F&amp;seed_title=EE%3A+Low+CP+extension</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;low&#45;cp&#45;extension/</guid>
      <description>There are some minor nuisances in the ExpressionEngine Control Panel that started to bug me and &#8212; more importantly &#8212; some of my clients. To get rid of them, I&#8217;ve created an extension: Low CP, Control Panel according to Low.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>There are some minor nuisances in the <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> Control Panel that started to bug me and &#8212; more importantly &#8212; some of my clients. To get rid of them, I&#8217;ve created an extension: Low CP, Control Panel according to Low.</p>
<p><a href="/downloads/ext.low_cp.zip" title="3kb .zip file">&#8594; Download the Low CP extension, version 1.0.2</a></p>
<h2>What does it do?</h2>
<p>This extension <em>doesn&#8217;t</em> have any settings, so as soon as you enable it, you&#8217;ll notice the following effects:</p>
<h3>No <code>title</code> attribute for links</h3>
<p>You know how you get three JavaScript prompts each time you click the &#8220;Link&#8221; button in the entry form? The third one will add a <code>title</code> attribute to the link you&#8217;re creating, which is not necessary most of the time. Low CP gets rid of the third prompt, omitting the attribute.</p>
<h3>No Check Spelling, Glossary or Smileys</h3>
<p>I&#8217;ve never really used the three &#8220;textarea helper&#8221; links. Some browsers, like Firefox and Safari, even have built in spelling checkers. The glossary is only useful if you add your own items in there. Don&#8217;t even get me started on smileys. Low CP hides these three links.</p>
<h3>No localization for custom date fields</h3>
<p>Each time I used a custom date field for a client, that client asked me what &#8220;fixed&#8221; or &#8220;Localized&#8221; meant. Each of those times it wasn&#8217;t really important, but &#8220;fixed&#8221; would be my preferred choice. In the end &#8212; also due to a clumsy translation mistake &#8212; it caused more confusion than it should. Low CP gets rid of the drop down select box and replaces it with a hidden form field which sets the localization to fixed by default.</p>
<h3>No Trackbacks column</h3>
<p>Seriously, who uses trackbacks anymore? I&#8217;ve never used them and found that &#8212; in the edit entries table &#8212; it causes confusion with clients. Of course we can&#8217;t have any of that, that&#8217;s why Low CP removes that column from the edit entries table.</p>
<h3>Infinite URL title duplicates</h3>
<p>Not very common, but harmless to add anyway. There&#8217;s a maximum to the number that&#8217;s appended to the URL title if it already exists. Say, for example, that you add an entry called &#8220;News&#8221; every week. The first time, the URL title becomes <code>news</code>. The second time, it&#8217;ll be <code>news1</code>. Then <code>news2</code>, and so on, until you reach <code>news50</code>. After that, you&#8217;ll get an error message saying the URL title already exists. Low CP removes this limit.</p>
]]></content:encoded>
      <dc:date>2008-07-04T18:04:53+01:00</dc:date>
    </item>

    <item>
      <title>EE: Safe Encode extension</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-safe-encode-extension%2F&amp;seed_title=EE%3A+Safe+Encode+extension</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;safe&#45;encode&#45;extension/</guid>
      <description>The Dutch web guidelines do not allow you to use obfuscation to hide email addresses that are published on your site. ExpressionEngine will always use JavaScript to display email addresses when you use the &#123;encode=&#34;&#34;&#125; syntax. With this extension, you can bypass this behaviour, without having to modify the core typography class.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine</dc:subject>
      <content:encoded><![CDATA[<p>The <a href="http://www.webrichtlijnen.nl/english/manual/development/production/link-navigation/email-addresses/#addresses-on-sites">Dutch web guidelines</a> do not allow you to use obfuscation to hide email addresses that are published on your site. ExpressionEngine will always use JavaScript to display email addresses when you use the <code>&#123;encode=&#34;&#34;&#125;</code> syntax. With this extension, you can bypass this behaviour, without having to modify the core typography class.</p>
<p><a href="/downloads/ext.safe_encode.zip" title="1KB .zip file">&#8594; Download the Safe Encode extension, version 1.0</a></p>
<h2>What does it do?</h2>
<p>Whenever you use <code>&#123;encode=&#34;&#34;&#125;</code> in your weblog entries to display email addresses, this extension will generate an accessible link, instead of the JavaScript generated one. There is hardly any obfuscation, except that the . are replaced with <code>&#38;#46;</code> and the @ is replaced with <code>&#38;#64;</code>. This also means the email address is more likely to be picked up by bots and harvesters, so use at your own risk.</p>
<p>If you&#8217;re using the <code>encode</code>-tag in your templates, this extension will have no effect. But then again, you could just as well not use the <code>encode</code>-tag there.</p>
<h2>Example</h2>
<p>Using the extension, this&#8230;</p>
<pre><code>&#123;encode=&#34;example@domain.com&#34; title=&#34;Send an email&#34;&#125;</code></pre>
<p>&#8230;will be converted to&#8230;</p>
<pre><code>&#60;a href=&#34;mailto:example&#38;#64;domain&#38;#46;com&#34;&#62;Send an email&#60;/a&#62;</code></pre>
]]></content:encoded>
      <dc:date>2008-05-08T08:54:00+01:00</dc:date>
    </item>

    <item>
      <title>EE: Google Mini Plugin</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-google-mini-plugin%2F&amp;seed_title=EE%3A+Google+Mini+Plugin</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;google&#45;mini&#45;plugin/</guid>
      <description>This plugin lets you integrate search results from your Google Mini search appliance (GM) into ExpressionEngine seamlessly. If you&#8217;re using the GM to index your web site or intranet, this plugin will handle the search requests to it, retrieve the search results in XML format, and parses them just the way you want. You don&#8217;t have to learn any XSLT, you don&#8217;t have to leave the domain of your main site, just set up a template and you&#8217;re done.</description>
      <dc:subject>Add&#45;Ons, ExpressionEngine, Searching</dc:subject>
      <content:encoded><![CDATA[<p>This plugin lets you integrate search results from your <a href="http://www.google.com/enterprise/mini/">Google Mini search appliance</a> (GM) into <a href="http://expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a> seamlessly. If you&#8217;re using the GM to index your web site or intranet, this plugin will handle the search requests to it, retrieve the search results in XML format, and parses them just the way you want. You don&#8217;t have to learn any XSLT, you don&#8217;t have to leave the domain of your main site, just set up a template and you&#8217;re done.</p>
<p>&rarr; <a href="/downloads/pi.googlemini.zip" title="5KB .zip file">Download the ExpressionEngine Google Mini plugin, version 1.0</a></p>

<ul>
	<li>
		<a href="#gm_results">Search results</a>
		<ul>
			<li><a href="#results_parameters">Parameters</a></li>
			<li><a href="#results_conditionals">Conditionals</a></li>
			<li><a href="#results_variables">Single variables</a></li>
			<li><a href="#results_pairs">Variable pairs</a></li>	
			<li><a href="#results_example">Example</a></li>
		</ul>
	</li>
	<li><a href="#gm_keywords">Keywords</a></li>
	<li><a href="#gm_form">Search form</a></li>
</ul>

<h2 id="gm_results">Search results</h2>

<p>The main tag pair you will need is <code>&#123;exp:googlemini:results&#125;</code>. This contains several single variables and variable pairs that let you set up your search results page.</p>
	
<h3 id="results_parameters">Parameters</h3>

<ul>
	<li><a href="#par_host">host="googlemini.domain.com"</a></li>
	<li><a href="#par_request_parameters">Request Parameters</a></li>
</ul>

<h4 id="par_host">host=</h4>

<pre><code>host="googlemini.domain.com"</code></pre>

<p>The host name assigned to our Google Mini search appliance.</p>

<h4 id="par_request_parameters">Request parameters</h4>

<p>All <a href="http://code.google.com/apis/searchappliance/documentation/46/xml_reference.html#request_parameters">Request Parameters</a> used by the Google Mini search appliance are available. <em>All Request Parameters will be overwritten by GET variables in the url</em>. For example:</p>

<pre><code>client="default_frontend" site="default_collection"</code></pre>

<h3 id="results_conditionals">Conditional variables</h3>

<ul>
	<li><a href="#var_keymatch">&#123;if keymatch&#125;</a></li>
</ul>

<h4 id="var_keymatch">if keymatch</h4>
<pre><code>&#123;if keymatch&#125;
 content
&#123;/if&#125;</code></pre>
<p>This conditional lets you display content if a KeyMatch was found for the current search.</p>

<p><strong>Note:</strong> in addition to these conditionals, all <em>single variables</em> can be used as conditionals as well.</p>

<h3 id="results_variables">Single variables</h3>

<table>
	<caption>Single variables available in the &#123;exp:googlemini:results&#125; tag</caption>
	<colgroup>
		<col class="var" />
		<col class="desc" />
	</colgroup>
	<thead>
		<tr>
			<th scope="col">Variable</th>
			<th scope="col">Description</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>&#123;approx_results&#125;</td>
			<td>The estimated total number of results for the search. See also: <a href="http://code.google.com/apis/searchappliance/documentation/46/xml_reference.html#appendix_num_results">Estimated vs. Actual Number of Results</a></td>
		</tr>
		<tr>
			<td>&#123;current_page&#125;</td>
			<td>Current page number of search results</td>
		</tr>
		<tr>
			<td>&#123;end_result&#125;</td>
			<td>Absolute number of the last search result being displayed</td>
		</tr>
		<tr>
			<td>&#123;keymatch_description&#125;</td>
			<td>KeyMatch description for current search, as indicated in your Google Mini control panel</td>
		</tr>
		<tr>
			<td>&#123;keymatch_url&#125;</td>
			<td>KeyMatch URL for current search, as indicated in your Google Mini control panel</td>
		</tr>
		<tr>
			<td>&#123;keywords&#125;</td>
			<td>Search keywords, HTML-safe</td>
		</tr>
		<tr>
			<td>&#123;keywords_raw&#125;</td>
			<td>Search keywords, unaltered</td>
		</tr>
		<tr>
			<td>&#123;keywords_url&#125;</td>
			<td>Search keywords, URL-safe</td>
		</tr>
		<tr>
			<td>&#123;next_qs&#125;</td>
			<td>Query string to use in a URL to the next page of search results</td>
		</tr>
		<tr>
			<td>&#123;previous_qs&#125;</td>
			<td>Query string to use in a URL to the previous page of search results</td>
		</tr>
		<tr>
			<td>&#123;search_url&#125;</td>
			<td>Complete URL used to fetch the search results from your Google Mini search appliance</td>
		</tr>
		<tr>
			<td>&#123;start_result&#125;</td>
			<td>Absolute number of the first search result being displayed</td>
		</tr>
		<tr>
			<td>&#123;time&#125;</td>
			<td>Time it took for the Google Mini to come up with the search results</td>
		</tr>
		<tr>
			<td>&#123;total_pages&#125;</td>
			<td>Total number of pages with search results, based on the estimated total results (<code>&#123;approx_results&#125;</code>) and the <strong>num</strong> parameter defined in the <a href="#par_request_parameters">Request Parameters</a></td>
		</tr>
		<tr>
			<td>&#123;total_results&#125;</td>
			<td>The total number of search results being displayed</td>
		</tr>
		<tr>
			<td>&#123;total_synonyms&#125;</td>
			<td>Total number of synonyms found for current search</td>
		</tr>
	</tbody>
</table>


<h3 id="results_pairs">Variable pairs</h3>

<ul>
	<li><a href="#var_entries">&#123;entries&#125;</a></li>
	<li><a href="#var_synonyms">&#123;synonyms&#125;</a></li>
	<li><a href="#var_pagination">&#123;pagination&#125;</a></li>
</ul>

<h4 id="var_entries">entries</h4>
<pre><code>&#123;entries&#125;
 &lt;div&#123;if filtered&#125; class=&quot;filtered&quot;&#123;/if&#125;&gt;
  &lt;h3&gt;&lt;a href=&quot;&#123;url&#125;&quot;&gt;&#123;title&#125;&lt;/a&gt;&lt;/h3&gt;
  &lt;p&gt;&#123;excerpt&#125;&lt;/p&gt;
  &lt;p class=&quot;meta&quot;&gt;&#123;display_url&#125;&lt;/p&gt;
 &lt;/div&gt;
&#123;/entries&#125;</code></pre>

<table>
	<caption>Available variables in &#123;entries&#125; tag pair</caption>
	<colgroup>
		<col class="var" />
		<col class="desc" />
	</colgroup>
	<thead>
		<tr>
			<th scope="col">Variable</th>
			<th scope="col">Description</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>&#123;cache_id&#125;</td>
			<td>Cache id of the found page</td>
		</tr>
		<tr>
			<td>&#123;count&#125;</td>
			<td>The count out of the current search results being displayed</td>
		</tr>
		<tr>
			<td>&#123;crawldate&#125;</td>
			<td>The date the page was indexed</td>
		</tr>
		<tr>
			<td>&#123;display_url&#125;</td>
			<td>Stripped down version of the found page</td>
		</tr>
		<tr>
			<td>&#123;encoding&#125;</td>
			<td>Character encoding of the found page</td>
		</tr>
		<tr>
			<td>&#123;excerpt&#125;</td>
			<td>Excerpt of the found page</td>
		</tr>
		<tr>
			<td>&#123;if filtered&#125;</td>
			<td>Displays content if the result was part of a parent directory</td>
		</tr>
		<tr>
			<td>&#123;language&#125;</td>
			<td>Language of the found page</td>
		</tr>
		<tr>
			<td>&#123;more_url&#125;</td>
			<td>URL to use to compose a link to a specific site or directory search using the <code>site:</code> syntax</td>
		</tr>
		<tr>
			<td>&#123;rank&#125;</td>
			<td>Rank assigned to the page by the Google Mini</td>
		</tr>
		<tr>
			<td>&#123;result_number&#125;</td>
			<td>Absolute result number</td>
		</tr>
		<tr>
			<td>&#123;size&#125;</td>
			<td>Size in KB of the found page</td>
		</tr>
		<tr>
			<td>&#123;title&#125;</td>
			<td>Title of the found page</td>
		</tr>
		<tr>
			<td>&#123;url&#125;</td>
			<td>URL of the found page</td>
		</tr>
	</tbody>
</table>

<h4 id="var_synonyms">synonyms</h4>
<pre><code>&#123;synonyms&#125;
 &#123;synonym_count&#125;: &lt;a href=&quot;&#123;synonym_url&#125;&quot;&gt;&#123;synonym_name&#125;&lt;/a&gt;
&#123;/synonyms&#125;</code></pre>

<table>
	<caption>Available variables in &#123;synonyms&#125; tag pair</caption>
	<colgroup>
		<col class="var" />
		<col class="desc" />
	</colgroup>
	<thead>
		<tr>
			<th scope="col">Variable</th>
			<th scope="col">Description</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>&#123;synonym_name&#125;</td>
			<td>Name of the synonym found</td>
		</tr>
		<tr>
			<td>&#123;synonym_url&#125;</td>
			<td>Url of the synonym found</td>
		</tr>
		<tr>
			<td>&#123;synonym_count&#125;</td>
			<td>The count out of the current synonym being displayed</td>
		</tr>
	</tbody>
</table>

<h4 id="var_pagination">pagination</h4>
<pre><code>&#123;pagination&#125;
 &#123;if is_active&#125;
  &lt;strong&gt;&#123;page_count&#125;&lt;/strong&gt;
 &#123;if:else&#125;
  &lt;a href=&quot;&#123;path=search&#125;&#123;query_string&#125;&quot;&gt;&#123;page_count&#125;&lt;/a&gt;
 &#123;/if&#125;
&#123;/pagination&#125;</code></pre>

<table>
	<caption>Available variables in &#123;pagination&#125; tag pair</caption>
	<colgroup>
		<col class="var" />
		<col class="desc" />
	</colgroup>
	<thead>
		<tr>
			<th scope="col">Variable</th>
			<th scope="col">Description</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>&#123;if is_active&#125;</td>
			<td>Conditional variable to display content if current page is active</td>
		</tr>
		<tr>
			<td>&#123;page_count&#125;</td>
			<td>The count out of the current page being displayed</td>
		</tr>
		<tr>
			<td>&#123;query_string&#125;</td>
			<td>The query string used in the URL to navigate to a certain page</td>
		</tr>
	</tbody>
</table>

<h3 id="results_example">Example</h3>

<pre><code>&#123;exp:googlemini:results host=&quot;googlemini.domain.com&quot; oe=&quot;utf8&quot;&#125;
	
&#123;if keywords&#125;
 &lt;p&gt;Searched for &lt;strong&gt;&#123;keywords&#125;&lt;/strong&gt;&lt;br /&gt;
 Results &lt;strong&gt;&#123;start_result&#125; &ndash; &#123;end_result&#125;&lt;/strong&gt; of about &lt;strong&gt;&#123;approx_results&#125;&lt;/strong&gt;.&lt;/p&gt;
&#123;/if&#125;

&#123;if keymatch&#125;
 &lt;p&gt;KeyMatch: &lt;a href=&quot;&#123;keymatch_url&#125;&quot;&gt;&#123;keymatch_description&#125;&lt;/a&gt;&lt;/p&gt;
&#123;/if&#125;

&#123;if total_synonyms&#125;
 &lt;h3&gt;Also try:&lt;/h3&gt;
 &lt;ul&gt;
  &#123;synonyms&#125;
   &lt;li&gt;&lt;a href=&quot;&#123;path=search&#125;?q=&#123;synonym_url&#125;&quot;&gt;&#123;synonym_name&#125;&lt;/a&gt;&lt;/li&gt;
  &#123;/synonyms&#125;
 &lt;/ul&gt;
&#123;/if&#125;

&#123;entries&#125;
 &#123;if count == 1&#125;&lt;ol id=&quot;searchresults&quot;&gt;&#123;/if&#125;
  &lt;li&#123;if filtered&#125; class=&quot;level2&quot;&#123;/if&#125;&gt;
   &lt;h3&gt;&lt;a href=&quot;&#123;url&#125;&quot;&gt;&#123;title&#125;&lt;/a&gt;&lt;/h3&gt;
   &#123;if excerpt&#125;&lt;span class=&quot;excerpt&quot;&gt;&#123;excerpt&#125;&lt;/span&gt;&#123;/if&#125;
   &lt;span class=&quot;meta&quot;&gt;&#123;display_url&#125;&lt;/span&gt;
   &#123;if more_url&#125;&lt;span class=&quot;sitesearch&quot;&gt;[ &lt;a href=&quot;&#123;path=search&#125;?q=site:&#123;more_url&#125;%20&#123;keywords_url&#125;&quot;&gt;More results from &#123;more_url&#125;&lt;/a&gt; ]&lt;/span&gt;&#123;/if&#125;
  &lt;/li&gt;
 &#123;if count == total_results&#125;&lt;/ol&gt;&#123;/if&#125;
&#123;/entries&#125;

&#123;if total_pages &gt; 1&#125;
 &lt;p class=&quot;pagination&quot;&gt;
  &lt;span class=&quot;count&quot;&gt;&#123;current_page&#125;/&#123;total_pages&#125;&lt;/span&gt;
  &#123;if previous_qs&#125;&lt;a class=&quot;prev&quot; href=&quot;&#123;path=search&#125;&#123;previous_qs&#125;&quot;&gt;Previous page&lt;/a&gt;&#123;/if&#125;
  &#123;pagination&#125;&#123;if is_active&#125;&lt;strong&gt;&#123;page_count&#125;&lt;/strong&gt; &#123;if:else&#125;&lt;a href=&quot;&#123;path=search&#125;&#123;query_string&#125;&quot;&gt;&#123;page_count&#125;&lt;/a&gt; &#123;/if&#125;&#123;/pagination&#125;
  &#123;if next_qs&#125;&lt;a class=&quot;next&quot; href=&quot;&#123;path=search&#125;&#123;next_qs&#125;&quot;&gt;Next page&lt;/a&gt;&#123;/if&#125;
 &lt;/p&gt;
&#123;/if&#125;

&#123;/exp:googlemini:results&#125;</code></pre>


<h2 id="gm_keywords">Keywords</h2>
<p>To display keywords outside the results-tags, use the single tag <code>&#123;exp:googlemini:keywords&#125;</code>, for example:</p>
<pre><code>&lt;title&gt;&#123;exp:googlemini:keywords&#125; - Search - My Site Name&lt;/title&gt;</code></pre>


<h2 id="gm_form">Search form</h2>
<p>To create a search form, simply point a form to your search results template and use an input field with <code>name=&quot;q&quot;</code>. For example:</p>
<pre><code>&lt;form action=&quot;&#123;path=search&#125;&quot; method=&quot;get&quot;&gt;
 &lt;fieldset&gt;
  &lt;legend&gt;Search this site&lt;/legend&gt;
  &lt;label for=&quot;keywords&quot;&gt;Keywords&lt;/label&gt;
  &lt;input type=&quot;text&quot; name=&quot;q&quot; id=&quot;keywords&quot; value=&quot;&#123;exp:googlemini:keywords&#125;&quot; /&gt;
  &lt;button type=&quot;submit&quot;&gt;Search&lt;/button&gt;
 &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>


]]></content:encoded>
      <dc:date>2008-03-19T11:28:00+01:00</dc:date>
    </item>

    <item>
      <title>EE search bookmarklet</title>
      <link>http://loweblog.com/feeder/?FeederAction=clicked&amp;feed=Dev&amp;seed=http%3A%2F%2Floweblog.com%2Ffreelance%2Farticle%2Fee-search-bookmarklet%2F&amp;seed_title=EE+search+bookmarklet</link>
      <guid>http://loweblog.com/freelance/article/ee&#45;search&#45;bookmarklet/</guid>
      <description>If you&#8217;re anything like me, you&#8217;d agree that ExpressionEngine&#8217;s search functionality is adequate, but not as good as, say, Google. So, you&#8217;d rather use the latter than the former to search through expressionengine.com. And if you&#8217;re anything like me, you&#8217;re a bit lazy and you like to get repetitive things (like typing in site:expressionengine.com) done quickly. Now you can.</description>
      <dc:subject>Bookmarklets, ExpressionEngine, Searching</dc:subject>
      <content:encoded><![CDATA[<p>If you&#8217;re anything like me, you&#8217;d agree that <a href="http://www.expressionengine.com/index.php?affiliate=lodewijk">ExpressionEngine</a>&#8217;s search functionality is adequate, but not as good as, say, Google. So, you&#8217;d rather use the latter than the former to search through expressionengine.com. And if you&#8217;re anything like me, you&#8217;re a bit lazy and you like to get repetitive things (like typing in <kbd>site:expressionengine.com</kbd>) done quickly. Now you can.</p>
<p>Drag the following link to your browser&#8217;s toolbar and behold the speediness of bookmarklets (also known as &#8216;favelets&#8217;): <a href="javascript:if(w=prompt('Search%20expressionengine.com:',''))&#123;top.location.href='http://google.com/search?q=site%3Aexpressionengine.com+'+w;&#125;">!ee</a></p>
<p>That will speed up your support searches big time.</p>
]]></content:encoded>
      <dc:date>2007-12-11T20:03:00+01:00</dc:date>
    </item>

    
    </channel>
</rss>