<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ThinkRobot &#187; Code</title>
	<atom:link href="http://think-robot.com/tag/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://think-robot.com</link>
	<description>Design &#38; Development Blog</description>
	<lastBuildDate>Tue, 09 Aug 2011 16:56:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Top Level Cookies in Opera for Custom Domain Names</title>
		<link>http://think-robot.com/2011/04/top-level-cookies-in-opera-for-custom-domain-names/</link>
		<comments>http://think-robot.com/2011/04/top-level-cookies-in-opera-for-custom-domain-names/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 23:36:14 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[top level]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=288</guid>
		<description><![CDATA[For our local development at work we all use the same fake domain &#8211; helps with setting API keys and other things across the board and isn&#8217;t hard to setup whatever system any new developer might have. It also happens to be not a &#8220;.com&#8221;: www.local.bnt &#8211; which is nice for not confusing it with [...]]]></description>
			<content:encoded><![CDATA[<p>For our local development at work we all use the same fake domain &#8211; helps with setting API keys and other things across the board and isn&#8217;t hard to setup whatever system any new developer might have. It also happens to be not a &#8220;.com&#8221;: <strong>www.local.bnt</strong> &#8211; which is nice for not confusing it with real sites.</p>
<p>While developing cross-subdomain authentication we suddenly realised that it didn&#8217;t work on Opera. After a bit of research it turns out that it&#8217;s not the setting of the cookie path (&#8220;.local.bnt&#8221;) that is the problem, but <a target="_blank" href="http://my.opera.com/yngve/blog/show.dml/267415">the way Opera checks which part of the domain name is the top level domain</a>:</p>
<blockquote><p>&#8220;Here at Opera we went for the rule-of-thumb method: When Opera is checking a cookie whose target domain matches certain criteriea (e.g. it is not a .com domain), <strong>we do a DNS name lookup for the target domain, to see if there is an IP address for that domain</strong>. If there is an IP address for the domain (e.g. example.no) we assume that the domain is a normal company domain, not a co.uk like domain, and therefore safe. If there is no IP address we assume that the domain is co.uk-like and therefore unsafe, and only allows the cookie to be set for the server that sent the cookie.&#8221;</p></blockquote>
<p>So that&#8217;s the problem right there and with an easy fix once you know the above&#8230; However the whole article is worth a read as it does shed some light on the multiple problems related to top level domains and cookies.</p>
<p>If you want to keep your random local domain name make sure your <strong>hosts file</strong> contains not only your sub domains, but the main one as well even if it is not used directly.</p>
<pre><code>127.0.0.1    www.local.bnt
<strong>127.0.0.1    local.bnt</strong>
</code></pre>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/" rel="bookmark">Doctrine Many To Many With Extra Fields</a></li><li><a href="http://think-robot.com/2009/02/how-to-use-the-strong-ownership-list/" rel="bookmark">How To Use the Strong Ownership List</a></li><li><a href="http://think-robot.com/2010/03/multiple-changes-and-a-delete-on-same-object-in-doctrine/" rel="bookmark">Multiple changes and a delete on same object in doctrine</a></li><li><a href="http://think-robot.com/2009/12/phpunit-selenium-screenshot-path-problem/" rel="bookmark">PHPUnit & Selenium - screenshot path problem</a></li><li><a href="http://think-robot.com/2009/04/regex-for-autolinking-urls/" rel="bookmark">Regex for Autolinking URLs</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2011/04/top-level-cookies-in-opera-for-custom-domain-names/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Multiple Events Without Default Behaviour</title>
		<link>http://think-robot.com/2011/03/jquery-multiple-events-without-default-behaviour/</link>
		<comments>http://think-robot.com/2011/03/jquery-multiple-events-without-default-behaviour/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 22:51:34 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=276</guid>
		<description><![CDATA[Sometimes you trip over the little things. With several people working on the same page while we were recreating some JS functionality from scratch I&#8217;ve noticed one of my buttons suddenly stopped working. Scratched my head a bit, and for a minute thought that maybe it&#8217;s not having a &#8220;return false;&#8221; in my jQuery live() [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you trip over the little things.</p>
<p>With several people working on the same page while we were recreating some JS functionality from scratch I&#8217;ve noticed one of my buttons suddenly stopped working. Scratched my head a bit, and for a minute thought that maybe it&#8217;s not having a &#8220;return false;&#8221; in my jQuery live() event handler.</p>
<p>Turned out though that it was actually one of the other developers actually putting a &#8220;return false;&#8221; in their event handler that just happened to target the same element&#8230; </p>
<p>Ideally we needed to propagate the event through a variable number of events but prevent the default behaviour of a link kicking in. <strong>preventDefault()</strong> to the rescue! <img src='http://think-robot.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre><code>$('#tag').live('click', function(event){
    (...)
    event.preventDefault();
});
</code></pre>
<p>Now, before blindly applying this piece of code I&#8217;d encourage everyone to first read up on <a target="_blank" href="http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/">why &#8220;return false;&#8221; is evil</a>. <img src='http://think-robot.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>And for a quick reference here&#8217;s a table featured on a related <a target="_blank" href="http://stackoverflow.com/questions/5302903/jquery-event-stopimmediatepropagation-vs-return-false">StackOverflow question</a>:</p>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<th>stop propagation</th>
<th>prevent default action</th>
<th>prevent &#8220;same element&#8221; event handlers</th>
</tr>
</thead>
<tbody>
<tr>
<th>return false</th>
<td>X</td>
<td>X</td>
<td>&nbsp;</td>
</tr>
<tr>
<th>preventDefault</th>
<td>&nbsp;</td>
<td>X</td>
<td>&nbsp;</td>
</tr>
<tr>
<th>stopPropagation</th>
<td>X</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th>stopImmediatePropagation</th>
<td>X</td>
<td>&nbsp;</td>
<td>X</td>
</tr>
</tbody>
</table>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/" rel="bookmark">Hitch. Object-oriented event handlers with jQuery</a></li><li><a href="http://think-robot.com/2008/11/nested-sortable-using-jtree-clickable-links/" rel="bookmark">Nested sortable using jTree - clickable links</a></li><li><a href="http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/" rel="bookmark">Zend_Db_Select multiple table joins explained</a></li><li><a href="http://think-robot.com/2008/11/wordpress-nextgen-gallery-tweak/" rel="bookmark">WordPress NextGen gallery tweak</a></li><li><a href="http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/" rel="bookmark">Enable delayed messages in Zend_Queue</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2011/03/jquery-multiple-events-without-default-behaviour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enable delayed messages in Zend_Queue</title>
		<link>http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/</link>
		<comments>http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 11:57:52 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[queue]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Queue]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=268</guid>
		<description><![CDATA[The default Zend_Queue DB implementation unfortunately does not allow you to pass a timeout value when saving a message on the queue. However not all is lost and you can easily extend the standard Zend classes to add that functionality. All you need is your own Db adapter and Queue class. For the adapter you [...]]]></description>
			<content:encoded><![CDATA[<p>The default Zend_Queue DB implementation unfortunately does not allow you to <strong>pass a timeout value</strong> when saving a message on the queue. However not all is lost and you can easily extend the standard Zend classes to add that functionality.</p>
<p>All you need is your own <strong>Db adapter</strong> and <strong>Queue class</strong>.</p>
<p>For the adapter you only need to overwrite <strong>the send()</strong> function. The highlighted code below is the only change to the original class (2 lines affected&#8230;). You could actually apply this without extending Zend_Queue, but this way will be easier if you ever need to update your Zend library.</p>
<pre><code>&lt;?php

class TS_Queue_Adapter_Db extends Zend_Queue_Adapter_Db {

    /**
     * Send a message to the queue
     *
     * @param  string     $message Message to send to the active queue
     * @param  Zend_Queue $queue
     * @param  Timestamp $timeout
     * @return Zend_Queue_Message
     * @throws Zend_Queue_Exception - database error
     */
    public function send($message, Zend_Queue $queue = null<strong>, $timeout = null</strong>){
        if ($this->_messageRow === null) {
            $this->_messageRow = $this->_messageTable->createRow();
        }

        if ($queue === null) {
            $queue = $this->_queue;
        }

        if (is_scalar($message)) {
            $message = (string) $message;
        }
        if (is_string($message)) {
            $message = trim($message);
        }

        if (!$this->isExists($queue->getName())) {
            require_once 'Zend/Queue/Exception.php';
            throw new Zend_Queue_Exception('Queue does not exist:' . $queue->getName());
        }

        $msg = clone $this->_messageRow;
        $msg->queue_id = $this->getQueueId($queue->getName());
        $msg->created = time();
        $msg->body = $message;
        $msg->md5 = md5($message);
<strong>        $msg->timeout = $timeout;</strong>

        try {
            $msg->save();
        } catch (Exception $e) {
            require_once 'Zend/Queue/Exception.php';
            throw new Zend_Queue_Exception($e->getMessage(), $e->getCode(), $e);
        }

        $options = array(
            'queue' => $queue,
            'data' => $msg->toArray(),
        );

        $classname = $queue->getMessageClass();
        if (!class_exists($classname)) {
            require_once 'Zend/Loader.php';
            Zend_Loader::loadClass($classname);
        }
        return new $classname($options);
    }
}</code></pre>
<p>Your Queue class only needs to extend the <strong>send()</strong> function again to allow you to pass the timeout through. obviously you can use this class to add other functionality too.</p>
<pre><code>&lt;?php

class TS_Queue extends Zend_Queue {

	/**
	 * Send a message to the queue
	 *
	 * @param  mixed $message message
	 * @return Zend_Queue_Message
	 * @throws Zend_Queue_Exception
	 */
	public function send($message, $timeout = null){
		return $this->getAdapter()->send($message, null, $timeout);
	}
}</code></pre>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/" rel="bookmark">Hitch. Object-oriented event handlers with jQuery</a></li><li><a href="http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/" rel="bookmark">Zend_Db_Select multiple table joins explained</a></li><li><a href="http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/" rel="bookmark">Doctrine Many To Many With Extra Fields</a></li><li><a href="http://think-robot.com/2008/12/using-zend_mail-and-google-smtp-to-send-emails/" rel="bookmark">Using Zend_Mail and Google SMTP to send emails</a></li><li><a href="http://think-robot.com/2010/12/zend-application-resource-plugin-loading-issues/" rel="bookmark">Zend Application Resource Plugin Loading Issues</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP_AUTH_USER and PHP_AUTH_PW is null</title>
		<link>http://think-robot.com/2010/12/php_auth_user-and-php_auth_pw-is-null/</link>
		<comments>http://think-robot.com/2010/12/php_auth_user-and-php_auth_pw-is-null/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 19:30:41 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=249</guid>
		<description><![CDATA[Ok, so you&#8217;re trying to setup password protection on your website using HTTP authentication. Unfortunately despite the request for password working your authentication keeps failing. If you check the output of your script and the password and username variables are not populated as expected it will usually be for one of two reasons. Working code [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, so you&#8217;re trying to setup password protection on your website using HTTP authentication. Unfortunately despite the request for password working your authentication keeps failing. If you check the output of your script and the password and username variables are not populated as expected it will usually be for one of two reasons.</p>
<h2>Working code example</h2>
<pre><code>
$username = "expectedUsername";
$password = "expectedPassword";

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password) {
  header('WWW-Authenticate: Basic realm=""');
  header('HTTP/1.0 401 Unauthorized');
  echo '&gt;h2>Authorization failed.&gt;/h2>';
  exit;
} else if($_SERVER['PHP_AUTH_USER'] != $username &#038; $_SERVER['PHP_AUTH_PW'] != $password){
  echo '&gt;h2>Authorization failed.&gt;/h2>';
  exit;
}</code></pre>
<h2>Most common reason for failure</h2>
<p>Firstly if you are using an older book or website as reference you will see <strong>$PHP_AUTH_USER</strong> mentioned instead of <strong>$_SERVER['PHP_AUTH_USER']</strong>. If you are using the former then this could be the reason for not seeing your variables populated.</p>
<h2>The reason that can take you by surprise</h2>
<p>If your code is correct (compare against the example) and you are using the $_SERVER variable format and still getting <strong>NULL</strong> inside both $_SERVER['PHP_AUTH_USER'] and $_SERVER['PHP_AUTH_PW'] it&#8217;s time to check your server settings.</p>
<p>HTTP authentication does not work with the <strong>cgi version of PHP</strong>, so if your hosting allows you will need to switch to PHP as Apache module or look for an alternative solution.</p>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2008/12/using-zend_mail-and-google-smtp-to-send-emails/" rel="bookmark">Using Zend_Mail and Google SMTP to send emails</a></li><li><a href="http://think-robot.com/2008/08/server-error-500-htaccess-require-valid-user/" rel="bookmark">Server Error 500 - htaccess require valid-user</a></li><li><a href="http://think-robot.com/2009/12/phpunit-selenium-screenshot-path-problem/" rel="bookmark">PHPUnit & Selenium - screenshot path problem</a></li><li><a href="http://think-robot.com/2008/08/opensuse-11-on-lenovo-thinkpad-x61-tablet-pc/" rel="bookmark">openSUSE 11 on Lenovo Thinkpad X61 (tablet pc)</a></li><li><a href="http://think-robot.com/2008/10/how-to-convert-pdt-projects-into-phpeclipse-projects/" rel="bookmark">How to convert PDT projects into PHPEclipse projects</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2010/12/php_auth_user-and-php_auth_pw-is-null/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiple changes and a delete on same object in doctrine</title>
		<link>http://think-robot.com/2010/03/multiple-changes-and-a-delete-on-same-object-in-doctrine/</link>
		<comments>http://think-robot.com/2010/03/multiple-changes-and-a-delete-on-same-object-in-doctrine/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 20:58:13 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=219</guid>
		<description><![CDATA[If you want to make several different changes to a doctrine record object you might find yourself slightly puzzled when it comes to deleting related objects. $user['Address']->delete(); $user['Address']->state(Doctrine_Record::STATE_LOCKED); (...) $user->save(); It seems that unless you set the state the save later on still sees an initialized (though empty!) relation. Related Articles:Top Level Cookies in Opera [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to make several different changes to a doctrine record object you might find yourself slightly puzzled when it comes to deleting related objects.</p>
<pre><code>$user['Address']->delete();
$user['Address']->state(Doctrine_Record::STATE_LOCKED);
(...)
$user->save();</code></pre>
<p>It seems that unless you set the state the save later on still sees an initialized (though empty!) relation.</p>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2011/04/top-level-cookies-in-opera-for-custom-domain-names/" rel="bookmark">Top Level Cookies in Opera for Custom Domain Names</a></li><li><a href="http://think-robot.com/2008/08/server-error-500-htaccess-require-valid-user/" rel="bookmark">Server Error 500 - htaccess require valid-user</a></li><li><a href="http://think-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/" rel="bookmark">Hitch. Object-oriented event handlers with jQuery</a></li><li><a href="http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/" rel="bookmark">Doctrine Many To Many With Extra Fields</a></li><li><a href="http://think-robot.com/2011/06/wordpress-update-permission-issues/" rel="bookmark">WordPress update permission issues</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2010/03/multiple-changes-and-a-delete-on-same-object-in-doctrine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPUnit &amp; Selenium &#8211; screenshot path problem</title>
		<link>http://think-robot.com/2009/12/phpunit-selenium-screenshot-path-problem/</link>
		<comments>http://think-robot.com/2009/12/phpunit-selenium-screenshot-path-problem/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 23:04:46 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[selenium rc]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=207</guid>
		<description><![CDATA[PHPUnit_Framework_Exception: Response from Selenium RC server for testComplete(). ERROR: Command execution failure. Please search the forum at http://clearspace.openqa.org for error details from the log window. The error message is: Component returned failure code: 0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH) [nsILocalFile.initWithPath] Setting up Selenium RC server together with PHPUnit has proven surprisingly easy&#8230; Well most of it. Every now and [...]]]></description>
			<content:encoded><![CDATA[<pre><code>PHPUnit_Framework_Exception: Response from Selenium RC server for testComplete().
ERROR: Command execution failure. Please search the forum at http://clearspace.openqa.org for error details from the log window.
The error message is: Component returned failure code: 0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH) [nsILocalFile.initWithPath]
</code></pre>
<p>Setting up Selenium RC server together with PHPUnit has proven surprisingly easy&#8230; Well most of it. Every now and then as a beginner you might run into monster errors like the one above. No fear, what Selenium is trying to tell you is just that your path is wrong.</p>
<p>For me it happened when trying to setup the  error screenshot variables:</p>
<pre><code>protected $captureScreenshotOnFailure = TRUE;
<strong>protected $screenshotPath = '/var/www/localhost/htdocs/screenshots';</strong>
protected $screenshotUrl = 'http://localhost/screenshots';
</code></pre>
<p>In case you wonder the path relates to the <strong>browser&#8217;s host</strong> not the Selenium RC host (if they are different), In my case the browsers are run on a windows box, with the Selenium RC setup on a Linux machine. Thus the error about the inapropriate <strong>$screenshotPath</strong>.</p>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2010/12/installing-windows-7-guest-on-vmware-7-on-opensuse-113-host/" rel="bookmark">Installing Windows 7 Guest on VMWare 7 on OpenSuse 11.3 Host</a></li><li><a href="http://think-robot.com/2009/07/autloading-modular-forms-models-in-zend-framework-18/" rel="bookmark">Autloading modular forms & models in Zend Framework 1.8</a></li><li><a href="http://think-robot.com/2008/08/server-error-500-htaccess-require-valid-user/" rel="bookmark">Server Error 500 - htaccess require valid-user</a></li><li><a href="http://think-robot.com/2011/04/top-level-cookies-in-opera-for-custom-domain-names/" rel="bookmark">Top Level Cookies in Opera for Custom Domain Names</a></li><li><a href="http://think-robot.com/2010/12/zend-application-resource-plugin-loading-issues/" rel="bookmark">Zend Application Resource Plugin Loading Issues</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2009/12/phpunit-selenium-screenshot-path-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autloading modular forms &amp; models in Zend Framework 1.8</title>
		<link>http://think-robot.com/2009/07/autloading-modular-forms-models-in-zend-framework-18/</link>
		<comments>http://think-robot.com/2009/07/autloading-modular-forms-models-in-zend-framework-18/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 21:55:00 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[autload]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=200</guid>
		<description><![CDATA[It&#8217;s not really obvious with the error messages you get, but using a thing like Form_Login does not work out of the box with a modular structure. Which is slightly surprising considering that it&#8217;s inside the default module. I have found examples like the second one below, but no one mentions that you actually declare [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not really obvious with the error messages you get, but using a thing like Form_Login does not work out of the box with a modular structure. Which is slightly surprising considering that it&#8217;s inside the default module.</p>
<p>I have found <a href="http://forums.zend.com/viewtopic.php?f=69&#038;t=1288&#038;start=0" class="external">examples like the second one below</a>, but no one mentions that you actually declare the default namespace too for everything to work.</p>
<pre><code>$autoloader = new Zend_Application_Module_Autoloader(array(
	'namespace' => '',
	'basePath'  => APPLICATION_PATH .'/modules/default',
	'resourceTypes' => array (
		'form' => array(
		'path' => 'forms',
		'namespace' => 'Form',
    ),
	'model' => array(
		'path' => 'models',
		'namespace' => 'Model',
    	),
    )
));

$autoloader = new Zend_Application_Module_Autoloader(array(
	'namespace' => 'Admin_',
	'basePath'  => APPLICATION_PATH .'/modules/admin',
	'resourceTypes' => array (
		'form' => array(
		'path' => 'forms',
		'namespace' => 'Form',
    ),
	'model' => array(
		'path' => 'models',
		'namespace' => 'Model',
    	),
    )
));</code></pre>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/02/zend-framework-decorators-labels-and-checkboxes/" rel="bookmark">Zend Framework Decorators - Labels and Checkboxes</a></li><li><a href="http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/" rel="bookmark">Doctrine Many To Many With Extra Fields</a></li><li><a href="http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/" rel="bookmark">Zend_Db_Select multiple table joins explained</a></li><li><a href="http://think-robot.com/2008/11/wordpress-nextgen-gallery-tweak/" rel="bookmark">WordPress NextGen gallery tweak</a></li><li><a href="http://think-robot.com/2011/08/edit-bios-in-lenovo-thinkpad-x220t/" rel="bookmark">Edit BIOS in Lenovo ThinkPad x220t</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2009/07/autloading-modular-forms-models-in-zend-framework-18/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Doctrine Many To Many With Extra Fields</title>
		<link>http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/</link>
		<comments>http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/#comments</comments>
		<pubDate>Sat, 09 May 2009 10:25:13 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[many to many]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[YAML]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=180</guid>
		<description><![CDATA[Recently I have started using Doctrine with Zend Framework. Most of the time it is great, but sometimes I get stuck on this or that issue. Most of my problems so far have been connected with the Many to Many relationship. Here are a few tips I learned the hard way. Automatic relationship detection When [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I have started using Doctrine with Zend Framework. Most of the time it is great, but sometimes I get stuck on this or that issue. Most of my problems so far have been connected with the Many to Many relationship. Here are a few tips I learned the hard way.<span id="more-180"></span></p>
<h2>Automatic relationship detection</h2>
<p>When setting up a YAML file with your database schema you can start it with the handy declaration:</p>
<pre><code>---
detect_relations: true</code></pre>
<p>It does the One to Many relationship for you nicely, however the Many to Many ones did not work out of the box and required manual BaseModel tweaking. Take for example my <strong>Tag</strong>, <strong>Website</strong>, and <strong>WebsiteTag</strong> classes.</p>
<h3>BaseTag:</h3>
<pre><code>abstract class BaseTag extends Doctrine_Record {

  public function setTableDefinition() {
    $this-&gt;setTableName('ts_tags');
    $this-&gt;hasColumn('name', 'string', 128, array('type' =&gt; 'string', 'length' =&gt; '128'));
    $this-&gt;hasColumn('is_category as isCategory', 'integer', 1, array('type' =&gt; 'integer', 'length' =&gt; '1'));
    $this-&gt;hasColumn('page_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8));
    $this-&gt;hasColumn('ordering', 'integer', 5, array('type' =&gt; 'integer', 'length' =&gt; '5'));
  }

  public function setUp() {
    $this-&gt;hasOne('Page', array('local' =&gt; 'page_id',
                                              'foreign' =&gt; 'id'));
<strong>
    $this-&gt;hasMany('Website as Websites', array('local' =&gt; 'tag_id',
                                                                     'foreign' =&gt; 'website_id',
                                                                     'refClass' =&gt; 'WebsiteTag'));</strong>

    $i18n0 = new Doctrine_Template_I18n(array('fields' =&gt; array(0 =&gt; 'name')));
    $this-&gt;actAs($i18n0);
  }
}</code></pre>
<h3>BaseWebsite:</h3>
<pre><code>abstract class BaseWebsite extends Doctrine_Record{
  public function setTableDefinition() {
    $this-&gt;setTableName('ts_websites');
    $this-&gt;hasColumn('page_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8));
    $this-&gt;hasColumn('title', 'string', 128, array('type' =&gt; 'string', 'length' =&gt; '128'));
    $this-&gt;hasColumn('client', 'string', 128, array('type' =&gt; 'string', 'length' =&gt; '128'));
    $this-&gt;hasColumn('link', 'string', 255, array('type' =&gt; 'string', 'length' =&gt; '255'));
    $this-&gt;hasColumn('intro', 'string', null, array('type' =&gt; 'string'));
    $this-&gt;hasColumn('content', 'string', null, array('type' =&gt; 'string'));
    $this-&gt;hasColumn('published', 'timestamp', null, array('type' =&gt; 'timestamp'));
    $this-&gt;hasColumn('is_home as isHome', 'integer', 1, array('type' =&gt; 'integer', 'length' =&gt; '1'));
  }

  public function setUp() {
    $this-&gt;hasOne('Page', array('local' =&gt; 'page_id',
                                              'foreign' =&gt; 'id'));

    <strong>$this-&gt;hasMany('Tag as Tags', array('local' =&gt; 'website_id',
                                                          'foreign' =&gt; 'tag_id',
                                                          'refClass' =&gt; 'WebsiteTag'));</strong>

    $this-&gt;hasMany('Media', array('local' =&gt; 'website_id',
                                                 'foreign' =&gt; 'media_id',
                                                 'refClass' =&gt; 'WebsiteMedia'));

    $i18n0 = new Doctrine_Template_I18n(array('fields' =&gt; array(0 =&gt; 'intro', 1 =&gt; 'content', 2 =&gt; 'title')));
    $this-&gt;actAs($i18n0);
  }
}
</code></pre>
<h3>BaseWebsiteTag:</h3>
<pre><code>abstract class BaseWebsiteTag extends Doctrine_Record {

  public function setTableDefinition() {
    $this-&gt;setTableName('ts_website_has_tags');
    $this-&gt;hasColumn('tag_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8, <strong>'primary' =&gt; true )</strong>);
    $this-&gt;hasColumn('website_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8,<strong> 'primary' =&gt; true</strong>));
  }

  public function setUp() {
  }
}
</code></pre>
<p>The highlighted portions of code needed to be added. You can actually define these manually in the YAML file, the catch is that I was expecting it to happen magically with the auto relationship setting.</p>
<h2>Many to Many with extra fields</h2>
<p>Another little issue that Doctrine has is when you try to retrieve records. It in a way skips the joining table and retrieves a collection of the final items. In most cases this is exactly what you might need. However for my Media I decided to keep the ordering in the joining table &#8211; WebsiteMedia.</p>
<pre><code>$q = Doctrine_Query::create()
  -&gt;from('Website w')
  -&gt;joinLeft('w.Media');</code></pre>
<p>If you simply proceed with the above you only get Media objects without the ordering.</p>
<h3>BaseWebsiteMedia:</h3>
<pre><code>abstract class BaseWebsiteMedia extends Doctrine_Record {

    public function setTableDefinition() {
        $this-&gt;setTableName('ts_website_has_media');
        $this-&gt;hasColumn('website_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8, 'primary' =&gt; true));
        $this-&gt;hasColumn('media_id', 'integer', 8, array('type' =&gt; 'integer', 'length' =&gt; 8, 'primary' =&gt; true));
        $this-&gt;hasColumn('caption', 'string', 255, array('type' =&gt; 'string', 'length' =&gt; '255'));
        $this-&gt;hasColumn('is_main as isMain', 'integer', 1, array('type' =&gt; 'integer', 'length' =&gt; '1'));
        $this-&gt;hasColumn('ordering', 'integer', 4, array('type' =&gt; 'integer', 'length' =&gt; '4'));
    }

    public function setUp() {
        <strong>$this-&gt;hasOne('Website', array('local' =&gt; 'website_id',
                                       'foreign' =&gt; 'id'));

        $this-&gt;hasOne('Media', array('local' =&gt; 'media_id',
                                     'foreign' =&gt; 'id'));</strong>

        $i18n0 = new Doctrine_Template_I18n(array('fields' =&gt; array(0 =&gt; 'caption')));
        $this-&gt;actAs($i18n0);
    }
}</code></pre>
<p>If you do not have the additional One to Many relations declared already you should add them now. With the modified model now you can get the records like so:</p>
<pre><code>$q = Doctrine_Query::create()
  ->from('Website w')
  ->leftJoin('w.WebsiteMedia wm')
    ->leftJoin('wm.Media m');
</code></pre>
<p>This gives you a collection of WebsiteMedia records each containing the actual Media item.</p>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/" rel="bookmark">Zend_Db_Select multiple table joins explained</a></li><li><a href="http://think-robot.com/2009/02/zend-framework-decorators-labels-and-checkboxes/" rel="bookmark">Zend Framework Decorators - Labels and Checkboxes</a></li><li><a href="http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/" rel="bookmark">Enable delayed messages in Zend_Queue</a></li><li><a href="http://think-robot.com/2009/07/autloading-modular-forms-models-in-zend-framework-18/" rel="bookmark">Autloading modular forms & models in Zend Framework 1.8</a></li><li><a href="http://think-robot.com/2008/12/using-zend_mail-and-google-smtp-to-send-emails/" rel="bookmark">Using Zend_Mail and Google SMTP to send emails</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Week of the Month in Mysql</title>
		<link>http://think-robot.com/2009/04/week-of-the-month-in-mysql/</link>
		<comments>http://think-robot.com/2009/04/week-of-the-month-in-mysql/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 15:37:16 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[stackoverflow]]></category>
		<category><![CDATA[week]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=173</guid>
		<description><![CDATA[SELECT WEEK(my_date_field,5) - WEEK(DATE_SUB(my_date_field, INTERVAL DAYOFMONTH(my_date_field)-1 DAY),5)+1 Recently I needed to get the number of the week in a certain month. There is the handy WEEK() function, however it only gives you the week of the year. Obviously before we can go through the code above, a definition of the nth week of the month [...]]]></description>
			<content:encoded><![CDATA[<pre><code>SELECT WEEK(my_date_field,5) -
WEEK(DATE_SUB(my_date_field, INTERVAL DAYOFMONTH(my_date_field)-1 DAY),5)+1
</code></pre>
<p><span id="more-173"></span><br />
Recently I needed to get the number of the week in a certain month. There is the handy <strong>WEEK()</strong> function, however it only gives you the week of the year.</p>
<p>Obviously before we can go through the code above, a definition of the <strong>n<sup>th</sup></strong> week of the month is needed (as I realized after <a href="http://stackoverflow.com/questions/785206/function-for-week-of-the-month-in-mysql">asking the question on stackoverflow</a>&#8230;):</p>
<p>For me the week starts on a Monday, and the first week of the month does not have to be a full week &#8211; if a month starts on a Friday, the Friday to Sunday days count as the first week.</p>
<p>With this out of the way here is a quick explanation of what goes on above.</p>
<pre><code>WEEK(my_date_field,<strong>5</strong>)</code></pre>
<p>First we get the actual week number of the year for the specified date. The second parameter is there to define Monday as the first day of the week (<a href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_week">more details in Mysql manual</a>).</p>
<pre><code>DAYOFMONTH(my_date_field)</code></pre>
<p>Next we get the day of the month for the specified date.</p>
<pre><code>DATE_SUB(my_date_field, <strong>DAYOFMONTH(my_date_field)</strong>-1 DAY)</code></pre>
<p>We can use that number with <strong>DATE_SUB</strong> to get the date for the 1<sup>st</sup> day of the month. This in turn can be used to get the week number for the 1<sup>st</sup> week of the month.</p>
<pre><code>SELECT WEEK(my_date_field,5) -
WEEK(<strong>DATE_SUB(my_date_field, INTERVAL DAYOFMONTH(my_date_field)-1 DAY)</strong>,5)+1
</code></pre>
<p>Finally we subtract the first day&#8217;s week from the actual week number which should give us the month&#8217;s week number starting from 0. Thus the final <strong>+1</strong> if you want the count to start from 1.</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=55c87db5-a5a4-45e9-92f1-43c731c03ece" /><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2008/06/atmedia-london-2008/" rel="bookmark">@media - London, 2008</a></li><li><a href="http://think-robot.com/2009/02/firefox-ignores-tabs-but-not-spaces-in-a-pre-tag/" rel="bookmark">Firefox ignores tabs but not spaces in a pre tag</a></li><li><a href="http://think-robot.com/2009/02/how-to-use-the-strong-ownership-list/" rel="bookmark">How To Use the Strong Ownership List</a></li><li><a href="http://think-robot.com/2009/12/zend_date-time-part-and-gmt/" rel="bookmark">Zend_Date time part and GMT</a></li><li><a href="http://think-robot.com/2011/03/jquery-multiple-events-without-default-behaviour/" rel="bookmark">jQuery Multiple Events Without Default Behaviour</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2009/04/week-of-the-month-in-mysql/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zend_Db_Select multiple table joins explained</title>
		<link>http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/</link>
		<comments>http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 22:52:23 +0000</pubDate>
		<dc:creator>Joanna</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Db_select]]></category>
		<category><![CDATA[Zend_Db_Table_Abstract]]></category>

		<guid isPermaLink="false">http://think-robot.com/?p=156</guid>
		<description><![CDATA[It sounds like a simple task &#8211; retrieve the result from a join SQL query. Unusually you can even find documentation on the official Zend Framework site explaining how to put together a query that will return the results from a JOIN query. Unfortunately when it actually comes to putting theory into practice any Zend [...]]]></description>
			<content:encoded><![CDATA[<p>It sounds like a simple task &#8211; retrieve the result from a join SQL query. Unusually you can even find <a href="http://framework.zend.com/manual/en/zend.db.select.html" target="_blank">documentation on the official Zend</a> Framework site explaining how to put together a query that will return the results from a JOIN query. Unfortunately when it actually comes to putting theory into practice any Zend newcomer can run into several problems.<span id="more-156"></span></p>
<h2>You Think It&#8217;s Easy&#8230;</h2>
<p>For starters rather than use &#8220;raw&#8221; <strong>Zend_Db_Select</strong>:</p>
<pre><code>$select = $db-&gt;select();</code></pre>
<p>I wanted to derive the select from my <strong>Zend_Db_Table_Abstract</strong>, like so:</p>
<pre><code>
class Model_Db_Website extends Zend_Db_Table_Abstract {
	(...)
	public function fetchWebsites(){
		$select = $this-&gt;select();
		$select-&gt;join(array('whi' =&gt; 'website_has_images), 'whi.website_id = websites.website_id')
		return $this-&gt;fetchAll($select);
	}
}
</code></pre>
<p>This was more or less the example I found in the documentation. You might be wondering what is wrong with this picture. At first it seems like there is nothing missing. The table fields and the table name (for the FROM clause) are taken from the table class, and we have provided all the necessary JOIN details&#8230; However instead of the expected result, you an error message!</p>
<pre class="msg"><code><strong>Message:</strong> Select query cannot join with another table </code></pre>
<h2>The Solution</h2>
<p>Not to prolong any more here is the final bit, which we will walk-through below.</p>
<pre><code>
class Model_Db_Website extends Zend_Db_Table_Abstract {
	(...)
	public function fetchWebsites(){
		$select = $this-&gt;select();
		$select<strong>-&gt;setIntegrityCheck(false)</strong>
			<strong>-&gt;from($this-&gt;_name, '*')</strong>
			-&gt;join(
				array('whi' =&gt; 'website_has_images'),
				'whi.website_id = websites.website_id'<strong>, '*'</strong>
    			);
		return $this-&gt;fetchAll($select);
	}
}
</code></pre>
<p>The first thing you need to do is get rid of the error. This one has been mentioned online quite a lot and is easy to fix by applying:</p>
<pre class="msg"><code>-&gt;setIntegrityCheck(false)</code></pre>
<p>The code above makes your result set read only, but allows you to do joins.</p>
<p>Now for the less obvious bits. Once the above problem is fixed you will notice that your results only include the join table fields. To fix this add the final parameter to the list &#8211; either a &#8216;*&#8217; or an explicit list of fields.</p>
<p><strong>Many sites suggest using an empty array, though this causes the result set to return only main table fields&#8230;</strong></p>
<p>The &#8216;*&#8217; is not enough though. You still need the from declaration <strong>-&gt;from($this-&gt;_name, &#8216;*&#8217;)</strong>, as without you will still be getting just the join table fields.</p>
<p>So there you go, it took me quite a bit of fiddling and randomly changing the parameter set to arrive at the final solution. Hope it saves you the hassle too!</p>
<div id="crp_related"><h2>Related Articles:</h2><ul><li><a href="http://think-robot.com/2009/05/doctrine-many-to-many-with-extra-fields/" rel="bookmark">Doctrine Many To Many With Extra Fields</a></li><li><a href="http://think-robot.com/2011/03/jquery-multiple-events-without-default-behaviour/" rel="bookmark">jQuery Multiple Events Without Default Behaviour</a></li><li><a href="http://think-robot.com/2008/11/wordpress-nextgen-gallery-tweak/" rel="bookmark">WordPress NextGen gallery tweak</a></li><li><a href="http://think-robot.com/2009/04/week-of-the-month-in-mysql/" rel="bookmark">Week of the Month in Mysql</a></li><li><a href="http://think-robot.com/2011/01/enable-delayed-messages-in-zend_queue/" rel="bookmark">Enable delayed messages in Zend_Queue</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://think-robot.com/2009/04/zend_db_select-multiple-table-joins-explained/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

