web-dev-qa-db-fra.com

Comment puis-je obtenir le paquet d'une entité à partir du type et de l'ID?

J'ai besoin d'identifier bundle d'une entité à partir de ses type et id.

Par exemple, si type est 'node' et id est 7, je peux obtenir 'page' comme bundle.

Merci

11
Junaid

Utilisez entity_load Pour charger l'entité comme mentionné par @Nikhil.

Utilisez ensuite entity_extract_ids , pour extraire le bundle. Exemple:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

La fonction entity_extract_ids Renvoie un tableau indexé numériquement (pas une table de hachage) contenant les éléments:

  • 0: ID principal de l'entité.
  • 1: ID de révision de l'entité, ou NULL si $ entity_type n'est pas versionné.
  • 2: nom du bundle de l'entité, ou NULL si $ entity_type n'a pas de bundles.

où, 0, 1 et 2 sont des indices de tableau. Cependant, l'approche utilisée par les modules core et contrib consiste à utiliser la fonction list().

11
AjitS

Voici le plus propre celui que j'ai obtenu du code du module Organic groups.

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

Par exemple, je peux l'appeler comme:

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

Edit: Comme l'a souligné @Clive, la méthode ci-dessus dépend du module d'entité.

Voici une autre méthode qui ne dépend d'aucun module supplémentaire. Il est expliqué ici https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Copiez-collez cette méthode:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}
7
Junaid

Si vous voulez un moyen très léger, en termes de performances, pour obtenir le type de nœud à partir de l'ID de nœud - vous pouvez utiliser une seule requête de sélection sur la table des nœuds.

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

De cette façon, vous n'avez pas besoin d'appeler l'ensemble du système de hook d'entité, avec entity_load etc.

Il s'agit d'une seule requête de sélection utilisant l'ID de nœud indexé.

3
David Thomas

Essayez entity_load

Chargez des entités à partir de la base de données.

Les entités sont stockées dans un cache de mémoire statique et ne nécessiteront pas d'accès à la base de données si elles sont chargées à nouveau lors de la même demande de page.

Paramètres

$ entity_type : le type d'entité à charger, par ex. nœud ou utilisateur.

$ ids : un tableau d'ID d'entité, ou FALSE pour charger toutes les entités.

$ conditions : (obsolète) Un tableau associatif de conditions sur la table de base, où les clés sont les champs de la base de données et les valeurs sont les valeurs que ces champs doivent avoir. Au lieu de cela, il est préférable d'utiliser EntityFieldQuery pour récupérer une liste des ID d'entité chargeables par cette fonction.

$ reset : Indique s'il faut réinitialiser le cache interne pour le type d'entité demandé.

Valeur de retour

Tableau d'objets d'entité indexés par leurs identifiants. Lorsqu'aucun résultat n'est trouvé, un tableau vide est renvoyé.

3
niksmac