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

<channel>
	<title>Palivoda IT Solutions</title>
	<atom:link href="http://www.palivoda.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.palivoda.eu</link>
	<description>software development services</description>
	<pubDate>Sat, 30 Jan 2010 08:39:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>CakePHP format user input before validation</title>
		<link>http://www.palivoda.eu/2009/11/cakephp-format-user-input/</link>
		<comments>http://www.palivoda.eu/2009/11/cakephp-format-user-input/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 09:37:50 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=34</guid>
		<description><![CDATA[While struggling with incorrect user validation rules I&#8217;ve decided to solve the issue from the opposite side - automatically format user input. Format includes: capitalize first letters of the words, capitalize first letters of the sentences, ad spaces after punctuation marks, etc. In fact there could be added other rules later.
So I &#8216;ve started to [...]]]></description>
			<content:encoded><![CDATA[<p>While struggling with incorrect user validation rules I&#8217;ve decided to solve the issue from the opposite side - automatically format user input. Format includes: capitalize first letters of the words, capitalize first letters of the sentences, ad spaces after punctuation marks, etc. In fact there could be added other rules later.<span id="more-34"></span><br />
So I &#8216;ve started to work on FormatBehaviour class that will do the job, here is the code:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #808080; font-style: italic;">/**
 * CakePHP behaviour to format text entered by user.
 * Can be used to convert letters case, trim, etc.
 *
 * @filesource
 * @author Rostislav Palivoda
 * @link http://www.palivoda.eu
 * @version	$Revision$
 * @license	http://www.opensource.org/licenses/mit-license.php The MIT License
 * @package app
 * @subpackage app.models.behaviors
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> FormatBehavior <span style="color: #000000; font-weight: bold;">extends</span> ModelBehavior <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$settings</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>
    <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> setup<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$config</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">settings</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #000066;">array_merge</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">settings</span>, <span style="color: #0000ff;">$config</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> beforeValidate<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'caseUpper'</span>, <span style="color: #ff0000;">'caseLower'</span>, <span style="color: #ff0000;">'caseTitle'</span>, <span style="color: #ff0000;">'caseSentence'</span>, <span style="color: #ff0000;">'noSpaces'</span>,
					<span style="color: #ff0000;">'caseSentences'</span>, <span style="color: #ff0000;">'trim'</span>, <span style="color: #ff0000;">'html2text'</span>, <span style="color: #ff0000;">'normalSpacing'</span>, <span style="color: #ff0000;">'prefixUrl'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">settings</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">settings</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$field</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$field</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$field</span><span style="color: #66cc66;">&#93;</span> = 
							<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_format</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$field</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> mb_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$mode</span>, <span style="color: #0000ff;">$encoding</span> = <span style="color: #ff0000;">'UTF-8'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">in_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span>, <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'caseUpper'</span>, <span style="color: #ff0000;">'caseLower'</span>, <span style="color: #ff0000;">'caseTitle'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'caseUpper'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$mode</span> = MB_CASE_UPPER;
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'caseLower'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$mode</span> = MB_CASE_LOWER;
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'caseTitle'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$mode</span> = MB_CASE_TITLE;
&nbsp;
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_convert_case</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$mode</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'caseSentence'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_ucfirst</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'caseSentences'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">sentence_case</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>,  <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'html2text'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">html2txt</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>,  <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'trim'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'noSpaces'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span>  <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/<span style="color: #000099; font-weight: bold;">\s</span>+/ui'</span>, <span style="color: #ff0000;">''</span>, <span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'normalSpacing'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_normal_spacing</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>,  <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mode</span> == <span style="color: #ff0000;">'prefixUrl'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_prefix</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'www.'</span>, <span style="color: #ff0000;">'http://'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$string</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//Add prefix to string, if no prefix.</span>
	<span style="color: #000000; font-weight: bold;">function</span> mb_prefix<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$prefixes</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$prefixes</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$prefix</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_strpos</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$prefix</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> === <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$string</span> = <span style="color: #0000ff;">$prefix</span>.<span style="color: #0000ff;">$string</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> mb_ucfirst<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_strtoupper</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span>.
			<span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #000066;">mb_strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> sentence_case<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$sentences</span> = <span style="color: #000066;">preg_split</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/([<span style="color: #000099; font-weight: bold;">\.</span>?!<span style="color: #000099; font-weight: bold;">\n</span>]+)/ui'</span>, <span style="color: #0000ff;">$string</span>, <span style="color: #cc66cc;">-1</span>, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$new_string</span> = <span style="color: #ff0000;">''</span>;
		<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sentences</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&gt; <span style="color: #0000ff;">$sentence</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0000ff;">$new_string</span> .= <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$key</span> &amp; <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">0</span>?
				<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_ucfirst</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">trim</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sentence</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> :
				<span style="color: #0000ff;">$sentence</span>.<span style="color: #ff0000;">' '</span>; 
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//Remove spaces from start and end of the string and remove double spaces.</span>
	<span style="color: #808080; font-style: italic;">//Transform &quot;   aaa   bbb   &quot; to &quot;aaa bbb&quot;.</span>
	<span style="color: #000000; font-weight: bold;">function</span> mb_trimspaces<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$retVal</span> = <span style="color: #0000ff;">$string</span>;
		<span style="color: #808080; font-style: italic;">//debug('Before:&lt;br/&gt;&quot;'.htmlspecialchars($string).'&quot;');</span>
		<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/<span style="color: #000099; font-weight: bold;">\r</span>|<span style="color: #000099; font-weight: bold;">\n</span>|<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>/ui'</span> =&gt; <span style="color: #ff0000;">'&lt;newline&gt;'</span>, <span style="color: #ff0000;">'/<span style="color: #000099; font-weight: bold;">\s</span><span style="color: #000099; font-weight: bold;">\s</span>+/ui'</span> =&gt; <span style="color: #ff0000;">' '</span>, 
			<span style="color: #ff0000;">'/^<span style="color: #000099; font-weight: bold;">\s</span>+|<span style="color: #000099; font-weight: bold;">\s</span>+$/ui'</span> =&gt; <span style="color: #ff0000;">''</span>, <span style="color: #ff0000;">'/&lt;newline&gt;/ui'</span> =&gt; <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #ff0000;">'/<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\s</span>/'</span> =&gt; <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$pattern</span> =&gt; <span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0000ff;">$retVal</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$pattern</span>, <span style="color: #0000ff;">$value</span>, <span style="color: #0000ff;">$retVal</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #808080; font-style: italic;">//debug('After:&lt;br/&gt;&quot;'.htmlspecialchars($retVal).'&quot;');</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">trim</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$retVal</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//Remove HTML tags.</span>
	<span style="color: #000000; font-weight: bold;">function</span> html2txt<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$search</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'@&lt;script[^&gt;]*?&gt;.*?&lt;/script&gt;@si'</span>,  <span style="color: #808080; font-style: italic;">// Strip out javascript</span>
		               <span style="color: #ff0000;">'@&lt;style[^&gt;]*?&gt;.*?&lt;/style&gt;@siU'</span>,    <span style="color: #808080; font-style: italic;">// Strip style tags properly</span>
		               <span style="color: #ff0000;">'@&lt;[<span style="color: #000099; font-weight: bold;">\/</span><span style="color: #000099; font-weight: bold;">\!</span>]*?[^&lt;&gt;]*?&gt;@si'</span>,            <span style="color: #808080; font-style: italic;">// Strip out HTML tags</span>
		               <span style="color: #ff0000;">'@&lt;![<span style="color: #000099; font-weight: bold;">\s</span><span style="color: #000099; font-weight: bold;">\S</span>]*?--[ <span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span>]*&gt;@'</span>         <span style="color: #808080; font-style: italic;">// Strip multi-line comments including CDATA</span>
		<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$new_string</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$search</span>, <span style="color: #ff0000;">''</span>, <span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//Transform &quot;(aaa),bbb,(ccc)ddd,(eee)&quot; to &quot;(aaa), bbb, (ccc) ddd, (eee)&quot;.</span>
	<span style="color: #000000; font-weight: bold;">function</span> mb_normal_spacing<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$encoding</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #808080; font-style: italic;">//debug('&quot;'.htmlspecialchars($string).'&quot;');</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//put spaces after special characters, except last character</span>
		<span style="color: #0000ff;">$tokens</span> = <span style="color: #000066;">preg_split</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/([<span style="color: #000099; font-weight: bold;">\.</span>?!,;:<span style="color: #000099; font-weight: bold;">\)</span>]){1}/u'</span>, <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #cc66cc;">-1</span>, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$new_string</span> = <span style="color: #ff0000;">''</span>;
		<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$tokens</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&gt; <span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">//debug('&quot;'.mb_substr($new_string, -1, 1).'&quot; - '.mb_strlen($token).' - &quot;'.$token.'&quot;');</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">1</span> &amp;&amp; <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span>, <span style="color: #cc66cc;">-1</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span> 
				<span style="color: #0000ff;">$new_string</span> = <span style="color: #000066;">trim</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #0000ff;">$new_string</span> .= <span style="color: #000066;">mb_strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">1</span> ? <span style="color: #0000ff;">$token</span>.<span style="color: #ff0000;">' '</span> : <span style="color: #0000ff;">$token</span>; 
			<span style="color: #808080; font-style: italic;">//debug('&quot;'.$new_string.'&quot;');</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #0000ff;">$new_string</span> .= <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #cc66cc;">-1</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//spaces before specila characters, except first character</span>
		<span style="color: #0000ff;">$tokens</span> = <span style="color: #000066;">preg_split</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/([<span style="color: #000099; font-weight: bold;">\(</span>]){1}/u'</span>, <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #cc66cc;">-1</span>, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$new_string</span> = <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$tokens</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&gt; <span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">//debug('&quot;'.mb_substr($new_string, -1, 1).'&quot; - '.mb_strlen($token).' - &quot;'.$token.'&quot;');</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">mb_strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">1</span> &amp;&amp; <span style="color: #000066;">mb_substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span>, <span style="color: #cc66cc;">-1</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span> 
				<span style="color: #0000ff;">$new_string</span> = <span style="color: #000066;">trim</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #0000ff;">$new_string</span> .= <span style="color: #000066;">mb_strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">1</span> ? <span style="color: #ff0000;">' '</span>.<span style="color: #0000ff;">$token</span> : <span style="color: #0000ff;">$token</span>; 
			<span style="color: #808080; font-style: italic;">//debug('&quot;'.$new_string.'&quot;');</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//debug('&quot;'.htmlspecialchars($new_string).'&quot;');</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">mb_trimspaces</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$new_string</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>And finally to attach it to the model just ad it to the actAs list and provide format rules as parameters:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'format'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>
    <span style="color: #ff0000;">'html2text'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'firstname'</span>, <span style="color: #ff0000;">'lastname'</span>, <span style="color: #ff0000;">'nationality'</span>, <span style="color: #ff0000;">'address'</span>, <span style="color: #ff0000;">'city'</span>, <span style="color: #ff0000;">'postal_code'</span>, <span style="color: #ff0000;">'telephone'</span>, <span style="color: #ff0000;">'mobile'</span> ,<span style="color: #ff0000;">'fax'</span>, <span style="color: #ff0000;">'email'</span><span style="color: #66cc66;">&#41;</span>,
    <span style="color: #ff0000;">'caseTitle'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'firstname'</span>,<span style="color: #ff0000;">'lastname'</span>,<span style="color: #ff0000;">'nationality'</span>,<span style="color: #ff0000;">'city'</span>, <span style="color: #ff0000;">'address'</span><span style="color: #66cc66;">&#41;</span>,
    <span style="color: #ff0000;">'caseUpper'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'postal_code'</span><span style="color: #66cc66;">&#41;</span>,
    <span style="color: #ff0000;">'trim'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'telephone'</span>, <span style="color: #ff0000;">'mobile'</span> ,<span style="color: #ff0000;">'fax'</span>, <span style="color: #ff0000;">'email'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>,
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Now before model is validated, the fields are formatted. Note, if you use model validation separately with {Model}->validates() then formatted data will stay in the $this->{Model}->data, so dont forget to get changed data from there after validation. Hope this helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2009/11/cakephp-format-user-input/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP how to use Model in Component</title>
		<link>http://www.palivoda.eu/2009/07/cakephp-how-to-use-model-in-component/</link>
		<comments>http://www.palivoda.eu/2009/07/cakephp-how-to-use-model-in-component/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 10:03:13 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

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

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

		<category><![CDATA[use model in component]]></category>

		<guid isPermaLink="false">http://www.palivoda.eu/?p=32</guid>
		<description><![CDATA[I know it&#8217;s against the main design stream of CakePHP applications to use models in the components and I was restricting myself from doing that&#8230; but finally I decide to make a try and see will that simplify my  CakePHP applications development. 
Let me explain a bit my motivation to use model in component. [...]]]></description>
			<content:encoded><![CDATA[<p>I know it&#8217;s against the main design stream of CakePHP applications to use models in the components and I was restricting myself from doing that&#8230; but finally I decide to make a try and see will that simplify my  CakePHP applications development. <span id="more-32"></span><br />
Let me explain a bit my motivation to use model in component. I want to add some controller output independent blocks to various screens of my application, e.g. to show list of last posts on screen 1,2 and 3. Currently I pass data from controller to layout component, so each controller method has almost the same part of code to load data from model, process data an put in to the session, so later the view element can render it. On the other hand if the data load, processing and session manipulation will be in the component then the only thing left for controller method is to add component in to the used components list.<br />
So, here is the solution. The core controller loads models with Controller::loadModel(<className>) method. And here is how we can reuse that functionality in the component:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #000000; font-weight: bold;">class</span> BaseModelComponent <span style="color: #000000; font-weight: bold;">extends</span> Object <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$uses</span> = <span style="color: #000000; font-weight: bold;">false</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> initialize<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$controller</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//load required for component models</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">uses</span> !== <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">uses</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$modelClass</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$controller</span>-&gt;<span style="color: #006600;">loadModel</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modelClass</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #0000ff;">$modelClass</span> = <span style="color: #0000ff;">$controller</span>-&gt;<span style="color: #0000ff;">$modelClass</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>As you can see from its name this is a base class. So if you would like to use a model in your component just inherit it from the BaseModelComponent, like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
App::<span style="color: #006600;">import</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Component'</span>, <span style="color: #ff0000;">'BaseModel'</span><span style="color: #66cc66;">&#41;</span>; 
<span style="color: #000000; font-weight: bold;">class</span> MyFooComponent <span style="color: #000000; font-weight: bold;">extends</span> BaseModelComponent <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$uses</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Foo'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//models to load</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> initialize<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$controller</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> parent::<span style="color: #006600;">initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$controller</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//important to initialize base component</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> doFoo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		debug<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Foo</span>-&gt;<span style="color: #006600;">findAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//sample output to test it works</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>After your base class changed, the Foo component can define in the $uses variable list of the models to use. Now you can access the model the same way as you&#8217;ve done that in the controller. Controller code can be moved to the component without any change.</p>
<p>Hope this helps. Have a nice day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2009/07/cakephp-how-to-use-model-in-component/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP conference in Berlin 2009</title>
		<link>http://www.palivoda.eu/2009/04/cakephp-conference-in-berlin-2009/</link>
		<comments>http://www.palivoda.eu/2009/04/cakephp-conference-in-berlin-2009/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 17:25:33 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[News]]></category>

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

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=31</guid>
		<description><![CDATA[

To register your proposal: http://cakefest.org/talks/add
To participate: http://cakefest.org/pages/badges
]]></description>
			<content:encoded><![CDATA[<p><img src="http://cakefest.org/themed/berlin09/img/badges/cakefest_berlin_red_large.png" alt="CakeFest" /><br />
<span id="more-31"></span><br />
To register your proposal: http://cakefest.org/talks/add<br />
To participate: http://cakefest.org/pages/badges</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2009/04/cakephp-conference-in-berlin-2009/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP Exception Handler</title>
		<link>http://www.palivoda.eu/2009/03/cakephp-exception-handler/</link>
		<comments>http://www.palivoda.eu/2009/03/cakephp-exception-handler/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 18:34:47 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=30</guid>
		<description><![CDATA[While searching for ready exception handler I did not found any that could match following requirements:
1) Handle Exception and any other (AppException, MyAppException etc) exception that are Exception super class;
2) Send email notification about exception;
3) Dump exception to log;
4) Show nice page to the user:
a) A custom landing page can be defined for exception;
b) For [...]]]></description>
			<content:encoded><![CDATA[<p>While searching for ready exception handler I did not found any that could match following requirements:<br />
1) Handle Exception and any other (AppException, MyAppException etc) exception that are Exception super class;<br />
2) Send email notification about exception;<br />
3) Dump exception to log;<br />
4) Show nice page to the user:<br />
a) A custom landing page can be defined for exception;<br />
b) For all other exceptions a default landing page should be used;<br />
5) Landing page text should be localizable;<span id="more-30"></span><br />
As a good start I’ve used existing AppException implementation [1]. It matches requirements: 4 and 5, but can not handle Exceptions, only AppException. So, here my evolved version of the code:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #808080; font-style: italic;">/**
  * Aplication wide exception handler class.
  *
  * Installation: 
  * 1) Copy file in to the app directory;
  * 2) Add to bootstrap.ctp folowing lines:
  * require_once(APP.'app_exception.php');
  * set_exception_handler(array('AppExceptionHandler', 'handleException'));
  * 3) Add default view to render exceptions in /exceptions/unknown.ctp, 
  * view has access to $info variable
  *
  * References:
  * http://www.mt-soft.com.ar/2007/12/21/handling-exceptions-in-cakephp-12/
  */</span>
<span style="color: #000000; font-weight: bold;">class</span> AppExceptionHandler <span style="color: #000000; font-weight: bold;">extends</span> Object <span style="color: #66cc66;">&#123;</span>  
&nbsp;
	<span style="color: #000066;">static</span> <span style="color: #000000; font-weight: bold;">function</span> handleException<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$exception</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$parsed</span> = <span style="color: #000000; font-weight: bold;">new</span> AppExceptionParser<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$exception</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$instance</span> = <span style="color: #000000; font-weight: bold;">new</span> AppExceptionHandler<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$instance</span>-&gt;<span style="color: #006600;">renderException</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$parsed</span>-&gt;<span style="color: #006600;">getInfo</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$instance</span>-&gt;<span style="color: #006600;">logException</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$parsed</span>-&gt;<span style="color: #006600;">getInfo</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$instance</span>-&gt;<span style="color: #006600;">emailException</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$parsed</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000066;">exit</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> renderException<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$info</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$Controller</span> = <span style="color: #000000; font-weight: bold;">new</span> Controller<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">viewPath</span> = <span style="color: #ff0000;">'exceptions'</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">layout</span> = <span style="color: #ff0000;">'exception'</span>;
		<span style="color: #0000ff;">$Dispatcher</span> = <span style="color: #000000; font-weight: bold;">new</span> Dispatcher<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">base</span> = <span style="color: #0000ff;">$Dispatcher</span>-&gt;<span style="color: #006600;">baseUrl</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">webroot</span> = <span style="color: #0000ff;">$Dispatcher</span>-&gt;<span style="color: #006600;">webroot</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">set</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">compact</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'info'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$View</span> = <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$Controller</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$view</span> = @<span style="color: #0000ff;">$info</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'type'</span><span style="color: #66cc66;">&#93;</span>;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">file_exists</span><span style="color: #66cc66;">&#40;</span>VIEWS.<span style="color: #ff0000;">'exceptions'</span>.DS.<span style="color: #0000ff;">$view</span>.<span style="color: #ff0000;">'.ctp'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0000ff;">$view</span> = <span style="color: #ff0000;">'unknown'</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #808080; font-style: italic;">//header('HTTP/1.0 500 Internal Server Error');</span>
		<span style="color: #0000ff;">$out</span> = <span style="color: #0000ff;">$View</span>-&gt;<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$view</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$Controller</span>-&gt;<span style="color: #006600;">afterFilter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  
		<span style="color: #000066;">echo</span> <span style="color: #0000ff;">$out</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> logException<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$info</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">serialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$info</span><span style="color: #66cc66;">&#41;</span>, LOG_ERROR<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> emailException<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$message</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		App::<span style="color: #006600;">import</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Core'</span>, <span style="color: #ff0000;">'Email'</span><span style="color: #66cc66;">&#41;</span>;  
		<span style="color: #0000ff;">$email</span> = <span style="color: #000000; font-weight: bold;">new</span> EmailComponent;  
		<span style="color: #0000ff;">$email</span>-&gt;<span style="color: #006600;">from</span> = <span style="color: #ff0000;">'noreply@example.com'</span>;  
		<span style="color: #0000ff;">$email</span>-&gt;<span style="color: #006600;">to</span> = <span style="color: #ff0000;">'dev@example.com'</span>;  
		<span style="color: #0000ff;">$email</span>-&gt;<span style="color: #006600;">sendAs</span> = <span style="color: #ff0000;">'text'</span>;  
		<span style="color: #0000ff;">$email</span>-&gt;<span style="color: #006600;">subject</span> = <span style="color: #ff0000;">'Exception notification'</span>;  
		<span style="color: #0000ff;">$email</span>-&gt;<span style="color: #006600;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$message</span><span style="color: #66cc66;">&#41;</span>;  
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/**
  * Application exception info synthetic class.
  */</span>
<span style="color: #000000; font-weight: bold;">class</span> AppExceptionParser <span style="color: #000000; font-weight: bold;">extends</span> Object <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$exception</span> = <span style="color: #000000; font-weight: bold;">null</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$exception</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span> = <span style="color: #0000ff;">$exception</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">print_r</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getInfo</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getInfo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">array_merge</span><span style="color: #66cc66;">&#40;</span>
			<span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>
				<span style="color: #ff0000;">'type'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getType</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
				<span style="color: #ff0000;">'message'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getMessage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#41;</span>,
			<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">where</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, 
			<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">context</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000066;">getType</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">get_class</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #ff0000;">'AppException'</span> || <span style="color: #000066;">is_subclass_of</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>, <span style="color: #ff0000;">'AppException'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getType</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> <span style="color: #ff0000;">'unknown'</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getMessage<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getMessage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> where<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>
			<span style="color: #ff0000;">'function'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getClass</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">'::'</span>.<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getFunction</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'file'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'line'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getLine</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'url'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getUrl</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getUrl<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$full</span> = <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> Router::<span style="color: #006600;">url</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'full_base'</span> =&gt; <span style="color: #0000ff;">$full</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$trace</span> = <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getTrace</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$trace</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'class'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getFunction<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$trace</span> = <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">exception</span>-&gt;<span style="color: #006600;">getTrace</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$trace</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'function'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> context<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>
			<span style="color: #ff0000;">'remoteAddr'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getRemoteAddr</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'requestMethod'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getRequestMethod</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'httpUserAgent'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getHttpUserAgent</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'httpAcceptLangage'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getHttpAcceptLanguage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'httpReferer'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getHttpReferer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
			<span style="color: #ff0000;">'sessionAuth'</span> =&gt; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">getSessionAuth</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getRemoteAddr<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'REMOTE_ADDR'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getRequestMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'REQUEST_METHOD'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getHttpUserAgent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'HTTP_USER_AGENT'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getHttpAcceptLanguage<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'HTTP_ACCEPT_LANGUAGE'</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getHttpReferer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'HTTP_REFERER'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> ? <span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'HTTP_REFERER'</span><span style="color: #66cc66;">&#93;</span> : <span style="color: #ff0000;">'None'</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> getSessionAuth<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'Auth'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> ? <span style="color: #000066;">print_r</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'Auth'</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #ff0000;">'Anonymous'</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/**
  * Application base exception class. The $info['type'] stores name of the view file in /views/exceptions/, without .ctp.
  * Default view is /views/exceptions/unknon.ctp
  */</span>
<span style="color: #000000; font-weight: bold;">class</span> AppException <span style="color: #000000; font-weight: bold;">extends</span> Exception <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$type</span> = <span style="color: #000000; font-weight: bold;">null</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$message</span>, <span style="color: #0000ff;">$type</span> = <span style="color: #ff0000;">'unknown'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		parent::__construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$message</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">type</span> = <span style="color: #0000ff;">$type</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000066;">getType</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">type</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>To attach AppExceptionHandler to yours the CakePHP application add to the bootstrap.php following lines:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #b1b100;">require_once</span><span style="color: #66cc66;">&#40;</span>APP.<span style="color: #ff0000;">'app_exception.php'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>configure::<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &lt;= <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	set_exception_handler<span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AppExceptionHandler'</span>, <span style="color: #ff0000;">'handleException'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>The last step is to create /views/exceptions/unknown.ctp, here is my example:</p>

<div class="wp_syntax"><div class="code"><pre class="php">&lt;div&gt;
	&lt;p&gt;&lt;img src=<span style="color: #ff0000;">&quot;/img/logo.png&quot;</span>/&gt;&lt;/p&gt;
	&lt;h1&gt;&lt;?php __<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'-views-exceptions-unknown-header'</span><span style="color: #66cc66;">&#41;</span> ?&gt;&lt;/h1&gt;
	&lt;p&gt;&lt;?php __<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'-views-exceptions-unknown-text-short_term'</span><span style="color: #66cc66;">&#41;</span>; ?&gt;&lt;/p&gt;
	&lt;p&gt;&lt;?php __<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'-views-exceptions-unknown-text-long_term'</span><span style="color: #66cc66;">&#41;</span>; ?&gt;&lt;/p&gt;
&nbsp;
	&lt;div id=<span style="color: #ff0000;">&quot;debug&quot;</span> <span style="color: #000000; font-weight: bold;">class</span>=<span style="color: #ff0000;">&quot;cake-exception-log&quot;</span>&gt;
	&lt;table&gt;&lt;?php 
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>Configure::<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &gt;= <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$info</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'&lt;tr&gt;&lt;th&gt;'</span>.<span style="color: #0000ff;">$name</span>.<span style="color: #ff0000;">':&lt;/th&gt;&lt;td id=&quot;'</span>.<span style="color: #0000ff;">$name</span>.<span style="color: #ff0000;">'&quot;&gt;'</span>.<span style="color: #0000ff;">$value</span>.<span style="color: #ff0000;">'&lt;/td&gt;&lt;/tr&gt;'</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	?&gt;&lt;/table&gt;
	&lt;/div&gt;
&lt;/div&gt;</pre></div></div>

<p>That&#8217;s it. Hope this helps.</p>
<p>References:<br />
[1] http://www.mt-soft.com.ar/2007/12/21/handling-exceptions-in-cakephp-12/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2009/03/cakephp-exception-handler/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL to order Null values on top with CakePHP</title>
		<link>http://www.palivoda.eu/2008/11/sql-to-order-null-values-on-top-with-cakephp/</link>
		<comments>http://www.palivoda.eu/2008/11/sql-to-order-null-values-on-top-with-cakephp/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 11:11:09 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=29</guid>
		<description><![CDATA[It&#8217;s clear - to make null values on top can be used  that SQL:

ORDER BY date_end IS NULL DESC, date_end DESC

and here is how to pas that SQL order in CakePHP:

array&#40;'date_end' =&#62; 'IS NULL DESC', 'Model.date_end' =&#62; 'DESC'&#41;

Here is few things you should keep in mind:
1) if you just write date_end IS NULL as [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s clear - to make null values on top can be used <span id="more-29"></span> that SQL:</p>

<div class="wp_syntax"><div class="code"><pre class="php">ORDER BY date_end IS <span style="color: #000000; font-weight: bold;">NULL</span> DESC, date_end DESC</pre></div></div>

<p>and here is how to pas that SQL order in CakePHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'date_end'</span> =&gt; <span style="color: #ff0000;">'IS NULL DESC'</span>, <span style="color: #ff0000;">'Model.date_end'</span> =&gt; <span style="color: #ff0000;">'DESC'</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Here is few things you should keep in mind:<br />
1) if you just write date_end IS NULL as string, CakePHP will fail with error &#8216;date_end IS NULL&#8217; column not found, thats why we have that array to pass order fields;<br />
2) the second parameter is Model.date_end, because is you make it just date_end CakePHP will ignore it because date_end is already in array of sorted fields.</p>
<p>That&#8217;s all, happy coding.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/11/sql-to-order-null-values-on-top-with-cakephp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Image submit button with changable text</title>
		<link>http://www.palivoda.eu/2008/10/how-to-make-graphical-submit-button-with-text/</link>
		<comments>http://www.palivoda.eu/2008/10/how-to-make-graphical-submit-button-with-text/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 07:18:21 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Cake PHP]]></category>

		<category><![CDATA[graphical submit button]]></category>

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

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

		<category><![CDATA[render text on image]]></category>

		<category><![CDATA[text on image]]></category>

		<guid isPermaLink="false">http://www.palivoda.eu/?p=26</guid>
		<description><![CDATA[After several try to make a graphical submit form button with localizable text in it i found it&#8217;s not so simple. Furthermore there are no cases I found in the Internet. This mean weather I hav to create an image button for each language or&#8230; here is the story how I made this.
Problem definition
As input [...]]]></description>
			<content:encoded><![CDATA[<p>After several try to make a graphical submit form button with localizable text in it i found it&#8217;s not so simple. Furthermore there are no cases I found in the Internet. This mean weather I hav to create an image button for each language or&#8230; here is the story how I made this.<span id="more-26"></span></p>
<p><strong>Problem definition</strong></p>
<p>As input we have a button background layout and a text string to draw on the button background.</p>
<p>As output we should have an URL wich produces button with text.</p>
<p>Right now caching of result images is not important, but we can add it later for high performance aplications.</p>
<p><strong>The solution</strong></p>
<p>We use php GD library to load image, and draw a text on it. After the image is ready it&#8217;s writen to the webserver response stream.</p>
<p>To draw a text we need a font, the arial.ttf will fit, so we place it in to the /app/vendors/imagetext/arial.ttf to use it later in our controller.</p>
<p>To output image we create controller and remove any model associations from it (we do not need model for that functionality, the image name and text to draw we need we will get from parameters).</p>
<p>Here is the controller code:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #808080; font-style: italic;">/**
 * Controller provides functionality to render imges with specified text over it
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ImagesController <span style="color: #000000; font-weight: bold;">extends</span> Controller <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$uses</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; 
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	* Diaplays image with text over it
	*/</span>
	<span style="color: #000000; font-weight: bold;">function</span> textover<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$caption</span>, <span style="color: #0000ff;">$image</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">// Some basic setup</span>
		<span style="color: #0000ff;">$textFont</span> = <span style="color: #000066;">realpath</span><span style="color: #66cc66;">&#40;</span>VENDORS.<span style="color: #ff0000;">'imagetext'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">'/'</span>.<span style="color: #ff0000;">'arial'</span>.<span style="color: #ff0000;">'.ttf'</span>;
		<span style="color: #0000ff;">$textSize</span> = <span style="color: #cc66cc;">15</span>;
		<span style="color: #0000ff;">$textString</span> = <span style="color: #0000ff;">$caption</span>;
		<span style="color: #0000ff;">$imageFile</span> = IMAGES_URL.DS.<span style="color: #0000ff;">$image</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">// Load background image</span>
		<span style="color: #0000ff;">$image</span> = imagecreatefrompng<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imageFile</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$textColor</span> = imagecolorallocate<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//Get image dimensions</span>
		<span style="color: #000066;">list</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imageWidth</span>, <span style="color: #0000ff;">$imageHeight</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">getimagesize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imageFile</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">// Get box info</span>
		<span style="color: #0000ff;">$box</span> = imagettfbbox<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$textSize</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">$textFont</span>, <span style="color: #0000ff;">$textString</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//Find out the width and height of the text box</span>
		<span style="color: #0000ff;">$textW</span> = <span style="color: #0000ff;">$box</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> - <span style="color: #0000ff;">$box</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>;
		<span style="color: #0000ff;">$textH</span> = <span style="color: #0000ff;">$box</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span> - <span style="color: #0000ff;">$box</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">// Calculate the positions</span>
		<span style="color: #0000ff;">$positionLeft</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imageWidth</span> - <span style="color: #0000ff;">$textW</span><span style="color: #66cc66;">&#41;</span>/<span style="color: #cc66cc;">2</span>;
		<span style="color: #0000ff;">$positionTop</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imageHeight</span> - <span style="color: #0000ff;">$textH</span><span style="color: #66cc66;">&#41;</span>/<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">// Add some text</span>
		imagettftext<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #0000ff;">$textSize</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">$positionLeft</span>, <span style="color: #0000ff;">$positionTop</span>, <span style="color: #0000ff;">$textColor</span>, <span style="color: #0000ff;">$textFont</span>, <span style="color: #0000ff;">$textString</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #000066;">header</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Pragma: public'</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000066;">header</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Content-type: image/png'</span><span style="color: #66cc66;">&#41;</span>;
		imagepng<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">// Destroy the image</span>
		imagedestroy<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span><span style="color: #66cc66;">&#41;</span>; 
&nbsp;
        <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">autoRender</span>=<span style="color: #000000; font-weight: bold;">false</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>That&#8217;s it. Now we are ready to get our image from the url /images/textover/[caption]/[background].png</p>
<p>where the caption is the text to draw on the image and the bacground.png is a filename in the /app/webroot/img directory. Try to get image by that url, if it works ok then you can use it as a source of input.</p>

<div class="wp_syntax"><div class="code"><pre>&lt;input type=&quot;image&quot; src=&quot;/images/textover/Submit/mybutton.png&quot;/&gt;</pre></div></div>

<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/10/how-to-make-graphical-submit-button-with-text/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bridgecamp Riga</title>
		<link>http://www.palivoda.eu/2008/04/bridgecamp-riga/</link>
		<comments>http://www.palivoda.eu/2008/04/bridgecamp-riga/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 20:10:34 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[News]]></category>

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=24</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href='http://bridgecamp.lv'><img src='http://bridgecamp.lv/banners/468x60_ru.gif' border='0' /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/04/bridgecamp-riga/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dynamic CSS file linking to CakePHP layout</title>
		<link>http://www.palivoda.eu/2008/04/dynimic-file-linking-to-cakephp-layout/</link>
		<comments>http://www.palivoda.eu/2008/04/dynimic-file-linking-to-cakephp-layout/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 07:21:09 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

		<category><![CDATA[dynamic file linking to layout]]></category>

		<category><![CDATA[view specific css]]></category>

		<guid isPermaLink="false">http://www.palivoda.eu/?p=23</guid>
		<description><![CDATA[Here is peace of code that can allow you to link CSS per controller action, just place the code in to the layout head section /app/views/layouts/default.ctp:

// view specific CSS - css/&#60;controllername&#62;/&#60;action&#62;.css or /css/pahes/&#60;static_page&#62;.css linking, if CSS file exists
$action = $this-&#62;params&#91;&#34;controller&#34;&#93; != 'pages' ? $this-&#62;params&#91;&#34;action&#34;&#93; : $this-&#62;params&#91;&#34;pass&#34;&#93;&#91;'0'&#93;;
if &#40;is_file&#40;APP.WEBROOT_DIR.DS.&#34;css&#34;.DS.$this-&#62;params&#91;&#34;controller&#34;&#93;.DS.$action.&#34;.css&#34;&#41;&#41; &#123;
	   echo $html-&#62;css&#40;$this-&#62;params&#91;&#34;controller&#34;&#93;.&#34;/&#34;.$action&#41;;
&#125;

&#160;
]]></description>
			<content:encoded><![CDATA[<p>Here is peace of code that can allow you to link CSS per controller action, just place the code in to the layout head section /app/views/layouts/default.ctp<span id="more-23"></span>:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #808080; font-style: italic;">// view specific CSS - css/&lt;controllername&gt;/&lt;action&gt;.css or /css/pahes/&lt;static_page&gt;.css linking, if CSS file exists</span>
<span style="color: #0000ff;">$action</span> = <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">params</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;controller&quot;</span><span style="color: #66cc66;">&#93;</span> != <span style="color: #ff0000;">'pages'</span> ? <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">params</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;action&quot;</span><span style="color: #66cc66;">&#93;</span> : <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">params</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;pass&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">&#93;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_file</span><span style="color: #66cc66;">&#40;</span>APP.WEBROOT_DIR.DS.<span style="color: #ff0000;">&quot;css&quot;</span>.DS.<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">params</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;controller&quot;</span><span style="color: #66cc66;">&#93;</span>.DS.<span style="color: #0000ff;">$action</span>.<span style="color: #ff0000;">&quot;.css&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	   <span style="color: #000066;">echo</span> <span style="color: #0000ff;">$html</span>-&gt;<span style="color: #006600;">css</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">params</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;controller&quot;</span><span style="color: #66cc66;">&#93;</span>.<span style="color: #ff0000;">&quot;/&quot;</span>.<span style="color: #0000ff;">$action</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/04/dynimic-file-linking-to-cakephp-layout/feed/</wfw:commentRss>
		</item>
		<item>
		<title>i18n in CakePHP 1.2 - database content translation, Part 2</title>
		<link>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation-part-2/</link>
		<comments>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation-part-2/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 15:49:51 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

		<category><![CDATA[database localization]]></category>

		<category><![CDATA[database translation]]></category>

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=22</guid>
		<description><![CDATA[In my own opinion database content translation with core CakePHP ‘translate’ behavior is a kind of pain when the matter comes to HABTM relations and any bulk records manipulations. It&#8217;s not a secret that it is also pain for java ORM engines, like Hibernate.
So the situation needs simple solution that just works.

User wants to add, [...]]]></description>
			<content:encoded><![CDATA[<p>In my own opinion database content translation with core CakePHP ‘translate’ behavior is a kind of pain when the matter comes to HABTM relations and any bulk records manipulations. It&#8217;s not a secret that it is also pain for java ORM engines, like Hibernate.<span id="more-22"></span><br />
So the situation needs simple solution that just works.</p>
<ol>
<li>User wants to add, delete and amend some classifiers in all languages the application is available. This means default.so file is not our friend any more and the magic __() function also. Of course it&#8217;s possible to modify the SO files but why we need it if there is a database to store this kind of data.</li>
<li>Database content localization should not complicate bulk records manipulations with sub queries.</li>
<li>Localization of single record CRUD should be simple for developer. Perfect solution – change nothing.</li>
<li>There is legacy database fields that should remain unchanged to keep current functionality up and running after the localization functionality deployed. Also this field values should be used as default values if there is no translation.</li>
<li>Development contract defines how many languages should support application, so we know from the beginning what languages should the application support. If user locale does not match supported locales then application should fallback to default locale.</li>
</ol>
<p>In a couple of minutes I found at least three following approaches how to store the data.</p>
<table class="table" border="0">
<tbody>
<tr>
<td>Solution</td>
<td>Bulk manipulations</td>
<td>Single CRUD</td>
</tr>
<tr>
<td>1. Store localized data in separate table, like it does CakePHP translation behavior (i18n table).</td>
<td>Bulk manipulations with this approach can be done at programming language level with loops.<br/> Direct SQL queries will include additional relation to the table with localized data.<br/>Localized data field type is a memo for all types of data.</td>
<td>Here is possible to use model object interceptors to amend sql to read data from external table before CRUD request and manipulate data after CRUD request to set localized values. In CakePHP implementation I found that if there is no translated content in i18n table then no record selected at all.</td>
</tr>
<tr>
<td>2. Just store all data in one field in a kind of xml or symbol separated format, e.g. English String; Russian String.</td>
<td>Because all data in one field it&#8217;s hard to manipulate with localized values with SQL. There is overhead with unnecessary data load that hard to fix. For example you have 28 languages and user want to see data in selected locale. The rest 27 localized values just wasting computer memory.</td>
<td>On read we have to get whole field value and select value for current locale in code. On save we should done reverse process.</td>
</tr>
<tr>
<td>3. Store localized data In the same table - for each localizable field create fields for default value and localized values, e.g. crate fields with _eng and _rus suffix and map <name>_eng as default.</td>
<td>Bulk manipulations with localized data are simple because you can access localized value with sql column name without external table linkage and sql queries are easy to localize with text parser.</td>
<td>Method requires to intercept request before a) read operation to select only localized values and localize sql field names; b) save operation to write content to the current locale field. If you need to read values for more then one language then: a) you can select multiple columns - pass array of locales to read and locale to use as default; b) you can read same model object multiple times - one time per selected locale.</td>
</tr>
</tbody>
</table>
<p>I’ve selected approach 3 because second looks bad to me, and I already had experience with the first one. Maybe there are some other solutions, but I fill comfortable with the third one - it looks simple to me can match all requirements. Lets go deeper in the third approach implementation for CakePHP…</p>
<h2>The i18n model behavior</h2>
<p>A weekend is passed. Finally I&#8217;ve done with i18n behavior prototype. Here is the code:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #808080; font-style: italic;">/* SVN FILE: $Id: $ */</span>
<span style="color: #808080; font-style: italic;">/**
 * Requires:
 * CakePHP 1.2.1.8004
 *
 * I18n behavior for database content internationalization using locale dependent table field names.  
 *
 * I18n behavior integration steps:
 * 1. Identify which languages you are going to use 
 *	(e.g. English and Russian)
 * 2. Identify your default language 
 *	(e.g. English);
 * 3. Identify fields of your models to be internationalized (
 *	(e.g. model Country field 'name' should be i18n compatible);
 * 4. Update your database tables for each model field to be i18n compatible 
 *	(e.g. rename 'name' field to &lt;name&gt;.'_'.DEFAULT_LANGUAGE - default, and create field 'name_rus' that will be russian content); 
 * 5. Add to your model this behavior;
 *	(e.g. $artAs = array('i18n' =&gt; array('fields' =&gt; array('name'), 'display' =&gt; 'name');) 
 * 6. Add to all models that are associated with i18n compatible models this behavior;
 *	(e.g. $actAs = array('i18n'); //you can simply add this to each model )
 *	Its necessary because beforeFind and afterFind invoked for the behavior of the model that calls find method. 
 *	During beforeFind and afterFind the behavior will look for any i18n behaviors, see _localizeScheme and _unlocalizeResults.
 * 7. In your model you can set $displayField as usual. The i18n behavior will unlocalize result field names in afterFind. Default $displayField is 'name'.
 * 8. In your model you can set $order as usual. The i18n behavior will localize your order field name in beforeFind.
 * 9. In your relations you can set order attribute for one field and it will be localized.
 * 10. To save multiple locales pass data with database field names.
 *  (e.g. 'name_rus', 'name_eng');
 * 11. To save data in to current locale pass data without locale profex.
 *  (e.g. 'name' will be saved to 'name_eng' if current locale is 'eng');
 * 12. To load values for all locales detach the i18n behavior before calling model read.
 * (e.g. $this-&gt;MyModel-&gt;Behaviors-&gt;detach('i18n'); $this-&gt;MyModel-&gt;read();)
 * 13. i18n can be used with Containable behaviour, but becuase it relies on recursion while searching for localizable 
 * fields througth relations, check you have enougth recursion level (default recursion=1);
 *
 * PHP versions 4 and 5
 *
 * Copyright 2008, Palivoda IT Solutions, Inc.
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright		Copyright 2008, Palivoda IT Solutions, Inc.
 * @link			http://www.palivoda.eu
 * @package		app
 * @subpackage		app.models.behaviors
 * @since			CakePHP(tm) v 1.2
 * @version			$Revision:  $
 * @modifiedby		$LastChangedBy:  $
 * @lastmodified		$Date: $
 * @license			http://www.opensource.org/licenses/mit-license.php The MIT License
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> I18nBehavior <span style="color: #000000; font-weight: bold;">extends</span> ModelBehavior <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//for each model stores lozalizable field names and their aliases to current locale</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$fields</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/** 
	 * Reads configuration of behavior.
	 * Allowed values:
	 * fields - array of i18n compatible field names;
	 */</span>
	<span style="color: #000000; font-weight: bold;">function</span> setup<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$config</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">defined</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DEFAULT_LANGUAGE'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000066;">trigger_error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Add to bootstrap.php line: define('DEFAULT_LANGUAGE', 'eng');&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span> = array_fill_keys<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> cleanup<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$this</span>-&gt;_refreshSchema<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #808080; font-style: italic;">//debug('I18n behaviour detached from '.$model-&gt;alias.' model.');</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> beforeFind<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0000ff;">$locale</span> = <span style="color: #0000ff;">$this</span>-&gt;_getLocale<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #808080; font-style: italic;">//debug('i18n-'.$model-&gt;alias.'-beforeFind-'.$locale);</span>
		<span style="color: #808080; font-style: italic;">//debug($query);</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//reset shema if model locale set and was changed since last query</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">locale</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #0000ff;">$locale</span> != <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">locale</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$this</span>-&gt;_refreshSchema<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #0000ff;">$recursive</span> = <span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'recursive'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> ? 
			<span style="color: #66cc66;">&#40;</span><span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">recursive</span><span style="color: #66cc66;">&#41;</span> ? <span style="color: #cc66cc;">0</span> : <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">recursive</span><span style="color: #66cc66;">&#41;</span> 
				: <span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'recursive'</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #808080; font-style: italic;">//during 'delete' there are queries with empty recursive</span>
&nbsp;
		<span style="color: #0000ff;">$this</span>-&gt;_localizeScheme<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$locale</span>, <span style="color: #0000ff;">$recursive</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #0000ff;">$this</span>-&gt;_localizeQuery<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$query</span>, <span style="color: #0000ff;">$recursive</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//debug($query);</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$query</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">//Recursively replaces $localField values to $localAlias in $section array (or string)</span>
	<span style="color: #000000; font-weight: bold;">function</span> __localizeArrayInQuery<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$section</span>, <span style="color: #0000ff;">$localField</span>, <span style="color: #0000ff;">$localAlias</span>, <span style="color: #0000ff;">$isPrimary</span>, &amp;<span style="color: #0000ff;">$level</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$level</span> &lt;= <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>; <span style="color: #808080; font-style: italic;">//rectrict recursion level</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//multiple filed as array</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
			<span style="color: #808080; font-style: italic;">//localize array values </span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$queryAlias</span> =&gt; &amp;<span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #808080; font-style: italic;">//for containable [model] =&gt; array('fields'=&gt;array(...)), all sub calls will localize by short name too</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryAlias</span> == <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$isPrimary</span> = <span style="color: #000000; font-weight: bold;">true</span>;
					<span style="color: #808080; font-style: italic;">//localize array values in sub section (like contain, order)</span>
					<span style="color: #0000ff;">$this</span>-&gt;__localizeArrayInQuery<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$queryField</span>, <span style="color: #0000ff;">$localField</span>, <span style="color: #0000ff;">$localAlias</span>, <span style="color: #0000ff;">$isPrimary</span>, <span style="color: #0000ff;">$level</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #808080; font-style: italic;">//full name</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, <span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
						<span style="color: #0000ff;">$queryField</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, 
							<span style="color: #ff0000;">'$1'</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localAlias</span>.<span style="color: #ff0000;">'$3'</span>, <span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #808080; font-style: italic;">//short name</span>
					<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$isPrimary</span> &amp;&amp; <span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, <span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
						<span style="color: #0000ff;">$queryField</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, 
							<span style="color: #ff0000;">'$1'</span>.<span style="color: #0000ff;">$localAlias</span>.<span style="color: #ff0000;">'$3'</span>, <span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #808080; font-style: italic;">//localize array keys</span>
			<span style="color: #0000ff;">$oldKeys</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$queryAlias</span> =&gt; &amp;<span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #808080; font-style: italic;">//full name</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, <span style="color: #0000ff;">$queryAlias</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$newKey</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, 
							<span style="color: #ff0000;">'$1'</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localAlias</span>.<span style="color: #ff0000;">'$3'</span>, <span style="color: #0000ff;">$queryAlias</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$newKey</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$queryField</span>;
					<span style="color: #0000ff;">$oldKeys</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$queryAlias</span>;
					debug<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryAlias</span>.<span style="color: #ff0000;">''</span>.<span style="color: #0000ff;">$newKey</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #808080; font-style: italic;">//short name</span>
				<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$isPrimary</span> &amp;&amp; <span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, <span style="color: #0000ff;">$queryAlias</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$newKey</span> = <span style="color: #000066;">preg_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/(^|,| )('</span>.<span style="color: #0000ff;">$localField</span>.<span style="color: #ff0000;">')(,| |$)/i'</span>, 
						<span style="color: #ff0000;">'$1'</span>.<span style="color: #0000ff;">$localAlias</span>.<span style="color: #ff0000;">'$3'</span>, <span style="color: #0000ff;">$queryAlias</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$newKey</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$queryField</span>;
					<span style="color: #0000ff;">$oldKeys</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$queryAlias</span>;
					debug<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryAlias</span>.<span style="color: #ff0000;">''</span>.<span style="color: #0000ff;">$newKey</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$oldKeys</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$removeKey</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$removeKey</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryAlias</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$queryField</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #808080; font-style: italic;">//multiple fileds in one string, comma separated</span>
		<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">//full name</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">strstr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span>, <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>
				<span style="color: #0000ff;">$section</span> = <span style="color: #000066;">str_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>, <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localAlias</span>, <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #808080; font-style: italic;">//short name</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$isPrimary</span> &amp;&amp; <span style="color: #000066;">strstr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span>, <span style="color: #0000ff;">$localField</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>
				<span style="color: #0000ff;">$section</span> = <span style="color: #000066;">str_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$localField</span>, <span style="color: #0000ff;">$localAlias</span>, <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	* Modifies query fielelds to load localized content for current locale.
	* isPrimary should be true only when localizing model that has afterFind event
	*/</span>
	<span style="color: #000000; font-weight: bold;">function</span> _localizeQuery<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$query</span>, <span style="color: #0000ff;">$recursive</span>, <span style="color: #0000ff;">$isPrimary</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$localField</span> =&gt; <span style="color: #0000ff;">$localAlias</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//$localAlias set by _localizeScheme</span>
&nbsp;
				<span style="color: #808080; font-style: italic;">//localize field names in query sections:</span>
				<span style="color: #808080; font-style: italic;">//1. fields - localize full and short array values</span>
				<span style="color: #808080; font-style: italic;">//2. contain - localize full array values</span>
				<span style="color: #808080; font-style: italic;">//3. conditions - localize array keys, localize array values</span>
				<span style="color: #808080; font-style: italic;">//4. order - localize array values as comma separated string</span>
				<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fields'</span>, <span style="color: #ff0000;">'contain'</span>, <span style="color: #ff0000;">'conditions'</span>, <span style="color: #ff0000;">'order'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$level</span> = <span style="color: #cc66cc;">3</span>; <span style="color: #808080; font-style: italic;">//recursion level for __localizeArrayInQuery only</span>
						<span style="color: #0000ff;">$this</span>-&gt;__localizeArrayInQuery<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$localField</span>, <span style="color: #0000ff;">$localAlias</span>, <span style="color: #0000ff;">$isPrimary</span>, <span style="color: #0000ff;">$level</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
&nbsp;
				<span style="color: #808080; font-style: italic;">//on primary model append default display name to query if not exists</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$isPrimary</span> &amp;&amp; 
					<span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp;
					<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">displayField</span> == <span style="color: #0000ff;">$localField</span> &amp;&amp;
					!<span style="color: #000066;">in_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localAlias</span>,  <span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp;
					!<span style="color: #000066;">in_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$localAlias</span>,  <span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #808080; font-style: italic;">//keep only one Id column in query</span>
						<span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #000066;">array_values</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array_unique</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
						<span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localAlias</span>;
						<span style="color: #808080; font-style: italic;">//set displayFieled fof list type of query</span>
						<span style="color: #0000ff;">$query</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'list'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'valuePath'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #ff0000;">'{n}.'</span>.<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span>.<span style="color: #ff0000;">'.'</span>.<span style="color: #0000ff;">$localField</span>; 
&nbsp;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//if no recursive set then localize fields of related models</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$recursive</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$recursive</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$recursive</span> &lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>;
&nbsp;
 		<span style="color: #808080; font-style: italic;">//go throught related models and if thay has i18n behaviour then localize theme</span>
		<span style="color: #808080; font-style: italic;">//Note: models A-B-C, if B is not i18n then C will not be localized, even if it has i18n behaviour</span>
&nbsp;
		<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'belongsTo'</span>,<span style="color: #ff0000;">'hasOne'</span>,<span style="color: #ff0000;">'hasMany'</span>,<span style="color: #ff0000;">'hasAndBelongsToMany'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$relationGroup</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$relationGroup</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$relationGroup</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; &amp;<span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_localizeQuery<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$query</span>, <span style="color: #0000ff;">$recursive</span><span style="color: #cc66cc;">-1</span>, <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	* Modifies theme to load localized content only for default and current locale.
	*/</span>
	<span style="color: #000000; font-weight: bold;">function</span> _localizeScheme<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$locale</span>, <span style="color: #0000ff;">$recursive</span>, &amp;<span style="color: #0000ff;">$relation</span> = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">locale</span> = <span style="color: #0000ff;">$locale</span>;
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$configName</span> =&gt; &amp;<span style="color: #0000ff;">$configAlias</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
				<span style="color: #808080; font-style: italic;">//ammend schema and store in config localized field name &lt;name&gt;_&lt;locale&gt; or &lt;name&gt;_def</span>
				<span style="color: #0000ff;">$foundSpecific</span> = <span style="color: #000000; font-weight: bold;">false</span>;
				<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;_schema <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$shemaName</span> =&gt; <span style="color: #0000ff;">$v</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">strpos</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'_'</span>.<span style="color: #0000ff;">$shemaName</span>, <span style="color: #0000ff;">$configName</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//is one of i18n fields</span>
						<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$configName</span>.<span style="color: #ff0000;">'_'</span>.DEFAULT_LANGUAGE != <span style="color: #0000ff;">$shemaName</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//not for default locale</span>
							<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$configName</span>.<span style="color: #ff0000;">'_'</span>.<span style="color: #0000ff;">$locale</span> != <span style="color: #0000ff;">$shemaName</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//not for current locale</span>
								<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;_schema<span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$shemaName</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
							<span style="color: #66cc66;">&#125;</span>
							<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
								<span style="color: #0000ff;">$foundSpecific</span> = <span style="color: #000000; font-weight: bold;">true</span>;
								<span style="color: #0000ff;">$configAlias</span> = <span style="color: #0000ff;">$configName</span>.<span style="color: #ff0000;">'_'</span>.<span style="color: #0000ff;">$locale</span>;
							<span style="color: #66cc66;">&#125;</span>
						<span style="color: #66cc66;">&#125;</span>
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$shemaName</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$v</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$foundSpecific</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//found locale specific content, no need in default content</span>
					<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;_schema<span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$configName</span>.<span style="color: #ff0000;">'_'</span>.DEFAULT_LANGUAGE<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$configAlias</span> = <span style="color: #0000ff;">$configName</span>.<span style="color: #ff0000;">'_'</span>.DEFAULT_LANGUAGE;
				<span style="color: #66cc66;">&#125;</span>
&nbsp;
				<span style="color: #808080; font-style: italic;">//set defailt display field to i18n name or title</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">displayField</span><span style="color: #66cc66;">&#41;</span> || <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">displayField</span> == <span style="color: #ff0000;">'id'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">displayField</span> = <span style="color: #ff0000;">'name'</span>;
					<span style="color: #66cc66;">&#125;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'title'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">displayField</span> = <span style="color: #ff0000;">'title'</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
&nbsp;
				<span style="color: #808080; font-style: italic;">//localize relations</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
					<span style="color: #808080; font-style: italic;">// localize other relation attributes: 'conditions', 'fields', 'order', //TODO: 'finderQuery', 'deleteQuery', 'insertQuery'.</span>
					<span style="color: #0000ff;">$sections</span> = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'fields'</span><span style="color: #66cc66;">&#93;</span>, &amp;<span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'order'</span><span style="color: #66cc66;">&#93;</span>, &amp;<span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'conditions'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sections</span> <span style="color: #b1b100;">as</span> &amp;<span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #808080; font-style: italic;">//do not localize more than once</span>
						<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
							<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
								<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span> <span style="color: #b1b100;">as</span> &amp;<span style="color: #0000ff;">$subSection</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
									<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">substr_count</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$subSection</span>, <span style="color: #0000ff;">$configAlias</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
										<span style="color: #0000ff;">$subSection</span> = <span style="color: #000066;">str_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$configName</span>, <span style="color: #0000ff;">$configAlias</span>, <span style="color: #0000ff;">$subSection</span><span style="color: #66cc66;">&#41;</span>;
								<span style="color: #66cc66;">&#125;</span>
							<span style="color: #66cc66;">&#125;</span> 
							<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span> 
								<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">strlen</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> &amp;&amp; <span style="color: #000066;">substr_count</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$section</span>, <span style="color: #0000ff;">$configAlias</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
									<span style="color: #0000ff;">$section</span> = <span style="color: #000066;">str_replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$configName</span>, <span style="color: #0000ff;">$configAlias</span>, <span style="color: #0000ff;">$section</span><span style="color: #66cc66;">&#41;</span>;
							<span style="color: #66cc66;">&#125;</span>
						<span style="color: #66cc66;">&#125;</span>
					<span style="color: #66cc66;">&#125;</span>
&nbsp;
				<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
		<span style="color: #808080; font-style: italic;">//if no recursive set then update schema of related models</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$recursive</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$recursive</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$recursive</span> &lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//go throught related models and if thay has i18n behaviour then localize theme</span>
		<span style="color: #808080; font-style: italic;">//Note: models A-B-C, if B is not i18n then C will not be localized, even if it has i18n behaviour</span>
&nbsp;
		<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'belongsTo'</span>,<span style="color: #ff0000;">'hasOne'</span>,<span style="color: #ff0000;">'hasMany'</span>,<span style="color: #ff0000;">'hasAndBelongsToMany'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$relationGroup</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$relationGroup</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$relationGroup</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; &amp;<span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_localizeScheme<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$locale</span>, <span style="color: #0000ff;">$recursive</span><span style="color: #cc66cc;">-1</span>, <span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> afterFind<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$results</span>, &amp;<span style="color: #0000ff;">$primary</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #808080; font-style: italic;">//debug('i18n-'.$model-&gt;alias.'-afterFind');</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$results</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$results</span> <span style="color: #b1b100;">as</span> &amp;<span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$this</span>-&gt;_unlocalizeResults<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>, <span style="color: #0000ff;">$result</span>, <span style="color: #0000ff;">$this</span>-&gt;_getLocale<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$results</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	* Narrows fields of loaded data to locale independant names, e.g. fields &lt;name&gt;_def and &lt;name&gt;_eng will became just &lt;name&gt;.
	* It recurse as far as resulsts are exists. If you made find with recursive 2 then it will recurse till second level of results.
	* TODO: The reverse process should be made before model saved.
	*/</span>
	<span style="color: #000000; font-weight: bold;">function</span> _unlocalizeResults<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span>, &amp;<span style="color: #0000ff;">$result</span>, &amp;<span style="color: #0000ff;">$locale</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
			<span style="color: #808080; font-style: italic;">//collection of models</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$data</span> = &amp;<span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span>;
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #808080; font-style: italic;">//single model</span>
			<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$data</span> = &amp;<span style="color: #0000ff;">$result</span>;
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">alias</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$alias</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//alias set in _localizeScheme</span>
				<span style="color: #808080; font-style: italic;">//unlocalize field name</span>
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">is_array</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">array_key_exists</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$alias</span>, <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$alias</span><span style="color: #66cc66;">&#93;</span>;
					<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$alias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">belongsTo</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">belongsTo</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$behaviors</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>-&gt;<span style="color: #006600;">Behaviors</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_unlocalizeResults<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$locale</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasOne</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasOne</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$behaviors</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>-&gt;<span style="color: #006600;">Behaviors</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_unlocalizeResults<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$locale</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasMany</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasMany</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$behaviors</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>-&gt;<span style="color: #006600;">Behaviors</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> &amp;<span style="color: #0000ff;">$record</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_unlocalizeResults<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$record</span>, <span style="color: #0000ff;">$locale</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasAndBelongsToMany</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">hasAndBelongsToMany</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$name</span> =&gt; <span style="color: #0000ff;">$relation</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #0000ff;">$behaviors</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>-&gt;<span style="color: #006600;">Behaviors</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">as</span> &amp;<span style="color: #0000ff;">$record</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">Behaviors</span>-&gt;<span style="color: #006600;">i18n</span>-&gt;_unlocalizeResults<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$record</span>, <span style="color: #0000ff;">$locale</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> beforeSave<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//get current locale</span>
		<span style="color: #0000ff;">$locale</span> = <span style="color: #0000ff;">$this</span>-&gt;_getLocale<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">//if user is saving unlocalized values then reset shema and do not localize any value</span>
		<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">fields</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$modelAlias</span> =&gt; <span style="color: #0000ff;">$modelFields</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modelFields</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$fieldName</span> =&gt; <span style="color: #0000ff;">$fieldAlias</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">isset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$modelAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$fieldAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					<span style="color: #0000ff;">$this</span>-&gt;_refreshSchema<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>; <span style="color: #808080; font-style: italic;">//exit</span>
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//save localized value to alias database field</span>
		<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">fields</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$modelAlias</span> =&gt; <span style="color: #0000ff;">$modelFields</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modelFields</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$fieldName</span> =&gt; <span style="color: #0000ff;">$fieldAlias</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">empty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$modelAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$fieldName</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>				
					<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$modelAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$fieldAlias</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$modelAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$fieldName</span><span style="color: #66cc66;">&#93;</span>;
					<span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$modelAlias</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$fieldName</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #808080; font-style: italic;">//debug($model-&gt;data);</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
	<span style="color: #66cc66;">&#125;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066;">static</span> <span style="color: #0000ff;">$_i18n</span> = <span style="color: #000000; font-weight: bold;">null</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> _getLocale<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//instanciate current locale storage class</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>self::<span style="color: #0000ff;">$_i18n</span> == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066;">class_exists</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'I18n'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				uses<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'i18n'</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
			self::<span style="color: #0000ff;">$_i18n</span> =&amp; I18n::<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">//retreive current locale</span>
		<span style="color: #0000ff;">$locale</span> = self::<span style="color: #0000ff;">$_i18n</span>-&gt;<span style="color: #006600;">l10n</span>-&gt;<span style="color: #006600;">locale</span>;
		<span style="color: #808080; font-style: italic;">//debug($model-&gt;alias.' get locale '.$locale);</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$locale</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> _refreshSchema<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$model</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0000ff;">$model</span>-&gt;_schema = <span style="color: #000000; font-weight: bold;">null</span>;
		<span style="color: #0000ff;">$model</span>-&gt;<span style="color: #006600;">schema</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #808080; font-style: italic;">//debug($model-&gt;alias.' schema renewed');</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>&nbsp;</p>
<h3>Localized find operation</h3>
<p>Lets imagine we have following table in the database with fields for localized content for English and Russian languages:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`countries`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> int<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: #ff0000;">`name_eng`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span> character <span style="color: #993333; font-weight: bold;">SET</span> utf8 collate utf8_unicode_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>,
  <span style="color: #ff0000;">`name_rus`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span> character <span style="color: #993333; font-weight: bold;">SET</span> utf8 collate utf8_unicode_ci <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;">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;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">--- and here is sample records</span>
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`countries`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name_eng`</span>, <span style="color: #ff0000;">`name_rus`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">'Australia'</span>, <span style="color: #ff0000;">'Австралия'</span><span style="color: #66cc66;">&#41;</span>,
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #ff0000;">'Austria'</span>, <span style="color: #ff0000;">'Австрия'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Next we have the model class /app/models/country.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Country <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$name</span> = <span style="color: #ff0000;">'Country'</span>;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$useTable</span> = <span style="color: #ff0000;">'countries'</span>;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'i18n'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fields'</span>=&gt;array<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>; 
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$displayField</span> = <span style="color: #ff0000;">'name'</span>;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$order</span> = <span style="color: #ff0000;">'name'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Note, we have i18n in the behaviors list ($actAs) and name of the field we want to localize - &#8220;name&#8221;. Here in our example we have only one filed, but you can add as many fileld to the array as you wish, like</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'i18n'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fields'</span>=&gt;array<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span>, <span style="color: #ff0000;">'shortname'</span>, <span style="color: #ff0000;">'firstname'</span>, <span style="color: #ff0000;">'mydrandmaname'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>CakePHP uses &#8220;name&#8221; or &#8220;title&#8221; as default display name and i18n behavior do the same, therefore we can skip definition of $displayField variable but I will leave it for example.<br />
As far as we have our model we can drop the i18n behavior in to the /app/models/behaviors/i18n.php (full source code of i18n is at the top of the page).<br />
Next we have to define that English is our default language in /app/config/bootstrap.php</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000066;">define</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DEFAULT_LANGUAGE'</span>, <span style="color: #ff0000;">'eng'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Fallback to default language happens when the database field for the specific locale not found. e.g. user wants Lithuanian locale, but in the database there are fields name_eng and name_rus, but no field name_lit, then values from name_eng field will be selected.<br />
Now we are ready to read our localized model from database, and here is how we do that:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #808080; font-style: italic;">//output localized list or countries</span>
debug<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Country</span>-&gt;<span style="color: #006600;">find</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'list'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//output all countries with all fields with localized names</span>
debug<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Country</span>-&gt;<span style="color: #006600;">findAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>That&#8217;s all about find operation localization. </p>
<blockquote><p>
I tried making one of the fields empty, but it does not falls back to the default locale language. I want to select default value if column exists but value is empty. Like user has Russian locale and there is name_rus but values are NULL in the database. Then app should select values from name_eng.
</p></blockquote>
<p>This will increase the amount of selected data (we need to select default and locale specific) fields from the database and in afterfind event of the behavior we should parse all results to check for empty locale specific value. It&#8217;s really bad from performance point of view. My idea is to write default value to the empty locale specific value during save operation. E.g. we have name_eng, name_rus, user has Russian locale and saves model, if value is empty then value of nam_eng will be written to the name_rus. Note, this functionality not implemented yet.</p>
<blockquote><p>
I have a one to many relationship table - a category table which has many product relationship. Product model has id field, i18n &#8216;name&#8217; field (name_eng and name_zh_tw), and this table belongs to category by category_id field. When I retrieve the category table with recursive of two, I wanted to retrieve the name of the product depending on the locale.
</p></blockquote>
<p>What you should keep in mind it is the i18n behavior should be both:<br />
a) in the model that has the localizable fields;<br />
b) in the model that does find operation.<br />
In your case you have: <strong>category</strong> (no i18n fields) 1 - M <strong>product</strong> (i18n fileds: name_eng, name_zh_tw).<br />
For this case you should put the i18n behavior:<br />
a) in to the product model the i18n behavior to mark fields that you are going to localize;</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'i18n'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fields'</span>=&gt;array<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>b) in to the category model to allow the i18n behavior to intercept the beforeFind and afterFind calls:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'i18n'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>&nbsp;</p>
<h3>What’s next?</h3>
<p>As you can see in comments the save interception is not implemented yet. And if you will try to save localized model you will got error message that field not found.<br />
I will keep up to date the post and commit updates to the code as I will progress in the area. Right now this functionality is enough for me and it works great.<br />
Do not hesitate to post comments and code improvements.<br />
As soon as the code became more or less functional and stable enough it will be introduced to CakePHP community.<br />
That’s all for now, happy coding. <img src='http://www.palivoda.eu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation-part-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>i18n in CakePHP 1.2 - database content translation.</title>
		<link>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation/</link>
		<comments>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 07:47:53 +0000</pubDate>
		<dc:creator>Rostislav Palivoda</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

		<category><![CDATA[database content translation]]></category>

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

		<guid isPermaLink="false">http://www.palivoda.eu/?p=21</guid>
		<description><![CDATA[Use case: Show translation of database content.

To start with translation of database content in CakePHP 1.2 we have to create a table to store all translated data, by default it&#8217;s name is i18n. We can use &#8216;cake i18n&#8217; command to create the table. Here is the SQL of the table I&#8217;ve got:

CREATE TABLE `i18n` &#40;
 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Use case:</strong> Show translation of database content.</p></blockquote>
<p><span id="more-21"></span><br />
To start with translation of database content in CakePHP 1.2 we have to create a table to store all translated data, by default it&#8217;s name is i18n. We can use &#8216;cake i18n&#8217; command to create the table. Here is the SQL of the table I&#8217;ve got:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`i18n`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> int<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: #ff0000;">`locale`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> collate utf8_unicode_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>,
  <span style="color: #ff0000;">`model`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> collate utf8_unicode_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>,
  <span style="color: #ff0000;">`foreign_key`</span> int<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: #ff0000;">`field`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> collate utf8_unicode_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>,
  <span style="color: #ff0000;">`content`</span> text collate utf8_unicode_ci,
  <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: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`locale`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`locale`</span><span style="color: #66cc66;">&#41;</span>,
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`model`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`model`</span><span style="color: #66cc66;">&#41;</span>,
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`foreign_key`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`foreign_key`</span><span style="color: #66cc66;">&#41;</span>,
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`field`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`field`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I will localize Country names, so here is sql for counries table:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`countries`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> int<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: #ff0000;">`name`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> collate utf8_unicode_ci <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;">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;">&#41;</span></pre></div></div>

<p>Just a few words about the table: the idea of translation is to intercept calls to the model data and to lookup for translated content in the i18n table. Translation content identified by model name, current locale, model identifier (id) and field name to be translated.<br />
So setup fields to be translated we have to add behavior in to the model and supply model field names:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$actsAs</span>   = <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Translate'</span> =&gt; <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>My model name is &#8216;Country&#8217;. After adding behavior to the model in the sql trace I can see additional query to the database:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`Country`</span>.<span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`I18n__name`</span>.<span style="color: #ff0000;">`content`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`countries`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`Country`</span> <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`i18n`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`I18n__name`</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`Country`</span>.<span style="color: #ff0000;">`id`</span> = <span style="color: #ff0000;">`I18n__name`</span>.<span style="color: #ff0000;">`foreign_key`</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`I18n__name`</span>.<span style="color: #ff0000;">`model`</span> = <span style="color: #ff0000;">'Country'</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`I18n__name`</span>.<span style="color: #ff0000;">`field`</span> = <span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`I18n__name`</span>.<span style="color: #ff0000;">`locale`</span> = <span style="color: #ff0000;">'eng'</span></pre></div></div>

<p>It&#8217;s TranslateBehavior is looking for translated content. I have about 200 records in countries table but after adding the behavior the results are empty. It looks like only translated content records appear in the results. </p>
<h3>Found a problems</h3>
<p>1) Find as list does not load translated content. (problem <a href="https://trac.cakephp.org/ticket/4456#preview" target="_blank">4456</a>). Following code will return identifiers but translated values always will be set to null.</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$countries</span> = <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Somemodel</span>-&gt;<span style="color: #006600;">Country</span>-&gt;<span style="color: #006600;">find</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'list'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//returns array with null values</span></pre></div></div>

<p>2) If there are multiple model associations has-one to the same model then i18n content searches by model.name, not by model.alias (problem <a href="https://trac.cakephp.org/ticket/4461">4461</a>).</p>
<p>That&#8217;s all. Happy baking. <img src='http://www.palivoda.eu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>P.S.:</h3>
<p>Why I need Country.name column in the database table if contents for the name column is stored in the i18n table? I&#8217;ve renamed the column to &#8216;name_old&#8217; and it still works, buy in lists only identifier are displayed. After following line was added translated values appeared again in the lists.</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$displayField</span> = <span style="color: #ff0000;">'name'</span>;</pre></div></div>

<p>So there is no column in the databse but in model it&#8217;s created from translation behavior. Now countries table has following structure:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`countries`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> int<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: #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;">&#41;</span></pre></div></div>

<p>&nbsp;</p>
<h3>P.S.:</h3>
<p>To sort by localized values use &#8216;I18n__<field_name>.content&#8217;. For example to sort countries list by localized name I use:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0000ff;">$order</span> = <span style="color: #ff0000;">'I18n__name.content'</span>;</pre></div></div>

<p>&nbsp;</p>
<h3>Open questions</h3>
<p>1. Why contents not localized for related models one-to-many, many-to-one, many-to-many (HABT)?<br />
2. Why order column should be &#8216;I18n__name.contents&#8217;?</p>
<h3>What next?</h3>
<p>Take a look at the alternative solution in the <a href="/2008/04/15/">next post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
