Database CakePHP-如何将转换行为应用于现有数据库?

Database CakePHP-如何将转换行为应用于现有数据库?,database,cakephp,behavior,translate,Database,Cakephp,Behavior,Translate,我用CakePHP开发了一个现有的应用程序和一个数据库。 任务是将转换行为应用于其模型。问题是i18n.php脚本只创建了_i18n表,但没有将现有数据复制到此表。 你不知道有什么脚本可以做到吗? 谢谢你的帮助。据我所知,没有办法做到这一点。此外,由于i18n表的配置方式,我认为有更好的解决方案。不久前,我为TranslateBehavior编写了一个补丁,可以让您不必将现有数据复制到i18n表中(这对我来说是非常多余的,是实现i18n的一个巨大障碍)。如果i18n表中不存在该模型的记录,它只会

我用CakePHP开发了一个现有的应用程序和一个数据库。 任务是将转换行为应用于其模型。问题是i18n.php脚本只创建了_i18n表,但没有将现有数据复制到此表。 你不知道有什么脚本可以做到吗?
谢谢你的帮助。

据我所知,没有办法做到这一点。此外,由于i18n表的配置方式,我认为有更好的解决方案。不久前,我为TranslateBehavior编写了一个补丁,可以让您不必将现有数据复制到i18n表中(这对我来说是非常多余的,是实现i18n的一个巨大障碍)。如果i18n表中不存在该模型的记录,它只会将模型记录本身作为回退读取

不幸的是,Cake团队似乎已经将所有内容都转移到了新系统中,因此我再也找不到提交的票证或补丁。我的TranslateBehavior的补丁副本位于我的Codaset存储库中

正如您所料,所有常见的警告都适用。这个补丁文件是由YMMV为1.2.x开发的,适合我的需要。

尝试使用它

function regenerate()
{
    $this->Article->Behaviors->disable('Translate'); 
    $out = $this->Article->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = $b = 0;
    foreach($out as $v){
        $title['locale'] = 'aze';
        $title['model'] = 'Article';
        $title['foreign_key'] = $v['Article']['id'];
        $title['field'] = 'title';
        $title['content'] = $v['Article']['title'];
        if($this->Article->I18n->create($title) && $this->Article->I18n->save($title)){
            $t++;
        }
        $body['locale'] = 'aze';
        $body['model'] = 'Article';
        $body['foreign_key'] = $v['Article']['id'];
        $body['field'] = 'body';
        $body['content'] = $v['Article']['body'];
        if($this->Article->I18n->create($body) && $this->Article->I18n->save($body)){
            $b++;
        }
    }
}

谢谢你,阿齐兹。我修改了您的代码以在cakeshell中使用它
(CakePHP 2.3.8)


我扩展了Aziz和MarcoB的答案,并从中创建了一个更通用的CakeShell

在方法
\u execute()
中,只需设置如下内容:

$this->_regenerateI18n('BlogPosts', array('title'), 'deu');
语言deu中列标题的所有blogpost模型条目都将在i18n表中创建

这是CakePHP2.4兼容的


$this->_regenerateI18n('BlogPosts', array('title'), 'deu');
<?php 

class SetuptranslationsShell extends AppShell {

    public function main() {
        $selection = $this->in('Start to create translated entries?', array('y', 'n', 'q'), 'y');
        if (strtolower($selection) === 'y') {
            $this->out('Creating entries in i18n table...');
            $this->_execute();
        }
    }

    function _execute() {
        $this->_regenerateI18n('BlogPosts', array('title'), 'deu');
        $this->_regenerateI18n('BlogTags',  array('name'),  'deu');
    }

    /**
     * See http://stackoverflow.com/q/2024407/22470
     * 
     */
    function _regenerateI18n($Model, $fields = array(), $targetLocale) {

        $this->out('Create entries for "'.$Model.'":');

        if (!isset($this->$Model)) {
            $this->{$Model} = ClassRegistry::init($Model);
        }

        $this->{$Model}->Behaviors->disable('Translate'); 
        $out = $this->{$Model}->find('all', array(
                                                    'recursive' => -1, 
                                                    'order'     => $this->{$Model}->primaryKey, 
                                                    'fields'    => array_merge(array($this->{$Model}->primaryKey), $fields))
                                                    );

        $this->I18nModel = ClassRegistry::init('I18nModel');

        $t = 0;
        foreach ($out as $v) {

            foreach ($fields as $field) {
                $data = array(
                    'locale'        => $targetLocale,
                    'model'         => $this->{$Model}->name,
                    'foreign_key'   => $v[$Model][$this->{$Model}->primaryKey],
                    'field'         => $field,
                    'content'       => $v[$Model][$field],
                );


                $check_data = $data;
                unset($check_data['content']);
                if (!$this->I18nModel->find('first', array('conditions' => $check_data))) {
                    if ($this->I18nModel->create($data) AND $this->I18nModel->save($data)) {
                        echo '.';
                        $t++;
                    }
                }
            }
        }
        $this->out($t." entries written");
    }
}