Fil d'Ariane
Drupal 10 : Charger, lister et afficher des entités avec EntityQuery
Tirer toute la puissance des listes d'entités. Ajouter ses conditions et trouver comment charger les entités qui remplissent nos conditions avant de les rendre dans notre mode d'affichage souhaité.
Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.
N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !
Lister des entités
Depuis Drupal 8 existe un Service de requêtage d’entités entity.query
via la classe \Drupal\Core\Entity\Query\QueryFactory
.
Une fois une instance récupérée, il est possible de chaîner les conditions pour former une requête :
$fids = \Drupal::entityQuery('file')
->condition('status', FILE_STATUS_PERMANENT, '<>')
->condition('changed', REQUEST_TIME - $age, '<')
->range(0, 100)
->execute();
Une possibilité offerte par ce service est que vous pouvez traverser vos entités pour ajouter des conditions sur leurs relations. Ce genre de condition est licite par exemple :
$latest_archive = \Drupal::entityQuery('node')
->condition('type', 'mag_article')
->condition('associated_mag.entity:node.mag_type.value', 'archives')
->range(0, 1)
->sort('nid', 'DESC')
->execute();
Charger des entités
Une classe de gestion des entités a été créée dans Drupal 8, il s’agit de la classe \Drupal\Core\Entity\EntityTypeManager.
Elle donne accès à plusieurs outils pour charger, lister, ou afficher des entités. La méthode getStorage()
donne ainsi accès à une classe de gestion de stockage des entités qui implémente EntityStorageInterface
. Les méthodes load()
ou loadMultiple()
quant à elles permettent de charger une ou plusieurs entités à la fois.
$entitytype_manager = \Drupal::service('entity_type.manager');
$storage = $entitytype_manager->getStorage('file');
$files = $storage->loadMultiple($fids);
Afficher des entités
Dans Drupal 9 ou Drupal 10, l’affichage d’un contenu se fait grâce à la classe \Drupal\Core\Entity\EntityTypeManager
et les classes se basant sur l’interface EntityViewBuilderInterface
. Il faut utiliser la méthode getViewBuilder()
pour récupérer une instance de la classe et les méthodes view()
et viewMultiple()
pour en faire le rendu dans un render array.
$view_builder = $entitytype_manager->getViewBuilder('file');
$output = $view_builder->viewMultiple($nodes, $view_mode);
Votre commentaire
À propos de Julien
Co-fondateur - Scrum master & Expert technique
Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.
Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.