Wie kann ich ein Entitätsbündel aus Typ und ID abrufen?

11

Ich muss bundleeine Entität anhand ihrer typeund identifizieren id.

Wenn zum Beispiel type'node' und id7 ist, erhalte ich möglicherweise 'page' as bundle.

Vielen Dank

Junaid
quelle

Antworten:

11

Verwenden Sie entity_loaddiese Option, um die Entität wie von @Nikhil erwähnt zu laden.

Verwenden Sie dann entity_extract_ids , um das Bundle zu extrahieren. Beispiel:

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

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

echo "Bundle name is : " . $bundle;

Die Funktion entity_extract_idsgibt ein numerisch indiziertes Array (keine Hash-Tabelle) zurück, das die folgenden Elemente enthält:

  • 0: Primäre ID der Entität.
  • 1: Revisions-ID der Entität oder NULL, wenn $ entity_type nicht versioniert ist.
  • 2: Bundle-Name der Entität oder NULL, wenn $ entity_type keine Bundles enthält.

wobei, 0, 1, und 2sind Array - Indizes. Der Ansatz der Core- und Contrib-Module besteht jedoch darin, die list()Funktion zu verwenden.

AjitS
quelle
Ich denke, es ist nicht gut, sich auf den numerischen Index des Arrays zu verlassen.
Junaid
3
@Junaid Dieser Index ist vorhersehbar, also ist es in Ordnung. So erledigt Drupal Core diese Aufgabe. Wenn die 'magische Zahl' stört, verwenden Sie nur Sprachfunktionen:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive
@Junaid Sie können sich auf den numerischen Index verlassen, wenn Sie sicher sind, dass er sich nicht ändert. In der Bearbeitung finden Sie eine Erklärung, warum ich den numerischen Index verwendet habe. Dies liegt daran, dass die API-Funktion so konzipiert ist. Außerdem ist die Lösung nicht vom Entitätsmodul abhängig
;-)
7

Hier ist die sauberste , die ich aus dem Modulcode für organische Gruppen erhalten habe.

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

Zum Beispiel kann ich es so nennen:

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

Bearbeiten: Wie @Clive hervorhob, hängt die obige Methode vom Entitätsmodul ab.

Hier ist eine andere Methode, die nicht von einem zusätzlichen Modul abhängt. Es wird hier erklärt https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Kopieren Sie das Einfügen dieser Methode:

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
quelle
Was ist $group_type, $gid? und was ist der Wert in $bundle ?
Niksmac
Entschuldigung, ich habe vergessen, die richtigen Parameternamen zu verwenden. Es ist jetzt korrigiert.
Junaid
Sie können das gleiche tun entity_load, übrigens, wie es am saubersten ist?
Niksmac
1
Persönlich denke ich nicht, dass entity_metadata_wrapper()es sauberer ist als die entity_extract_ids()Methode. Außerdem verlassen Sie sich darauf, dass das Entitätsmodul installiert wird ...
Clive
Es ist nicht unbedingt sauberer, aber es ist eine gültige Alternative, insbesondere wenn Sie ohnehin Metadaten-Wrapper verwenden. Vielleicht könnten @develkar oder Junaid ihre Antwort so bearbeiten, dass beide Alternativen enthalten sind? (Junaid, vielleicht könnten Sie auch Links zum Entity-Modul und zur Seite über entity_metadata_wrappers hinzufügen?)
Alice Heaton
3

Versuchen Sie entity_load

Laden Sie Entitäten aus der Datenbank.

Die Entitäten werden in einem statischen Speichercache gespeichert und erfordern keinen Datenbankzugriff, wenn sie während derselben Seitenanforderung erneut geladen werden.

Parameter

$ entity_type : Der zu ladende Entitätstyp, z. B. Knoten oder Benutzer.

$ ids : Ein Array von Entitäts-IDs oder FALSE zum Laden aller Entitäten.

$ Bedingungen : (veraltet) Ein assoziatives Array von Bedingungen in der Basistabelle, wobei die Schlüssel die Datenbankfelder und die Werte die Werte sind, die diese Felder haben müssen. Stattdessen ist es vorzuziehen, EntityFieldQuery zu verwenden, um eine Liste von Entitäts-IDs abzurufen, die von dieser Funktion geladen werden können.

$ reset : Gibt an, ob der interne Cache für den angeforderten Entitätstyp zurückgesetzt werden soll.

Rückgabewert

Ein Array von Entitätsobjekten, die durch ihre IDs indiziert sind. Wenn keine Ergebnisse gefunden werden, wird ein leeres Array zurückgegeben.

niksmac
quelle
3

Wenn Sie in Bezug auf die Leistung eine sehr einfache Methode zum Abrufen des Knotentyps aus der Knoten-ID wünschen, können Sie eine einzelne Auswahlabfrage für die Knotentabelle verwenden.

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

Auf diese Weise müssen Sie nicht das gesamte Entity-Hook-System mit entity_load usw. aufrufen.

Es handelt sich um eine einzelne Auswahlabfrage unter Verwendung der indizierten Knoten-ID.

David Thomas
quelle
Wir spielen hier nicht nur mit Knoten.
Junaid
OP schrieb: "Wenn der Typ beispielsweise 'node' und id 7 ist, erhalte ich möglicherweise 'page' als Bundle." daher die knotenbasierte Beispielantwort.
David Thomas