Afficher les articles à venir avec CMSMS
Par ephase le mercredi, septembre 7 2011, 01:05 :: Création :: Lien permanent
CMS made simple (ou CMSMS pour les intimes) est un gestionnaire de contenu Open-Source très facile d'emploi. Je l'utilise régulièrement pour des sites de petite ou moyenne envergure. Pour un de mes clients, j'ai du adapter un peu le module "News" qui permet la gestion (simple) d'articles.
Pour un article donné, il nous est possible de définir une date de début de publication, et une date de fin. Fonctionnalité très pratique, il est cependant impossible de forcer la publication d'un article à paraître "dans le futur", fonctionnalité qui serait pourtant très utile. Prenons un exemple concret...

Sur le site des Amis des musées de Bordeaux, les articles annoncant les Sorties Culturelles à venir sont programmé pour apparaître sur la page d'accueil au moment voulu (un mois avant la date de la sortie en question). Mais pour ne pas avoir à réinventer la roue, je veux que cet articles apparaisse dès à présent dans la partie Sortie > saison 2011-2012.
le fichier News_module.php
Celui-ci se trouve dans le répertoire Modules/News de votre installation CMSMS. Après la ligne 136 rajoutez ceci afin de déclarer le paramètre qui nous permettra de forcer ou non l'affichage des articles à venir :
$this->SetParameterType('showfuture',CLEAN_INT);
Le fichier action.default
Toujours dans le même répertoire, ouvrez le fichier action.default.php et retrouvez les lignes suivantes
$now = $db->DbTimeStamp(time());
$query1 .= "(".$db->IfNull('start_time',$db->DBTimeStamp(1))." < ".$now.") "; $query2 .= "(".$db->IfNull('start_time',$db->DBTimeStamp(1))." < ".$now.") ";
Et remplacez les par ceci
if (isset($params['showfuture']) && $params['showfuture'] == 1)
{ $query1 .= "("; $query2 .= "("; }
$now = $db->DbTimeStamp(time()); $query1 .= "(".$db->IfNull('start_time',$db->DBTimeStamp(1))." < ".$now.") "; $query2 .= "(".$db->IfNull('start_time',$db->DBTimeStamp(1))." < ".$now.") ";
if (isset($params['showfuture']) && $params['showfuture'] == 1) { $query1 .= "OR (".$db->IfNull('start_time',$db->DBTimeStamp(1))." >= ".$now.")) "; $query2 .= "OR (".$db->IfNull('start_time',$db->DBTimeStamp(1))." >= ".$now.")) "; }
L'explication est très simple, si le paramètre showfuture est défini et égal à 1 alors on affiche les articles qui ont une date de publication dans le passé ou dans le futur.
Utilisation de la modification
C'est bien beau de modifier tout ça, mais maintenant il va falloir l'utiliser... pour ça rien de bien compliqué il suffira de rajouter le paramètre showfuture='1' pour forcer l'affichage des articles à venir ou showfuture='0' lors de l'appel du module news dans vos gabarits.
{news category="Sorties" pagelimit='3' showfuture='1'}
Et le tour est joué.. Il y a peut être une méthode plus simple mais je ne la connais pas (et surtout pas trouvée en cherchant quand même un bon moment). Attention cependant : si vous mettez à jour votre installation, vous allez devoir recommencer cette manipulation.
Dans le prochain article, je vous montrerai comment empêcher CMSMS d'afficher deux fois le même article dans une page lorsqu'on appelle plusieurs fois le module News.
Cette modification à été inspirée par cet article de Roy Lindauer.
Commentaires
Attention, comme précisé, c'est une assez mauvaise idée de modifier le code du module News tel que décrit ici, pour les raisons que tu expliques.
Pour faire ce genres de choses, tu pourrais explorer des modules tel que MCFactory, qui te permet de créer des modules, et d'y apporter des "behavior" comme celui que tu décris, sans problèmes de mises à jour. Malheureusement il n'est pas assez documenté (shame on me).
Bonjour Totophe,
Oui c'est effectivement le défaut de cette méthode, mais les modification sont assez simple à réintégrer en cas de mise à jour par exemple. Ceci étant dis je ne serais pas contre un peu de doc à propos de MCFactory qui à l'air du coup fort intéressant.