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 :
$message->findComments(array(), array('created_at DESC')), 'options'=>array())) ?>
Postez votre commentaire :
$message->getCommentForm())) ?>
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.