0

Cakephp Book(ver 1.3)からの引用:

直接実行findしているモデルのフィールドのみが変換されることに注意してください。アソシエーションを介してアタッチされたモデルは、関連付けられたモデルでのコールバックのトリガーが現在サポートされていないため、変換されません。

誰かがこれに対する解決策を思いついたことがありますか?

できない場合は、次の簡単なシナリオに関するいくつかの指針を教えてください。

私は2つのモデルを持っています:

プロジェクト、カテゴリー。
プロジェクトHABTMカテゴリー

i18nテーブルを適切に設定し、データベースにいくつかのエントリがあり、すべて翻訳されています。プロジェクトを取得すると、翻訳は取得されますが、翻訳されたカテゴリは取得されません。これは、Cakephpの本で述べられているように、関連付けを介して添付されたモデルは翻訳されないためです。

4

4 に答える 4

3

別の回避策があります。それがパフォーマンスまたはスタイルの面で良いか悪いかはわかりませんが、それが「ファットモデル、スキニーコントローラー」の目標に適していることだけがわかります。

AppModel.php

public function getTranslatedModelField($id = 0, $field) {

        $res = false;

        $db = $this->getDataSource();
        $tmp = $db->fetchAll('SELECT content from s2h_i18n WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1',
            array($this->alias, Configure::read('Config.language'), $id, $field)
        );      
        if (!empty($tmp)) {
            $res = $tmp[0]['s2h_i18n']['content'];
        }
        return $res;
}

SomeModel.php

   public function afterFind($results, $primary = false) {

        foreach ($results as $key => $val) {
            if (isset($val['SomeOtherModel']) && isset($val['SomeOtherModel']['id'])) {
                $results[$key]['SomeOtherModel']['name'] = 
    $this->SomeOtherModel->getTranslatedModelField($val['SomeOtherModel']['id'], 'name');
            }
            // other possible queries for other models and/or fields
         }

        return $results;
    }
于 2012-10-26T18:13:40.593 に答える
0

OK私は解決策を見つけました。これは主に回避策です。私はそれをもっと早く考えるべきだった。

私がやっていることは次のとおりです。すべてのプロジェクトと、プロジェクトに関連するすべてのカテゴリを再帰的に検索しています。現在、cakephpはカテゴリを変換しないため、最初のクエリの結果を使用し、カテゴリに対してのみ2番目のクエリを実行していますが、最初のクエリで見つけたカテゴリID値を使用しています。今、私はそれらを検索しているだけで、それらのデータを翻訳させることができるので、cakephpはカテゴリーを翻訳します。

現時点ではこのソリューションで問題ありませんが、最初にcakephpが翻訳動作をすぐに使用できるようにするか、次に、関連するモデルでの翻訳の取得をサポートできる動作が誰かにあると便利です。

于 2010-03-26T14:45:49.243 に答える
0

パーツを少し一般化して、関連付けられたモデルの配列afterFindから変換するフィールドを自動的に取得し、関連付けられたモデルのactsAs["Translate"]配列を使用して(潜在的に)変換するようにしました。

public function afterFind($results, $primary = false){

    $modelsToTranslate = array("SomeModel", "AnotherModel");

    foreach ($results as $key => $val){
        foreach($modelsToTranslate as $mtt){
            if (isset($val[$mtt])){
                foreach($val[$mtt] as $fieldname => $fieldval){
                    foreach ($this->$mtt->actsAs["Translate"] as $fieldToTranslate){
                        $results[$key][$mtt][$fieldname][$fieldToTranslate] = $this->$mtt->getTranslatedModelField($val[$mtt][$fieldname]['id'], $fieldToTranslate);
                    }
                }            
            }               
        }
    }
    return $results;
}
于 2013-05-03T13:27:43.750 に答える
0

私は上記の解決策を取り、両方の関数を少し一般化しました。今度は、変換動作と一緒に使用する必要があり、両方の関数をmodel.phpに入れる必要があります。他のすべてはそれ自体で機能するはずです。

public function getTranslatedModelField($id = 0, $field) {
    $res = false;
    $translateTable = (isset($this->translateTable))?$this->translateTable:"i18n";

    $db = $this->getDataSource();
    $tmp = $db->fetchAll(
        "SELECT content from {$translateTable} WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1",
        array($this->alias, Configure::read('Config.language'), $id, $field)
    );
    if (!empty($tmp)) {
        $res = $tmp[0][$translateTable]['content'];
    }
    return $res;
}   

public function afterFind($results, $primary = false) {

    if($primary == false && array_key_exists('Translate', $this->actsAs)) {
        foreach ($results as $key => $val) {
            if (isset($val[$this->name]) && isset($val[$this->name]['id'])) {
                foreach($this->actsAs['Translate'] as $translationfield) {  
                    $results[$key][$this->name][$translationfield] = 
                    $this->getTranslatedModelField($val[$this->name]['id'], $translationfield);
                }
            } else if($key == 'id' && is_numeric($val)) {
                foreach($this->actsAs['Translate'] as $translationfield) {  
                    $results[$translationfield] = 
                    $this->getTranslatedModelField($val, $translationfield);
                }                   
            }
         }
    }

    return $results;
}   
于 2013-09-02T22:28:04.103 に答える