如何更新翻译cakephp而不是主表

时间:2013-03-28 08:36:23

标签: cakephp internationalization

我已将翻译行为添加到模型中,模型来到这里

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;
    }
    }   

我的问题是我在类别数据库中有一个名称字段,当我更新或创建新的翻译时,它会使用翻译的值进行更新。我该如何避免

3 个答案:

答案 0 :(得分:0)

您必须使用Model::locale值设置用于保存在数据库中的代码语言

答案 1 :(得分:0)

这是因为TranslateBehavior使用像beforeSave和afterSave这样的回调来保存翻译的内容,所以它需要让模型的保存操作继续,因此将包含最后翻译的内容。

你可以通过欺骗TranslateBehavior来思考模型通过调用beforeSave和afterSave来保存某些东西来解决这个问题:

$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);
}

这样翻译将被保存,主表将保持不变。可能不是保存翻译的最佳方式。为什么你需要保持主桌不受影响?

答案 2 :(得分:0)

回调Behavior::beforeSaveModel::beforeSave ...

之前

但是,在真正保存之前,在Model::beforeSave之前修改Behavior::beforeSave中数据的最简单方法是:

$this->Behaviors->Behavior_Name->runtime[Model_Name]['beforeSave'][Field_Name] = '...';