<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum CakePHP.org.pl - i18n behavior]]></title>
		<link>http://forum.cakephp.org.pl/topic/26/i18n-behavior/</link>
		<description><![CDATA[Najświeższe odpowiedzi w i18n behavior.]]></description>
		<lastBuildDate>Tue, 09 Dec 2008 12:07:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[i18n behavior]]></title>
			<link>http://forum.cakephp.org.pl/post/82/#p82</link>
			<description><![CDATA[<p>Obecnie kod wygląda tak<br /></p><div class="codebox"><pre><code>&lt;?php
class I18nBehavior extends ModelBehavior{

    public $fields = array();

    public $defaultLanguage = null;

    public function setup(&amp;$model, $config = array()){
        $this-&gt;defaultLanguage = Configure::read(&#039;App.defaultLanguage&#039;);
        if( !$this-&gt;defaultLanguage ){
            trigger_error(&quot;Add to core.php line: Configure::write(&#039;App.defaultLanguage&#039;, &#039;pol&#039;);&quot;);
        }
        if( !empty($config[&#039;fields&#039;]) ){
            $this-&gt;fields[$model-&gt;alias] = $config[&#039;fields&#039;];
        }
    }

    public function beforeFind(&amp;$model, $query){
        $locale = $this-&gt;getLocale($model);
        $recursive = empty($query[&#039;recursive&#039;]) ? 0 : $query[&#039;recursive&#039;];
        $this-&gt;_localizeScheme($model, $locale, $recursive);
        $this-&gt;localizeQuery($model, $query, $locale, $recursive);
        return $query;
    }

    protected function localize(&amp;$array, $alias, $locale){
        foreach($this-&gt;fields[$alias] as $field){
            if( !is_array($array) ) return false;
            foreach($array as $index =&gt; $value){
                $indexReplace = false;
                if( (string)$index == $alias.&#039;.&#039;.$field ){
                    $indexReplace = true;
                    $replace = $alias.&#039;.&#039;.$field.&#039;_&#039;.$locale;
                }
                if( (string)$index == $field ){
                    $indexReplace = true;
                    $replace = $field.&#039;_&#039;.$locale;
                }
                if( $indexReplace ){
                    $array[$replace] = $value;
                    unset($array[$index]);
                    $index = $replace;
                }
                if( is_array($value) ){
                    $this-&gt;localize($array[$index], $alias, $locale);
                }else{
                    if(substr($value,-(1+strlen($locale))) !== &#039;_&#039;.$locale){
                        $array[$index] = str_replace($field, $field.&#039;_&#039;.$locale, $array[$index]);
                    }
                }
            }
        }
    }

    protected function localizeQuery(&amp;$model, &amp;$query, $locale, $recusrsive){
        if( isset($model-&gt;Behaviors-&gt;I18n) &amp;&amp; isset($model-&gt;Behaviors-&gt;I18n-&gt;fields[$model-&gt;alias]) ){
            foreach(array(&#039;fields&#039;, &#039;conditions&#039;, &#039;order&#039;, &#039;contain&#039;) as $part){
                $this-&gt;localize($query[$part], $model-&gt;alias, $locale);
            }
        }
    }

    protected function getLocale(&amp;$model) {
        if(!isset($model-&gt;locale) || is_null($model-&gt;locale)) {
            if(!ClassRegistry::isKeySet(&#039;I18n&#039;)) {
                App::Import(&#039;Core&#039;, &#039;i18n&#039;);
            }
            $I18n =&amp; I18n::getInstance();
            $model-&gt;locale = $I18n-&gt;l10n-&gt;locale;
        }
        return $model-&gt;locale;
    }

}
?&gt;</code></pre></div><p>Teraz tak, powiedzmy ze mam dwa modele : Offer i RoomOFfer. Offer HABTM RoomOffer HABTM Offer.<br />Tak więc tabele przykladowo wyglądają tak<br />Offer<br />- id<br />- object_description_pol<br />- object_description_eng</p><p>RoomFeatore<br />- id<br />- name_pol<br />- name_eng</p><p>Przykladowa akcja w kontrolerze wygląda tak:<br /></p><div class="codebox"><pre><code>public function test(){
    $this-&gt;Offer-&gt;find(&#039;all&#039;, array(
        &#039;order&#039; =&gt; array(&#039;Offer.object_description&#039; =&gt; &#039;DESC&#039;),
        &#039;fields&#039; =&gt; array(&#039;object_description&#039;),
        &#039;contain&#039; =&gt; array(&#039;RoomFeature&#039; =&gt; array(&#039;fields&#039; =&gt; &#039;name&#039;))
    ));

}</code></pre></div><p>Konfiguracja modeli :<br />Offer<br /></p><div class="codebox"><pre><code>public $actsAs = array(&#039;I18n&#039; =&gt; array(&#039;fields&#039; =&gt; array(&#039;object_description&#039;, &#039;short_object_description&#039;)));</code></pre></div><p>RoomFeature<br /></p><div class="codebox"><pre><code>public $actsAs = array(&#039;I18n&#039; =&gt; array(&#039;fields&#039; =&gt; array(&#039;name&#039;)));</code></pre></div><p>Problem jest taki, że Behavior prawidłowo zmienia nazwy wszystkich zdefiniowanych kolumn dla modelu Offer ale tak jakby nie działała dla modelu RoomFeature, tzn dodastaje błąd że kolumna name w tabeli rooms_features nie istnieje ( co się zgadza ).<br />Wydaje mi się że muszę w metodzie localizeQuery dodać coś w tym stylu<br /></p><div class="codebox"><pre><code>if (isset($model-&gt;hasAndBelongsToMany)) {
    foreach ($model-&gt;hasAndBelongsToMany as $name =&gt; &amp;$relation) {
        if (isset($model-&gt;$name-&gt;Behaviors-&gt;I18n)) {
            // NIE WIEM CO TUTAJ WSTAWIĆ
        }
    }
}</code></pre></div><p>Ma ktoś jakiś pomysł jak &#039;odpalić&#039; ten behavior dla wszystkich modeli które zdefiniowane są w &#039;query&#039; ?</p>]]></description>
			<author><![CDATA[null@example.com (nookie)]]></author>
			<pubDate>Tue, 09 Dec 2008 12:07:04 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/82/#p82</guid>
		</item>
	</channel>
</rss>

