私はデータベースを使用してCakePHPに既存のアプリケーションを持っています。タスクは、そのモデルに変換動作を適用することです。問題は、i18n.php スクリプトが _i18n テーブルを作成するだけで、既存のデータをこのテーブルにコピーしないことです。それを実行できるスクリプトを知りませんか? 助けてくれてありがとう。
4 に答える
使ってみてください
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");
}
私の知る限り、これを行う方法はありません。さらに、i18n テーブルが機能するように構成されているため、より良い解決策があると思います。しばらく前に、既存のデータを i18n テーブルにコピーする必要がないようにする TranslateBehavior のパッチを作成しました (これは非常に冗長に感じられ、i18n の実装に対する大きな障壁でした)。そのモデルのレコードが i18n テーブルに存在しない場合は、単にモデル レコード自体をフォールバックとして読み取ります。
残念ながら、Cake チームはすべてを新しいシステムに移行したようで、私が提出したチケットもパッチも見つかりません。TranslateBehavior のパッチを適用したコピーは、 http: //codaset.com/robwilkerson/scratchpad/source/master/blob/cakephp/behaviors/translatable.php の Codaset リポジトリにあります。
ご想像のとおり、通常の警告がすべて適用されます。パッチを適用したファイルは 1.2.x 用に開発されたもので、YMMV によって私のニーズに合わせて動作します。