我已将翻译行为添加到模型中,模型来到这里
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;
}
}
我的问题是我在类别数据库中有一个名称字段,当我更新或创建新的翻译时,它会使用翻译的值进行更新。我该如何避免
答案 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::beforeSave
在Model::beforeSave
...
但是,在真正保存之前,在Model::beforeSave
之前修改Behavior::beforeSave
中数据的最简单方法是:
$this->Behaviors->Behavior_Name->runtime[Model_Name]['beforeSave'][Field_Name] = '...';