1

モデルの1つにTranslate動作をアタッチしましたが、これに関していくつかの欠点があります。

1)ビヘイビアーをモデルにアタッチするときにparamsとして渡されたすべてのフィールドにデータを保存しないと、$ Model :: find()メソッドは挿入された行を取得しません。

public $actsAs = array(
    'Translate' => array(
        'title' => 'title_Translation',
        'description' => 'description_Translation',
        'description_long' => 'description_long_Translation'
    )
);

例:$Model::save()メソッドにの値のみを渡すと'title'、データはi18nテーブルにも保存されますが、$Model::find()何も取得されません。すべてのフィールドのデータを渡す必要があります。

それらのレコードを強制的に取得できますか?

2)ユーザーが変更(データの編集、複数の言語でのデータの保存)できるように、アプリケーションの管理者側ですべてのレコードを(レコードが保存されている言語に関係なく)取得して一覧表示するにはどうすればよいですか?現在、現在の言語に対応するレコードのみを取得できます([構成]から読み取るか、明示的に設定します)。

ありがとうございました!

4

4 に答える 4

4

私はそれを解決しました。TranslateBehaviorをapp/Model / Behaviorにコピーし(将来のアップグレードでの問題を回避し、万が一の場合に備えて元のメソッドを保持するため)、動作の_addJoin(...)メソッドを変更しました。行255のINNERからLEFTへの結合タイプ(私はケーキ2.2.3を使用します)。

これで、レコードが存在する場合、翻訳されたフィールドが欠落している場合でも、レコードは常に取得されます。

翻訳フィールドが空かどうかを確認する必要がある以外に、欠点はありません。

于 2012-11-16T13:02:52.243 に答える
2

わかりました、少し遅れるかもしれませんが、とにかく...

1) Cake は、行をフェッチするときに INNER JOIN を使用し、それに関連付けられた翻訳であるため、基本的にこれを回避する簡単な方法はありません。空白として保存する場合でも、翻訳可能なすべてのフィールドを毎回保存する必要があります。唯一の代替手段は、内部結合ではなく左結合を使用するようにコアをハッキングすることですが、そうしないでください。

2) クックブックでは、ここですべてのレコードを取得する方法について説明しています: http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html#retrieve-all-translation-records-for-a-field

さて、おそらくほとんどの場合、翻訳を 1 つだけ取得したいので、モデル内の $actsAs['Translate'] 配列の定義を変更したくないでしょう。だから私がしたことは、その場で $actsAs['Translate'] 配列を変更する AppModel.php のメソッドを設定することでした:

/*  
 * See http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html#using-the-bindtranslation-method
 * This is for making it so we fetch all translations, as opposed to just that of the current locale.
 * Used for eg. editing (multiple translations) via the admin interface.
 */
public function bindAllTranslations(){
    $translatableFields = $this->actsAs['Translate'];

    $keyValueFields = array();
    foreach($translatableFields as $field){
        $keyValueFields[$field] = $field.'Translation';
    }

    $this->bindTranslation($keyValueFields,false);  // false means it will be changed for all future DB transactions in this page request - and won't be reset after the next transaction.
}

したがって、それが管理メソッド (またはすべての翻訳が必要なその他の状況) の場合は、検索を実行する前にそのコードを呼び出します。

$this->MyModel->bindAllTranslations();
$this->MyModel->find('all');

それが役立つことを願っています!

于 2012-11-16T05:16:04.973 に答える