Afficher les articles à venir avec CMSMS

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...

Date de début et date de fin sur cmsms

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.

Vus : 1251
Publié par ephase : 62