Salut à toutes et à tous!

Je viens de suivre le tuto de Grafikart sur l'internationalisation et le premier problème que je rencontre se situe au moment où l'on enregistre les champs dans plusieurs langues. Il est fort possible que ce soit à cause de la version de cake, je suis sous la 2.2.

Voici ce que j'ai fais jusqu'à présent :

bootstrap

Configure::write('Config.languages', array('fra','eng'));
Configure::write('Config.language','fra');

Post model

<?php
class Post extends AppModel{
    public $actsAs = array(
        'Translate' => array(
            'name' => 'nameTranslation',
            'slug' => 'slugTranslation',
            'content' => 'contentTranslation'
            )
        );

PostsController

function admin_edit(){
    if (!empty($this->request->data)) {
            $this->Post->locale = Configure::read('Config.languages');
            $this->Post->create();
            if ($this->Post->save($this->request->data)) {
                // $this->redirect(array('action' => 'index'));
            }
        }
}

admin_edit.ctp

<div class="page-header">
    <h1>Editer un article</h1>
</div>
<?php echo $this->Form->create('Post', array('class' => 'form-horizontal','type' => 'file')); ?>
<div class="control-group">
    <?php echo $this->Form->label('file', 'Image (format png/jpg)', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->input('file', array('div' => false, 'label' => false,'type' => 'file')); ?>
    </div>
</div>
<?php foreach (Configure::read('Config.languages') as $lang): ?>
<div class="control-group">
    <?php echo $this->Form->label('photo', 'Image name ('.$lang.')', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->input('Post.photo.'.$lang, array('div' => false, 'label' => false)); ?>
    </div>
</div>
<div class="control-group">
    <?php echo $this->Form->label('name', 'News title ('.$lang.')', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->input('Post.name.'.$lang, array('div' => false, 'label' => false)); ?>
    </div>
</div>
<div class="control-group">
    <?php echo $this->Form->label('slug', 'URL ('.$lang.')', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->input('Post.slug.'.$lang, array('div' => false, 'label' => false)); ?>
    </div>
</div>
<div class="control-group">
    <?php echo $this->Form->label('content', 'News content ('.$lang.')', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->textarea('Post.content.'.$lang, array('div' => false, 'label' => false)); ?>
    </div>
</div>
<?php endforeach; ?>
<?php echo $this->Form->input('id'); ?>
<div class="control-group">
    <?php echo $this->Form->label('online', 'Put online', 'control-label'); ?>
    <div class="controls">
        <?php echo $this->Form->input('online', array('div' => false, 'label' => false)); ?>
    </div>
</div>
<div class="control-group">
    <div class="controls">
        <?php echo $this->Form->submit('Create',array('class' => 'btn primary')); ?>
    </div>
</div>
<?php echo $this->Form->end(); ?>

Pour la vue j'utilise le bootstrap de twitter d'où l'organisation des champs un peu bizzare.

Et enfin voici l'erreur que je rencontre lorsque je sauvegarde :

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list'
SQL Query: INSERT INTO `cakeint`.`posts` (`photo`, `created`, `online`, `name`, `slug`, `content`) VALUES (Array, 'CURRENT_TIMESTAMP', '1', Array, Array, Array)

Je suis certain que le problème vient du fait que le tuto est une version antérieure et de fait en passant sur la 2.2 le résultat agit differement. Malheureusement la doc de cakephp est très vague et il m'est difficile de comprendre comment solutionner ce problème.

Je vous remercie grandement par avance pour vos lumières, j'ai tout un site à internationaliser avec tables existantes et liées, bref je suis pas sortit de l'auberge! :)

3 réponses


Je viens de débuter Cake. Cependant, pour moi ceci $this->request->data retourne un tableau de données, mais tu restes dans le premier niveau du tableau et il faut aller voir ses fils.

De plus je vois un deuxième problème à la vue du titre de ta vue et de la function tu es dans l'édition. Or tu vois bien que cake essaye de faire un INSERT INTO et non un update.

Quand on fait un update il faut préciser l'id à cake. Voici comment je procède :

<?php
/*
*
*   Function admin edit qui à le @param $id
*
*/
public function admin_edit($id) {
    if(isset($this->request->data'Post'])) { // si $_POST'Post'] est setté
        $this->Post->id = $id; // on indique à cake l'id sur lequel on va bosser, donc il sait qu'on UPDATE
        $this->Post->save(array(
            'name' => $this->request->data'Post']'name'],   // les champs
            'content' => $this->request->data'Post']'content']  
        ), true, array('name', 'content')); // true => pour valider les donner et un tableau des fields dont on autorise la modif (eviter les hacks)
    }
}
?>

Salut Hotgeart et merci de ton intérêt.

Concernant ta première remarque c'est vrai et c'est d'ailleurs pour ça que le nom des input sont sous la forme suivante:

<?php echo $this->Form->input('Post.name.'.$lang); ?>

Dans le cas ci-dessus, le pointeur ira dans l'array Post, puis dans name et enfin dans $lang qui est fra et eng. Donc tout devrait fonctionner correctement, ce qui est la cas dans le tuto d'ailleurs. Il doit y avoir une subtilité au niveau du modèle je pense mais j'aimerais comme m'éclaire.

Concernant ta deuxième remarque, mon titre est trompeur car ma view servira aussi bien pour ajouter que pour éditer un post. Donc ma fonction edit aura foncément un paramètre passé, en l'occurence $id.

Je sais pas si je l'ai dit mais mon site est déjà parfaitement opérationel sous cakephp 2.2, donc tout fonctionne Hotgear. Sauf le passage à l'internationalisation qui bloque...

Merci quand même ;)

Bonjour,
alors la solution est d'utiliser pour la version de cakePhp 2, non pas

$this->Model->save()

mais

$this->Model->saveAssociated()

Voilà :)