1

私は CakePHP の Translate Behavior を実装し、すべてがかなりスムーズに進みましたが、翻訳されるはずのモデルを作成しi18nたときに、テーブルから翻訳されたデータが存在しないことに気付きました。contain()

含まれているモデルに対して変換動作は機能しませんか? もしそうなら、それはこの動作の有用性をほぼ完全に削除しませんか? (あるいは、それは私だけかもしれませんが、ほぼすべてに Containable を使用しています)。

Containable を頻繁に使用する予定がある場合、翻訳をかなり簡単に行う別の「CakePHP 方式」はありますか?

4

2 に答える 2

0

どうやらこれは一般的な問題です。CakePHP クックブックには、それを処理する方法に関するいくつかのヒントがあります。

http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html

于 2012-11-06T14:24:40.627 に答える
0

同様の問題に遭遇し、Google から数十ページを読みましたが、私の問題に対する簡単な解決策が見つかりませんでした。いくつかのデバッグの後、この回避策のスニペットを作成しました。これはハックであることを考慮してください。これは主に Croogo 用に作成されたものであるため、関連するモデルがサイト上で翻訳されて表示されます。しかし、私は翻訳の動作を閲覧しましたが、それも同様に機能するはずです。基本的に AppModel クラスに貼り付けます。Cake 2.x用です

// DIRTY LITTLE HACKS, FORCING TRANSLATE BEHAVIOR AFTERFIND CALLBACK
    /**
     * Hacking the afterFind so it will call the afterFind() from 
     * behavior
     * Pase this in your AppModel Class
     * 
     * @param array $results
     * @param bool $primary
     * @return array 
     */
    public function afterFind(array $results, $primary = false) {
        parent::afterFind($results, $primary);
        # calling only if not primary model, as they get translated pretty well
        if (!$primary) {
            # iterating behaviors to look for one that has something to do
            # with translations ( Translate for cake general behavior, CroogoTranslate for Croogo based apps )        
            foreach ($this->Behaviors->enabled() as $behavior) {
                if (preg_match('/(.*)[T|t]ranslate(.*)/', $behavior)) {
                    # setting locale, not sure if it gets set on secondary models
                    $this->locale = Configure::read('Config.language');
                    # hacking the result set to match behaviours requirments
                    # so basically creating the result set to look like called from originated model
                    # $k => array('ModelAlias' => array $results)        
                    $results_tmp = array(
                        0 => array(
                            $this->alias => $results,
                        )
                    );
                    # if we find such behavior we force it's afterFind with prepared data
                    $results = $this->Behaviors->{$behavior}->afterFind($this, $results_tmp, true); # forcing true on primary - CroogoTranslate requires that
                    # restoring orginal structure like nothing ever happened     
                    $results = $results[0][$this->alias];
                    # not sure if should break or not ?
                    # on one hand what's the point of having multiple translate behaviors in one app ?
                    # on the other i've seen more weird stuff that multiple translate behaviors
                    break;
                }
            }
        }
        return $results;
    }
于 2013-04-05T10:24:38.947 に答える