CakePHP 2.x转换行为未保存到i18n表

时间:2012-04-13 20:26:12

标签: php cakephp behavior translate cakephp-2.1

我已按照手册中有关使用CakePHP 2.1设置翻译行为的说明以及this question here on Stack。我没有收到任何错误,但我翻译的帖子没有保存到我的i18n表中。

这是我的PostModel.php:

class Post extends AppModel {

    public $title = 'Post';
    public $name = 'Post';
    public $body = 'Post';

    public $actAs = array(
        'Translate' => array(
            'title' => 'titleTranslation', 
            'body' => 'bodyTranslation'
        )
    );

    public $validate = array(
        'title' => array(
            'rule' => 'notEmpty'
        ),
        'body' => array(
            'rule' => 'notEmpty'
        )
    );

}

以下是PostsController.php中的添加和编辑功能:

public function add() {
        if ($this->request->is('post')) {
            $this->Post->locale = 'fre';
            $this->Post->create();

        if ($this->Post->save($this->request->data)) {
            $this->Session->setFlash(__('Your post has been saved.', true));
            $this->redirect(array('action' => 'admin'));
        } else {
            $this->Session->setFlash(__('Unable to add your post.', true));
        }
    }
}

public function edit($id = null) {
    $this->Post->id = $id;
    if ($this->request->is('get')) 
    {
        $this->Post->locale = 'fre';
        $this->request->data = $this->Post->read();
    } 
    else 
    {
        if ($this->Post->save($this->request->data)) 
        {
            $this->Post->locale = 'fre';
            $this->Session->setFlash(__('Your post has been updated.', true));
            $this->redirect(array('action' => 'admin'));
        } 
        else 
        {
            $this->Session->setFlash(__('Unable to update your post.', true));
        }
    }
}

我使用Console初始化了i18n表。我应该放弃桌子并尝试重新初始化吗?不知道为什么会出现问题。

4 个答案:

答案 0 :(得分:2)

更多可重用的解决方案是添加到您的AppModel:

class AppModel extends Model {
    public $actsAs = array('Containable');

    /**
     * Converts structure of translated content by TranslateBehavior to be compatible
     * when saving model
     *
     * @link http://rafal-filipek.blogspot.com/2009/01/translatebehavior-i-formularze-w.html
     */
    public function afterFind($results, $primary = false) {
        if (isset($this->Behaviors->Translate)) {
            foreach ($this->Behaviors->Translate->settings[$this->alias] as $value) {
                foreach ($results as $index => $row) {
                    if (array_key_exists($value, $row)) {
                        foreach($row[$value] as $locale) {
                            if (isset($results[$index][$this->alias][$locale['field']])) {
                                if (!is_array($results[$index][$this->alias][$locale['field']])) {
                                    $results[$index][$this->alias][$locale['field']] = array();
                                }
                                $results[$index][$this->alias][$locale['field']][$locale['locale']] = $locale['content'];
                            }
                        }
                    }
                }
            }
        }
        return $results;
    }
}

此代码自动转换返回TranslateBehavior的内容,以便能够创建多语言形式,如:

echo $this->Form->input('Category.name.eng');
echo $this->Form->input('Category.name.deu');
echo $this->Form->input('Category.name.pol');

在CakePHP 2.3上测试。我发现现在需要Model->saveAssociated()而不是Model->save()

答案 1 :(得分:0)

尝试在add.ctp上添加此表单:

<?php
     echo $this->Form->create('Post');
     echo $this->Form->input('Post.title.fre');
     echo $this->Form->input('Post.body.fre');
     //Something more...
     echo $this->Form->end(__('Submit'));
?>
你的edit.ctp中的

<?php
     echo $this->Form->create('Post');
     echo $this->Form->input('id');
     echo $this->Form->input('Post.title.fre', array('value'=>$this->request->data['titleTranslation'][0]['content'));
     echo $this->Form->input('Post.body.fre', array('value'=>$this->request->data['bodyTranslation'][0]['content'));
     //Something more...
     echo $this->Form->end(__('Submit'));
?>

假设数据['titleTranslation'] [0]的索引是法语,为了在视图中轻松查看数组,我建议使用DebugKit https://github.com/cakephp/debug_kit

我希望这会有所帮助

答案 2 :(得分:0)

使用saveMany instedof save。它对我来说很好。

答案 3 :(得分:0)

对于遇到相同问题的人:正确的变量是$actsAs,而不是$actAs