Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.
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é.
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);