Come posso ottenere il bundle di un'entità dal tipo e dall'ID?


11

Devo identificare bundleun'entità dal suo typee id.

Ad esempio, se typeè 'nodo' ed idè 7, potrei ottenere 'pagina' come bundle.

Grazie

Risposte:


11

Utilizzare entity_loadper caricare l'entità come indicato da @Nikhil.

Quindi utilizzare entity_extract_ids , per estrarre il pacchetto. Esempio:

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

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

echo "Bundle name is : " . $bundle;

La funzione entity_extract_idsrestituisce un array indicizzato numericamente (non una tabella hash) contenente gli elementi:

  • 0: ID primario dell'entità.
  • 1: ID revisione dell'entità o NULL se $ entity_type non ha la versione.
  • 2: Nome del bundle dell'entità o NULL se $ entity_type non ha bundle.

dove 0, 1e 2sono indici degli array. Tuttavia, l'approccio utilizzato dai moduli core e contrib è di utilizzare la list()funzione.


Penso che non sia buono dipendere dall'indice numerico dell'array.
Junaid,

3
@Junaid Quell'indice è prevedibile, quindi va bene. Ecco come Drupal core gestisce questo compito. Se il 'numero magico' ti dà fastidio, devi solo usare le funzionalità del linguaggio:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive

@Junaid Puoi contare sull'indice numerico, quando sei sicuro che non cambieranno. Vedi la modifica per la spiegazione del perché ho usato l'indice numerico. È perché la funzione API è progettata in questo modo. Inoltre, la soluzione non dipende dal modulo entità ;-)
AjitS

7

Ecco il più pulito che ho ottenuto dal codice del modulo gruppi organici.

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

Ad esempio, posso chiamarlo come:

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

Modifica: come sottolineato da @Clive, il metodo sopra dipende dal modulo entità.

Ecco un altro metodo che non dipende da nessun modulo aggiuntivo. È spiegato qui https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Copia incollando quel metodo:

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']};
  }
}

Che cosa è $group_type, $gid? e qual è il valore $bundle ?
Niksmac,

Siamo spiacenti, ho dimenticato di utilizzare i nomi dei parametri corretti. Ora è corretto.
Junaid,

Puoi fare lo stesso per entity_loadil modo in cui è più pulito?
Niksmac,

1
Personalmente non penso entity_metadata_wrapper()sia più pulito del entity_extract_ids()metodo. Inoltre fai affidamento sul modulo entità in fase di installazione ...
Clive

Non è necessariamente più pulito, ma è una valida alternativa, soprattutto se si utilizzano comunque wrapper di metadati. Forse @develkar o Junaid potrebbero modificare la loro risposta per includere entrambe le alternative? (Junaid, forse potresti aggiungere collegamenti al modulo Entity e anche alla pagina su entity_metadata_wrappers?)
Alice Heaton,

3

Prova entity_load

Caricare entità dal database.

Le entità sono archiviate in una cache di memoria statica e non richiederanno l'accesso al database se caricate di nuovo durante la stessa richiesta di pagina.

parametri

$ entity_type : il tipo di entità da caricare, ad esempio nodo o utente.

$ ids : una matrice di ID entità o FALSE per caricare tutte le entità.

$ condition : (obsoleto) Un array associativo di condizioni nella tabella di base, in cui le chiavi sono i campi del database e i valori sono i valori che tali campi devono avere. È preferibile invece utilizzare EntityFieldQuery per recuperare un elenco di ID entità caricabili da questa funzione.

$ reset : se ripristinare la cache interna per il tipo di entità richiesto.

Valore di ritorno

Un array di oggetti entità indicizzati dai loro ID. Quando non viene trovato alcun risultato, viene restituita una matrice vuota.


3

Se si desidera un modo molto leggero, dal punto di vista delle prestazioni, per ottenere il tipo di nodo dall'ID nodo, è possibile utilizzare una query di selezione singola nella tabella dei nodi.

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

In questo modo, non è necessario richiamare l'intero sistema hook entità, con entity_load ecc.

È una singola query di selezione che utilizza l'id nodo indicizzato.


non stiamo giocando solo con nodi qui.
Junaid,

OP ha scritto "Ad esempio, se il tipo è 'nodo' e id è 7, potrei ottenere 'pagina' come pacchetto." da qui la risposta di esempio basata sul nodo.
David Thomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.