2013-03-28 36 views
0

,该模型来这里如何更新翻译CakePHP的,但不是我加入翻译行为模型主表

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

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

+0

这是错误的方式$这个 - >类别 - > locale = $ locale; – 2013-03-29 10:32:51

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

这样翻译就会被保存,主表将留下不变。可能不是挽救翻译的最好方式。为什么你需要不改变主表?

0

回调Behavior::beforeSave之前Model::beforeSave ...

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

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