<?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>Richard Knop&#039;s Zend Framework Blog &#187; Zend Framework</title>
	<atom:link href="http://blog.richardknop.com/category/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.richardknop.com</link>
	<description>Zend Framework, PHP, MySQL, jQuery, JavaScript, AJAX, SEO, E-commerce and more</description>
	<lastBuildDate>Mon, 06 Sep 2010 15:49:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Zend_Navigation add class to active link</title>
		<link>http://blog.richardknop.com/2010/09/zend_navigation-add-class-to-active-link/</link>
		<comments>http://blog.richardknop.com/2010/09/zend_navigation-add-class-to-active-link/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 15:49:00 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend controller plugins]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=621</guid>
		<description><![CDATA[It is often useful to highlight an active navigation menu link so users are clear about where they are. It is usually done by adding a class (for instance: &#8220;active&#8221;) to a link which points to a current request URI. When using Zend_Navigation it is a bit more complicated. I am using a controller plugin [...]]]></description>
			<content:encoded><![CDATA[<p>It is often useful to highlight an active navigation menu link so users are clear about where they are. It is usually done by adding a class (for instance: &#8220;active&#8221;) to a link which points to a current request URI. When using Zend_Navigation it is a bit more complicated. I am using a controller plugin to add the class to the active link during the routeShutdown event:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Plugin_PrepareNavigation <span class="kw2">extends</span> Zend_Controller_Plugin_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> routeShutdown<span class="br0">&#40;</span>Zend_Controller_Request_Abstract <span class="re1">$request</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span> <span class="sy0">=</span> Zend_Controller_Action_HelperBroker<span class="sy0">::</span><span class="me2">getExistingHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">initView</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span> <span class="sy0">=</span> <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$container</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Navigation<span class="br0">&#40;</span>Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;configuration&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">navigation</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$container</span><span class="sy0">-&gt;</span><span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$page</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$uri</span> <span class="sy0">=</span> <span class="re1">$page</span><span class="sy0">-&gt;</span><span class="me1">getHref</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$uri</span> <span class="sy0">===</span> <span class="re1">$request</span><span class="sy0">-&gt;</span><span class="me1">getRequestUri</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$page</span><span class="sy0">-&gt;</span><span class="me1">setClass</span><span class="br0">&#40;</span><span class="st0">&#39;active&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">navigation</span><span class="br0">&#40;</span><span class="re1">$container</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/09/zend_navigation-add-class-to-active-link/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Action helper that converts SQL result to XML</title>
		<link>http://blog.richardknop.com/2010/09/action-helper-that-converts-sql-result-to-xml/</link>
		<comments>http://blog.richardknop.com/2010/09/action-helper-that-converts-sql-result-to-xml/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 15:43:09 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend action helpers]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=617</guid>
		<description><![CDATA[Here is a simple Zend Framework controller action helper that converts SQL result to XML. The SQL result should be fetched as an object or an array of objects: &#60;?php class My_Controller_Action_Helper_SqlToXml extends Zend_Controller_Action_Helper_Abstract &#123; &#160; &#160; public function direct&#40;$sqlResult, $rootElementName, $childElementName, $singleRow, $encoding = &#39;UTF-8&#39;&#41; &#160; &#160; &#123; &#160; &#160; &#160; &#160; // create [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a simple Zend Framework controller action helper that converts SQL result to XML. The SQL result should be fetched as an object or an array of objects:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Action_Helper_SqlToXml <span class="kw2">extends</span> Zend_Controller_Action_Helper_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> direct<span class="br0">&#40;</span><span class="re1">$sqlResult</span><span class="sy0">,</span> <span class="re1">$rootElementName</span><span class="sy0">,</span> <span class="re1">$childElementName</span><span class="sy0">,</span> <span class="re1">$singleRow</span><span class="sy0">,</span> <span class="re1">$encoding</span> <span class="sy0">=</span> <span class="st0">&#39;UTF-8&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// create XML documnt &nbsp; &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$doc</span> <span class="sy0">=</span> <span class="kw2">new</span> DomDocument<span class="br0">&#40;</span><span class="st0">&#39;1.0&#39;</span><span class="sy0">,</span> <span class="re1">$encoding</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// insert a root element</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$root</span> <span class="sy0">=</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">createElement</span><span class="br0">&#40;</span><span class="re1">$rootElementName</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$root</span> <span class="sy0">=</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">appendChild</span><span class="br0">&#40;</span><span class="re1">$root</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// if the SQL result set contains only a singler row</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">true</span> <span class="sy0">===</span> <span class="re1">$singleRow</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$xmlData</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rowToXml</span><span class="br0">&#40;</span><span class="re1">$doc</span><span class="sy0">,</span> <span class="re1">$root</span><span class="sy0">,</span> <span class="re1">$sqlResult</span><span class="sy0">,</span> <span class="re1">$childElementName</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// if the SQL result set is an object array</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">false</span> <span class="sy0">===</span> <span class="re1">$singleRow</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$sqlResult</span> <span class="kw1">as</span> <span class="re1">$row</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$xmlData</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rowToXml</span><span class="br0">&#40;</span><span class="re1">$doc</span><span class="sy0">,</span> <span class="re1">$root</span><span class="sy0">,</span> <span class="re1">$row</span><span class="sy0">,</span> <span class="re1">$childElementName</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// return XML string</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">saveXML</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> rowToXml<span class="br0">&#40;</span><span class="re1">$doc</span><span class="sy0">,</span> <span class="re1">$root</span><span class="sy0">,</span> <span class="re1">$row</span><span class="sy0">,</span> <span class="re1">$childElementName</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// insert a child element</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$occ</span> <span class="sy0">=</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">createElement</span><span class="br0">&#40;</span><span class="re1">$childElementName</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$occ</span> <span class="sy0">=</span> <span class="re1">$root</span><span class="sy0">-&gt;</span><span class="me1">appendChild</span><span class="br0">&#40;</span><span class="re1">$occ</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// iterate through each public object property and insert a shild element</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$row</span> <span class="kw1">as</span> <span class="re1">$property</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$child</span> <span class="sy0">=</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">createElement</span><span class="br0">&#40;</span><span class="re1">$property</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$child</span> <span class="sy0">=</span> <span class="re1">$occ</span><span class="sy0">-&gt;</span><span class="me1">appendChild</span><span class="br0">&#40;</span><span class="re1">$child</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$childValue</span> <span class="sy0">=</span> <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">createTextNode</span><span class="br0">&#40;</span><span class="re1">$value</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$childValue</span> <span class="sy0">=</span> <span class="re1">$child</span><span class="sy0">-&gt;</span><span class="me1">appendChild</span><span class="br0">&#40;</span><span class="re1">$childValue</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Hope some of you will find it useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/09/action-helper-that-converts-sql-result-to-xml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework &#8211; MixedCase or ACRONYMCase Survey</title>
		<link>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/</link>
		<comments>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 21:18:31 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=606</guid>
		<description><![CDATA[So Matthew Weier O&#8217;Phinney and the rest of the Zend Framework team have started to convert all code to use ACRONYMCase casing. However, they&#8217;re not done yet and they have decided to let people decide whether to use MixedCase or ACRONYMCase. If you&#8217;d like to have your say in this matter simply visit this website [...]]]></description>
			<content:encoded><![CDATA[<p>So Matthew Weier O&#8217;Phinney and the rest of the Zend Framework team have started to convert all code to use ACRONYMCase casing. However, they&#8217;re not done yet and they have decided to let people decide whether to use MixedCase or ACRONYMCase. If you&#8217;d like to have your say in this matter simply visit <a href="http://spreadsheets.google.com/viewform?formkey=dEtsV1NxLUYtOWZKTTN1cmVibV8tbEE6MQ">this website</a> and vote in the survey.</p>
<p>The poll will probably get closed in few days so hurry.</p>
<p>Personally, I have voted for ZF classes to enforce MixedCasing. I find it much more readable than ACRONYMCasing. XmlHttpRequest is prettier and more readable than XMLHTTPRequest, don&#8217;t you think?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zend Framework content negotiation plugin</title>
		<link>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/</link>
		<comments>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 17:33:41 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Content negotiation]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=601</guid>
		<description><![CDATA[Even though most designers write nice and valid XHTML it usually gets served to browser as text/html. In other words, what browser sees is a chaotic tag soup instead of XML (remember that while HTML was based on SGML, XHTML is based on XML or it is a reformulation of HTML in XML). The major [...]]]></description>
			<content:encoded><![CDATA[<p>Even though most designers write nice and valid XHTML it usually gets served to browser as text/html. In other words, what browser sees is a chaotic tag soup instead of XML (remember that while HTML was based on SGML, XHTML is based on XML or it is a reformulation of HTML in XML). The major reason why XHTML pages are getting served as text/html is infamous Internet Explorer which does not support serving XHTML the correct way (as XML). But why should your website suffer because of one browser? You can serve the tag soup to IE and serve XML to other browsers. This is called <strong>content negotiation</strong> and I&#8217;m going to show you a simple Zend Fraemwork controller plugin that will negotiate different content to different browsers:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Plugin_NegotiateContent <span class="kw2">extends</span> Zend_Controller_Plugin_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> preDispatch<span class="br0">&#40;</span>Zend_Controller_Request_Abstract <span class="re1">$request</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span> <span class="sy0">=</span> Zend_Controller_Action_HelperBroker<span class="sy0">::</span><span class="me2">getExistingHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">initView</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span> <span class="sy0">=</span> <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// content negotiation</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Vary: Accept&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">false</span> <span class="sy0">===</span> <span class="kw3">stristr</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_ACCEPT&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st0">&#39;application/xhtml+xml&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type: text/html; charset=utf-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;HTML4_STRICT&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headMeta</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendHttpEquiv</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type&#39;</span><span class="sy0">,</span> <span class="st0">&#39;text/html; charset=UTF-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">xhtmlAllowed</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type: application/xhtml+xml; charset=utf-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;XHTML1_STRICT&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headMeta</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendHttpEquiv</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type&#39;</span><span class="sy0">,</span> <span class="st0">&#39;application/xhtml+xml; charset=UTF-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">xhtmlAllowed</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This plugin will serve HTML 4.01 Strict as text/html to IE and XHTML 1.0 Strict as application/xhtml+xml to other browsers.</p>
<p>The only thing you need to do is to register the plugin to the front controller during bootstrapping:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span><span class="sy0">-&gt;</span><span class="me1">registerPlugin</span><span class="br0">&#40;</span><span class="kw2">new</span> My_Controller_Plugin_NegotiateContent<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>And it will take care of content negotiation. The plugin will also set a boolean view variable $view-&gt;xhtmlAllowed so you can use different markups in layouts and views if needed (&lt;img&gt; in HTML and &lt;img /&gt; in XHTML).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to register a new phpBB user with Zend Framework</title>
		<link>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/</link>
		<comments>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/#comments</comments>
		<pubDate>Thu, 20 May 2010 21:44:02 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[phpBB]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=580</guid>
		<description><![CDATA[You might need to integrate one of your future Zend Framework applications with phpBB forum software. The most important aspect of such integration is a dual sign up process. In other words, you want to avoid having users sign up at both the application and phpBB forum. The simplest solution is to have a single [...]]]></description>
			<content:encoded><![CDATA[<p>You might need to integrate one of your future Zend Framework applications with <a href="http://www.phpbb.com/">phpBB</a> forum software. The most important aspect of such integration is a dual sign up process. In other words, you want to avoid having users sign up at both the application and phpBB forum. The simplest solution is to have a single sign up form in your ZF application which upon submission will register user details in both your application and the phpBB forum. I will show you how to do that assuming both applications are on the same server.</p>
<p>The sign up form should have at least these fields:</p>
<ul>
<li>email</li>
<li>username</li>
<li>password</li>
</ul>
<div class="geshi no php">
<div class="head">// first of all, let&#39;s get the submitted form data</div>
<ol>
<li class="li1">
<div class="de1"><span class="re1">$data</span> <span class="sy0">=</span> <span class="re1">$form</span><span class="sy0">-&gt;</span><span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// here you would use the data to register user in the ZF application</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// once the user has been registered at the application level,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// let&#39;s use the same data to register him/her at the phpBB level</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$db</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;dbAdapter&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phpbbUserIp</span> <span class="sy0">=</span> <span class="st0">&#39;127.0.0.1&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// if IP is valid include it in the INSERT query</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$validator</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Validate_Ip<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$validator</span><span class="sy0">-&gt;</span><span class="me1">isValid</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;REMOTE_ADDR&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$phpbbUserIp</span> <span class="sy0">=</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;REMOTE_ADDR&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sql</span> <span class="sy0">=</span> <span class="st0">&#39;INSERT INTO phpbb_users (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_type,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;group_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_permissions,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;username,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;username_clean,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_password,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_email,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_email_hash,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_timezone,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_lang,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_ip,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_regdate,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_dateformat)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">2</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;username&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;username&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_helper<span class="sy0">-&gt;</span><span class="me1">PhpbbHash</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;password&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&#39;%u&#39;</span><span class="sy0">,</span> <span class="kw3">crc32</span><span class="br0">&#40;</span><span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">1.00</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;sk&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$phpbbUserIp</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;D M d, Y g:i a&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;SELECT user_id FROM phpbb_users WHERE user_email = ? LIMIT 1&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$userId</span> <span class="sy0">=</span> <span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">fetchColumn</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;INSERT INTO phpbb_user_group (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_leader,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user_pending)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VALUES (?, ?, ?, ?)&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="re1">$userId</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">7</span><span class="sy0">,</span> <span class="re1">$userId</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>There are few tiny things you will probably need to modify according to your application. I chose Slovak language (&#8216;sk&#8217;) and GMT+1 time zone (&#8217;1.00&#8242;) which is a time for central Europe. I also used a controller action helper PhpbbHash above. The helper is here:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* PhpbbHash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Just a phpbb hashing algorithm rewritten in a form of controller action helper.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The reason for this is because we want users to be registered simultaneously</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* at both the main website and the phpbb forum so we will need to add a row to</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* phpbb_users table during registration at the main website.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @author PHPBB</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Action_Helper_PhpbbHash <span class="kw2">extends</span> Zend_Controller_Action_Helper_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> direct<span class="br0">&#40;</span><span class="re1">$password</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$itoa64</span> <span class="sy0">=</span> <span class="st0">&#39;./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random_state</span> <span class="sy0">=</span> <span class="st0">&#39;123456789012&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count</span> <span class="sy0">=</span> <span class="nu0">6</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re1">$fh</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw3">fopen</span><span class="br0">&#40;</span><span class="st0">&#39;/dev/urandom&#39;</span><span class="sy0">,</span> <span class="st0">&#39;rb&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="kw3">fread</span><span class="br0">&#40;</span><span class="re1">$fh</span><span class="sy0">,</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$fh</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$random</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="sy0">;</span> <span class="re1">$i</span> <span class="sy0">+=</span> <span class="nu0">16</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random_state</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="st0">&#39;123456789012&#39;</span> <span class="sy0">.</span> <span class="re1">$random_state</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">.=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$random_state</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$random</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_crypt_private<span class="br0">&#40;</span><span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_gensalt_private<span class="br0">&#40;</span><span class="re1">$random</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$hash</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="nu0">34</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$hash</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$password</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_gensalt_private<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="sy0">,</span> <span class="re1">$iteration_count_log2</span> <span class="sy0">=</span> <span class="nu0">6</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$iteration_count_log2</span> <span class="sy0">&lt;</span> <span class="nu0">4</span> <span class="sy0">||</span> <span class="re1">$iteration_count_log2</span> <span class="sy0">&gt;</span> <span class="nu0">31</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$iteration_count_log2</span> <span class="sy0">=</span> <span class="nu0">8</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;$H$&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="kw3">min</span><span class="br0">&#40;</span><span class="re1">$iteration_count_log2</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw2">PHP_VERSION</span> <span class="sy0">&gt;=</span> <span class="nu0">5</span><span class="br0">&#41;</span> ? <span class="nu0">5</span> <span class="sy0">:</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">30</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_encode64<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="nu0">6</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_encode64<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="re1">$count</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="sy0">++</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="re1">$value</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">|=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> <span class="nu0">8</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">6</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">++</span> <span class="sy0">&gt;=</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">|=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> <span class="nu0">16</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">12</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">++</span> <span class="sy0">&gt;=</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">18</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_crypt_private<span class="br0">&#40;</span><span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$setting</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;*&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check for correct hash</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&#39;$H$&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count_log2</span> <span class="sy0">=</span> <span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re1">$itoa64</span><span class="sy0">,</span> <span class="re1">$setting</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$count_log2</span> <span class="sy0">&lt;</span> <span class="nu0">7</span> <span class="sy0">||</span> <span class="re1">$count_log2</span> <span class="sy0">&gt;</span> <span class="nu0">30</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count</span> <span class="sy0">=</span> <span class="nu0">1</span> <span class="sy0">&lt;&lt;</span> <span class="re1">$count_log2</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$salt</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">4</span><span class="sy0">,</span> <span class="nu0">8</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$salt</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="nu0">8</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * We&#39;re kind of forced to use MD5 here since it&#39;s the only</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * cryptographic primitive available in all versions of PHP</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * currently in use.  To implement our own low-level crypto</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * in PHP would result in much worse performance and</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * consequently in lower iteration counts and hashes that are</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * quicker to crack (by non-PHP code).</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">PHP_VERSION</span> <span class="sy0">&gt;=</span> <span class="nu0">5</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$salt</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$hash</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">&#8211;</span><span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$salt</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$hash</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">&#8211;</span><span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">12</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_encode64<span class="br0">&#40;</span><span class="re1">$hash</span><span class="sy0">,</span> <span class="nu0">16</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Few comments:</p>
<ol>
<li>The above code is taken directly from the phpBB codebase, I only made a couple of necessary changes to make it work with Zend Framework.</li>
<li>For those of you asking why didn&#8217;t I just use phpBB API and call its native functions, there is a reason for it. The phpBB code is written to be available with PHP 4. Zend Framework requires at least PHP 5.2.4. There are lots of globals and other scary stuff in the phpBB codebase which makes it impossible for its functions to be called from ZF controllers.</li>
<li>If you think I should have done something differently or I completely forgot to do something, please let me know.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework IE conditional stylesheets and scripts</title>
		<link>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/</link>
		<comments>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 21:27:17 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[IE conditional comments in Zend Framework]]></category>
		<category><![CDATA[Zend view helpers]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=559</guid>
		<description><![CDATA[You can append a conditional stylesheet in a controller action like this: $this-&#62;view-&#62;headLink&#40;&#41;-&#62;appendStylesheet&#40;&#39;/path/to/some/styles.css&#39;, &#39;screen&#39;, &#39;IE 8&#39;&#41;; Which would produce this markup: &#60;!--[if IE 8]&#62; &#60;link href="/path/to/some/styles.css" media="screen" rel="stylesheet" type="text/css" /&#62;&#60;![endif]--&#62; Adding a conditional JavaScript file is similar: $this-&#62;view-&#62;headScript&#40;&#41;-&#62;appendFile&#40;&#39;/path/to/some/script.js&#39;, &#39;text/javascript&#39;, array&#40;&#39;conditional&#39; =&#62; &#39;IE&#39;&#41;&#41;; And that would produce markup like this: &#60;!--[if IE]&#62; &#60;script type="text/javascript" src="/path/to/some/script.js"&#62;&#60;/script&#62;&#60;![endif]--&#62; It [...]]]></description>
			<content:encoded><![CDATA[<p>You can append a conditional stylesheet in a controller action like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">-&gt;</span><span class="me1">headLink</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendStylesheet</span><span class="br0">&#40;</span><span class="st0">&#39;/path/to/some/styles.css&#39;</span><span class="sy0">,</span> <span class="st0">&#39;screen&#39;</span><span class="sy0">,</span> <span class="st0">&#39;IE 8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Which would produce this markup:</p>
<pre>&lt;!--[if IE 8]&gt; &lt;link href="/path/to/some/styles.css" media="screen" rel="stylesheet" type="text/css" /&gt;&lt;![endif]--&gt;</pre>
<p>Adding a conditional JavaScript file is similar:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">-&gt;</span><span class="me1">headScript</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendFile</span><span class="br0">&#40;</span><span class="st0">&#39;/path/to/some/script.js&#39;</span><span class="sy0">,</span> <span class="st0">&#39;text/javascript&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;conditional&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;IE&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>And that would produce markup like this:</p>
<pre>&lt;!--[if IE]&gt; &lt;script type="text/javascript" src="/path/to/some/script.js"&gt;&lt;/script&gt;&lt;![endif]--&gt;</pre>
<p>It can pretty useful when you need to use IE conditional comments just for a single controller action. Otherwise, if it applies site-wide, it&#8217;s better to just put conditional stylesheets and/or scripts in a layout file.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Simple Search Engine Implementing Zend_Search_Lucene</title>
		<link>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/</link>
		<comments>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 15:51:36 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Search_Lucene]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=555</guid>
		<description><![CDATA[Zend_Search_Lucene is a PHP port of a popular Java search engine Apache Lucene. It is also an important part of Zend Framework. Some say that it is too sluggish to be used in robust web applications and recommend faster alternatives such as Sphinx but that is not today&#8217;s topic. In this post I will show [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://framework.zend.com/manual/en/zend.search.lucene.html">Zend_Search_Lucene</a> is a PHP port of a popular Java search engine <a href="http://lucene.apache.org/java/docs/">Apache Lucene</a>. It is also an important part of Zend Framework. Some say that it is too sluggish to be used in robust web applications and recommend faster alternatives such as <a href="http://www.sphinxsearch.com/">Sphinx</a> but that is not today&#8217;s topic. In this post I will show you a basic implementation of Zend_Search_Lucene that has worked well so far for medium websites I have worked on. There are two main tasks you will have to take care of:</p>
<ol>
<li>Creating an index and updating it regularly.</li>
<li>Searching the index with a powerful <a href="http://framework.zend.com/manual/en/zend.search.lucene.query-language.html">query language</a>.</li>
</ol>
<p>First, let&#8217;s create a fresh search index. I know it&#8217;s already tiresome but I will use a simple blog application for my example implementation. To simplify it even further, it will only be possible to search blog posts. The posts schema looks like this:</p>
<pre>CREATE TABLE posts (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
user_id INT NOT NULL,
INDEX (created_at),
INDEX (user_id),
FOREIGN KEY (user_id)
REFERENCES users(id)
ON UPDATE CASCADE
ON DELETE CASCADE,
PRIMARY KEY (id)
) ENGINE = INNODB;</pre>
<p>Creating the search index is easy:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">Zend_Search_Lucene<span class="sy0">::</span><span class="me2">setDefaultSearchField</span><span class="br0">&#40;</span><span class="st0">&#39;contents&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// create blog posts index located in /data/posts_index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// make sure the folder is writable</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span> <span class="sy0">=</span> Zend_Search_Lucene<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span><span class="st0">&#39;data/posts_index&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// $this-&gt;_getTable() is a method that returns a model</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// get() method of the model returns all posts from the database</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$posts</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_getTable<span class="br0">&#40;</span><span class="st0">&#39;Posts&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// iterate through posts and build the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$posts</span> <span class="kw1">as</span> <span class="re1">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Search_Lucene_Document<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">UnIndexed</span><span class="br0">&#40;</span><span class="st0">&#39;entry_id&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">id</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">Keyword</span><span class="br0">&#40;</span><span class="st0">&#39;title&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">title</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">UnStored</span><span class="br0">&#40;</span><span class="st0">&#39;contents&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">body</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">addDocument</span><span class="br0">&#40;</span><span class="re1">$doc</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// commit the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Pretty straightforward. You can see I have used three different static methods for adding fields to the document:</p>
<ul>
<li><strong>UnIndexed</strong>: unindexed and unstored (therefor unsearchable) but they are returned with search results. Unindexed fields usually store primary keys, timestamps or file paths.</li>
<li><strong>Text</strong>: indexed, stored and tokenized. Text fields are searchable and are returned with search hits. Titles, first and last names, cities and states, post codes and street names are all good candidates for keyword fields.</li>
<li><strong>UnStored</strong>: indexed and unstored &#8211; ideal for large texts.</li>
</ul>
<p>There are more types of fields you can use (keyword, binary) but you can read about them in the documentation.</p>
<p>Next thing you need to do is update the index every once in a while so the search hits return up-to-date information. There are two ways to get around this problem. The most obvious is to update the index every time a new post is published or an existing post is edited. Another approach would be to set up a cron job to run every now and then and rebuild the index. Which way you choose depends on many variables such as expected index size (a very large index can have few GBs in size).</p>
<p>Secondly, the index is already taken care of, so let&#8217;s search it:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">Zend_Search_Lucene_Analysis_Analyzer<span class="sy0">::</span><span class="me2">setDefault</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Zend_Search_Lucene<span class="sy0">::</span><span class="me2">setResultSetLimit</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// explode the search query to individual words</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$words</span>  <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re1">$request</span><span class="sy0">-&gt;</span><span class="me1">getParam</span><span class="br0">&#40;</span><span class="st0">&#39;search_for&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// start a search query and add a term for each word to it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$query</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Search_Lucene_Search_Query_MultiTerm<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$words</span> <span class="kw1">as</span> <span class="re1">$w</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query</span><span class="sy0">-&gt;</span><span class="me1">addTerm</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Search_Lucene_Index_Term<span class="br0">&#40;</span><span class="re1">$w</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// open and query the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span> <span class="sy0">=</span> Zend_Search_Lucene<span class="sy0">::</span><span class="me2">open</span><span class="br0">&#40;</span><span class="st0">&#39;data/posts_index&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$results</span> <span class="sy0">=</span> <span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="re1">$query</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// the search results</span></div>
</li>
</ol>
</div>
<p>That was possibly the simplest possible example of a Lucene search query. You can, however, create very complex queries with the powerful Lucene query language. You can either build queries manually in PHP or you can use Zend_Search_Lucene methods to build them. It&#8217;s so easy a baby could do it.</p>
<p>To search for posts with words &#8216;hello&#8217; and &#8216;word&#8217; in the contents field you would write this query:</p>
<pre>hello</pre>
<p>To search for a post that must contain &#8216;hello&#8217; and may contain &#8216;world&#8217;:</p>
<pre>+hello world</pre>
<p>To search for a post that must contain &#8216;hello&#8217; in the contents field and may contain &#8216;world&#8217; in the title field:</p>
<pre>+hello title:"world"</pre>
<p>And those were just basics. You can use boolean operators, wildcards, ranges and even perform a fuzzy search.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please use partials in your ZF apps</title>
		<link>http://blog.richardknop.com/2010/01/please-use-partials-in-your-zf-apps/</link>
		<comments>http://blog.richardknop.com/2010/01/please-use-partials-in-your-zf-apps/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 00:49:30 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=534</guid>
		<description><![CDATA[Wouldn&#8217;t you agree that using exactly the same markup in 15 views is a little bit redundant? Now imagine doing that 10 times in your application (that&#8217;s 15*10-15 which equals to 135 reduntant repetitions of the same piece of XHTML). Well, that&#8217;s the easier part. Now imagine you need to make few changes in the [...]]]></description>
			<content:encoded><![CDATA[<p>Wouldn&#8217;t you agree that using exactly the same markup in 15 views is a little bit redundant? Now imagine doing that 10 times in your application (that&#8217;s 15*10-15 which equals to 135 reduntant repetitions of the same piece of XHTML). Well, that&#8217;s the easier part. Now imagine you need to make few changes in the markup after few days. Guess what &#8211; you are going to do those worthless 135 repetitions again. And surely you might need more changes in the markup two weeks later&#8230; I could go on. There&#8217;s nothing easier than avoiding this problem in Zend Framework.</p>
<p>The solution is to use partial view helper which allows you to put the repetitive XHTML into a single file. For example, this could be your partial:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="co1">// saved in views/scripts/index/partials/partial.phtml ?&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>h3<span class="sy0">&gt;&lt;</span>?php <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">heading</span><span class="br0">&#41;</span><span class="sy0">;</span> ?<span class="sy0">&gt;&lt;/</span>h3<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>p<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Lorem ipsum dolor sit amet<span class="sy0">,</span> consectetur adipiscing elit<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Mauris porta<span class="sy0">,</span> sapien at accumsan venenatis<span class="sy0">,</span> neque velit </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; sodales augue<span class="sy0">,</span> sit amet posuere odio enim quis risus<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Aliquam semper<span class="sy0">,</span> ipsum porttitor ultricies bibendum<span class="sy0">,</span> sem </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; sapien tincidunt purus<span class="sy0">,</span> eget sollicitudin felis eros </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fermentum felis<span class="sy0">.</span> Praesent vehicula varius est at semper<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Nam nulla augue<span class="sy0">,</span> fermentum in varius vel<span class="sy0">,</span> tincidunt non </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; nibh<span class="sy0">.</span> In vitae neque vitae metus dignissim hendrerit<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Nulla eget massa nec sapien tempor ultricies a et tellus<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Sed imperdiet<span class="sy0">,</span> risus quis vehicula ornare<span class="sy0">,</span> justo lorem </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; iaculis sapien<span class="sy0">,</span> id semper massa nisi eu purus<span class="sy0">.</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Suspendisse sed urna eu risus rhoncus bibendum<span class="sy0">.</span> Cras </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; feugiat consectetur nisi id dictum<span class="sy0">.</span> Pellentesque quis </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mauris a risus dapibus dictum nec sed nisl<span class="sy0">.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>p<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>ul<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="sy0">&lt;</span>li<span class="sy0">&gt;</span>List Item <span class="nu0">1</span><span class="sy0">:</span> <span class="kw2">&lt;?php</span> <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">li1</span><span class="br0">&#41;</span><span class="sy0">;</span> ?<span class="sy0">&gt;&lt;/</span>li<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="sy0">&lt;</span>li<span class="sy0">&gt;</span>List Item <span class="nu0">2</span><span class="sy0">:</span> <span class="kw2">&lt;?php</span> <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">li2</span><span class="br0">&#41;</span><span class="sy0">;</span> ?<span class="sy0">&gt;&lt;/</span>li<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">&lt;</span>li<span class="sy0">&gt;</span>List Item <span class="nu0">3</span><span class="sy0">:</span> <span class="kw2">&lt;?php</span> <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">li3</span><span class="br0">&#41;</span><span class="sy0">;</span> ?<span class="sy0">&gt;&lt;/</span>li<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>ul<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>And this is how you would include it in all views where the same piece of markup occurs:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">partial</span><span class="br0">&#40;</span><span class="st0">&#39;index/partials/partial.phtml&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;heading&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Lorem Ipsum&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="st0">&#39;li1&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Hello&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="st0">&#39;li2&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;World&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;li3&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;!!!&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s really easy and it saves a huge amount of time both to you and to a developer that might work on your application in the future so please, all of you Zend Framework developers, use partial helpers wherever there is a repetitive XHTML markup in your application.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/01/please-use-partials-in-your-zf-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Zend_Captcha_Image easier to read</title>
		<link>http://blog.richardknop.com/2009/12/making-zend_captcha_image-easier-to-read/</link>
		<comments>http://blog.richardknop.com/2009/12/making-zend_captcha_image-easier-to-read/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 18:58:25 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Captcha_Image]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=530</guid>
		<description><![CDATA[Sometimes people will complain that the captcha is too difficult to read and they have to reload the page in order to be able to pass the captcha test. If you are not willing to say goodbye to the very flexible Zend_Captcha_Image there are only two ways how to make it easier to read: Use [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes people will complain that the captcha is too difficult to read and they have to reload the page in order to be able to pass the captcha test. If you are not willing to say goodbye to the very flexible Zend_Captcha_Image there are only two ways how to make it easier to read:</p>
<ol>
<li>Use different font (I have found that Arial is sometimes hard to read, a good replacement seems to be LBRITED.TTF).</li>
<li>Set lower dot and line noise level.</li>
</ol>
<p>You can use &#8220;dotNoiseLevel&#8221; and &#8220;lineNoiseLevel&#8221; to tune down the captcha noise (and surpisingly this is not mentioned in the Zend Framework documentation):</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$captcha</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Form_Element_Captcha<span class="br0">&#40;</span><span class="st0">&#39;captcha&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;label&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Captcha&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;helper&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;captcha&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;captcha&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Image&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;wordLen&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">5</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;timeout&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">300</span><span class="sy0">,</span> <span class="co1">// 5 minutes timeout</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;font&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;fonts/LBRITED.TTF&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;fontSize&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">20</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;width&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">100</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;height&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">60</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;imgDir&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;images/captcha/&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;imgUrl&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;/images/captcha/&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;dotNoiseLevel&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">15</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;lineNoiseLevel&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Above I went over the top perhaps. Nevertheless, you must be able to find a compromise so that the users will be happy and the security side of your website won&#8217;t suffer too much.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2009/12/making-zend_captcha_image-easier-to-read/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Caching with Zend_Cache</title>
		<link>http://blog.richardknop.com/2009/12/caching-with-zend_cache/</link>
		<comments>http://blog.richardknop.com/2009/12/caching-with-zend_cache/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 14:21:42 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=523</guid>
		<description><![CDATA[Caching with PHP is the best way to speed up your application and it&#8217;s quite easy thanks to native PHP modules such as APC or output buffering control. It&#8217;s even much much easier when you are using the Zend Framework as it contains a native class just for caching &#8211; Zend_Cache. To use the Zend_Cache [...]]]></description>
			<content:encoded><![CDATA[<p>Caching with PHP is the best way to speed up your application and it&#8217;s quite easy thanks to native PHP modules such as <a href="http://php.net/manual/en/book.apc.php">APC</a> or <a href="http://php.net/manual/en/book.outcontrol.php">output buffering control</a>. It&#8217;s even much much easier when you are using the Zend Framework as it contains a native class just for caching &#8211; <a href="http://framework.zend.com/manual/en/zend.cache.html">Zend_Cache</a>. To use the Zend_Cache you must first initialize it in the bootstrap and add it to the registry so you can access it easily in controllers, I do it like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">protected <span class="kw2">function</span> _initCache<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$frontend</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;lifetime&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">7200</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;automatic_seralization&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// where are we going to stored the cached files?</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$backend</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;cache_dir&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;cache&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">cache</span> <span class="sy0">=</span> Zend_Cache<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="st0">&#39;core&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;File&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$frontend</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$backend</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">protected <span class="kw2">function</span> _initRegistry<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">registry</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">registry</span><span class="sy0">-&gt;</span><span class="me1">cache</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">cache</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// I store much more in the registry, of course</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// for instance, configuration and db adapter</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The frontend and the backend adapters can take much more arguments, read the documentation to learn all possible options. I initialized the Zend_Cache object with the factory method. First argument means that we want to use the Zend_Cache_Core frontend which is the core of the Zend_Cache module. The second argument is the backend we want to use the Zend_Cache_Backend_File backend or that we want to store cached data as files in a specific directory. The other two parameters are frontend and backend options.</p>
<p>Now we can easily access the cache object in controllers or models:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$cache</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;cache&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// does the cache contain data we are looking for?</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="st0">&#39;myUniqueId&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// if not let&#39;s cache the data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// here I use only a random array but in a real application</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// you would probably cache some database entries</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;John Doe&#39;</span><span class="sy0">,</span> <span class="st0">&#39;Jane Doe&#39;</span><span class="sy0">,</span> <span class="st0">&#39;Baby Doe&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// besides unique cache id you can use tags to categorize data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">save</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="sy0">,</span> <span class="st0">&#39;myUniqueId&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;tag1&#39;</span><span class="sy0">,</span> <span class="st0">&#39;tag2&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// dump the cached data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That was easy, wasn&#8217;t it?</p>
<h3>Cleaning the cache</h3>
<p>You will surely also want to remove cached files at some point in your application:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// clean all cached files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">clean</span><span class="br0">&#40;</span>Zend_Cache<span class="sy0">::</span> <span class="me2">CLEANING_MODE_ALL</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// clean only outdated cached files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">clean</span><span class="br0">&#40;</span>Zend_Cache<span class="sy0">::</span><span class="me2">CLEANING_MODE_OLD</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// remove a particular cache id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">remove</span><span class="br0">&#40;</span><span class="st0">&#39;myUniqueId&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// remove records tagged as &quot;tag1&quot; AND &quot;tag2&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">clean</span><span class="br0">&#40;</span>Zend_Cache<span class="sy0">::</span><span class="me2">CLEANING_MODE_MATCHING_TAG</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;tag1&#39;</span><span class="sy0">,</span> <span class="st0">&#39;tag2&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// remove records tagged as &quot;tag1&quot; OR :tag2&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">clean</span><span class="br0">&#40;</span>Zend_Cache<span class="sy0">::</span><span class="me2">CLEANING_MODE_MATCHING_ANY_TAG</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;tag1&#39;</span><span class="sy0">,</span> <span class="st0">&#39;tag2&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// remove records NOT tagged as &quot;tag1&quot; or &quot;tag2&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cache</span><span class="sy0">-&gt;</span><span class="me1">clean</span><span class="br0">&#40;</span>Zend_Cache<span class="sy0">::</span><span class="me2">CLEANING_MODE_NOT_MATCHING_ANY_TAG</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;tag1&#39;</span><span class="sy0">,</span> <span class="st0">&#39;tag2&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s it for today and, by the way, Merry Christmas <img src='http://blog.richardknop.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2009/12/caching-with-zend_cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
