4

私はデータベースを使用してCakePHPに既存のアプリケーションを持っています。タスクは、そのモデルに変換動作を適用することです。問題は、i18n.php スクリプトが _i18n テーブルを作成するだけで、既存のデータをこのテーブルにコピーしないことです。それを実行できるスクリプトを知りませんか? 助けてくれてありがとう。

4

4 に答える 4

1

使ってみてください

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++;
        }
    }
}
于 2010-02-19T00:07:05.807 に答える
1

ありがとうアジズ。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");
}
于 2013-07-19T17:25:31.280 に答える
1

私の知る限り、これを行う方法はありません。さらに、i18n テーブルが機能するように構成されているため、より良い解決策があると思います。しばらく前に、既存のデータを i18n テーブルにコピーする必要がないようにする TranslateBehavior のパッチを作成しました (これは非常に冗長に感じられ、i18n の実装に対する大きな障壁でした)。そのモデルのレコードが i18n テーブルに存在しない場合は、単にモデル レコード自体をフォールバックとして読み取ります。

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

ご想像のとおり、通常の警告がすべて適用されます。パッチを適用したファイルは 1.2.x 用に開発されたもので、YMMV によって私のニーズに合わせて動作します

于 2010-01-08T12:53:30.397 に答える