Bonjour,
Voila je rencontre un petit problème avec mon code, je travaille sur un projet de blog en php mvc.
Depuis 3 jours je suis bloquer sur le module de commentaire imbriqué.
j'ai suivi le tuto déjas dispo sur le site à ce sujet mais j'ai du mal a l'adapter sur ma structure model, vue et controler .
j'ai vraiment tout essayer sans succès. Si une âme charitable veut bien aider, merci par avance .
Ce que je fais
voici pour commencer mon model commentaire avec mes proccess d'ajout , de recup de commentaire :
// recupère le commentaire parent
public function addcomment($auteur, $contenu, $idEpisode, $email, $id_parent, $depth)
{
$req = 'INSERT INTO comment SET contenu = ?, parent_id = ?, episode_id = ?, depth = ?';
$this->executerRequete($req,array($contenu,$auteur, $idEpisode, $email,$id_parent, $depth));
}
// ajoute un commentaire
public function commentParent($parentId)
{
$req ='SELECT id, depth FROM comment WHERE id = ?';
$comment = $this->executerRequete($req,array($parentId));
$comment->fetch();
}
/**
* Récupère tous les commentaire organisé par ID
* @param $post_id
* @return array
*/
public function findAllById($episode_id)
{
$sql = ('SELECT * FROM comment WHERE episode_id = ?');
$comments =$this->executerRequete($sql, array($episode_id));
$comments->fetchAll();
$comments_by_id = [];
foreach ($comments as $comment) {
$comments_by_id[$comment->id] = $comment;
}
return $comments_by_id;
}
/**
* Permet de récupérer les commentaires avec les enfants
* @param $episode_id
* @param bool $unset_children Doit-t-on supprimer les commentaire qui sont des enfants des résultats ?
* @return array
*/
public function findAllWithChildren($episode_id, $unset_children = true)
{
// On a besoin de 2 variables
// comments_by_id ne sera jamais modifié alors que comments
$comments = $comments_by_id = $this->findAllById($episode_id);
foreach ($comments as $id => $comment) {
if ($comment->parent_id != 0) {
$comments_by_id[$comment->parent_id]->children[] = $comment;
if ($unset_children) {
unset($comments[$id]);
}
}
}
return $comments;
}
/**
* Récupère un commentaire
* @param $id
* @return mixed
* @throws \Exception
*/
public function find($id)
{
// On récupère le commentaire à supprimer
$sql='SELECT * FROM comment WHERE id = ?';
$comment = $this->executerRequete($sql, array($id));
$comment->fetch();
if ($comment === false) {
throw new \Exception("Ce commentaire n'existe pas");
}
return $comment;
}
/**
* Permet de supprimer un commentaire en replaçant les enfants
* @param $id
*/
public function delete($id)
{
$comment = $this->find($id);
// On supprime le commentaire
$this->executerRequete('DELETE FROM comment WHERE id = ?',array($id));
// On monte tous les enfants
$this->executerRequete('UPDATE comment SET parent_id = ?, depth = depth - 1 WHERE parent_id = ?',array($comment->parent_id, $comment->id));
}
/**
* Permet de supprimer un commentaire et ces enfants
* @param $id
* @return PDOStatement
*/
public function deleteWithChildren($id)
{
// On récupère le commentaire à supprimer
$comment = $this->find($id);
$comments = $this->findAllWithChildren($comment->episode_id, false);
$ids = $this->getChildrenIds($comments[$comment->id]);
$ids[] = $comment->id;
// On supprime le commentaire et ses enfants
return $this->executerRequete('DELETE FROM comment WHERE id IN (' . implode(',', $ids) . ')');
}
/**
* Get all chidren ids of a comment
* @param $comment
* @return array
*/
private function getChildrenIds($comment)
{
$ids = [];
foreach ($comment->children as $child) {
$ids[] = $child->id;
if (isset($child->children)) {
$ids = array_merge($ids, $this->getChildrenIds($child));
}
}
return $ids;
}
mon controleur post :
// Ajoute un commentaire sur un episode
public function commenter() {
$idEpisode = $this->requete->getParametre("id");
$auteur = $this->requete->getParametre("auteur");
$contenu = $this->requete->getParametre("contenu");
$email = $this->requete->getParametre("email");
$depth = $this->requete->getParametre("depth");
$parent_id = $this->requete->getParametre("parent_id");
if (isset($_POST['content']) && !empty($_POST['content'])) {
$parent_id = isset($_POST['parent_id']) ? $_POST['parent_id'] : 0;
$depth = 0;
$comment = $this->commentaire->commentParent($parent_id);
if ($comment == false) {
throw new Exception('Ce parent n\'existe pas');
}
$depth = $comment->depth + 1;
}
if($depth >= 3){
echo 'Vous ne pouvez pas répondre à une réponse d\'une réponse ';
} else {
$this->commentaire->addcomment($auteur, $contenu, $email,$idEpisode, $parent_id, $depth);
}
// Exécution de l'action par défaut pour réafficher la liste des episodes
$this->executerAction("index");
}
ma vue :
<?php $this->titre = "Blog de l'écrivain - " . $this->nettoyer($episode['titre']); ?>
</div>
<div class="parallax-container">
<div class="parallax">
<img src="Web/img/post.png" alt="<?= $this->nettoyer($episode['titre'])?>"/>
</div>
</div>
<div class="container">
<article>
<header>
<h1 class="titreEpisode"><?= $this->nettoyer($episode['titre']) ?></h1>
<time><?= $this->nettoyer($episode['date'] )?></time>
</header>
<p><?=$episode['contenu']?></p>
</article>
<hr />
<header>
<h1 id="titreReponses">Réponses à <?= $this->nettoyer($episode['titre']) ?></h1>
</header>
<?php foreach ($commentaires as $commentaire): ?>
<?php require('comment.php'); ?>
<?php endforeach; ?>
<hr />
<form action="episode/commenter" id="form-comment" method="post">
<div class="row">
<input type="hidden" name="parent_id" value="0" id="parent_id">
<input type="hidden" name="episode_id" value="1" id="episode_id">
<input type="hidden" name="id" value="<?= $this->nettoyer($episode['id'] )?>" />
<h4>Poster un commentaire</h4>
<div class="input-field col s12">
<textarea name="contenu" id="contenu" class="form-control" placeholder="Votre commentaire" required></textarea>
</div>
<div class="input-field col s12 m6">
<input id="auteur" name="auteur" type="text"
required /><br />
<label for="pseudo">Pseudo</label>
</div>
<div class="input-field col s12 m6">
<input type="email" name="email" id="email" required/>
<label for="email">Adresse email</label>
</div>
<div class="col s12">
<button type="submit" name="submit" class="btn waves-effect" value="commenter">
Commenter cette episode
</button>
</div>
</form>
</div>
</div>
Ce que je veux
je voudrais afficher en dessous de chaque poste, les commentaires liées au poste en question et avoir la possibiliter de repondre au commentaire avec une profondeur de 3 pour l'imbrication, j'utilise le js qui est fourni dans le tuto imbrication de commentaire aussi, mais il se passe rien .
Ce que j'obtiens
donc sur le rendu, j'ai mon post avec le formulaire d'ajout de commentaire, mais les commentaires ne s'affiche pas et l'ajout de commentaire ne fonctionne pas, il me dit que le paramètre depth n'est pas défini et Paramètre 'parent_id' absent de la requête.
j'ai fait des tas de modif mais sans succès, d'autant plus que je suis q'un simple petit dev.
merci encore.