Dernière mise à jour : 19/08/2016 à 17h19
Table des matières
Introduction
Dans ce tutoriel je vais pouvoir vous expliquer comment personnaliser votre petit module HomeCustom. En effet, il est toujours plus agréable d'avoir une page d'accueil qui reprend les diverses activité de votre site :
- Les dernières news,
- Les derniers articles,
- Et enfin les prochains événements à venir.
En somme visuellement pour faire un petit schéma récapitulatif voici à quoi ressemblera votre page d'Accueil :
Votre page d'accueil |
Vos 3 derniers Articles |
Article 3 |
Article 2 |
Article 1 |
Vos 3 dernières News |
News 3 |
News 2 |
News 1 |
Vos 3 prochains Evénements |
Evénement 1 |
Evénement 2 |
Evénement 3 |
Alors pour ce faire, il faudra modifier 2 fichiers (HomeCustomHomePageExtensionPoint.class.php et home.tpl) et créer 3 fichiers (articles.tpl, news.tpl et events.tpl).
Modification des fichiers
Dans un premier je vous propose de modifier d'abord le HomeCustomHomePageExtensionPoint.class.php puis le fichier home.tpl.
HomeCustomHomePageExtensionPoint.class.php
Ici nous accorderons une grande partie du tutoriel car c'est la partie la plus technique. C'est ici que nous coderons en PHP & MySQL, nous irons chercher toutes les informations dont nous avons besoin dans la Base De Donnée (BDD).
Ce que vous avez
Voici le code que contient ce fichier :
Code PHP :
<?php /*################################################## * HomeCustomHomePageExtensionPoint.class.php * ------------------- * begin : August 25, 2012 * copyright : (C) 2012 Kevin MASSY * email : kevin.massy@phpboost.com * * ################################################### * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ###################################################*/ class HomeCustomHomePageExtensionPoint implements HomePageExtensionPoint { private $template; public function get_home_page() { return new DefaultHomePage($this->get_title(), $this->get_view()); } private function get_title() { return LangLoader::get_message('title', 'common', 'HomeCustom'); } private function get_view() { $this->template = new FileTemplate('HomeCustom/home.tpl'); return $this->template; } } ?>
Le nouveau code
Code PHP :
<?php /*################################################## * HomeCustomHomePageExtensionPoint.class.php * ------------------- * begin : August 25, 2012 * copyright : (C) 2012 Kevin MASSY * email : kevin.massy@phpboost.com * * ################################################### * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ###################################################*/ class HomeCustomHomePageExtensionPoint implements HomePageExtensionPoint { private $template; public function get_home_page() { $columns_disabled = Environment::get_graphical_environment()->get_columns_disabled(); $columns_disabled->set_disable_left_columns(false); //passer à "true" pour désactiver $columns_disabled->set_disable_right_columns(false); $columns_disabled->set_disable_top_central(false); $columns_disabled->set_disable_bottom_central(false); return new DefaultHomePage($this->get_title(), $this->get_view()); } private function get_title() { return LangLoader::get_message('title', 'common', 'HomeCustom'); } private function get_view() { $this->template = new FileTemplate('HomeCustom/home.tpl'); $this->build_view(); return $this->template; } private function build_view() { // ici on définit la date en Français // for the French date setlocale(LC_ALL, 'french', 'fr_FR.UTF8', 'fr.UTF8', 'fr_FR.UTF-8', 'fr.UTF-8', 'fr_FR'); $this->build_articles_view($this->articles_results()); $this->build_news_view($this->news_results()); $this->build_events_view($this->events_results()); } private function articles_results() { $now = new Date(); $querier = PersistenceContext::get_querier(); $results = $querier->select('SELECT articles.*, member.*, com.number_comments, notes.average_notes, notes.number_notes, note.note, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'articles articles LEFT JOIN ' . PREFIX . 'articles_cats cat ON cat.id = articles.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = articles.author_user_id LEFT JOIN ' . DB_TABLE_COMMENTS_TOPIC . ' com ON com.id_in_module = articles.id AND com.module_id = \'articles\' LEFT JOIN ' . DB_TABLE_AVERAGE_NOTES . ' notes ON notes.id_in_module = articles.id AND notes.module_name = \'articles\' LEFT JOIN ' . DB_TABLE_NOTE . ' note ON note.id_in_module = articles.id AND note.module_name = \'articles\' AND note.user_id = :user_id AND (published = 1 OR (published = 2 AND publishing_start_date < :timestamp_now AND (publishing_end_date > :timestamp_now OR publishing_end_date = 0))) ORDER BY articles.date_created DESC LIMIT 3', array( 'user_id' => AppContext::get_current_user()->get_id(), 'timestamp_now' => $now->get_timestamp() )); /* SELECT = On selectionne tous les champs liés aux articles FROM = Dans quelles entités sont issues les champs LEFT JOIN = On fait les jointure afin de dire que les clefs primaire sont identiques AND = On fait bien attention a récupérer un article qui a été publié avec autorisation ou différé après heure ODRDER BY = On classe les articles par la date de création et par ordre décroissant (DESC, le plus récent en premier et le plus ancien en dernier) LIMIT = On récupère uniquement les 3 derniers articles */ return $results; } private function news_results() { $now = new Date(); $querier = PersistenceContext::get_querier(); $results = $querier->select('SELECT news.*, member.*, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'news news LEFT JOIN ' . PREFIX . 'news_cats cat ON cat.id = news.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = news.author_user_id AND (approbation_type = 1 OR (approbation_type = 2 AND start_date < :timestamp_now AND (end_date > :timestamp_now OR end_date = 0))) ORDER BY news.creation_date DESC LIMIT 3', array( 'timestamp_now' => $now->get_timestamp() )); /* SELECT = On selectionne tous les champs liés aux news FROM = Dans quelles entités sont issues les champs LEFT JOIN = On fait la jointure afin de dire que les clefs primaire sont identiques AND = On fait bien attention a récupérer une news qui a été publiée avec autorisation ou différé après heure. ODRDER BY = On classe les news par la date de création et par ordre décroissant (DESC, le plus récent en premier et le plus ancien en dernier) LIMIT = On récupère uniquement les 3 dernières news. */ return $results; } private function events_results() { $now = new Date(); $today = strtotime(date("Y-m-d", $now->get_timestamp())); $querier = PersistenceContext::get_querier(); $results = $querier->select('SELECT * FROM '. PREFIX . 'calendar_events event LEFT JOIN ' . PREFIX . 'calendar_events_content event_content ON event_content.id = event.content_id LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = event_content.author_id LEFT JOIN '. PREFIX . 'calendar_cats cat ON cat.id = event_content.id_category WHERE approved = 1 AND start_date >= :timestamp_now ORDER BY start_date LIMIT 3 ', array( 'timestamp_now' => $today )); /* SELECT = On selectionne tous les champs liés aux événements FROM = Dans quelles entités sont issues les champs LEFT JOIN = On fait la jointure afin de dire que les clefs primaire sont identiques WHERE On fait bien attention a récupérer un événement qui a été publié AND = On récupère uniquement un prochain événement (les événements passés on ne les veut pas) ODRDER BY = On classe les événements par date de début par ordre chronologique (ASC, inutile de le préciser, on précise uniquement le DESC) LIMIT = On récupère uniquement les 3 prochains événements */ return $results; } private function build_articles_view(SelectQueryResult $results) { // ici les résultats seront envoyés dans articles.tpl // results send in articles.tpl $tpl = new FileTemplate('HomeCustom/articles.tpl'); while($row = $results->fetch()) { $article = new Article(); $article->set_properties($row); $tpl->assign_block_vars('articles_items', $article->get_tpl_vars()); // create a new custom TPL variable made with the help of $article // ici on créeait une nouvelle variable personnalisée avec l'aide de $article $tpl->put_all(array( 'DATE_DAY' => strftime('%d', $article->get_date_created()->get_timestamp()), 'DATE_MONTH_A' => strftime('%b', $article->get_date_created()->get_timestamp()), )); } // ici c'est pour "pousser" articles.tpl via # INCLUDE ARTICLES # dans le home.tpl // "push" articles.tpl with # INCLUDE ARTICLES # in home.tpl $this->template->put('ARTICLES', $tpl); } private function build_news_view(SelectQueryResult $results) { // ici les résultats seront envoyés dans news.tpl // results send in news.tpl $tpl = new FileTemplate('HomeCustom/news.tpl'); while ($row = $results->fetch()) { $news = new News(); $news->set_properties($row); $tpl->assign_block_vars('news_items', $news->get_array_tpl_vars()); } // ici c'est pour "pousser" news.tpl via # INCLUDE NEWS # dans le home.tpl // "push" news.tpl with # INCLUDE NEWS # in home.tpl $this->template->put('NEWS', $tpl); } private function build_events_view(SelectQueryResult $results) { // ici les résultats seront envoyés dans events.tpl // results send in events.tpl $tpl = new FileTemplate('HomeCustom/events.tpl'); foreach ($results as $row) { // si "rewrited_name" est vide c'est que c'est la categorie racine (root) // if "rewrited_name" is empty it's root category (root) $row['rewrited_name'] = !empty($row['id_category']) ? $row['rewrited_name_cat'] : 'root'; // je me prend pas la tête j'utilise le builder du module calendar, comme ça je suis sure que le lien généré sera correcte. // using the "CalendarUrlBuilder" to build link $link = CalendarUrlBuilder::display_event($row['id_category'], $row['rewrited_name'], $row['id_event'], $row['rewrited_title']); // ici sa boucle et on fait correspondre le tableau extrait de la BDD avec des variables TPL // here is the loop to correspond the row in database with the right TPL variable $tpl->assign_block_vars('events_items', array( 'U_LINK' => $link->absolute(), 'TITLE' => $row['title'], 'CONTENTS' => $row['contents'], 'PSEUDO' => $row['login'], 'LOCATION' => $row['location'], 'LAST_DATE' => strftime('%d/%m/%Y', $row['last_registration_date']), 'MAX_MEMBER' => $row['max_registered_members'], 'START_DATE' => strftime('%d/%m/%Y', $row['start_date']), 'END_DATE' => strftime('%d/%m/%Y', $row['end_date']), 'CAT' => $row['name'], 'START_DATE_FULL' => strftime('%d %B %Y', $row['start_date']), // date de début jour // start date of day 'START_DATE_DAY_FULL' => strftime('%A', $row['start_date']), 'START_DATE_DAY_SHORT' => strftime('%a', $row['start_date']), 'START_DATE_DAY_FIGURE' => strftime('%d', $row['start_date']), // date de début mois // start date of month 'START_DATE_MONTH_FULL' => strftime('%B', $row['start_date']), 'START_DATE_MONTH_SHORT' => strftime('%b', $row['start_date']), 'START_DATE_MONTH_FIGURE' => strftime('%m', $row['start_date']), // date de début année // start date of year 'START_DATE_YEAR_FULL' => gmdate_format('%Y', $row['start_date']), 'START_DATE_YEAR_SHORT' => gmdate_format('%y', $row['start_date']), )); } // ici c'est pour "pousser" events.tpl via # INCLUDE EVENTS # dans le home.tpl // "push" events.tpl with # INCLUDE EVENTS # in home.tpl $this->template->put('EVENTS', $tpl); } } ?>
home.tpl
Ensuite il nous faut de modifier le home.tpl parce que c'est bien beau d'avoir un fichier PHP bien remplis mais si on n'utilise pas ses variables il nous sert strictement à rien.
Ce que vous avez
Non ! Quand même je ne vais pas vous dire ce que vous avez, votre fichier est quasiment vide ! Ce serait vous manquer de respect tout ça, le plus simple et de tout supprimer !
Le nouveau code
Ah je vous avez prévenu le code est très basique, en d'autre terme il est horriblement moche ! Mais il fonctionne je vous le garanti, libre à votre imagination de le rendre plus esthétique.
Code TPL :
<div class="center"><h1>Votre Page d'accueil</h1></div> <br/> <div class="center"><h2>Les 3 derniers articles</h2></div> # INCLUDE ARTICLES # <div class="center"><h2>Les 3 dernières news</h2></div> # INCLUDE NEWS # <div class="center"><h2>Les 3 prochains événements</h2></div> # INCLUDE EVENTS #
Création des fichiers
Enfin vous allez pouvoir créer des fichiers, tout le monde aime créer (sauf moi ).
Comme je vous l'ai dis plus haut, on va créer 3 fichier :
- articles.tpl
- news.tpl
- events.tpl
articles.tpl
Cette page .tpl permettra de mettre en forme (oui j'ai compris elle est pas si jolie que ça la forme ! ) vos derniers articles.
Le code
Code TPL :
# START articles_items # <hr> <div> <a href="{articles_items.U_ARTICLE}"><p>{articles_items.TITLE}</p></a> <p>{articles_items.DESCRIPTION}... <a href="{articles_items.U_ARTICLE}">[${LangLoader::get_message('read-more', 'common')}]</a></p> <p>${TextHelper::lowercase_first(LangLoader::get_message('the', 'common'))} : {articles_items.DATE}</p> # IF articles_items.C_AUTHOR_DISPLAYED # <p>${LangLoader::get_message('by', 'common')} : <span>{articles_items.PSEUDO}</span></p> # ENDIF # </div> # END articles_items #
Les différentes variables possibles
Oui, il serait judicieux de vous dire ce qu'il peut être rajouter aussi ! Vous l'avez bien compris les variables sont belle est bien repris du module articles... Mais pas toutes ! Il y en a 2 qui ont étaient créées !
Toutefois, il est important de préciser qu'il existe plusieurs types de variables :
- Les variables d’affichage : Le résultat affiché est très explicite.
- Les variable de conditions : Le résultat affiché ne veut pas dire grand chose pour les visiteurs.
En d'autre terme, vous l'aurez compris, les variables d'affichage se servent des variables de conditions. Par exemple, on ne va pas afficher un bouton de suppression d'article si l'utilisateur lambda n'a pas les droits requis (surtout pas le lien de suppression ! ) alors :
Code TPL :
Les variables d'affichage
Les variables du module Articles
NOMS | SIGNIFICATIONS | UTILISATIONS | EXEMPLE |
TITLE | Affiche le titre de l'article | {articles_item.TITLE} | Article 1 |
DATE | Affiche la date de création de l'article | {articles_item.DATE} | Samedi 14 Mars 2015 à 14h50 |
DATE_ISO8601 | Affiche la date de création de l'article | {articles_item.DATE-ISO8601} | 2015-03-14T14:50:00+01:00 |
DATE_SHORT | Affiche la date de création de l'article | {articles_item.DATE_SHORT} | 14/03/2015 |
PUBLISHING_START_DATE | Affiche la date de publication de l'article s'il a été poster en différé | {articles_item.PUBLISHING_START_DATE} | 14/04/2015 |
PUBLISHING_START_DATE_ISO8601 | Affiche la date de publication de l'article s'il a été poster en différé | {articles_item.PUBLISHING_START_DATE} | 2015-04-14T14:50:00+01:00 |
PUBLISHING_END_DATE | Affiche la date de fin de publication de l'article s'il a été poster en différé | {articles_item.PUBLISHING_END_DATE} | 14/05/2015 |
PUBLISHING_END_DATE_ISO8601 | Affiche la date de fin de publication de l'article s'il a été poster en différé | {articles_item.PUBLISHING_START_DATE} | 2015-05-14T14:50:00+01:00 |
DATE_UPDATED | Affiche la dernière date de modification de l'article | {articles_item.DATE_UPDATE} | 14/03/2015 |
L_COMMENTS | Affiche "Poster commentaire" | {articles_item.L_COMMENTS} | Poster un commentaire |
NUMBER_COMMENTS | Affiche le nombre de commentaires sur l'article | {articles_item.NUMBER_COMMENTS} | 0, 1, 2, 3 ... |
NUMBER_VIEW | Affiche le nombre de vues de l'article | {articles_item.NUMBER_VIEW} | 0, 1, 2, 3... |
NOTE | Affiche les petites étoiles de notation | {articles_item.NOTE} | Les petites étoiles |
PSEUDO | Affiche le pseudo de l'auteur de l'article | {articles_item.PSEUDO} | janus57, jpalbert92 ... |
DESCRIPTION | Affiche la description de l'article | {articles_item.DESCRIPTION} | Ceci est la description de l'article 1 |
PICTURE | Affiche le lien de la photo de l'article | {articles_item.PICTURE} | /phpboost_v4-1/articles/templates/images/default.png |
USER_LEVEL_CLASS | Affiche le niveau de l'auteur | {articles_item.USER_LEVEL_CLASS} | admin, modo, membre, visiteur |
USER_GROUP_COLOR | Donne le code héxadécimal de la couleur du groupe qui a été configuré dans l'administration via le système de groupe | {articles_item.USER_GROUP_COLOR} | / |
CATEGORY_ID | Affiche le numéro de la catégorie de l'article | {articles_item.CATEGORY_ID} | 1, 2, 3 ... |
CATEGORY_NAME | Affiche le nom de la catégorie de l'article | {articles_item.CATEGORY_NAME} | catégorie 1 |
CATEGORY_DESCRIPTION | Affiche la description de la catégorie de l'article | {articles_item.DESCRIPTION} | Ceci est la description de la cat 1 |
CATEGORY_IMAGE | Affiche le lien de l'image de la catégorie de l'article | {articles_item.CATEGORY_IMAGE} | /phpboost_v4-1/articles/articles.png |
U_COMMENTS | Affiche le lien de la partie commentaires de l'article | {articles_item.U_COMMENTS} | /phpboost_v4-1/articles/?url=/1-cat-1/5-article-4-cat-1/ |
U_AUTHOR | Affiche le lien vers le profil de l'auteur de l'article | {articles_item.U_AUTHOR} | /phpboost_v4-1/user/profile/1 |
U_CATEGORY | Affiche le lien vers la catégorie de l'article | {articles_item.U_CATEGORY} | /phpboost_v4-1/articles/1-cat-1/ |
U_ARTICLE | Affiche le lien de l'article | {articles_item.U_ARTICLE} | /phpboost_v4-1/articles/1-cat-1/5-article-4-cat-1/ |
U_EDIT_ARTICLE | Affiche le lien d'édition de l'article | {articles_item.U_EDIT_ARTICLE} | /phpboost_v4-1/articles/5/edit/ |
U_DELETE_ARTICLE | Affiche le lien de suppression de l'article | {articles_item.U_DELETE_ARTICLE} | /phpboost_v4-1/articles/5/delete/?token=88baada266a37da1 |
U_SYNDICATION | Affiche le flux RSS | {articles_item.U_SYNDICATION} | /phpboost_v4-1/syndication/rss/articles/1 |
U_PRINT_ARTICLE | Affiche la version imprimable de l'article | {articles_item.U_PRINT_ARTICLE} | /phpboost_v4-1/articles/print/5-article-4-cat-1/ |
Les nouvelles variables
Jusqu'ici nous avons repris les variables d'affichages du module news, mais nous avons créé 2 nouvelles variables dans le fichier PHP :
NOMS | SIGNIFICATIONS | UTILISATIONS | EXEMPLE |
DATE_DAY | Affiche le jour de la date de création de l'article | {DATE_DAY} | 01, 02, 03 ... 29, 30, 31 |
DATE_MONTH_A | Affiche le mois abrégé de la date de création de l'article | {DATE_MONTH_A} | Jan, Févr, Mars, Avr, Mai, Juin, Juil, Août ... Nov, Déc |
Les variables de conditions
NOMS | SIGNIFICATIONS | UTILISATIONS |
C_EDIT | Si l'utilisateur peut supprimer | # IF articles_items.C_EDIT # |
C_DELETE | Si l'utilisateur peut supprimer | # IF articles_items.C_DELETE # |
C_HAS_PICTURE | S'il y a une photo sur l'article | # IF articles_items.C_HAS_PICTURE # |
C_USER_GROUP_COLOR | Si l'auteur est associé à un groupe avec une couleur | # IF articles_items.C_USER_GROUP_COLOR # |
C_PUBLISHED | Si l'article est publié | # IF articles_items.C_PUBLISHED # |
C_PUBLISHING_START_AND_END_DATE | Si l'article à une date de début de publication et une date de fin de publication | # IF C_PUBLISHING_START_AND_END_DATE # |
C_PUBLISHING_START_DATE | Si l'article à une date de début de publication | # IF articles_items.C_PUBLISHING_START_DATE # |
C_PUBLISHING_END_DATE | Si l'article à une date de fin de publication | # IF articles_items.C_PUBLISHING_END_DATE # |
C_DATE_UPDATED | Si l'article à été modifié | # IF articles_items.C_DATE_UPDATED # |
C_AUTHOR_DISPLAYED | Si l'affichage de l'auteur est activé | # IF articles_items.C_AUTHOR_DISPLAYED # |
C_NOTATION_ENABLED | Si la notation est activé | # IF articles_items.C_NOTATION_ENABLED # |
C_AUTHOR_EXIST | Si l'auteur exist | # IF articles_items.C_AUTHOR_EXIST # |