CakePHPは - 既存のデータベースへの行動を翻訳どのように適用しますか?

StackOverflow https://stackoverflow.com/questions/2024407

質問

私が持っているとデータベースとのCakePHPで既存のアプリケーション。 タスクは、そのモデルにビヘイビアを翻訳適用することです。問題はi18n.phpスクリプトがちょうど_i18nテーブルを作成しますが、このテーブルには、既存のデータをコピーしないことです。 あなたはそれを行うことができます任意のスクリプトを知らないのですか? 任意の助けてくれてありがとう。

役に立ちましたか?

解決

私の知る限りでは、これを行う方法はありません。また、国際化テーブルが動作するように設定されている方法のため、私はよりよい解決策があると思います。しばらく前に、私は国際化テーブルに既存のデータをコピーすることからあなたを維持しますTranslateBehaviorのパッチを書きました(それは私にめちゃくちゃ冗長に感じたと国際化の実装に大きな障壁でした)。そのモデルにはレコードが国際化テーブルに存在しない場合、それは単にフォールバックとしてモデルレコード自体を読み込みます。

残念ながら、ケーキのチームは新しいシステムにすべてを移動しているように見えるので、私はもはや、チケットや、私が提出したパッチのいずれかを見つけることができません。 TranslateBehaviorの私のパッチを当てたコピーは、で私Codasetリポジトリにありますhttp://codaset.com/robwilkerson/scratchpad/source/master/blob/cakephp/behaviors/translatable.phpする

のご想像のとおり、通常の警告のすべてが適用されます。パッチを当てたファイルは1.2.xのために開発され、私のニーズのために働く、YMMV のことでました。

他のヒント

私はアジズとMarcoBから回答を延長し、それから、より汎用的なCakeShellを作成しました。

メソッド_execute()では、単にのようなものを設定します

$this->_regenerateI18n('BlogPosts', array('title'), 'deu');
言語DEUの列のタイトルのためのモデルのブログ記事のための

そして、すべてのエントリが国際化テーブルに作成されます。

これは、CakePHP 2.4で互換性!

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

タグにそれを使用してみてください
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)

function execute() {
    $this->out('CORE_PATH: '. CORE_PATH. "\n");
    $this->out('CAKEPHP_SHELL: '. CAKEPHP_SHELL. "\n");

    $this->out('Migrate BlogPosts');
    $this->regenerateI18n('BlogPost', 'title', 'BlogPostI18n');
}
/**
 * @param string $Model 
 * @param string $Field
 * @param string $ModelI18n
 */
function regenerateI18n($Model = null, $Field = null, $ModelI18n = null)
{
    if(!isset($this->$Model))
        $this->$Model = ClassRegistry::init($Model);
    if(!isset($this->$ModelI18n))
        $this->$ModelI18n = ClassRegistry::init($ModelI18n);

    $this->$Model->Behaviors->disable('Translate'); 
    $out = $this->$Model->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = 0;
    foreach($out as $v){
        $data = array(
            'locale' => 'deu',
            'model' => $this->$Model->name,
            'foreign_key' => $v[$Model]['id'],
            'field' => $Field,
            'content' => $v[$Model][$Field],
        );
        if($this->$ModelI18n->create($data) && $this->$ModelI18n->save($data)){
            echo '.';
            $t++;
        }
    }
    $this->out($t." Entries written");
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top