Bonjour à tous,
Je suis de nouveau bloqué dans dans mon projet.
J'ai suivi le tuto sur l'internationalisation, mais je suis bloqué.
Lorsque je fais un find all sur ma vue d'admin index, et bien je n'ai pas exactement les mêmes champs que ceux visibles dans le tuto, mais surtout, je n'ai que la langue locale qui est dispo dans mes datas.
Voici l'info que je récupère
array(
(int) 0 => array(
'Page' => array(
'id' => '1',
'meta_key' => '',
'meta_desc' => '',
'name' => '',
'slug' => 'mon-titre-fr',
'content' => '',
'created' => '2014-11-20 23:09:37',
'online' => '0',
'user_id' => '2',
'category_id' => '28',
'draft' => '0',
'acl' => '2',
'locale' => 'fra'
),
(int) 0 => array(
'Page __i18n__ name' => 'Mon titre fr'
),
'Category' => array(
'id' => '28',
'name' => 'Categorie de test'
)
)
)
Pourtant la version eng est bien inscrite dans ma table i18n
j'ai l'impression que mon mon controller n'est pas bon, et qu'il va chercher l'info dans le Controller Page au lieu d'aller la chercher dans i18n
Voici mon controller
public function backoffice_index() {
$this->loadModel("Category");
$d'pages'] = $this->Page->find("all",array(
//"fields"=>array("Page.id","Page.name","Page.online","Page.category_id"),
"order"=>"Page.category_id DESC",
"contain"=>array("Category"=>array(
"fields"=>array("id","name")
))
));
$d'categories'] = $this->Category->generateTreeList(null, null, null, ' - ');
//debug($d);
$this->set($d);
//debug($this->request);
}
Est-ce normal et du coup je peux poursuivre le tuto? Ou bien est-ce que je vais dans le mur et sans freiner !! :)
Merci pour votre aide
Fabien
C'est bon !!! j'y suis arrivé
Bon j'ai fait du code pas très propre, mais du moment que ca fonctionne.
J'arrive bien a récupérer mes traductions des models liés.
Voici mon controller edit
public function backoffice_edit($id = null) {
// on vérifie si on est dans un article existant ou s'il s'agit d'un nouvel article
//debug($this->request->data);
//$this->Page->Section->recursive = 2;
$this->loadModel("Category");
$this->loadModel("Section");
$this->loadModel("Block");
$this->Page->locale = Configure::read("Config.languages");
$this->Section->Block->locale = Configure::read("Config.languages");
$this->Section->locale = Configure::read("Config.languages");
if (!empty($this->request->data)) {
$this->request->data'Page']'draft'] = 0;
//debug($this->request->data);
//die();
foreach ($this->request->data'Section'] as $k => $v) {
//$this->request->data'Section'][0]'Block']$k]"draft"] = 0;
$this->request->data'Section']$k]"draft"] = 0;
foreach ($v as $r => $s) {
//debug($s);
if (is_array($s)) {
foreach ($s as $m => $n) {
$this->request->data'Section']$k]'Block']$m]"draft"] = 0;
}
}
}
}
//debug($this->request->data);
//die();
$this->Page->saveAssociated($this->request->data, array("deep" => true));
$this->Session->setFlash("Le contenu a été modifié avec succès", 'notif');
$this->redirect(array("controller" => "pages", "action" => "index"));
}
if (!$id) {
// si aucun id n'est définit on récupère un enregistrement bidon
$id = $this->Page->getDraftId(array("user_id" => 2));
//debug($id);
$this->backoffice_add_section($id); // on crée une section
$section = $this->Section->find("first", array(
"fields" => "Section.id",
"conditions" => array(
"Section.page_id" => $id,
"Section.draft" => 1
)
));
//debug($section'Section']'id']);
$this->backoffice_add_block($section'Section']'id'], $id); // on crée un block
}
//$d'categories'] = $this->Category->find("list");
$d'categories'] = $this->Category->generateTreeList(null, null, null, ' - ');
// on va aller vérifier toutes les sections qui existent
$this->data = current($this->Page->find("all", array(
"conditions" => array(
"Page.id" => $id
),
"contain" => array(
"Section" => array(
'Block' => array(
//"fields" => array('Block.id')
)
))
)));
foreach ($this->request->data'Section'] as $k => $v) {
//$this->request->data'Section'][0]'Block']$k]"draft"] = 0;
$this->request->data'Section']$k]"draft"] = 0;
foreach ($v as $r => $s) {
//debug($s);
if (is_array($s)) {
foreach ($s as $m => $n) {
$this->request->data'Section']$k]'Block']$m] = $this->Section->Block->find("first", array(
"conditions" => array(
"Block.id" => $this->request->data'Section']$k]'Block']$m]'id']
)
));
}
}
}
}
$this->data = $this->formatAll($this->data);
$this->set($d);
}
avec une fonction pour formater les datas et c'est goooooodddd !!!! (ma fonction formatAll() n'est pas optimisée, mais bon, pour le moment elle fera l'affaire.
public function formatAll($datas) {
debug($datas);
$array = array();
$explod = array();
$explodBlock = array();
// on inscrit les données par défaut
$array'Page']'id'] = $datas'Page']'id'];
$array'Page']'created'] = $datas'Page']'created'];
$array'Page']'online'] = $datas'Page']'online'];
$array'Page']'user_id'] = $datas'Page']'user_id'];
$array'Page']'category_id'] = $datas'Page']'category_id'];
$array'Page']'draft'] = $datas'Page']'draft'];
$array'Page']'acl'] = $datas'Page']'acl'];
$array'Page']'locale'] = $datas'Page']'locale'];
// on récupère le tableau
foreach ($datas as $k => $v) {
if ($k === 0) { // on récupère la traduction du model Page
// on découpe nos trad
if (is_array($v)) {
foreach ($v as $model => $trad) {
$explod = explode("__", $model);
$array'Page']$explod[2]]$explod[3]] = $trad;
}
}
}
if ($k === "Section") {
foreach ($v as $dat => $cont) {
foreach ($cont as $lab => $don) {
//debug($don);
if (is_array($don)) {
//debug($don);
foreach ($don as $n => $m) {
//debug($n);
foreach ($m as $key => $val) {
if (is_numeric($key)) {
//debug($val);
foreach ($val as $mod => $dats) {
$explodBlock = explode("__", $mod);
$array'Section']$dat]'Block']$n]$explodBlock[2]]$explodBlock[3]] = $dats;
$array'Section']$dat]'id'] = $datas'Section']$dat]'id'];
$array'Section']$dat]'background'] = $datas'Section']$dat]'background'];
$array'Section']$dat]'page_id'] = $datas'Section']$dat]'page_id'];
$array'Section']$dat]'sectionorder'] = $datas'Section']$dat]'sectionorder'];
$array'Section']$dat]'draft'] = $datas'Section']$dat]'draft'];
$array'Section']$dat]'Block']$n]'background'] = $datas'Section']$dat]'Block']$n]'Block']'background'];
$array'Section']$dat]'Block']$n]'id'] = $datas'Section']$dat]'Block']$n]'Block']'id'];
$array'Section']$dat]'Block']$n]'section_id'] = $datas'Section']$dat]'Block']$n]'Block']'section_id'];
$array'Section']$dat]'Block']$n]'blockorder'] = $datas'Section']$dat]'Block']$n]'Block']'blockorder'];
$array'Section']$dat]'Block']$n]'draft'] = $datas'Section']$dat]'Block']$n]'Block']'draft'];
$array'Section']$dat]'Block']$n]'locale'] = $datas'Section']$dat]'Block']$n]'Block']'locale'];
}
}
}
}
}
}
}
}
}
//debug($explodBlock);
debug($array);
// on boucle sur les données et on repère les traductions
return $array;
}
Suffisait juste que je me casse un peu la tête ! :)
Alors le souci continu lorsque je suis dans la vue d'édition.
Je n'arrive pas à avoir les locales pour les models liés via "contain"
Voici le résultat dans ma vue d'édition
array(
'Page' => array(
'id' => '1',
'meta_key' => '',
'meta_desc' => '',
'name' => 'titre fr qui va bien',
'slug' => 'titre-fr-qui-va-bien',
'content' => '',
'created' => '2014-11-21 14:33:53',
'online' => '0',
'user_id' => '2',
'category_id' => '27',
'draft' => '0',
'acl' => '2',
'locale' => 'fra'
),
(int) 0 => array(
'Page __i18n__ name_fra' => 'titre fr qui va bien',
'Page __i18n__ name_eng' => 'title uk'
),
'Section' => array(
(int) 0 => array(
'id' => '1',
'background' => '',
'page_id' => '1',
'sectionorder' => '0',
'draft' => '0',
'Block' => array(
(int) 0 => array(
'id' => '1',
'cols' => '12',
'offset' => '0',
'background' => '',
'content' => '<p>contenu fr</p>
',
'section_id' => '1',
'blockorder' => '1',
'draft' => '0'
)
)
)
)
)
Voici ma fonction edit
public function backoffice_edit($id = null) {
// on vérifie si on est dans un article existant ou s'il s'agit d'un nouvel article
$this->loadModel("Category");
$this->Page->locale = Configure::read("Config.languages");
if (!empty($this->request->data)) {
$this->request->data'Page']'draft'] = 0;
//debug($this->request->data);
//die();
foreach ($this->request->data'Section'] as $k => $v) {
//$this->request->data'Section'][0]'Block']$k]"draft"] = 0;
$this->request->data'Section']$k]"draft"] = 0;
foreach ($v as $r => $s) {
//debug($s);
if (is_array($s)) {
foreach ($s as $m => $n) {
$this->request->data'Section']$k]'Block']$m]"draft"] = 0;
}
}
}
}
//debug($this->request->data);
//die();
$this->Page->saveAssociated($this->request->data, array("deep" => true));
$this->Session->setFlash("Le contenu a été modifié avec succès", 'notif');
$this->redirect(array("controller"=>"pages","action"=>"index"));
}
if (!$id) {
// si aucun id n'est définit on récupère un enregistrement bidon
$id = $this->Page->getDraftId(array("user_id" => 2));
//debug($id);
$this->backoffice_add_section($id); // on crée une section
$section = $this->Section->find("first",array(
"fields"=>"Section.id",
"conditions"=>array(
"Section.page_id"=>$id,
"Section.draft"=>1
)
));
//debug($section'Section']'id']);
$this->backoffice_add_block($section'Section']'id'], $id); // on crée un block
}
//$d'categories'] = $this->Category->find("list");
$d'categories'] = $this->Category->generateTreeList(null, null, null, ' - ');
$this->set($d);
// on va aller vérifier toutes les sections qui existent
$this->request->data = current($this->Page->find("all", array(
"conditions" => array(
"Page.id" => $id
),
"contain" => array(
"Section" => array(
'Block' => array(
"conditions" => array(
//"Block.draft"=>0
)
)
))
)));
//debug($this->data);
}
Ce qui est plus frustrant, c'est que j'inscris bien mes contenus traduits avec la bonne locale dans la table i18n.
Mais impossible de récupérer correctement ces datas dans ma vue d'édition.
D'ailleurs, dans mon model post, d'après la doc de cake, j'ai la possibilité de nommer mon champ à traduire comme bon me semble.
si je fais ça :
public $actsAs = array(
"Translate"=>array(
"name"=>"_name"
),
'Media.Media' => array(
"extensions" => array('jpg', 'png', 'pdf', 'gif'),
"path" => "/uploads/%y-%m/%f"
),
"Draft.Draft" => array(
"conditions" => array("draft" => 1)
)
);
j'ai mes traductions qui apparaissent dans un tableau indexé
(int) 0 => array(
'Page __i18n__ name_fra' => 'titre fr qui va bien',
'Page __i18n__ name_eng' => 'title uk'
)
Si je change mon model pour quelque chose comme ça
"Translate"=>array(
"name"=>"name_tranlate"
),
et bien je n'ai plus mon tableau de valeurs juste au dessus.
Du coup je ne sais vraiment pas quoi faire.
Si vous avez une idée, je suis vraiment preneur sur ce coup ci !
Fabien