sfLexikDoctrineActAsCommentablePlugin ou comment rendre des objets commentables via un behavior / plugin

Aujourd’hui je vais vous montrer comment rendre des objets commentables grâce à un behavior Doctrine que j’ai créé, et le plugin qui permet de l’exploiter.

Le behavior donne les fonctionnalités, le plugin donne le modèle et l’affichage ainsi que les actions (listing des commentaires, formulaire d’ajout de commentaire, …)

Je me suis basé sur le behavior Doctrine Taggable fourni à l’origine pour réaliser ceci.

Le behavior et le plugin ne sont pas utilisable l’un sans l’autre.


télécharger les sources

Fourni par le behavior :

Le listener :

void postDelete(event) //supprime tous les commentaires liés lors de la suppression de l’objet les portant

Le template et ses méthodes :

void addComment(Comment) //ajoute le commentaire à l’objet

void deleteComments() //supprime tous les commentaires reliés à l’objet

Doctrine_Collection findComments(array $params, array $orders) //retourne tous les commentaires liés à l’objet, respectant les paramètres du tableau params, et classés successivement dans les ordres donnés par le tableau orders

int getNbComments() //retourne le nombre de commentaires liés à l’objet

CommentForm getCommentForm()

Fourni par le plugin :

La classe Comment :

getParent() pour récupérer l’objet porteur du commentaire

La classe CommentTable :

getCommentsFilteredQuery($params, $orders) pour récupérer une requête permettant de retrouver une collection de commentaires selon certains paramètres, et en respectant une suite d’ordres

getUnmoderatedCommentsQuery() pour récupérer une requête permettant de retrouver la collection des commentaires non modérés

getSpamCommentsQuery() pour récupérer la collection des commentaires classés spam
Le modèle de données :

Comment:
  tableName: sf_comment
 
  actAs: [Timestampable]
 
  columns:
    user_id:
      type: integer(4)
 
    #nom de l'auteur
    author_name:
      type: string(255)
      default: Anonyme
    #email de l'auter
    author_mail:
      type: string(255)
    #site web de l'auteur
    author_website:
      type: string(255)
 
    #texte du commentaire
    text:
      type: clob
 
    #id de l'objet porteur du commentaire
    parent_id:
      type: integer
    #classe de l'objet porteur du commentaire
    parent_class_name:
      type: string(255)
 
    #publié ?
    is_published:
      type: boolean
      notnull: true
      default: true
    #modéré ?
    is_moderated:
      type: boolean
      notnull: true
      default: false
    #est un spam ?
    is_spam:
      type: boolean
      notnull: true
      default: false
 
  relations:
    sfGuardUser:
      type: one
      foreignType: many
      local: user_id
      foreign: id
      foreignAlias: Comments

La technique pour relier un objet à cette table Comment est d’utiliser 2 champs spéciaux : parent_class_name et parent_id qui contiennent le nom de la classe ainsi que l’identifiant en base de l’objet porteur du commentaire.

De cette manière, on perd en partie l’aspect relationnel de la base, mais on allège énormément les requêtes de listing (derniers commentaires toutes catégories confondues, commentaires reliés à un objet, reliés à un type d’objet, …).
Comment ça marche :

télécharger les sources
Avant de commencer, il faut évidemment copié les sources du plugin dans le répertoire plugin/ de votre projet, puis :

php symfony plugin:publish-assets

Tout d’abord, il faut activer le module dans les settings, en l’ajoutant comme ceci :

all:
  .settings:
    enabled_modules: [default, sfGuardAuth, sfGuardUser, comment]

Ensuite dans le schema.yml du projet, il faut spécifier le behavior sur l’objet :

Message:
  actAs:
    Timestampable: ~
    Commentable: ~
  columns:
    …

A partir de là, on utilisera les fonctions et méthodes vues plus haut (fournies par le template).

Le plugin fournit des partials pour l’affichage par défaut, personnalisable via les noms de classes et id passables en paramètres (toutes les classes et id sont définies par défaut si pas d’options) :

Partial show_comment, paramètres :
$comment : le message à afficher
$options : les options spécifiques pour css personnalisé
show_comment_class → conteneur global
infos_class → entete (auteur, date et heure)
author_name_class → auteur
time_and_date_class → date et heure
date_class → date
time_class → heure
text_class → corps du commentaire

Partial comments_list, paramètres : (boucle sur le partial show_comment, donc passer en parametre les options pour le show_comment)
$comments : la liste des messages à afficher
$options : les options spécifiques pour css personnalisé
list_comment_class : classe de la div conteneur
list_comment_id : id de la div conteneur

Partial form_comment, paramètres :
$form : le formulaire
$action : l’action du formulaire, définie par défaut
$options : les options spécifiques pour css personnalisé
id → id du formulaire
class → classe du formulaire

Partial ajax_script, paramètres : script jquery permettant de valider le formulaire en ajax
$form : le formulaire

Partial ajax_form_comment, paramètres : le formulaire et le script ajax

Exemple d’utilisation :

  <!-- // liste des commentaires du message -->
  <?php include_partial('comment/comments_list', array('comments'=>$message->findComments(array(), array('created_at DESC')), 'options'=>array())) ?>
 
  <!-- // formulaire d'ajout de commentaire -->
  <div id="form<?php echo $message->getId() ?>">
    <h2>Postez votre commentaire :</h2>
    <?php include_partial('comment/ajax_form_comment', array('form'=>$message->getCommentForm())) ?>
  </div>

Vous aurez noté qu’on ne parle pas encore de l’administration dans ce post, dans les publications à venir je vous parlerai d’abord du backend pour les commentaires, puis de la réalisation d’un behavior étape par étape.

Partagez cet article