CakePHP - comment appliquer le comportement à traduire base de données existante?
Question
Je et application existante dans CakePHP avec une base de données. La tâche est d'appliquer à traduire le comportement de ses modèles. Le problème est que le script crée juste i18n.php table _i18n mais ne copie pas les données existantes à ce tableau. Ne savez-vous pas un script qui pourrait le faire? Merci pour toute aide.
La solution
Pour autant que je sache, il n'y a aucun moyen de le faire. De plus, à cause de la façon dont la table i18n est configuré pour fonctionner, je pense qu'il ya une meilleure solution. Un peu en arrière, je l'ai écrit un patch pour le qui vous le comportement Translate évitera d'avoir à copier les données existantes dans la table i18n (qui me sentir incroyablement redondant et était un énorme obstacle à la mise en œuvre i18n). Si aucun enregistrement pour ce modèle existe dans la table i18n, il suffit de lire le dossier du modèle lui-même comme solution de repli.
Malheureusement, l'équipe de gâteau semble avoir déplacé tout à de nouveaux systèmes, donc je ne peux plus trouver soit le billet ou le patch que je soumettais. Ma copie corrigée de l'est dans mon comportement Translate dépôt Codaset http://codaset.com/robwilkerson/scratchpad/source/master/blob/cakephp/behaviors/translatable.php .
Comme on pouvait s'y attendre, tous les avertissements habituels s'appliquent. Le fichier a été développé pour patché 1.2.x et travaille pour mes besoins, par YMMV .
Autres conseils
Je tendis les réponses de Aziz et MarcoB et créé un CakeShell encore plus générique hors de lui.
Dans simplement la méthode _execute()
défini quelque chose comme:
$this->_regenerateI18n('BlogPosts', array('title'), 'deu');
Et toutes les entrées du BlogPosts modèle pour le titre de colonne dans la deu linguistique sera créer dans la table i18n.
Ceci est CakePHP 2.4 compatible!
<?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");
}
}
essayer de l'utiliser
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++;
}
}
}
Merci Aziz. J'ai modifié votre code pour l'utiliser dans le 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");
}