Il est souvent nécessaire de trouver toutes les entités d'un site selon certaines conditions.
Un non-initié aura surement le réflexe d'aller coder lui-même sa requête SQL, avec tout ce que cela comporte en matière de génocide chatonnesque (j'invente des mots si je veux)
Pour réaliser ce type de demande, Drupal embarque la class EntityFieldQuery (EFQ) qui permet de réaliser ceci de manière très rapide, maintenable et sécurisée.
Exemple, imaginons que l'on utilise DrupalCommerce, que l'on ne connait rien a la structure des tables crées au niveau du SGBD, mais que l'on souhaite obtenir tous les produits correspondant a une liste de SKU donnée, cela donnerait à peu près :
$sku = array('001', '002', '003', '004', '005');
$query = new EntityFieldQuery;
$result = $query->entityCondition('entity_type', 'commerce_product')
->propertyCondition('status', 1)
->propertyCondition('sku', $sku)
->execute();
return $result;
Voila un exemple de ce nous retournerais ce petit bout de code :
array(
'commerce_product' => array(
542 => (object) array(
'product_id' => '542',
'type' => 'product',
),
543 => (object) array(
'product_id' => '543',
'type' => 'product',
),
544 => (object) array(
'product_id' => '544',
'type' => 'product',
),
545 => (object) array(
'product_id' => '545',
'type' => 'product',
),
546 => (object) array(
'product_id' => '546',
'type' => 'product',
),
),
)
Et voila, rien de plus compliqué que ça.
Un autre exemple, avec l'utilisation de node_load_multiple()
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type','node')
->entityCondition('bundle','event')
->propertyCondition('status',1)
->fieldCondition('field_date','value', array('2011-03-01','2011-03-31'),'BETWEEN')
->fieldOrderBy('field_date','value','ASC')
->execute();
$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes,'teaser');
Je pense que ca peut même se passer de commentaire tellement c'est clair et lisible.
Pour plus d'information, vous pouvez aller jeter un oeil sur la documentation
Vous n'avez maintenant plus aucune excuse pour ne pas utiliser cette class dans vos modules !