Après une longue absence, me voilà de retour pour vous jouer des mauvais tours et pour vous en apprendre toujours plus sur Drupal 7 ! Au programme d’aujourd’hui, on va découvrir les EntityFieldQuery et comment sélectionner des nodes aléatoirement. Enjoy !
Les EntityFieldQuery
Pour récupérer des nodes en base avec Drupal, on a l’embarras du choix (enfin pas vraiment, juste 3 possibilités, mais c’est déjà beaucoup) : on peut passer par une db_query, un db_select ou .. par les EntityFieldQuery (si vous aviez pas deviné, c’est que vous avez rien lu jusqu’ici. C’est mal).
J’ai une préférence pour ces dernières, parce que c’est une classe PHP, et que ça me manque sur Drupal de faire du véritable objet.
La syntaxe est relativement simple et assez explicite :
$query = new EntityFieldQuery(); $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'article') ->propertyCondition('status', 1) ->propertyOrderBy('created', 'DESC') ->range(0, 10) ->addMetaData('account', user_load(1)); // Run the query as user 1. $result = $query->execute();
On commence par déclarer notre requête, et on ajoute nos conditions. Pour les conditions, on en a de 3 types :
- l’entityCondition, qui vous permet de définir les entités que vous voulez ramener (un node, un user, un commentaire …)
- la propertyCondition, qui vous permet de filtrer sur des attributs propres à l’entité défini plus haut (là par exemple, je veux des nodes de type « Article », qui sont publié … Oui je sais ça fais beaucoup de nodes !)
- la fieldCondition, qui vous permet de filtrer sur les champs de votre entité, comme sur le body ou vos champs customs
On peut ensuite faire des range (comme dans l’exemple, où j’en prends que 10), trié par ordre croissant ou décroissant sur pas mal de champs.
On exécute ensuite notre requête, et BOUM ! On a les 10 derniers articles publiés !
Déjà je trouve ça super, mais on peut tomber sur un cas où l’on souhaite ramener des nodes aléatoirement, pour faire un bloc dynamique par exemple. Et là, les EntityFieldQuery se démarque vraiment avec leur système de tag.
Ajouter un tag sur une EntityFieldQuery pour récupérer du contenu aléatoirement
Pour se faire, rien de plus simple !
$query = new EntityFieldQuery(); $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'article') ->propertyCondition('status', 1) ->addTag('random') ->range(0, 10) ->addMetaData('account', user_load(1)); // Run the query as user 1. $result = $query->execute();
Je reprends ma requête précédente, et j’ajoute un petit addTag(‘random’), mais vous pouvez l’appeler comme vous voulez, laissez parler votre imagination !
Mais là, il vous faudra faire un hook pour altérer la requête. Encore une fois, c’est facile 🙂
Dans votre module, déclarez la fonction [NOM_CUSTOM_MODULE]_query_[NOM_DU_TAG]_alter($query) :
function adfab_query_random_alter($query){ $query->orderRandom(); }
Dans mon module Adfab, j’ai donc déclarer la fonction adfab_query_random_alter($query), et je rajoute un orderRandom, et on a nos 10 articles aléatoires, qui changeront à chaque rechargement de page.
P.S : Si vous en avez moins de 10, ça sera toujours les mêmes par contre hein !
A bientôt pour de nouvelles aventures !