jeudi 14 mars 2013
Dans mon installation Drupal, j'ai voulu créer un nouveau type de contenu pour afficher des événements, comme des spectacles où les représentations pouvaient s'étendre sur plusieurs jours. De base, il semble que Drupal n'offre pas de support pour stocker des dates, à moins d'installer le module Date (eh!).
Une fois installé, j'ai activé le support des modules Date, Date API et Date Popup, ce dernier permettant de faciliter la saisie d'une date à l'aide d'un calendrier jQueryUI (datepicker).
Puis, j'ai pu ajouter un champ date requis à mon type de contenu que j'ai appelé "show" :
- Label : Dates
- Machine name : field_dates
- Field type : Date
- Widget : Pop-up Calendar
L'important est de cocher "Collect an end date" et de ne pas rendre la date de fin requise. Ceci permettra de saisir une date unique ou bien une plage de dates. De plus, on peut indiquer un nombre de valeurs illimitées ce qui nous donnera la flexibilité d'entrer autant de dates/plages qu'on veut.
Remarquez la chronologie des entrées, elles peuvent être saisies dans n'importe quel ordre et il est de la responsabilité de l'utilisateur de réordonner correctement celles-ci à l'aide du drag and drop illustré par le curseur de type move, sans quoi elles seront affichées telles quelles sur le site web :
Par expérience, je sais que la probabilité que l'utilisateur passe à côté de cette étape est élevée et je cherchais un moyen d'automatiser l'ordre chronologique en me basant sur la date de début de la plage. La solution que j'ai trouvé est d'intervenir par le code PHP juste avant d'enregistrer les données à l'aide de hook_node_presave().
Dans un module que j'ai créé pour cette personnalisation, j'ai ajouté le code suivant (dans mon exemple, le module s'appelle code18, d'où le préfixe au nom de la fonction) :
function code18_node_presave($node){ if($node->type == 'show'){ // nom de mon type de contenu usort($node->field_dates['und'], 'sort_by_date'); } } // Fonction comparant la valeur des dates pour le tri // value = date de début, value2 = date de fin (non nécessaire ici) function sort_by_date($a, $b){ return ($a['value'] > $b['value']) ? true : false; }
Pour que ça fonctionne :
- Activez votre module
- Assurez-vous d'avoir vidé la cache de Drupal si vous avez ajouté la fonction à un module existant
- Retournez modifiez le contenu qui contient une liste de date et enregistrez-le à nouveau sans apporter aucune modification pour forcer l'appel de la fonction hook_node_presave()