<?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"
	>

<channel>
	<title>Osteraker.fi</title>
	<atom:link href="http://www.osteraker.fi/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.osteraker.fi/blog</link>
	<description>Web technologies and so on...</description>
	<pubDate>Sun, 18 Jan 2009 11:38:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Zend Framework Soap Server in WSDL-mode</title>
		<link>http://www.osteraker.fi/blog/2008/09/zend-framework-soap-server-in-wsdl-mode/</link>
		<comments>http://www.osteraker.fi/blog/2008/09/zend-framework-soap-server-in-wsdl-mode/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 14:44:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[soap]]></category>

		<category><![CDATA[wsdl]]></category>

		<category><![CDATA[zend]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://www.osteraker.fi/blog/?p=13</guid>
		<description><![CDATA[Update: ZF version 1.7 offers a setUri() method that overrides the default endpoint. No hack needed.
I wanted to publish some web services over SOAP in an Zend Framework application of mine and tried out the ZF Soap classes. Getting this to work was not that obvious so I thought I would share my experiences. In [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong>: ZF version 1.7 offers a setUri() method that overrides the default endpoint. No hack needed.</p>
<p>I wanted to publish some web services over SOAP in an Zend Framework application of mine and tried out the ZF Soap classes. Getting this to work was not that obvious so I thought I would share my experiences. In a nutshell I wanted ZF to automatically generate an WSDL for me on the fly based on my class. Additionally it should work in a ZF application environment with URL rewriting. Current <a title="Zend_Soap documentation" href="http://framework.zend.com/manual/en/zend.soap.html" target="_blank">Zend_Soap documentation</a> does not show this in a straightforward way.</p>
<p>You&#8217;re after the code anyway so here it is <img src='http://www.osteraker.fi/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> :</p>
<div class="geshi no php">
<div class="head">/**</div>
<ol>
<li class="li1">
<div class="de1"><span class="sy0">*</span> Zend Framework Soap Server in WSDL<span class="sy0">-</span>mode</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> This is a normal ZF controller <span class="kw2">class</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> Get WSDL by calling http<span class="sy0">:</span><span class="co1">//yourserver.com/soap-server?WSDL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> <span class="sy0">@</span>author Patrik Osteraker</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> SoapServerController <span class="kw2">extends</span> Zend_Controller_Action <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Executed before any ..Action()</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Disable rendering and layout functionality</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> preDispatch<span class="br0">&#40;</span><span class="br0">&#41;</span> &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$this</span><span class="sy0">-&gt;</span>_helper<span class="sy0">-&gt;</span><span class="me1">viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">setNoRender</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="re1">$this</span><span class="sy0">-&gt;</span>_helper<span class="sy0">-&gt;</span><span class="me1">layout</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">disableLayout</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="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> indexAction<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Check if we should serve the WSDL, http://yourserver.com/soap-server?WSDL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">array_key_exists</span><span class="br0">&#40;</span><span class="st0">&#39;WSDL&#39;</span><span class="sy0">,</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getRequest</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getParams</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Auto generate WSDL from existing class MyWebServices</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$autodiscover</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Soap_AutoDiscover<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">// Here comes a hack!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// The fourth parameter is a custom end point that overrides ZF&#39;s own end point logic, see explanation below</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$autodiscover</span><span class="sy0">-&gt;</span><span class="me1">setClass</span><span class="br0">&#40;</span><span class="st0">&#39;MyWebServices&#39;</span><span class="sy0">,</span> <span class="st0">&#39;&#39;</span><span class="sy0">,</span> <span class="kw2">null</span><span class="sy0">,</span> <span class="st0">&quot;http://yourserver.com/soap-server&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$autodiscover</span><span class="sy0">-&gt;</span><span class="me1">handle</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="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$options</span><span class="sy0">=</span><span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Soap_Server<span class="br0">&#40;</span><span class="st0">&quot;http://yourserver.com/soap-server?WSDL&quot;</span><span class="sy0">,</span> <span class="re1">$options</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">setClass</span><span class="br0">&#40;</span><span class="st0">&#39;MyWebServices&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">handle</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="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That was our controller class. The hack stems from the current ZF end point definition in the setClass() method which is (Zend/Soap/AutoDiscover.php:74):</p>
<div class="geshi no php">
<div class="head">public function setClass($class, $namespace = &#39;&#39;, $argv = null)</div>
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$uri</span> <span class="sy0">=</span> Zend_Uri<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="st0">&#39;http://&#39;</span> <span class="sy0">.</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_HOST&#39;</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;SCRIPT_NAME&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&#8230;</span>continues</div>
</li>
</ol>
</div>
<p>As you can see this won&#8217;t play nicely in a ZF application where URL rewriting is on. The SCRIPT_NAME will always be index.php and your SOAP client will shoot to the wrong end point (http://yourserver.com/index.php). So a small fix let&#8217;s you specify your own end point in full :</p>
<div class="geshi no php">
<div class="head">public function setClass($class, $namespace = &#39;&#39;, $argv = null, $endPoint=null)</div>
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$uri</span> <span class="sy0">=</span> Zend_Uri<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="st0">&#39;http://&#39;</span> <span class="sy0">.</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_HOST&#39;</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;SCRIPT_NAME&#39;</span><span class="br0">&#93;</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">$endPoint</span><span class="sy0">!=</span><span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$uri</span> <span class="sy0">=</span> Zend_Uri<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re1">$endPoint</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="sy0">&#8230;</span>continues</div>
</li>
</ol>
</div>
<p>Alrighty then, we have a SOAP server, the only thing missing is the MyWebServices class. That class is a plain old PHP class with proper method documentation (!important, the autodiscovery logic uses the doc).</p>
<div class="geshi no php">
<div class="head">class MyWebServices {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Echoes input string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Test method</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @param string $str</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @return string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> hello<span class="br0">&#40;</span><span class="re1">$str</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="re1">$str</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="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now you have a SOAP server that lives in the ZF application environment and can utilize it. Test and debug with the <a href="http://www.soapui.org/" target="_blank">free tool soap UI</a><br />
ZF version used is 1.6.1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.osteraker.fi/blog/2008/09/zend-framework-soap-server-in-wsdl-mode/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Simple form submit with Dojo</title>
		<link>http://www.osteraker.fi/blog/2008/09/simple-form-submit-with-dojo/</link>
		<comments>http://www.osteraker.fi/blog/2008/09/simple-form-submit-with-dojo/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 21:14:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[dojo]]></category>

		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.osteraker.fi/blog/?p=12</guid>
		<description><![CDATA[I was experimenting with Dojo the other day and to my surprise I did not find a really simple form submit example (using AJAX). What I was looking for was a snippet that took a form id and submitted the form based on that. The endpoint would be the form&#8217;s action attribute to make the [...]]]></description>
			<content:encoded><![CDATA[<p>I was experimenting with Dojo the other day and to my surprise I did not find a really simple form submit example (using AJAX). What I was looking for was a snippet that took a form id and submitted the form based on that. The endpoint would be the form&#8217;s action attribute to make the function reusable on more than one form.</p>
<p>Sitepen has a lot of useful tutorials and they got quite close to what I needed in their <a title="Sitepen Dojo Quick Start Guide" href="http://sitepen.com/labs/guides/?guide=DojoQuickStart" target="_blank">Dojo Quick Start Guide</a>. However, their example code seem to be intended to show off Dojo functionality (of course) and used features I did not need.</p>
<p>To the point then. Here is my draft of a form submission using Dojo&#8217;s AJAX functionality:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>script type=<span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* POSTs a form identified by formid using Dojo Ajax</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* The server response is shown in the element identified by msgboxid</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* TODO: A lot, modify to meet your needs</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @param formid The id of the form to submit</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @param msgboxid The id of the element to display the response in</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @return </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> formSubmit<span class="br0">&#40;</span>formid, msgboxid<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;dojo.<span class="me1">xhrPost</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; form: formid,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; handleAs: <span class="st0">&quot;text&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; handle: <span class="kw2">function</span><span class="br0">&#40;</span>data,args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">typeof</span> data == <span class="st0">&quot;error&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">warn</span><span class="br0">&#40;</span><span class="st0">&quot;error!&quot;</span>,args<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&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; &nbsp; <span class="co1">// show server response in the firebug console</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span>data<span class="br0">&#41;</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;dojo.<span class="me1">byId</span><span class="br0">&#40;</span>msgboxid<span class="br0">&#41;</span>.<span class="me1">innerHTML</span> = data;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>div id=<span class="st0">&quot;fsettingsmsgbox&quot;</span><span class="sy0">&gt;&lt;/</span>div<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>form method=<span class="st0">&quot;post&quot;</span> action=<span class="st0">&quot;settings/update&quot;</span> id=<span class="st0">&quot;fsettings&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>input type=<span class="st0">&quot;text&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;lastname&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>input type=<span class="st0">&quot;button&quot;</span> value=<span class="st0">&quot;Save settings&quot;</span> onclick=<span class="st0">&quot;formSubmit(&#39;fsettings&#39;, &#39;fsettingsmsgbox&#39;);&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>form<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>Easy as it should be <img src='http://www.osteraker.fi/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Yes, there is a lot you could add to this to make it more generic/re-usable/robust but I wanted to keep it as simple as possible so newbies like me can follow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.osteraker.fi/blog/2008/09/simple-form-submit-with-dojo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zend Framework</title>
		<link>http://www.osteraker.fi/blog/2008/06/zend-framework/</link>
		<comments>http://www.osteraker.fi/blog/2008/06/zend-framework/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 13:44:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zend]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://www.osteraker.fi/blog/?p=8</guid>
		<description><![CDATA[I have been looking for a suitable framework to build my web applications on for some time now. The motivation behind the quest is of course to reap the benefits that a framework can bring to my web app development process. A framework that suits you can cut development time and add consistent structure to [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span lang="EN-GB">I have been looking for a suitable framework to build my web applications on for some time now. The motivation behind the quest is of course to reap the benefits that a framework can bring to my web app development process. A framework that suits you can cut development time and add consistent structure to the application. However, a framework that you do not understand and that has poor documentation can have you pulling your hair in notime. </span></p>
<p class="MsoNormal"><span lang="EN-GB">The framework should be intuitive to use and have extensive documentation. A broad user base would also be desirable as it tend to generate online tutorials, snippets and problem solving threads. I prefer to use the MVC-style architecture in my applications and the framework of choice should thus support this. In short these are my main requirements for the framework:</span></p>
<ul>
<li><span lang="EN-GB">MVC</span></li>
<li><span lang="EN-GB">URL rewriting built in</span></li>
<li><span lang="EN-GB">Some kind of ORM solution</span></li>
<li><span lang="EN-GB">Intuitive to use (a very subjective property of course)</span></li>
<li><span lang="EN-GB">Good documentation</span></li>
<li><span lang="EN-GB">Internationalization and localization supported</span></li>
</ul>
<p class="MsoNormal"><span lang="EN-GB">The list could easily be extended with all sorts of fancy features like </span><span lang="EN-GB">AJAX</span><span lang="EN-GB"> and Web Services functionalities. Although these might be important for an application I concentrate on the basics in this case. There are many frameworks today that have all the desired features listed above. The decision boils down, not surprisingly, to the intuitiveness and level of documentation of the frameworks. This said it is important to remember that the choice of framework is a very subjective matter and does not rely on any universal truths or ‘absolutely correct’ ways of doing things.</span></p>
<p class="MsoNormal"><span lang="EN-GB">One possible framework candidate is the Zend Framework (ZF). It has some nice features besides the ones listed as requirements above. It uses the New BSD License (<a href="http://framework.zend.com/license">http://framework.zend.com/license</a>) that is very allowing for all kinds of applications. The company behind it is no less than the PHP company itself; Zend. Having Zend as a backing force certainly lifts the profile of the framework. Businesses will appreciate the commercial support and consultation services provided by one of the biggest players in the PHP world. It is likely that the Zend Framework will have more buzz, tools and literature created around it than other similar frameworks. It seems to be a stable choice for the future. </span></p>
<p class="MsoNormal"><span lang="EN-GB"><strong>Practical test</strong> </span></p>
<p class="MsoNormal"><span lang="EN-GB">It looks good so far on paper, but how does it run in practice? Is it intuitive and simple enough for my liking? I will give it a test run and my findings are presented in the next section. </span></p>
<p class="MsoNormal"><span lang="EN-GB">The work breakdown is the following:</span></p>
<ol style="margin-top: 0cm;" type="1">
<li class="MsoNormal"><span lang="EN-GB">Install the Zend Framework</span></li>
<li class="MsoNormal"><span lang="EN-GB">Do necessary configurations</span></li>
<li class="MsoNormal"><span lang="EN-GB">Create an application</span></li>
<li class="MsoNormal"><span lang="EN-GB">Create a user table and a user      model class</span></li>
<li class="MsoNormal"><span lang="EN-GB">Create login functionality</span></li>
</ol>
<p class="MsoNormal"><span lang="EN-GB">This should give me an idea about the ‘feel’ of the framework and I get to see how difficult configuration and database interaction is. </span></p>
<p class="MsoNormal"><strong>1. </strong><strong><span lang="EN-GB">Install the Zend Framework</span><span lang="EN-GB"> </span></strong></p>
<p class="MsoNormal"><span lang="EN-GB">Download a copy of the library from <a href="http://framework.zend.com/download">http://framework.zend.com/download</a></span></p>
<p class="MsoNormal"><span lang="EN-GB">It comes as a zip/tar.gz file that contains the framework files, demos and tests.</span></p>
<p class="MsoNormal"><span lang="EN-GB">Next you need to create the folder structure that will host the framework and your own code. You can modify the folder names and locations if you want, but I see no need to do so here. </span></p>
<p class="MsoNormal"><img class="alignnone size-full wp-image-9" title="Zend Framework folder structure" src="http://www.osteraker.fi/blog/wp-content/uploads/2008/06/zendframework-folder-structure.jpg" alt="" width="157" height="144" /></p>
<p class="MsoNormal">The document root and only publicly accessible folder will be the www-folder.<br />
The Zend Framework files comes in directly under the library-folder.</p>
<p class="MsoNormal"><strong>2. </strong><span lang="EN-GB"><strong>Configuration</strong></span></p>
<p class="MsoNormal"><span lang="EN-GB">The configuration can be kept at a very minimum by setting up autoloaders and defining controller script locations in a bootstrap file. This bootstrap.php file is located in the application folder and is included by the index.php file that is the only publicly accessible PHP file, located in the www folder. A .htaccess file takes care of the URL rewriting.</span></p>
<p class="MsoNormal">www/.htaccess:</p>
<div class="geshi no text">
<ol>
<li class="li1">
<div class="de1">RewriteEngine on</div>
</li>
<li class="li1">
<div class="de1">RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php</div>
</li>
</ol>
</div>
<p class="MsoNormal">www/index.php:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require</span> <span class="st0">&#39;../application/bootstrap.php&#39;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal">application/bootstrap.php:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* Report all errors directly to the screen for simple diagnostics in the dev environment */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span> <span class="sy0">|</span> E_STRICT<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">ini_set</span><span class="br0">&#40;</span><span class="st0">&#39;display_startup_errors&#39;</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">ini_set</span><span class="br0">&#40;</span><span class="st0">&#39;display_errors&#39;</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">date_default_timezone_set<span class="br0">&#40;</span><span class="st0">&#39;Europe/Helsinki&#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="coMULTI">/* Add the Zend Framework library to the include path so that we can access the ZF classes */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">set_include_path</span><span class="br0">&#40;</span><span class="st0">&#39;../library&#39;</span> <span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> <span class="kw3">get_include_path</span><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"><span class="coMULTI">/* Add models directory to path */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">set_include_path</span><span class="br0">&#40;</span><span class="st0">&#39;../application/models&#39;</span> <span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> <span class="kw3">get_include_path</span><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"><span class="coMULTI">/* Set up autoload so we don&#39;t have to explicitely require each Zend Framework class */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span> <span class="st0">&quot;Zend/Loader.php&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Zend_Loader<span class="sy0">::</span><span class="me2">registerAutoload</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="coMULTI">/* Set the singleton instance of the front controller */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span> <span class="sy0">=</span> Zend_Controller_Front<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;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* Disable error handler so it doesn&#39;t intercept all those errors we enabled above */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span><span class="sy0">-&gt;</span><span class="me1">throwExceptions</span><span class="br0">&#40;</span><span class="kw2">true</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="coMULTI">/* Point the front controller to your action controller directory */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span><span class="sy0">-&gt;</span><span class="me1">setControllerDirectory</span><span class="br0">&#40;</span><span class="st0">&#39;../application/controllers&#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">// Plugins</span></div>
</li>
<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> Zend_Controller_Plugin_ErrorHandler<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"><span class="re1">$config</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Config_Xml<span class="br0">&#40;</span><span class="st0">&#39;/path-to/zf-demo/application/config.xml&#39;</span><span class="sy0">,</span> <span class="st0">&#39;production&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$db</span> <span class="sy0">=</span> Zend_Db<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re1">$config</span><span class="sy0">-&gt;</span><span class="me1">database</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Zend_Db_Table_Abstract<span class="sy0">::</span><span class="me2">setDefaultAdapter</span><span class="br0">&#40;</span><span class="re1">$db</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="coMULTI">/* OK, do your stuff, front controller */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span><span class="sy0">-&gt;</span><span class="me1">dispatch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-GB">Although we can create applications without more configurations it is likely that we need to configure for instance access to our database(s).<span> </span></span></p>
<p class="MsoNormal"><span lang="EN-GB">What I want is thus a configuration file. I chose to use the XML format along with the Zend_Config_Xml class to access it.<br />
</span></p>
<p class="MsoNormal">application/config.xml :</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;configdata<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;production<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;webhost<span class="re2">&gt;</span></span></span>www.myserver.com<span class="sc3"><span class="re1">&lt;/webhost<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;database<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;adapter<span class="re2">&gt;</span></span></span>pdo_mysql<span class="sc3"><span class="re1">&lt;/adapter<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;params<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;host<span class="re2">&gt;</span></span></span>localhost<span class="sc3"><span class="re1">&lt;/host<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;username<span class="re2">&gt;</span></span></span>dbuser<span class="sc3"><span class="re1">&lt;/username<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;password<span class="re2">&gt;</span></span></span>a98w3yht9a32ht<span class="sc3"><span class="re1">&lt;/password<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;dbname<span class="re2">&gt;</span></span></span>demodb<span class="sc3"><span class="re1">&lt;/dbname<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/params<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/database<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/production<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/configdata<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p class="MsoNormal">The XML config file is loaded by the Zend_Config_Xml class:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$config</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Config_Xml<span class="br0">&#40;</span><span class="st0">&#39;/path-to/zf-demo/application/config.xml&#39;</span><span class="sy0">,</span> <span class="st0">&#39;production&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal">Configuration data is then accessible through the $config object as member variables. The database can for instance be set up like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$db</span> <span class="sy0">=</span> Zend_Db<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re1">$config</span><span class="sy0">-&gt;</span><span class="me1">database</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><strong>3. <span lang="EN-GB">Create an application</span></strong></p>
<p class="MsoNormal"><span lang="EN-GB">This one is easy. What I need is a controller class, a view directory and a view file. </span></p>
<p class="MsoNormal"><a href="http://www.osteraker.fi/blog/wp-content/uploads/2008/06/zendframework-folder-structure-application.jpg"><img class="alignnone size-medium wp-image-10" title="zendframework-folder-structure-application" src="http://www.osteraker.fi/blog/wp-content/uploads/2008/06/zendframework-folder-structure-application.jpg" alt="" width="229" height="289" /></a></p>
<p class="MsoNormal">The IndexController class is the default controller that is used if no other is called for. Accompanying the controller class is a view directory with the same name &#8220;index&#8221;. In the view directory you put one .phtml file for each action in the controller, keeping filename and action name the same.</p>
<p class="MsoNormal">application/IndexController.php:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/** @see Zend_Controller_Action */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span> <span class="st0">&#39;Zend/Controller/Action.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> IndexController <span class="kw2">extends</span> Zend_Controller_Action</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> indexAction<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"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal">application/views/scripts/index/index.phtml:</p>
<div class="geshi no html">
<ol>
<li class="li1">
<div class="de1">Helloworld!</div>
</li>
</ol>
</div>
<p>The IndexController&#8217;s default action (index) can be invoked by opening the www directory in a web browser. The www-directory should be set as document root for the domain you want to use. Let&#8217;s say the www dir equals http://yourdomain.com/</p>
<p>Then the IndexController, and index action can be called like this (all displaying &#8220;Helloworld!&#8221;)</p>
<p>http://yourdomain.com/<br />
http://yourdomain.com/index<br />
http://yourdomain.com/index/index<br />
http://yourdomain.com/index/index/id/1234</p>
<p>The meaning of the URL components are thus<br />
http://yourdomain.com/&lt;controller name&gt;/&lt;action name&gt;/&lt;GET parameter name&gt;/&lt;GET parameter value&gt;</p>
<p class="MsoNormal"><span lang="EN-GB"><strong>4. Create a user table and a user model class</strong></span></p>
<p class="MsoNormal"><span lang="EN-GB">Ok. Now we have a functional application created with the Zend Framework. I want to add database functionality to my application and see how that is can be done with ZF. The database table I want to access looks like this: </span></p>
<div class="geshi no text">
<ol>
<li class="li1">
<div class="de1">CREATE TABLE `user`(`username` VARCHAR(25) NOT NULL, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `password`VARCHAR(50) &nbsp;NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `first_name` VARCHAR(25) NOT NULL,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `last_name` VARCHAR(25) NOT NULL, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PRIMARY KEY(`username`)</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )TYPE MYISAM;</div>
</li>
</ol>
</div>
<p>The table is loaded with one user row. The password is salted and md5 hashed.</p>
<p><a href="http://www.osteraker.fi/blog/wp-content/uploads/2008/06/zendframework-user-table.jpg"><img class="alignnone size-full wp-image-11" title="zendframework-user-table" src="http://www.osteraker.fi/blog/wp-content/uploads/2008/06/zendframework-user-table.jpg" alt="User row" width="479" height="51" /></a></p>
<p class="MsoNormal"><span lang="EN-GB">I want to model the table with a model class. ZF has no ORM generator functionality that can generate model classes from existing database schemas. This mean I will have to create the model class by hand, luckily it is not complicated at all. </span></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> User <span class="kw2">extends</span> Zend_Db_Table_Abstract <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">protected <span class="re1">$_name</span> <span class="sy0">=</span> <span class="st0">&#39;user&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">protected <span class="re1">$_primary</span> <span class="sy0">=</span> <span class="st0">&#39;username&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-GB">The database access is declared in the bootstrap file as the default db access adapter. </span></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$config</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Config_Xml<span class="br0">&#40;</span><span class="st0">&#39;/path-to/zf-demo/application/config.xml&#39;</span><span class="sy0">,</span> <span class="st0">&#39;production&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$db</span> <span class="sy0">=</span> Zend_Db<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re1">$config</span><span class="sy0">-&gt;</span><span class="me1">database</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Zend_Db_Table_Abstract<span class="sy0">::</span><span class="me2">setDefaultAdapter</span><span class="br0">&#40;</span><span class="re1">$db</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-GB">Now I have created database access, a database table and a data model class. So far so good!<br />
</span></p>
<p class="MsoNormal"><strong>5. <span lang="EN-GB">Create login functionality</span></strong></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">Creating a login function requires a login form (view), a login action that checks credentials, and something that creates a session on successful login. </span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">Let’s start with the view. I chose to do a simple HTML form (in index.phtml) for this example. The same could be done with the Zend_Form class.<br />
</span></p>
<p class="MsoNormal"><span lang="EN-GB">application/views/scripts/index.phtml</span></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="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">message</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">$this</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;p&gt;You are logged in as &quot;</span><span class="sy0">.</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">first_name</span><span class="sy0">.</span><span class="st0">&quot;&lt;p&gt;&quot;</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="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>form method<span class="sy0">=</span><span class="st0">&quot;post&quot;</span> action<span class="sy0">=</span><span class="st0">&quot;&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>table<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>tr<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;</span>Username<span class="sy0">&lt;/</span>td<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;&lt;</span>input type<span class="sy0">=</span><span class="st0">&quot;text&quot;</span> name<span class="sy0">=</span><span class="st0">&quot;username&quot;</span><span class="sy0">&gt;&lt;/</span>td<span class="sy0">&gt;&lt;/</span>tr<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>tr<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;</span>Password<span class="sy0">&lt;/</span>td<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;&lt;</span>input type<span class="sy0">=</span><span class="st0">&quot;password&quot;</span> name<span class="sy0">=</span><span class="st0">&quot;password&quot;</span><span class="sy0">&gt;&lt;/</span>td<span class="sy0">&gt;&lt;/</span>tr<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>tr<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;&lt;/</span>td<span class="sy0">&gt;&lt;</span>td<span class="sy0">&gt;&lt;</span>input type<span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> value<span class="sy0">=</span><span class="st0">&quot;Login&quot;</span><span class="sy0">&gt;&lt;/</span>td<span class="sy0">&gt;&lt;/</span>tr<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>table<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>form<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-GB">Then we need to create an action that takes the username and password POST parameters and authenticates against the database. I will use ZF classes to do the authentication work. When a successful authentication is detected the entire User object for that user is retrieved using ZF database abstraction classes.<br />
</span></p>
<p class="MsoNormal">application/controllers/IndexController.php</p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/** @see Zend_Controller_Action */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span> <span class="st0">&#39;Zend/Controller/Action.php&#39;</span><span class="sy0">;&lt;/</span>span<span class="sy0">&gt;&lt;/</span>p<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> IndexController <span class="kw2">extends</span> Zend_Controller_Action</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="re1">$salt</span> <span class="sy0">=</span> <span class="st0">&quot;0328t4aw9htiousnevziSHEp+9&lt;w82h13qhwt&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> indexAction<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;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$request</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getRequest</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">// Check if we have a POST request</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$request</span><span class="sy0">-&gt;</span><span class="me1">isPost</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"><span class="re1">$postData</span> <span class="sy0">=</span> <span class="re1">$request</span><span class="sy0">-&gt;</span><span class="me1">getPost</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="kw1">require_once</span> <span class="st0">&#39;Zend/Auth/Adapter/DbTable.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$password</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">salt</span><span class="sy0">.</span><span class="re1">$postData</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;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Configure with constructor parameters&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$authAdapter</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Auth_Adapter_DbTable<span class="br0">&#40;</span>Zend_Db_Table_Abstract<span class="sy0">::</span><span class="me2">getDefaultAdapter</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="st0">&#39;user&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#39;username&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#39;password&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$authAdapter</span><span class="sy0">-&gt;</span><span class="me1">setIdentity</span><span class="br0">&#40;</span><span class="re1">$postData</span><span class="br0">&#91;</span><span class="st0">&#39;username&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$authAdapter</span><span class="sy0">-&gt;</span><span class="me1">setCredential</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;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$auth</span> &nbsp; &nbsp;<span class="sy0">=</span> Zend_Auth<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"><span class="re1">$result</span> &nbsp;<span class="sy0">=</span> <span class="re1">$auth</span><span class="sy0">-&gt;</span><span class="me1">authenticate</span><span class="br0">&#40;</span><span class="re1">$authAdapter</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">$result</span><span class="sy0">-&gt;</span><span class="me1">isValid</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"><span class="co1">// Success</span></div>
</li>
<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">message</span> <span class="sy0">=</span> <span class="st0">&quot;Login successful&quot;</span><span class="sy0">;</span></div>
</li>
<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">user</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span>Zend_Auth<span class="sy0">::</span><span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getIdentity</span><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"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<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">message</span> <span class="sy0">=</span> <span class="st0">&quot;Login unsuccessful&quot;</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="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</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="kw2">private</span> <span class="kw2">function</span> getUser<span class="br0">&#40;</span><span class="re1">$username</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$u</span> <span class="sy0">=</span> <span class="kw2">new</span> User<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$user</span> <span class="sy0">=</span> <span class="re1">$u</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="re1">$username</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">current</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="kw1">return</span> <span class="re1">$user</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="br0">&#125;</span></div>
</li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-GB">The Zend classes offers good help as we can see. Retrieving a mapped object from the database using the primary key is fairly trivial.<br />
</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">Then we are done with the coding!</span></p>
<p class="MsoNormal">A working demo of the application is found <a title="Zend Framework Demo - Login functionality" href="http://demo.netzink.com/zf-demo/www/" target="_blank">here</a>. Login with demo : demo</p>
<p class="MsoNormal">The source code can be downloaded <a title="Download source code" href="http://demo.netzink.com/zf-demo/zf-demo.tar">here</a> and is free for all uses.</p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><strong><span lang="EN-GB">Summary and reflection</span></strong></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">I am impressed with the documentation available at <a title="Framework.zend.com" href="http://framework.zend.com" target="_blank">framework.zend.com</a>. I had very little problem finding what I needed. Right away I also liked that the framework doesn’t seem to want to boss me around much <img src='http://www.osteraker.fi/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span><span lang="EN-GB"> Zend’s promise “Built so you can pick and choose just the pieces you need to turbocharge your web applications…” is fulfilled in my opinion.</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">It is probably a very good idea to use as much of the ZF functionality as possible rather than creating your own code that does the same. I am sure ZF does it better in most cases. However, trying to learn everything about the ZF and using all tricks in your first ZF application may not be fruitful. The learning curve becomes too steep. Instead you can learn as you go over time. You will be less frustrated and more productive by taking small steps in adopting the ZF classes. I think the ZF has an advantage over many other frameworks in this respect, it does allow you to use it as much or little as you want. </span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="EN-GB">I had used the Doctrine and Propel ORM frameworks before and they had code generators that could generate model classes from database schemas (and vice versa) making it easy to sync the database with the models. The ZF approach is much simpler and I had my doubts about it initially. Zend does not talk about having an ORM either so I wondered if I would be faced with much dreaded model routine coding. The ZF offers implementations of Martin Fowlers Enterprise Application Architecture patterns Table Data Gateway and Row Data Gateway. My simple test here gave me the impression that ZF’s implementations were surprisingly intuitive to use. Pending more demanding database applications…</span></p>
<p class="MsoNormal"><strong>References and further reading:</strong></p>
<p class="MsoNormal">This article is heavily based upon the documentation provided by Zend.</p>
<p class="MsoNormal"><a title="Zend Controller Quickstart" href="http://http//framework.zend.com/manual/en/zend.controller.html#zend.controller.quickstart" target="_blank">Zend Controller Quickstart</a></p>
<p class="MsoNormal"><a title="Zend_Auth" href="http://framework.zend.com/manual/en/zend.auth.html" target="_blank">Zend_Auth</a></p>
<p class="MsoNormal"><a title="Zend_Db_Table" href="http://framework.zend.com/manual/en/zend.db.table.html" target="_blank">Zend_Db_Table</a></p>
<p class="MsoNormal"><a title="Zend_Db_Table_Rowset" href="http://framework.zend.com/manual/en/zend.db.table.rowset.html" target="_blank">Zend_Db_Table_Rowset</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.osteraker.fi/blog/2008/06/zend-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blogging starts&#8230;</title>
		<link>http://www.osteraker.fi/blog/2008/06/blogging-starts/</link>
		<comments>http://www.osteraker.fi/blog/2008/06/blogging-starts/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 14:19:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.osteraker.fi/blog/?p=7</guid>
		<description><![CDATA[init(); So, it looks like I&#8217;m finally going to find the time to write a few rows once in a while. I have thought about doing some casual blogging for a while now. I guess I will be mostly writing about web technologies since that is what I&#8217;m interested in (and working with). Ajax, PHP [...]]]></description>
			<content:encoded><![CDATA[<p>init(); So, it looks like I&#8217;m finally going to find the time to write a few rows once in a while. I have thought about doing some casual blogging for a while now. I guess I will be mostly writing about web technologies since that is what I&#8217;m interested in (and working with). Ajax, PHP and some Java along with popular frameworks are likely topics to be seen here.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.osteraker.fi/blog/2008/06/blogging-starts/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
