【问题标题】:How to update translation cakephp but not main table如何更新翻译 cakephp 但不是主表
【发布时间】:2013-03-28 08:36:23
【问题描述】:

我已经为模型添加了翻译行为,模型来了

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

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

【问题讨论】:

    标签: cakephp internationalization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是因为 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);
      }
      

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 1970-01-01
          • 2015-06-28
          • 2011-10-17
          • 1970-01-01
          • 2021-08-07
          相关资源
          最近更新 更多