2013-03-28 39 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] = '...';