0

モデルに変換動作を追加しました。モデルはここに来ます

App::uses('AppModel', 'Model');
class Category extends AppModel
{
    public $hasMany = "Product";
    public $validate = array(
        'name' => array(
            'rule' => 'notEmpty'
        )
    );
    public $actsAs = array(
        'Translate' => array(
            'name','folder','show'
        )
    );
    public $name = "Category";

    public $translateModel = 'KeyTranslate';
}

そして、モデルを更新するためのコントローラーがここにあります

public function admin_edit_translate($id,$locale)
    {

    $this->Category->locale = $locale;          
    $category = $this->Category->findById($id);

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->Category->id = $id;
        if ($this->Category->save($this->request->data)) {
            $this->Session->setFlash('Category translate has been updated');
            //$this->redirect(array('action' => 'edit',$id));
        } else {
            $this->Session->setFlash('Unable to update category');
        }
    }
    if (!$this->request->data) {
        $this->request->data = $category;
    }
    }   

私の問題は、カテゴリデータベースに名前フィールドがあり、新しい翻訳を更新または作成すると、翻訳された値で更新されることです。どうすればそれを回避できますか

4

3 に答える 3

0

これは、TranslateBehavior が beforeSave や afterSave などのコールバックを使用して翻訳されたコンテンツを保存するために発生するため、モデルの保存操作を続行して、最後の翻訳されたコンテンツを含める必要があります。

これを回避するには、次のように beforeSave と afterSave を呼び出して、モデルが何かを保存していると TranslateBehavior に思わせるようにします。

$Model = $this->Category;

$Model->create($this->request->data);
$Model->locale = $locale;

$beforeSave = $Model->Behaviors->Translate->beforeSave($Model, array(
    array(
        'callbacks' => true
    )
));

if($beforeSave) {
    $Model->id = $id;
    $Model->Behaviors->Translate->afterSave($Model, true);
}

このようにして、翻訳が保存され、メイン テーブルは変更されません。ただし、翻訳を保存する最良の方法ではないかもしれません。メインテーブルをそのままにしておく必要があるのはなぜですか?

于 2013-05-10T18:07:33.110 に答える
0

Model::localeデータベースに保存するコード言語を設定するには、値を使用する必要があります

于 2013-03-28T11:11:50.640 に答える