Salut à tous,
je sais que le titre est bizarre mais c'est pourtant ce que j'observe.
Je suis en train de tester plus en détails CakePHP en créant un blog et je rencontre un problème au niveau des commentaires...
J'ai créé une fonction afterFind dans mon modèle Comment.php qui permet de récupérer les commentaires parents et enfants liés à un article.
Dans le même temps, j'ai mis en place le counterCache afin de récupérer plus facilement le nombre de commentaires associés à un article.
Le problème se situe donc lors de l'ajout d'un commentaire : le formulaire d'envoi "mouline" et lorsque je regarde au niveau de l'inspecteur, je reçois un code 200 mais j'ai une erreur comme quoi, il ne me trouve pas l'index 'Comment' dans la fonction afterFind.
Par contre, si je vire le counterCache, tout se passe sans problème...
Voici mon modèle Comment.php avec la fonction afterFind
public $belongsTo = array('Post' => array(
'counterCache' => true)
);
public function afterFind($data, $primary = false){
$replies = [];
foreach($data as $k => $d){
if($d['Comment']['parent_id']){
$replies[$d['Comment']['parent_id']][] = $d;
unset($data[$k]);
}
}
foreach ($data as $k => $d) {
if(isset($replies[$d['Comment']['id']])){
$data[$k]['Comment']['replies'] = array_reverse($replies[$d['Comment']['id']]);
}else{
$data[$k]['Comment']['replies'] = [];
}
}
return $data;
}
Comme ceci par exemple :
class Comment extends AppModel {
public $belongsTo = array(
'Parent' => array(
'className' => 'Comment',
'foreignKey' => 'parent_id'
)
);
public $hasMany = array(
'Children' => array(
'className' => 'Comment',
'foreignKey' => 'parent_id',
'dependent' => false
)
);
}
Source : Plusieurs relations avec le même model.
Bonjour.
Pour commencer, le premier paramètre passé dans le beforeFind est censé être $results et non $data.
Ensuite, s'il ne détecte pas l'index Comment, c'est peut-être parce que tu ne le lui fournit pas lors de la sauvegarde d'un commentaire.
Vérifies donc bien que tu n'échappes l'index lorsque tu envoies les données dans ta requête.
Si tu ne comprends pas trop ce que je veux dire, montres nous ton code de la fonction (ou des fonctions) correspondant à l'ajout et à la modification des commentaires.
Dernière chose, es-tu sûr d'avoir bien créé un champ comment_count dans ta table liée au modèle Post ?
Salut Lartak11,
j'ai changé $data par $results dans le afterFind mais pas de changements lors de la sauvegarde.
Je te mets le code de ma fonction qui correspond à l'ajout de mon commentaire car je ne comprends pas ce que tu veux dire par "échapper l'index" :
public function addComment($post_id){
$this->autoRender = false;
if($this->request->is('post') && $this->request->is('ajax')){
$this->Comment->set($this->request->data);
if($this->Comment->validates()){
$this->Comment->save($this->request->data);
$success = array('success' => array('messageFlash' => "Votre commentaire a bien été posté"));
$success = json_encode($success);
echo $success;
} else{
$errors = array('errors' => $this->validateErrors($this->Comment));
$errors = json_encode($errors);
echo $errors;
}
}
}
Pour info, quand je fais un debug de $this->request->data, j'obtiens ceci :
array(
'Comment' => array(
'username' => 'aze',
'email' => 'aze@aze.ae',
'content' => 'azeazea azezae zae zae ',
'post_id' => '3',
'parent_id' => '0'
)
)
Par ailleurs, j'ai bien un champ comment_count dans ma table et celui ci s'incrémente bien à chaque sauvegarde...
J'ai oublié de préciser que l'enregistrement en table se faisait bien, à la fois au niveau du counterCache qu'au niveau des données transmises par le formulaire...
Juste une question, pourquoi au lieu de faire un afterFind , tu ne fais tout simplement pas l'utilisation des alias dans les associations ?
Un alias pour les commentaires sans parent que tu pourrais nommer Parent et un alias pour les commentaires dépendants d'un parent, que tu pourrais nommer Children ou selon ton code afterFind : Replies (par exemple).
De cette manière, dans ton find tu fais un contain sur Parent et Children (ou Replies).
Car à mon avis, c'est le code de ton afterFind qui pose un problème pour le counterCache.
C'est une idée, mais je ne vois pas du tout comment tu fais un truc pareil ^^
Tu as des liens vers des infos pour que je jete un oeil ?
Merci pour la précision.
Je teste ça et je te tiens au courant ;)
Edit : Au final, tout marche parfaitement !
Marci à toi Lartak11