¿Cómo puedo obtener el paquete de una entidad de tipo e id?

11

Necesito identificar bundleuna entidad a partir de su typey id.

Por ejemplo, si typees 'nodo' y ides 7, puedo obtener 'página' como bundle.

Gracias

Junaid
fuente

Respuestas:

11

Use entity_loadpara cargar la entidad como lo menciona @Nikhil.

Luego use entity_extract_ids , para extraer el paquete. Ejemplo:

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

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

echo "Bundle name is : " . $bundle;

La función entity_extract_idsdevuelve una matriz indexada numéricamente (no una tabla hash) que contiene los elementos:

  • 0: ID principal de la entidad.
  • 1: ID de revisión de la entidad, o NULL si $ entity_type no está versionado.
  • 2: Nombre del paquete de la entidad, o NULL si $ entity_type no tiene paquetes.

donde, 0, 1, y 2son índices de matriz. Sin embargo, el enfoque utilizado por los módulos principales y contrib es utilizar la list()función.

AjitS
fuente
Creo que no es bueno depender del índice numérico de la matriz.
Junaid
3
@Junaid Ese índice es predecible, así que está bien. Así es como Drupal core maneja esta tarea. Si el 'número mágico' te molesta, solo usa las características del lenguaje:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive
@Junaid Puede depender del índice numérico, cuando esté seguro de que no cambiarán. Vea la edición para la explicación de por qué usé el índice numérico. Es porque la función API está diseñada de esa manera. Además, la solución no depende del módulo de entidad ;-)
AjitS
7

Aquí está el más limpio que obtuve del código del módulo Grupos orgánicos.

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

Por ejemplo, puedo llamarlo así:

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

Editar: como señaló @Clive, el método anterior depende del módulo de entidad.

Aquí hay otro método que no depende de ningún módulo adicional. Se explica aquí https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Copia pegando ese método:

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
fuente
¿Qué es $group_type, $gid? y cual es el valor $bundle ?
niksmac
Lo siento, olvidé usar los nombres de parámetros adecuados. Está corregido ahora.
Junaid
Puedes hacer lo mismo entity_load, por cierto, ¿cómo es más limpio?
niksmac
1
Personalmente no creo que entity_metadata_wrapper()sea ​​más limpio que el entity_extract_ids()método. Además, confía en el módulo de entidad que se está instalando ...
Clive
No es necesariamente más limpio, pero es una alternativa válida, especialmente si está utilizando envoltorios de metadatos de todos modos. ¿Quizás @develkar o Junaid podrían editar su respuesta para incluir ambas alternativas? (Junaid, ¿tal vez podrías agregar enlaces al módulo Entity y a la página sobre entity_metadata_wrappers también?)
Alice Heaton
3

Intenta la entidad de carga

Cargar entidades de la base de datos.

Las entidades se almacenan en una memoria caché estática y no requerirán acceso a la base de datos si se vuelven a cargar durante la misma solicitud de página.

Parámetros

$ entity_type : el tipo de entidad a cargar, por ejemplo, nodo o usuario.

$ ids : una matriz de ID de entidad, o FALSE para cargar todas las entidades.

$ condiciones : (en desuso) Una matriz asociativa de condiciones en la tabla base, donde las claves son los campos de la base de datos y los valores son los valores que esos campos deben tener. En cambio, es preferible utilizar EntityFieldQuery para recuperar una lista de ID de entidad que esta función puede cargar.

$ reset : si se restablece la memoria caché interna para el tipo de entidad solicitada.

Valor de retorno

Una matriz de objetos de entidad indexados por sus identificadores. Cuando no se encuentran resultados, se devuelve una matriz vacía.

niksmac
fuente
3

Si desea una forma muy liviana, en términos de rendimiento, para obtener el tipo de nodo de la identificación del nodo, puede usar una sola consulta de selección en la tabla de nodos.

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

De esa manera, no necesita invocar todo el sistema de enlace de entidad, con entity_load, etc.

Es una consulta de selección única que usa la identificación del nodo indexado.

David Thomas
fuente
No estamos jugando solo con nodos aquí.
Junaid
OP escribió "Por ejemplo, si el tipo es 'nodo' y la identificación es 7, puedo obtener 'página' como paquete". de ahí la respuesta de ejemplo basada en el nodo.
David Thomas