Bonjour à tous !

J'ai ce matin tenté d'internationaliser mon site web. En travaillant en local, j'ai bien suivi le tutoriel de a à z.
Mais lorsque je clique sur un lien (article) de ma page index avec la locale "language" bien définie etc. J'ai une erreur sur ma page view : Warning (512): SQL Error: 1066: Not unique table/alias: 'I18n__title' [CORE/cake/libs/model/datasources/dbo_source.php, line 684]

Voici le code fourni :

$sql    =   "SELECT `Post`.*, `Category`.*, `I18n __title`.`content`, `I18n__ content`.`content`, `Post`.`id` FROM `posts` AS `Post` LEFT JOIN `i18n` AS `I18n __title` ON (`Post`.`id` = `I18n__ title`.`foreign_key` AND `I18n __title`.`model` = 'Post' AND `I18n__ title`.`field` = 'title') LEFT JOIN `i18n` AS `I18n __content` ON (`Post`.`id` = `I18n__ content`.`foreign_key` AND `I18n __content`.`model` = 'Post' AND `I18n__ content`.`field` = 'content') LEFT JOIN `i18n` AS `I18n __title` ON (`Post`.`id` = `I18n__ title`.`foreign_key` AND `I18n __title`.`model` = 'Post' AND `I18n__ title`.`field` = 'title') LEFT JOIN `i18n` AS `I18n __content` ON (`Post`.`id` = `I18n__ content`.`foreign_key` AND `I18n __content`.`model` = 'Post' AND `I18n__ content`.`field` = 'content') LEFT JOIN `categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) WHERE `I18n __title`.`locale` = 'fre' AND `I18n__ content`.`locale` = 'fre' AND `Post`.`id` >= 11 AND `Post`.`id` != 12 ORDER BY `Post`.`id` ASC LIMIT 2"
$error  =   "1066: Not unique table/alias: 'I18n__title'"
$out    =   null

J'ai cherché sur Google mais rien à faire, je ne trouve pas. Ce qui est étrange ce que même avec cette erreur le poste est bien trouvé et affiché dans la bonne langue...
QUESAKO ?

Merci d'avoir lu mon problème.

Hugo hugorodde.com

7 réponses


Hugo
Auteur
Réponse acceptée

ALLÉLUIA !!

J'ai trouvé. Déjà j'avais oublié le "=>" après 'conditions' donc bon ça pouvait pas marcher. Ensuite il y avait une autre erreur que j'ai palliée en rajoutant "DESC" à la fin. Ce qui nous donne le jolie code suivant :

$suiv = $this->Post->find('first', array('conditions' => array('Post.id >' => $id), 'order' => 'Post.id'));
$prec = $this->Post->find('first', array('conditions'=> array('Post.id <' => $id), 'order' => 'Post.id DESC'));

Voilà Voilà. J'ai toujours mon problème d'url par contre. Mais sans avoir vu le tuto d'internationalisation ça risque d'être dur pour toi de me répondre dans l'autre sujet.

Mais merci pour ton aide amigo ;)

c'est que la table 'I18n_title' n'est pas unique : elle existe en tant qu'alias (apres un 'AS') et en tant que table réelle il faut soit que tu changes le nom de la table, soit que tu changes le nom de l'alias.

Et je vois que ta requete et une grosse jointure sur la meme table : i18n est jointe sur i18n... un certain nombre de fois et sur le meme champ, j'imagine que ce n'est pas toi qui a créé la requete puisque tu utilises cake mais je pense que tu as mal fait tes liaisons ou mal construit ton find()

Hugo
Auteur

J'ai trouvé le morceau de code à l'origine de l'erreur grâce à ton indication sur le find. Il s'agit de :

$v = $this->Post->find('neighbors', array('field' => 'Post.id', 'value' => $id));
$this->set('v',$v);

Car en enlevant ce morceau je n'ai plus d'erreur. Je vais procéder d'une autre façon pour récupérer le poste précédant et le suivant.
Mais je ne vois pas trop comment. Je suis toujours en apprentissage de cake, que j'adore d'ailleurs !

Hugo
Auteur

J'ai essayé quelque chose comme ça mais ca ne retourne rien, pas de tableau avec le debug :

$p = $this->Post->find('first',array('conditions'=> array('Post.id'=>'<='.$id)));

Une autre idée ?

c'est étrange qu'il te donne une erreur parce qu'a priori le find est bon (par rapport à la doc) apres j'ai pas suivi le tuto de l'internationalisation donc je peux pas te dire

essaye

$parent = $this->Post->find('first', array('conditions', array('Post.id <' => $id), 'limit' => 1)); // la doc est fausse sur la position du '<='
$suivant = $this->Post->find('first', array('conditions', array('Post.id >' => $id), 'limit' => 1));

c'est sans doute moins propre que neighbors (quoi que...) mais normalement tu auras ce que tu veux ,)

Hugo
Auteur

Alors ca marche.. Mais à moitié comme toujours !
Avec tes lignes :

$prec = $this->Post->find('first', array('conditions', array('Post.id <' => $id)));
                $suiv = $this->Post->find('first', array('conditions', array('Post.id >' => $id)));

J'obtiens toujours l'article $prec (J'entends par là avec "Post.id <' => $id"). Même en mettant la ligne $suiv avant la ligne $prec.

Voici le debug :

//Code :
$prec = $p'Post'];
        $suiv = $s'Post'];
        debug($prec);
        debug($suiv);
//Debug:
app/views/posts/view.ctp (line 13) //$prec
Array
(
    [id] => 11
    [title] => Coucou
    [thumbs] => welcome
    [content] => 
Contenu en français
    [date] => 2011-04-25 13:45:00
    [category_id] => 1
    [locale] => fre
)
app/views/posts/view.ctp (line 14) //$suiv
Array
(
    [id] => 11
    [title] => Coucou
    [thumbs] => welcome
    [content] => 
Contenu en français
    [date] => 2011-04-25 13:45:00
    [category_id] => 1
    [locale] => fre
)

J'avoue je suis largué :s

Merci pour ton aide :)

est ce que l'id 11 a un suivant au moins ? ^^
sinon, je vois pas pourquoi ca fait ca, essaye avec un limit 2 pour le suivant pour voir ce que ca donne