Dans le CMS Drupal, lorsque vous créez un type de contenu « Sondage » (/node/add/poll), vous pouvez lui paramétrer une durée à partir de laquelle seuls les résultats s’afficheront et le vote ne sera plus possible. Le problème est que si vous gérez de nombreux sondages sur votre site, certaines de vos pages peuvent afficher du contenu dépassé par rapport à l’actualité:
« Qui va gagner Secret Story 2010 ? » alors qu’on est en 2011, ça ressemble à un site peu fréquentable pas très à jour tout ça… Pour l’utilisateur, c’est assez moyen.
Script PHP dans crontab
J’ai essayé de masquer le sondage via la visibilité des blocs sans trop savoir si cela allait être faisable, mais je me suis dit qu’il y avait surtout plus simple. Du coup, j’ai crée une petite fonction PHP qui vérifie tous les jours (à paramétrer avec crontab) si des sondages Drupal sont arrivés à expiration, auquel cas elle les dépublie et ils deviennent non visibles (on vérifie le champ poll.active qui passe à 0 quand date création sondage + durée > date du jour).
<?php $drupal_path = "/chemin/vers/drupal"; chdir($drupal_path); include('includes/bootstrap.inc'); drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $result = db_query('SELECT p.nid FROM {poll} p INNER JOIN {node} n ON p.nid = n.nid WHERE p.active = 0 AND p.runtime != 0 AND n.status=1'); while ($poll = db_fetch_object($result)) { db_query("UPDATE {node} SET status = 0 WHERE nid = %d", $poll->nid); } ?>
Module Depubli-Sondage
Pour éviter de rajouter une entrée crontab et centraliser cette fonction avec Drupal core, on peut faire un « mini module » qui sera exécuté via le hook_cron() de Drupal. On crée deux fichiers: depubliesondage.module et depubliesondage.info. Il ne restera plus qu’à placer le module dans le bon dossier et à l’activer. Il sera lancé en même temps que http://monsitedrupal.com/cron.php.
depubliesondage.module:
<?php function depubliesondage_cron() { $result = db_query('SELECT p.nid FROM {poll} p INNER JOIN {node} n ON p.nid = n.nid WHERE p.active = 0 AND p.runtime != 0 AND n.status=1'); while ($poll = db_fetch_object($result)) { db_query("UPDATE {node} SET status = 0 WHERE nid = %d", $poll->nid); } } ?>
depubliesondage.info:
name = "Depubliesondage" description = "Depublication des sondages clos." package = "addons" project = "depubliesondage_modules" version = "6.x" core = 6.x