<?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>Sud Web Design</title>
	<atom:link href="http://sudwebdesign.com/feed" rel="self" type="application/rss+xml" />
	<link>http://sudwebdesign.com</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Tue, 14 May 2013 20:50:03 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Cook your own User Authentication in Yii – Part 2</title>
		<link>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-2/1053</link>
		<comments>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-2/1053#comments</comments>
		<pubDate>Mon, 13 May 2013 06:46:40 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=1053</guid>
		<description><![CDATA[In Cook your own User Authentication in Yii – Part 1 , we saw how to over-ride the CUserIdentity class to implement our own user validation against a database table. In this tutorial, we will see how to use the &#8230; <a href="http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-2/1053">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>In <strong><a title="Edit “Cook your own User Authentication in Yii – Part 1”" href="http://sudwebdesign.com/wp-admin/post.php?post=1015&amp;action=edit">Cook your own User Authentication in Yii – Part 1</a></strong> , we saw how to over-ride the CUserIdentity class to implement our own user validation against a database table.</p>
<p>In this tutorial, we will see how to use the CWebUser class to load the user details into the user&#8217;s web session.</p>
<h2>Customising the CWebUser class</h2>
<p>Once the user has been validated, in our case, against the database, we can then load the user details into the webuser class which Yii &nbsp;holds in the User Session. &nbsp;Because of this, you should be careful of what information you load and store in the webuser class as it could easily&nbsp;be accessible by the end user.</p>
<p>So we will create a new component called <strong>WebUser</strong> in protected/components as follows:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">class</span> WebUser <span style="color: #000000; font-weight: bold;">extends</span> CWebUser <span style="color: #009900;">&#123;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// Store model to not repeat query.</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_model</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// Return first name.</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// access it by Yii::app()-&gt;user-&gt;first_name</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> getFirstName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">firstname</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> getFullName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> getRole<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">role</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> getPage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pagination</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> getPasswordExpires<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">checkExpiryDate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// This is a function that checks the field 'role'</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// in the User model to be equal to constant defined in our User class</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// that means it's admin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// access it by Yii::app()-&gt;user-&gt;isAdmin()</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> isAdmin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadUser</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">!==</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">role</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> Users<span style="color: #339933;">::</span><span style="color: #004000;">ROLE_ADMIN</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// Load user model.</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> loadUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_model<span style="color: #339933;">===</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">!==</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_model<span style="color: #339933;">=</span>Users<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findByPk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_model<span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li><span style="color: #339933;">&amp;</span>nbsp<span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>And then in the main configuration file (config/main.php) you will need to specify the class in the User component, for example:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #0000ff;">'user'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #666666; font-style: italic;">// enable cookie-based authentication</span></li><li> <span style="color: #0000ff;">'allowAutoLogin'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'loginUrl'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'WebUser'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Our&nbsp;<strong>WebUser</strong> class extends the&nbsp;<strong>CWebUser</strong> class which is the class accessed by the Yii Application User component. &nbsp;Thus, when you reference Yii::app()-&gt;user it will now reference our new WebUser class. &nbsp;Therefore, anything that we define here can be accessed using the syntax <strong>Yii::app()-&gt;user-&gt;<span style="color: #0000ff;">property</span></strong> or <strong>Yii::app()-&gt;user-&gt;<span style="color: #0000ff;">function()</span></strong></p>
<p><strong>Eg: Yii::app()-&gt;user-&gt;isAdmin()</strong></p>
<p>Other things to note;</p>
<p>1) &nbsp;Business rules, like the concatenation of the fullName should be held in the User Model, as I have done here, and then can be exposed by the webuser class as a property Yii::app()-&gt;user-&gt;fullName</p>
<p>2) &nbsp;I&#8217;ve introduced a User Profile field called &#8216;pagination&#8217; which I use to allow users to define how many items are displayed in a GridView. &nbsp;For performance reasons, I then set a ceiling that is appropriate for my application in the validation of the User Model.</p>
<p>3) I have updated<a title="Cook your own User Authentication in Yii – Part 1" href="http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-1/1015"> Part 1</a> of the Tutorial to include a new function in the User model called <strong>checkExpiryDate,</strong> so you will need to go back and get that code.</p>
<p>That should now all work, so you can now check Yii:app()-&gt;user-&gt;isAdmin() to check for authorised users.</p>
<p>In Part 3 (coming soon), I &nbsp;will then add the functionality to manage the user profile, enable the user to change their passwords and check for password expiration on user login &#8230;.</p>
<p>-&gt;&nbsp;<a title="Sign-up for my Yii Tutorials and Tips Newsletter" href="http://sudwebdesign.com/yii-tutorials-and-tips-newsletter">sign-up to my newsletter</a>&nbsp;for the next tutorial</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-2/1053/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cook your own User Authentication in Yii &#8211; Part 1</title>
		<link>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-1/1015</link>
		<comments>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-1/1015#comments</comments>
		<pubDate>Mon, 06 May 2013 06:55:58 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii framework]]></category>
		<category><![CDATA[yii isAdmin]]></category>
		<category><![CDATA[yii user]]></category>
		<category><![CDATA[yii user authentication]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=1015</guid>
		<description><![CDATA[This is the first of three articles demonstrating how to build your own simple User Authentication system by extending core Yii classes and just a few views. There are a number of Extensions, Modules and RBAC systems available in the &#8230; <a href="http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-1/1015">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>This is the first of three articles demonstrating how to build your own simple User Authentication system by extending core Yii classes and just a few views.</p>
<p>There are a number of Extensions, Modules and RBAC systems available in the Yii extensions directory and, of course, the built-in Yii RBAC scheme.</p>
<p>But I&#8217;ve found that for the medium sized system, all of these are often too complicated and difficult to integrate.</p>
<h2>What we are going to build</h2>
<p>Autogenerated Yii applications have a very basic User Authentication system that is easily extended to provide a database enabled user authentication and in this series of articles we will be starting from this base.</p>
<p>We will build a simple <strong>level</strong> based User security system where a user role might be along the lines of subscriber, author, moderator or administrator and we will be able to use these levels to limit access to functions within our applications.</p>
<p>User Passwords will be checked against a strength algorithm.</p>
<p>Users will be forced to change their passwords after a set time interval.</p>
<h2>Understanding the difference between WebUser and Authentication</h2>
<p><a style="line-height: 19px; color: #ff4b33;" href="http://sudwebdesign.com/wp-content/uploads/2013/05/webuser-authentication.png"><img class=" wp-image-1054 alignleft" alt="webuser-authentication" src="http://sudwebdesign.com/wp-content/uploads/2013/05/webuser-authentication-300x175.png" width="400" height="225" /></a></p>
<p>This first part will be to understand the difference between User Authentication and the users Web Identity.</p>
<p>User information is stored in an instance of the CWebUser class and this is created on application initialisation (ie: when the User first connects with the website), irrespective of whether the user is logged in or not. By default, the user is set to “</p>
<p>Guest”.</p>
<p>Authentication is managed by a class called CUserIdentity and this class checks that the user is known and a valid user. How this validation occurs will depend on your application, perhaps against a database, or login with facebook, or against an ldap server etc&#8230;</p>
<p>The code generated by Gii defines the login action and loginForm model which manages this process for us and ties these two classes together.</p>
<p>On login, the System creates a UserIdentity class, passing the login details. These are validated against, in this example, a database. The login model then passes the UserIdentity object to the CWebUser object, which then stores this information.</p>
<p>By default the CWebUser class stores its information in session data and therefore, should NOT contain any sensitive information, like passwords.</p>
<h2>Our User Model</h2>
<p>So our first step is to define our User model and then generate a model and CRUD actions using Gii.</p>
<p>Here is my User table:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="SQL"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`users`</span> <span style="color: #66cc66;">&#40;</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`id`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`username`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`password`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`email`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`firstname`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`lastname`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`pagination`</span> tinyint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'25'</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`role`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`create_date`</span> datetime <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`last_login_time`</span> datetime <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`status`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #ff0000;">`password_expiry_date`</span> datetime <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`username`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`username`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`email`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`email`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`status`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span></li><li>&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`superuser`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`role`</span><span style="color: #66cc66;">&#41;</span></li><li><span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Now use Gii to generate model and CRUD forms&#8230;</p>
<h2>Customising the User Model</h2>
<p>now we need to update the User model as follows;</p>
<p>1. &nbsp;Include constants to represent our ROLES</p>
<p>2. &nbsp;Add fields and validation for repeat passwords, so that on our forms we can ask the user to enter their passwords twice</p>
<p>3. &nbsp;Password strength algorithm</p>
<p>4. &nbsp;Combine Firstname and Lastname into FullName</p>
<p>5. &nbsp;Use beforeSave to check passwords and update password expiry date</p>
<p>6. &nbsp;Add any relevant relations for your application</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li>&nbsp;</li><li><span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* This is the model class for table &quot;users&quot;.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;*</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* The followings are the available columns in table 'users':</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property integer $id</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property string $username</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property string $password</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property string $email</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property string $pagination</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property integer $createtime</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property integer $last_login_time</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property integer $role</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property integer $status</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;*</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* The followings are the available model relations:</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property Customer[] $customers</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property Issues[] $issues</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* @property Issues[] $issues1</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;*/</span></li><li><span style="color: #000000; font-weight: bold;">class</span> Users <span style="color: #000000; font-weight: bold;">extends</span> CActiveRecord</li><li><span style="color: #009900;">&#123;</span></li><li> <span style="color: #000000; font-weight: bold;">const</span> ROLE_AUTHOR<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></li><li> <span style="color: #000000; font-weight: bold;">const</span> ROLE_MODERATOR<span style="color: #339933;">=</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span></li><li> <span style="color: #000000; font-weight: bold;">const</span> ROLE_ADMIN<span style="color: #339933;">=</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$passwordSave</span><span style="color: #339933;">;</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$repeatPassword</span><span style="color: #339933;">;</span></li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * Returns the static model of the specified AR class.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @param string $className active record class name.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return Users the static model class</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> model<span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">__CLASS__</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return string the associated database table name</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> tableName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fullName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$fullName</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">firstname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>? <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">firstname</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$fullName</span><span style="color: #339933;">.=</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lastname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>?<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fullName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>? <span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lastname</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lastname</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$fullName</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return array validation rules for model attributes.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> rules<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #666666; font-style: italic;">// NOTE: you should only define rules for those attributes that</span></li><li> <span style="color: #666666; font-style: italic;">// will receive user inputs.</span></li><li> <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'passwordSave, repeatPassword'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'on'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'insert'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'passwordSave, repeatPassword'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'min'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'max'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">40</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'passwordSave'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'checkStrength'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'score'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'passwordSave'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compare'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compareAttribute'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'repeatPassword'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;</li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username, password, email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'role, status, pagination'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'numerical'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integerOnly'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username, firstname, lastname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'max'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;</li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password, email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'max'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'last_login_time, create_date'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'safe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #666666; font-style: italic;">// The following rule is used by search().</span></li><li> <span style="color: #666666; font-style: italic;">// Please remove those attributes that should not be searched.</span></li><li> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id, username, password, email, pagination, createtime, last_login_time, role, status'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'safe'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'on'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'search'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li> <span style="color: #000000; font-weight: bold;">function</span> CheckStrength<span style="color: #009900;">&#40;</span><span style="color: #000088;">$attribute</span><span style="color: #339933;">,</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span> </li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #000088;">$password</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$attribute</span><span style="color: #339933;">;</span></li><li> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$password</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span><span style="color: #339933;">=-</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span></li><li> <span style="color: #b1b100;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** get the length of the password ***/</span></li><li> <span style="color: #000088;">$length</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check if password is not all lower case ***/</span></li><li> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check if password is not all upper case ***/</span></li><li> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check string length is 8 -15 chars ***/</span></li><li> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">8</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$length</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check if lenth is 16 - 35 chars ***/</span></li><li> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">16</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$length</span> <span style="color: #339933;">&lt;=</span><span style="color: #cc66cc;">35</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check if length greater than 35 chars ***/</span></li><li> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">35</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** get the numbers in the password ***/</span></li><li> <span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[0-9]/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$numbers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$numbers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** check for special chars ***/</span></li><li> <span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[|!@#$%&amp;*\/=?,;.:\-_+~^\\\]/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$specialchars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$specialchars</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** get the number of unique chars ***/</span></li><li> <span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_split</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$num_unique_chars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_unique</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$strength</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$num_unique_chars</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #666666; font-style: italic;">/*** strength is a number 1-100; ***/</span></li><li> <span style="color: #000088;">$strength</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$strength</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">99</span> ? <span style="color: #cc66cc;">99</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$strength</span><span style="color: #339933;">;</span></li><li> <span style="color: #666666; font-style: italic;">//$strength = floor($strength / 10 + 1);</span></li><li>&nbsp;</li><li> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$strength</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'score'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addError</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$attribute</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;Password is too weak - try using CAPITALS, Num8er5, AND sp&amp;euro;c!al characters. Your score was &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$strength</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'score'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> </li><li> <span style="color: #b1b100;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> beforeSave<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li> parent<span style="color: #339933;">::</span><span style="color: #004000;">beforeSave</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #666666; font-style: italic;">//add the password hash if it's a new record</span></li><li> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isNewRecord</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">=</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">passwordSave</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create_date</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbExpression<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;NOW()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password_expiry_date</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbExpression<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DATE_ADD(NOW(), INTERVAL 90 DAY) &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li><li> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">passwordSave</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;&amp;!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">repeatPassword</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;&amp;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">passwordSave</span><span style="color: #339933;">===</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">repeatPassword</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> </li><li> <span style="color: #666666; font-style: italic;">//if it's not a new password, save the password only if it not empty and the two passwords match</span></li><li> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">=</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">passwordSave</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password_expiry_date</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbExpression<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DATE_ADD(NOW(), INTERVAL 90 DAY) &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>/**<br />
* Compare Expiry date and today&#8217;s date<br />
* @return type &#8211; positive number equals valid user<br />
*/<br />
public function checkExpiryDate() {<br />
&nbsp; &nbsp; $expDate=DateTime::createFromFormat(&#8216;Y-m-d H:i:s&#8217;,$this-&gt;password_expiry_date);<br />
&nbsp; &nbsp; $today=new DateTime(&#8220;now&#8221;);<br />
&nbsp; &nbsp; return ($today-&gt;diff($expDate)-&gt;format(&#8216;%a&#8217;));<br />
}</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return array relational rules.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> relations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #666666; font-style: italic;">// SAMPLE RELATIONS - You will need to change these depending on your application</span></li><li> <span style="color: #0000ff;">'issues'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">HAS_MANY</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Issues'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'reported_by'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'issues1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">HAS_MANY</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Issues'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'assigned_to'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return array customized attribute labels (name=&gt;label)</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> attributeLabels<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ID'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Username'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Password'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Email'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'pagination'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'pagination'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'createtime'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Createtime'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'last_login_time'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'last_login_time'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'role'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'role'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Status'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'passwordSave'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Password'</span><span style="color: #339933;">,</span> </li><li> <span style="color: #0000ff;">'passwordRepeat'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Repeat Password'</span><span style="color: #339933;">,</span> </li><li> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * Retrieves a list of models based on the current search/filter conditions.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> search<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li> <span style="color: #009900;">&#123;</span></li><li> <span style="color: #666666; font-style: italic;">// Warning: Please modify the following code to remove attributes that</span></li><li> <span style="color: #666666; font-style: italic;">// should not be searched.</span></li><li>&nbsp;</li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbCriteria<span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pagination'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pagination</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'createtime'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createtime</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'last_login_time'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">last_login_time</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'role'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">role</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">status</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> CActiveDataProvider<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #0000ff;">'criteria'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span></li><li> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<h2>The&nbsp;userIdentity class</h2>
<p>Next we will change the original Gii generated userIdentity class to authenticate the user against our new User table.</p>
<p>This is found in Protected/Compontents/UserIdentity.php and will look like this:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* UserIdentity represents the data needed to identity a user.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* It contains the authentication method that checks if the provided</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;* data can identity the user.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;*/</span></li><li><span style="color: #000000; font-weight: bold;">class</span> UserIdentity <span style="color: #000000; font-weight: bold;">extends</span> CUserIdentity</li><li><span style="color: #009900;">&#123;</span></li><li> <span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * Authenticates a user.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * Authenticate against our Database</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; * @return boolean whether authentication succeeds.</span></li><li><span style="color: #009933; font-style: italic;">&nbsp; */</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_id</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_username</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_username<span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getId<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_id<span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> authenticate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$user</span><span style="color: #339933;">=</span> Users<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LOWER(username)=?'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorCode</span><span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ERROR_UNKNOWN_IDENTITY</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">elseif</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">!==</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorCode</span><span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ERROR_PASSWORD_INVALID</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_id <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_username <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">last_login_time</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbExpression<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;NOW()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorCode</span><span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ERROR_NONE</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorCode</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>We now have a basic but working database Authentication system and in the next Tutorial I&#8217;ll be extending the CWebUer class &#8230; coming soon!</p>
<p>-&gt; <a title="Sign-up for my Yii Tutorials and Tips Newsletter" href="http://sudwebdesign.com/yii-tutorials-and-tips-newsletter">sign-up to my newsletter</a> for the next tutorial</p>
<p>credits: I found the&nbsp;CheckStrength algorithm on Snipplr.com with a deadlink, so I cannot properly credit the original author</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/cook-your-own-user-authentication-in-yii-part-1/1015/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; Obscuring the Admin actions</title>
		<link>http://sudwebdesign.com/yii-obscuring-the-admin-actions/1005</link>
		<comments>http://sudwebdesign.com/yii-obscuring-the-admin-actions/1005#comments</comments>
		<pubDate>Fri, 19 Apr 2013 06:52:40 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[url manager]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii framewiork]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=1005</guid>
		<description><![CDATA[Another Step towards Securing Your Application We all know that obscurity is no substitute for proper security in any web application, particularly those using AJAX but it does have it&#8217;s place in our arsenal towards securing our web applications. I&#8217;m &#8230; <a href="http://sudwebdesign.com/yii-obscuring-the-admin-actions/1005">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h2>Another Step towards Securing Your Application</h2>
<p>We all know that obscurity is no substitute for proper security in any web application, particularly those using AJAX but it does have it&#8217;s place in our arsenal towards <strong>securing our web applications</strong>.</p>
<p>I&#8217;m not going to make this article into a big discussion&nbsp;for all the different ways of one can structure the application to truly separate the User functions from the Admin ones but I will mention the two methods that I have tried. &nbsp;Firstly, is to move all admin actions into an Admin module and secondly, to build completely separate Admin apps or even role based apps; Admin, Employee, Public &#8230;.</p>
<p>Another method I have started playing with, more for the small to medium sized app is to obscure the admin URLs using the<strong> URL manager</strong> and here is how;-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li> </li><li><span style="color: #0000ff;">'hiddenconsole/&lt;model:.*?&gt;'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'&lt;model&gt;/admin'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'&lt;model:.*?&gt;/admin'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'site/error'</span><span style="color: #339933;">,</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Obviously, where you change&nbsp;<em>hiddenconsole</em> to something obscure &#8230;</p>
<p>So your new URLs will look like this: http://your-domain.com/hiddenconsole/posts</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-obscuring-the-admin-actions/1005/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii Rapid Application Development Hotshot</title>
		<link>http://sudwebdesign.com/yii-rapid-application-development-hotshot/985</link>
		<comments>http://sudwebdesign.com/yii-rapid-application-development-hotshot/985#comments</comments>
		<pubDate>Tue, 12 Feb 2013 09:48:02 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=985</guid>
		<description><![CDATA[I was recently asked to review this book by the Publishers and it&#8217;s been sat on the corner of my desktop for a while, just waiting for a few spare moments to have a good old browse &#8230; Beneath the &#8230; <a href="http://sudwebdesign.com/yii-rapid-application-development-hotshot/985">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I was recently asked to review this book by the Publishers and it&#8217;s been sat on the corner of my desktop for a while, just waiting for a few spare moments to have a good old browse &#8230;</p>
<blockquote><p><i>Beneath the light-hearted presentation of this book is a wealth of innovative methods of implementation, from RBAC security to job scheduling and mobile browser presentation.</i></p>
<p><i>Whether you are just starting out with Yii, or even if you have been using Yii and other frameworks for a few years, you are bound to find many useful tips buried with this super-hero based application.</i></p>
<p><i>As a seasoned developer myself, this book will certainly remain close to hand for a good while yet.</i></p></blockquote>
<p>You can find more <a href="http://www.amazon.co.uk/Yii-Rapid-Application-Development-Shot/dp/1849517509/ref=as_li_tf_mfw?&amp;linkCode=wey&amp;tag=sudw-21">details and buy the book here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-rapid-application-development-hotshot/985/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; more Advanced Logging</title>
		<link>http://sudwebdesign.com/yii-more-advanced-logging/970</link>
		<comments>http://sudwebdesign.com/yii-more-advanced-logging/970#comments</comments>
		<pubDate>Mon, 21 Jan 2013 07:50:54 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii advanced logging]]></category>
		<category><![CDATA[yii CFileLogRoute]]></category>
		<category><![CDATA[yii framework]]></category>
		<category><![CDATA[yii logging]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=970</guid>
		<description><![CDATA[Yii uses an application component called CLogRouter to determine where and how log messages are output to the various logs. You can configure different &#8220;log routes&#8221; depending on the log trace level, the log category (more on that later) and &#8230; <a href="http://sudwebdesign.com/yii-more-advanced-logging/970">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Yii uses an application component called <strong>CLogRouter</strong> to determine where and how log messages are output to the various logs.</p>
<p>You can configure different &#8220;log routes&#8221; depending on the log trace level, the log category (more on that later) and even your IP address.</p>
<p>I&#8217;ve already covered some configurations in my article <a title="Advanced Logging in Yii" href="http://sudwebdesign.com/advanced-logging-in-yii/775">&#8220;Advanced Logging in Yii&#8221;</a>&nbsp;that covers enabling profiling in Firefox, but recently I needed to increase the number of log files that were being kept by the server. &nbsp;I was trying to hunt down a particularly elusive bug when the events happened over a weekend. &nbsp;By the time I got to look into it on the Monday morning, all the logs had rolled forward and lost the necessary information.</p>
<p>So, I started looking into how to extend the log rolls and even hold <strong>info</strong> information in another log file. &nbsp;If you&#8217;ve read my previous article you will have seen that I have included a logging function in my bootstrap index.php file called &#8216;fb&#8217; which outputs to the log file. &nbsp;So, in my code, I can just write<em> fb(&#8220;Some message $variable&#8221;,&#8221;category.hierarchy&#8221;)</em> or even just <em>fb($variable).</em></p>
<p>So, I changed my fb function to prepend all categories with &#8220;Application.&#8221; as follows:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">function</span> fb<span style="color: #009900;">&#40;</span><span style="color: #000088;">$what</span><span style="color: #339933;">,</span><span style="color: #000088;">$where</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'fb.somewhere'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$what</span><span style="color: #339933;">=</span><span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$what</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #339933;">&amp;</span>nbsp<span style="color: #339933;">;</span>&nbsp;&nbsp; Yii<span style="color: #339933;">::</span><span style="color: #990000;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$what</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'info'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'application.'</span><span style="color: #339933;">.</span><span style="color: #000088;">$where</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>I then decided to output all <strong>info</strong> messages to a separate log file called <strong>application_info</strong> and extend the number of versions of this file from the default 5 to 10. &nbsp;I also included the category &#8216;system.db.CDbCommand&#8217; which logs SQL from <strong>CdbCommand</strong> objects where I often use more complex joins.</p>
<p>All other messages would still get logged to the default <strong>application</strong> log.</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;<span style="color: #0000ff;">'log'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CLogRouter'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'routes'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CFileLogRoute'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'levels'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'info, vardump'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'logFile'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'application_info'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'maxLogFiles'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">10</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CFileLogRoute'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'levels'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'trace'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'logFile'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'application_info'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'maxLogFiles'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'categories'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'system.db.CDbCommand'</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CFileLogRoute'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'levels'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'trace, error, warning'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'ext.yii-debug-toolbar.YiiDebugToolbarRoute'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'ipFilters'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'127.0.0.1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'192.168.1.1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #666666; font-style: italic;">/*&nbsp;&nbsp; array(</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'class'=&gt;'CFileLogRoute',</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'levels'=&gt;'trace, info, error, warning, vardump', //info, error, warning, vardump',</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array(</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'class'=&gt;'CEmailLogRoute',</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'levels'=&gt;'error, warning',</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'emails'=&gt;'me@me.com',</span></li><li><span style="color: #666666; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),*/</span></li><li> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>I wanted to use the &#8216;except&#8217; parameter as outlined on <a href="http://yiiframework.ru/doc/guide/en/topics.logging">The Definitive Guide to Yii</a>&nbsp;but got an error &#8220;Property &#8220;CFileLogRoute.except&#8221; is not defined.&#8221; but couldn&#8217;t find anything more about this property &#8230;. feedback welcome!</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-more-advanced-logging/970/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; Maintaining created and updated date</title>
		<link>http://sudwebdesign.com/yii-maintaining-created-and-updated-date/962</link>
		<comments>http://sudwebdesign.com/yii-maintaining-created-and-updated-date/962#comments</comments>
		<pubDate>Tue, 15 Jan 2013 06:56:34 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=962</guid>
		<description><![CDATA[A very simple way to maintain date-time stamps on records is to use the behaviors method in the data Model, linked with the CTimestampbehavior within Zii widgets. To implement this, in each of your data models, use a behaviors function &#8230; <a href="http://sudwebdesign.com/yii-maintaining-created-and-updated-date/962">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A very simple way to maintain date-time stamps on records is to use the behaviors method in the data Model, linked with the CTimestampbehavior within Zii widgets.</p>
<p>To implement this, in each of your data models, use a behaviors function as follows:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> behaviors<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'CTimestampbehavior'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zii.behaviors.CTimestampbehavior'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">'createAttribute'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">'updateAttribute'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'last_updated'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">'setUpdateOnCreate'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Note that in my model, I have set the CREATE attribute to NULL as my table does not have a created_dt column. Also, the last_updated column is updated on create by the option &#8216;SetUpdateOnCreate&#8217; being set to TRUE.</p>
<p>See also how to <a title="Using Behaviors to manage Create and Update dates" href="http://sudwebdesign.com/yii-maintaining-created-and-updated-date/962">use behaviors to manage Create and Update Dates</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-maintaining-created-and-updated-date/962/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; CGridView row formatting</title>
		<link>http://sudwebdesign.com/yii-cgridview-row-formatting/947</link>
		<comments>http://sudwebdesign.com/yii-cgridview-row-formatting/947#comments</comments>
		<pubDate>Sun, 18 Nov 2012 07:54:06 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=947</guid>
		<description><![CDATA[Do you want some advanced styling on your CGridView rows? To individually style each row of your CGridView you can use the rowCssClassExpression property. However, the first thing that you will notice is that your ODD and EVEN formatting disappears. &#8230; <a href="http://sudwebdesign.com/yii-cgridview-row-formatting/947">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h2>Do you want some advanced styling on your CGridView rows?</h2>
<p>To individually style each row of your CGridView you can use the <strong>rowCssClassExpression</strong> property.  However,  the first thing that you will notice is that your ODD and EVEN formatting disappears. &nbsp;That is because the&nbsp;rowCssClassExpression overwrites any internal defaults.</p>
<p>If you want to retain this or include other complex formatting rules, it can get a bit confusing trying to get everything to fit inside a quoted string. &nbsp;For example:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #0000ff;">'rowCssClassExpression'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'($row%2)? &quot;even &quot;.str_replace(&quot;,&quot;,&quot; &quot;,$data-&gt;flags) : &quot;odd &quot;.str_replace(&quot;,&quot;,&quot; &quot;,$data-&gt;flags)'</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>And this is relatively simple. &nbsp;What if I wanted to check the value of other fields as well &#8230; perhaps something like this:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">%</span><span style="color:#800080;">2</span><span style="color: #009900;">&#41;</span>? <span style="color: #0000ff;">&quot;even&quot;</span> <span style="color: #339933;">:</span>&nbsp;&nbsp;<span style="color: #0000ff;">&quot;odd&quot;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'B'</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' BK'</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'P'</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' PR'</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'UNREAD'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' UNREAD'</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>This could return a string like &#8220;ODD PR UNREAD&#8221;</p>
<h2>Creating a Component</h2>
<p>The best way I&#8217;ve found so far, is to create a really simple component with a function that returns the list of classes that you want to add.</p>
<p>1. &nbsp;create a file ERowClass in your protected/components directory</p>
<p>2. Add code similar to the following</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">class</span> ERowClass <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> rowClass<span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #000088;">$e</span><span style="color: #339933;">,</span> <span style="color: #000088;">$f</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$ret</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">%</span><span style="color:#800080;">2</span><span style="color: #009900;">&#41;</span>? <span style="color: #0000ff;">&quot;even&quot;</span> <span style="color: #339933;">:</span>&nbsp;&nbsp;<span style="color: #0000ff;">&quot;odd&quot;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'B'</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' BK'</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'P'</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' PR'</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'UNREAD'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">' UNREAD'</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li><span style="color: #009900;">&#125;</span></li><li><span style="color: #000000; font-weight: bold;">?&gt;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>3. Call this component from your <strong>rowCssClassExpression</strong></p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widget</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'zii.widgets.grid.CGridView'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li> <span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'email-grid'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'dataProvider'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">search</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'filter'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'rowCssClassExpression'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'ERowClass::rowClass($row,$data-&gt;entity_type,$data-&gt;flags);'</span><span style="color: #339933;">,</span></li><li> <span style="color: #0000ff;">'columns'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">....</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>4. Make sure that the component is loaded in your config/main.php</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li>	<span style="color: #0000ff;">'import'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>		<span style="color: #0000ff;">'application.models.*'</span><span style="color: #339933;">,</span></li><li>		<span style="color: #0000ff;">'application.components.*'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'application.helpers.*'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'application.components.ERowClass'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339933;">...</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-cgridview-row-formatting/947/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; Parameterising a sub-select in SQL Builder</title>
		<link>http://sudwebdesign.com/yii-parameterising-a-sub-select-in-sql-builder/932</link>
		<comments>http://sudwebdesign.com/yii-parameterising-a-sub-select-in-sql-builder/932#comments</comments>
		<pubDate>Tue, 06 Nov 2012 16:53:15 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii sql]]></category>
		<category><![CDATA[Yii SQL COmmand Builder]]></category>
		<category><![CDATA[Yii SQL parameters]]></category>
		<category><![CDATA[Yii sub-select]]></category>
		<category><![CDATA[Yii subselect]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=932</guid>
		<description><![CDATA[I spent hours trawling through Yii documentation, forums and tutorials to try and find out how to do this relatively simple task. &#160;I couldn&#8217;t find an answer anywhere and it seems that not many people need this kind of structure. &#8230; <a href="http://sudwebdesign.com/yii-parameterising-a-sub-select-in-sql-builder/932">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I spent hours trawling through Yii documentation, forums and tutorials to try and find out how to do this relatively simple task. &nbsp;I couldn&#8217;t find an answer anywhere and it seems that not many people need this kind of structure.</p>
<p>But just in case there is somebody else out there, mad enough to try this -&gt; and if you do, please just drop a comment below to let me know how you got on!</p>
<h2>THE SCENARIO</h2>
<p>I have developed a holiday reservation system in which a <strong>customer</strong> has one or more&nbsp;<strong>booking-enquiries<em>&nbsp;</em></strong>for a&nbsp;<strong>property</strong> which has many&nbsp;<strong>features<em>.</em></strong></p>
<p>Now I would like to provide a CGRIDVIEW with an Advanced Search form that enables me to query this whole chain.</p>
<p>I decided therefore to create a sub-query as follows:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="SQL"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #993333; font-weight: bold;">SELECT</span> customer<span style="color: #66cc66;">.*</span> </li><li><span style="color: #993333; font-weight: bold;">FROM</span> customer</li><li><span style="color: #993333; font-weight: bold;">WHERE</span> customer<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span></li><li>&nbsp;&nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span> <span style="color: #ff0000;">`cs`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`id`</span></li><li>&nbsp;&nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`customer`</span> <span style="color: #ff0000;">`cs`</span></li><li>&nbsp;&nbsp; <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`booking`</span> <span style="color: #ff0000;">`bk`</span> <span style="color: #993333; font-weight: bold;">ON</span> cs<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> bk<span style="color: #66cc66;">.</span>customer_id</li><li>&nbsp;&nbsp; <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`properties`</span> <span style="color: #993333; font-weight: bold;">ON</span> bk<span style="color: #66cc66;">.</span>property_id <span style="color: #66cc66;">=</span> properties<span style="color: #66cc66;">.</span>id</li><li>&nbsp;&nbsp; <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`vwpropertyalloptions`</span> <span style="color: #993333; font-weight: bold;">ON</span> properties<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> vwpropertyalloptions<span style="color: #66cc66;">.</span>id</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#40;</span>booking_status<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'BOOKED'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>option_id <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></li><li><span style="color: #66cc66;">&#41;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>So, note that the Parameters are in the <strong>sub-query.</strong> &nbsp;How the heck do you do this simply in Yii???</p>
<p>Basically, I copied the standard <em>Search&nbsp;</em> function in the Customer model and called it <em>searchAdvanced()</em></p>
<p>I added the search fields for all the other entities as Public properties of the customer model</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$asBookingStatus</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$asBookingFrom1</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$asBookingFrom2</span><span style="color: #339933;">;</span></li><li> </li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>In the normal way I then went about populating the standard CDbCriteria object</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbCriteria<span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'segment'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">segment</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'temperature'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">temperature</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009933; font-style: italic;">/** Setup Booking Conditions</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking_from'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBookingFrom</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking_to'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBookingTo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">.....</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009933; font-style: italic;">/** Setup Property Conditions **/</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339933;">.....</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<h2>Now comes the clever bits. &nbsp;</h2>
<p>Rather than using that CdbCriteria in the usual way, I have used it to handle all the messy bits about using parameters, like strings and arrays, column types, and PDO validation etc&#8230;</p>
<p>So I grab the <strong>WHERE</strong> clause and the <strong>PARAMS</strong>&nbsp;from the CdbCriteria which it has made them all nice and pretty for me.</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$where</span><span style="color: #339933;">=</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$params</span><span style="color: #339933;">=</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>&nbsp;I then created the SQL for my sub-select using a command object&nbsp;<strong>and</strong> inserted the&nbsp;<strong>where</strong> and&nbsp;<strong>params</strong> from above:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$subSQL</span><span style="color: #339933;">=</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'cs.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'customer cs'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking bk'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cs.id = bk.customer_id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'properties'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bk.property_id = properties.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'vwpropertyalloptions'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'properties.id = vwpropertyalloptions.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$where</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">group</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'cs.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">text</span><span style="color: #339933;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>This gives me the full SQL that I need to insert into the main query:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$sql</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SELECT * FROM customer where id in (<span style="color: #006699; font-weight: bold;">$subSQL</span>)&quot;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$dataProvider</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CSqlDataProvider<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'params'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$params</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// this is actually adding the parameters to the sub-query</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'totalItemCount'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$count</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// see note below</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'sort'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'attributes'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'firstname'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'surname'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'address'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'pagination'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'pageSize'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$dataProvider</span><span style="color: #339933;">;</span></li><li> </li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>There is one complication. If you want to use the standard Yii pagination, you must pass the CSqlDataProvider object the number of rows that this query returns.</p>
<p>Normally, this would be a simple $count=Yii::app()-&gt;db-&gt;createCommand(&#8216;Select count(*) from customer&#8217;)-&gt;queryScalar</p>
<p>but we need to apply all the Conditions and Parameters as well. &nbsp;So we need to build a COUNT query before building the CSqlDataProvider using a query like this:-</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'count(DISTINCT cs.id)'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'customer cs'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking bk'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cs.id = bk.customer_id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'properties'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bk.property_id = properties.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'vwpropertyalloptions'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'properties.id = vwpropertyalloptions.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$where</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">queryScalar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>So the final <strong>SearchAdvanced()</strong> function looks like this</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> searchAdvanced<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbCriteria<span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'segment'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">segment</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'temperature'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">temperature</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009933; font-style: italic;">/** Setup Booking Conditions</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking_from'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBookingFrom</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking_to'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">BookingTo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Setup Property Criteria</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sleeps'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asSleeps</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bedrooms'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBedrooms</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009933; font-style: italic;">/**</span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Now setup IN conditions </span></li><li><span style="color: #009933; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBookingStatus</span><span style="color: #009900;">&#41;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addInCondition</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking_status'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asBookingStatus</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asFeatures</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addInCondition</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'option_id'</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">asFeatures</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$where</span><span style="color: #339933;">=</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$params</span><span style="color: #339933;">=</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'count(DISTINCT cs.id)'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'customer cs'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking bk'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cs.id = bk.customer_id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'properties'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bk.property_id = properties.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'vwpropertyalloptions'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'properties.id = vwpropertyalloptions.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$where</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">queryScalar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// Annoying but you have to recreate the whole statement</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #666666; font-style: italic;">// just to change the SELECT clause!</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$subSQL</span><span style="color: #339933;">=</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'cs.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'customer cs'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'booking bk'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cs.id = bk.customer_id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'properties'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bk.property_id = properties.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftjoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'vwpropertyalloptions'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'properties.id = vwpropertyalloptions.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$where</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">group</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'cs.id'</span><span style="color: #009900;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">text</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$sql</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SELECT * FROM customer where id in (<span style="color: #006699; font-weight: bold;">$subSQL</span>)&quot;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$dataProvider</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CSqlDataProvider<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'params'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$params</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'totalItemCount'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$count</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'sort'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'attributes'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'firstname'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'surname'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'address'</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'pagination'</span><span style="color: #339933;">=&gt;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">'pageSize'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$dataProvider</span><span style="color: #339933;">;</span></li><li> <span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-parameterising-a-sub-select-in-sql-builder/932/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; Looping through a model in chunks</title>
		<link>http://sudwebdesign.com/yii-looping-through-a-model-in-chunks/925</link>
		<comments>http://sudwebdesign.com/yii-looping-through-a-model-in-chunks/925#comments</comments>
		<pubDate>Wed, 24 Oct 2012 09:29:09 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii limit]]></category>
		<category><![CDATA[yii loop]]></category>
		<category><![CDATA[yii pagination]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=925</guid>
		<description><![CDATA[Or Simple Pagination I recently needed to run through all records in a table and recalculate some variables. &#160;However, the lovely php was giving me a memory exceeded error after about 2000 records. &#160; I assumed that all the model &#8230; <a href="http://sudwebdesign.com/yii-looping-through-a-model-in-chunks/925">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Or Simple Pagination</p>
<p>I recently needed to run through all records in a table and recalculate some variables. &nbsp;However, the lovely php was giving me a memory exceeded error after about 2000 records. &nbsp;</p>
<p>I assumed that all the model objects were not being cleared down properly, so I wanted to try and process batches of records and then use unset after each batch to clear down all the model entries.</p>
<p>But I struggled to find out how to simple implement the MySQL &#8220;LIMIT from,chunk&#8221; syntax.</p>
<p>The solution, as often, was quite simple.</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000088;">$chunk</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;</li><li><span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$total</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #000088;">$chunk</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CDbCriteria<span style="color: #339933;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">offset</span><span style="color: #339933;">=</span><span style="color: #000088;">$i</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #339933;">=</span><span style="color: #000088;">$chunk</span><span style="color: #339933;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$recs</span><span style="color: #339933;">=</span>Article<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findAll</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$recs</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$rec</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009933; font-style: italic;">/** Processing here **/</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #990000;">unset</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$rec</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #990000;">unset</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$recs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Note: &nbsp;It didn&#8217;t actually get rid of my memory exceeded messages but I could process many more records!</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-looping-through-a-model-in-chunks/925/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii &#8211; CDbCriteria-&gt;compare as list</title>
		<link>http://sudwebdesign.com/yii-cdbcriteria-compare-as-list/904</link>
		<comments>http://sudwebdesign.com/yii-cdbcriteria-compare-as-list/904#comments</comments>
		<pubDate>Thu, 16 Aug 2012 16:07:56 +0000</pubDate>
		<dc:creator>Chris Backhouse</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii cdbcriteria]]></category>
		<category><![CDATA[yii cgridview]]></category>
		<category><![CDATA[yii compare]]></category>

		<guid isPermaLink="false">http://sudwebdesign.com/?p=904</guid>
		<description><![CDATA[Sometimes you may want to restrict your a cgridview to only display records with a list of values. The CDbCriteria class reference page stipulates that the allowed values are: the column value to be compared with. If the value is &#8230; <a href="http://sudwebdesign.com/yii-cdbcriteria-compare-as-list/904">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sometimes you may want to restrict your a cgridview to only display records with a list of values.</p>
<p>The CDbCriteria class reference page stipulates that the allowed values are:</p>
<p style="padding-left: 30px;"><em>the column value to be compared with. If the value is a string, the aforementioned intelligent comparison will be conducted. If the value is an array, the comparison is done by exact match of any of the value in the array. If the string or the array is empty, the existing search condition will not be modified.</em></p>
<p>For example, I am building a bug/issue tracker and I want the admin grid to only display outstanding bugs by default.</p>
<p>I have a list of valid statuses in my options table and I&#8217;m going to say that anything with a sort_order &lt; 10 is outstanding, anything greater is completed. The obvious place to do this is in the Issue-&gt;search() function.</p>
<p style="padding-left: 30px;">$criteria-&gt;compare(&#8216;status&#8217;, array(&#8230;)); &nbsp;//here place an array of valid statuses</p>
<p>Firstly, what is a nice quick and easy way to extract the array of statuses from the <em>Options</em> table. &nbsp;I&#8217;ve seen a number of posts about this including using listData on a model, which is very wasteful.</p>
<p>I think this is probably the most elegant solution</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000088;">$ostatuses</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT option_code FROM options WHERE option_name=\'ISSUE-STATUS\' and sort_order&lt;10'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">queryAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #000088;">$ost</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ostatuses</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$or</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000088;">$ost</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$or</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'option_code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li><li>criteria<span style="color: #339933;">-&gt;</span><span style="color: #004000;">compare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span><span style="color: #339933;">,</span><span style="color: #000088;">$ost</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>1.  Query the Options table to extract the &#8220;outstanding&#8221; status codes<br />
But note that the array returned is a 2 dimensional array &#8211; one that the compare function does not like. &nbsp;It looks something like this:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> CLOSED</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> CUST</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> DEV</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> INV</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> READY</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span></li><li><span style="color: #009900;">&#40;</span></li><li><span style="color: #009900;">&#91;</span>option_code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> REP</li><li><span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#41;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>2. Define our new empty array<br />
3.4.5. Loop each first dimension and add the &#8216;option_code&#8217; element to our new array</p>
<h2>One more thing</h2>
<p>Now that I have limited my search to only display outstanding bugs, it will always do this. &nbsp;So I&#8217;ve added a property to the&nbsp;<em>Issue</em> model that I can set if I want to display all statues.</p>
<p>At the top of the model&nbsp;declare&nbsp;a public variable</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">class</span> Issue <span style="color: #000000; font-weight: bold;">extends</span> CActiveRecord</li><li><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$os_only</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>So, by default, the variable is set to true</p>
<p>Then in the <em>search&nbsp;</em>function add a check for the value of this property</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="SQL"><div class="devcodeoverflow"><ol><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>$this<span style="color: #66cc66;">-&gt;</span>os_only<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></li><li><span style="color: #66cc66;">&gt;</span>findAll<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'option_name=:op'</span><span style="color: #66cc66;">,</span>array<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">':op'</span><span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'ISSUE-STATUS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'option_name'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ostatuses <span style="color: #66cc66;">=</span> Yii::app<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">-&gt;</span>db<span style="color: #66cc66;">-&gt;</span>createCommand<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SELECT option_code FROM options WHERE option_name=<span style="color: #000099; font-weight: bold;">\'</span>ISSUE-STATUS<span style="color: #000099; font-weight: bold;">\'</span> and sort_order&lt;10'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">-&gt;</span>queryAll<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ost<span style="color: #66cc66;">=</span>array<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach <span style="color: #66cc66;">&#40;</span>$ostatuses <span style="color: #993333; font-weight: bold;">AS</span> $or<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ost<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">=</span>$or<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'option_code'</span><span style="color: #66cc66;">&#93;</span>;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #66cc66;">&#125;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$criteria<span style="color: #66cc66;">-&gt;</span>compare<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'status'</span><span style="color: #66cc66;">,</span>$ost<span style="color: #66cc66;">&#41;</span>;</li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #66cc66;">&#125;</span> <span style="color: #993333; font-weight: bold;">ELSE</span> <span style="color: #66cc66;">&#123;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$criteria<span style="color: #66cc66;">-&gt;</span>compare<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'status'</span><span style="color: #66cc66;">,</span>$this<span style="color: #66cc66;">-</span><span style="color: #993333; font-weight: bold;">STATUS</span><span style="color: #66cc66;">&#41;</span>;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #66cc66;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>I guess a slightly better way to do this might be using scopes, so watch this space for that &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://sudwebdesign.com/yii-cdbcriteria-compare-as-list/904/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
