Si le module commentaire (comment
) n'est pas encore installé dans notre projet nous l'installons :
php framework/bin/change.php install-module comment-3.5.3 == Install module comment-3.5.3 == Check dependencies integrity == Update project dependencies == Update Checked successfully. Execute: compile-all ... Execute: generate-database ... Execute: import-init-data comment... Execute: init-patch-db modules_comment... Execute: init-webapp ... => Install OK
Nous partons sur la base de notre module recipes
et nous lui ajoutons la possibilité de définir des commentaires sur les recettes. Nous utiliserons la commande comment.implement-on-document
:
php framework/bin/change.php comment.implement-on-document -h Comment.implement-on-document: implement comments on a document model. Usage: change.php comment.implement-on-document <moduleName> <documentName>
Ajout des commentaires :
php framework/bin/change.php comment.implement-on-document recipes recipe == Implement comments on a document model == Generating <path>/modules/recipes/lib/blocks/BlockCommentsOnRecipeAction.class.php Add modules_recipes_commentsonrecipe in <path>/modules/recipes/config/blocks.xml. Add commentsonrecipe locale in m.recipes.bo.blocks.commentsonrecipe package. <path>/modules/recipes/config/actions.xml altered with new handler Recompile locales for module recipes. == Clear webapp cache == Webapp cache directory cleared == Clear template cache == Template cache directory cleared => Block 'CommentsOnrecipe' added in module 'recipes' and ready to use. To specialize rendering, add the following templates: * 'modules/recipes/templates/Recipes-Block-Success.all.all.html': for the comment list and form. * 'modules/recipes/templates/Recipes-Block-Save.all.all.html': for the confirmation screen. * 'modules/recipes/templates/Recipes-Block-Backoffice.all.all.html': for the backoffice view. Default templates are placed in 'modules/comment/templates/Comment-Block-CommentBase-<view>.all.all.html'.
Aucun nouveau template de block n'a été ajouté au module recipes
, les templates sont ceux définis dans le module comment
; pour les spécialiser pour notre module il suffirait de les y copier.
On constate également dans le fichier config/blocks.xml
qu'un nouveau bloc a été ajouté. Nous allons changer la valeur par défaut du paramètre showRatingDistribution
:
<?xml version="1.0" encoding="utf-8"?> <blocks> <block type="modules_recipes_Recipelist" icon="list-block"> <parameters> <parameter name="nbRecipesPerPage" type="Integer" default-value="10"> <constraints>min:1;max:100</constraints> </parameter> </parameters> </block> <block type="modules_recipes_Recipe" icon=""/> <block type="modules_recipes_CommentsOnRecipe" icon="comments"> <parameters> <parameter name="nbitemperpage" type="Integer" default-value="25"/> <parameter name="allowNotRegistered" type="Boolean" default-value="true"/> <parameter name="enableRating" type="Boolean" default-value="true"/> <parameter name="showRatingDistribution" type="Boolean" default-value="false"/> <parameter name="displaySortOptions" type="Boolean" default-value="true"/> <parameter name="enableEvaluation" type="Boolean" default-value="true"/> <parameter name="showgravatars" type="Boolean" default-value="false"/> </parameters> </block> </blocks>
On va donc éditer la clef de locales correspondante dans le fichier i18n/bo/blocks/commentsonrecipe/*.xml
pour y mettre une valeur convenable. Ce qui donne pour le fichier français :
<?xml version="1.0" encoding="utf-8"?> <i18n baseKey="m.recipes.bo.blocks.commentsonrecipe" lcid="fr_FR"> <include id="m.comment.bo.blocks.commentbase"/> <key id="title">Commenter une recette</key> </i18n>
Pour ajouter le bloc de détail on se rend en back office, on édite la page de détail et on insère le bloc de commentaire. Le bloc de commentaire est à chercher dans le sous menu correspondant à notre module recipes
. Il ne reste plus qu'à configurer le bloc.
L'élément qui va nous interresser au niveau de l'objet recipe
par rapport aux commentaires est sa note moyenne. Nous allons donc implémenter de nouvelles méthodes dans la classe finale de l'objet recipe
. Nous ajoutons le code suivant:
/** * This method will check if recipe has any rating or not. * Rating is provided by module comment. If module isn't installed method returns FALSE * @return boolean */ public function hasRating() { if (ModuleService::getInstance()->moduleExists('comment') && comment_CommentService::getInstance()->getRatingCountByTargetId($this->getId()) > 0) { return true; } return false; } /** * This method will get recipe's rating average. * Rating is provided by module comment. If module isn't installed method returns 0 * @return Double */ public function getRating() { if (ModuleService::getInstance()->moduleExists('comment')) { return comment_CommentService::getInstance()->getRatingAverageByTargetId($this->getId()); } return 0; }de manière à récupérer la noteNous pouvons intégrer les commentaires dans la liste des recettes par l'intermédiaire des notes dans les commentaires
Nous pouvons intégrer les commentaires dans la liste des recettes en insérant la note de chacune des recettes à côté de leur titre. Pour cela nous allons modifier le template templates/Recipes-Block-Recipelist-Success.all.all.html
comme suit :
... <ol class="document-list"> <tal:block tal:repeat="recipe recipes"> <li class="${php: repeat.recipe.odd ? 'odd' : 'even'}"> <h3 change:h=""> <img tal:condition="recipe/getVegetarian" src="/media/frontoffice/vegetarian.png" change:i18nattr="title m.recipes.fo.vegetarian; alt m.recipes.fo.vegetarian;"/> <a change:link="document recipe">${recipe/getLabelAsHtml}</a> <tal:block tal:condition="recipe/hasRating" change:starrating="" displayOnly="true" value="${recipe/getRating}" small="true" /> </h3> ...
Nous allons intégrer dans le bloc du détail de la recette le bloc récapitulatif du détail des notes de la recette ainsi que la note moyenne au niveau du titre de la recette. Nous modifions donc le code de notre template templates/Recipes-Block-Recipe-Success.all.all.html
comme suit :
... <h2 change:h="">${recipe/getLabelAsHtml} <tal:block tal:condition="recipe/hasRating" change:starrating="" displayOnly="true" value="${recipe/getRating}" small="true" /></h2> <div> <div class="recipe-detail-info-pic" tal:condition="recipe/getPicture"> <img change:media="document recipe/getPicture; format 'modules.recipes.frontoffice/recipe'; zoom 'true'" /> </div> <div tal:condition="recipe/hasRating" class="recipe-rating"> <tal:block change:block="" inheritedParams="cmpref,filter,sort" module="comment" name="ratingdistribution" /> </div> ...