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

11

J'ai besoin d'identifier bundleune entité à partir de son typeet id.

Par exemple, si le type«nœud» idest 7 et que je peux obtenir «page» comme bundle.

Merci

Junaid
la source

Réponses:

11

Utilisez entity_loadpour 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_idsrenvoie 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.

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

AjitS
la source
Je pense qu'il n'est pas bon de dépendre de l'index numérique du tableau.
Junaid
3
@Junaid Cet indice est prévisible, donc ça va. C'est ainsi que Drupal core gère cette tâche. Si le «nombre magique» vous dérange, vous utilisez simplement les fonctionnalités du langage:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive
@Junaid Vous pouvez dépendre de l'index numérique, lorsque vous êtes sûr qu'il ne changera pas. Voir l'édition pour l'explication de la raison pour laquelle j'ai utilisé l'index numérique. C'est parce que la fonction API est conçue de cette façon. De plus, la solution ne dépend pas du module d'entité ;-)
AjitS
7

Voici le plus propre que j'ai obtenu du code de module des groupes organiques.

$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']};
  }
}
Junaid
la source
Qu'est-ce que c'est $group_type, $gid? et quelle est la valeur $bundle ?
niksmac
Désolé, j'ai oublié d'utiliser les noms de paramètres appropriés. Il est maintenant corrigé.
Junaid
Vous pouvez faire de même pour entity_load, d'ailleurs, comment est-ce le plus propre?
niksmac
1
Personnellement, je ne pense pas que ce entity_metadata_wrapper()soit plus propre que la entity_extract_ids()méthode. De plus, vous comptez sur le module d'entité installé ...
Clive
Ce n'est pas nécessairement plus propre, mais c'est une alternative valide, surtout si vous utilisez des wrappers de métadonnées de toute façon. Peut-être que @develkar ou Junaid pourraient modifier leur réponse pour inclure les deux alternatives? (Junaid, vous pourriez peut-être aussi ajouter des liens vers le module Entity et vers la page sur entity_metadata_wrappers?)
Alice Heaton
3

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 : type d'entité à charger, par exemple 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é.

niksmac
la source
3

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é.

David Thomas
la source
nous ne jouons pas avec seulement des nœuds ici.
Junaid
OP a écrit: "Par exemple, si le type est 'node' et id est 7, je peux obtenir 'page' en bundle." d'où l'exemple de réponse basé sur les nœuds.
David Thomas