it-swarm.com.de

Gibt es eine Möglichkeit, das aktuelle Entitätsobjekt zu laden?

Gibt es eine Möglichkeit, von überall in Drupal das aktuelle Entitätsobjekt abzurufen? Ich verwende den Hook hook_filter_FILTER_process () und möchte die Dinge im $ text durch Daten aus der Entität ersetzen, aber es sieht nicht so aus, als gäbe es eine Möglichkeit, auf die Entität ohne zuzugreifen so etwas tun

if (!empty(arg(0)) && is_numeric(arg(1)) {
    $entity = entity_load(arg(0), array(arg(1)));
}

Dies funktioniert meistens, aber manchmal (wie bei Taxonomiebegriffen) nicht. Darüber hinaus ist dies sehr chaotisch, da die Datenbank erneut aufgerufen wird.

Gibt es einen besseren Weg, dies zu tun?

5
David Barratt

Ich denke menu_get_object() könnte hilfreich sein:

menu_get_object () bietet Zugriff auf Objekte, die vom aktuellen Router-Element geladen wurden. Beispielsweise lädt der Router auf dem Seitenknoten /% -Knoten das% -Knotenobjekt, und der Aufruf von menu_get_object () gibt dies zurück. Normalerweise muss der Typ des referenzierten Objekts angegeben werden, der Knoten ist jedoch der Standard. Im folgenden Beispiel wird geprüft, ob der angezeigte Knoten vom Inhaltstyp "Story" ist:

<?php
$node = menu_get_object();
$story = $node->type == 'story';
?>

Sie können dies mit jedem vom Router geladenen Objekt verwenden, sodass es naheliegend ist, dass Sie auf Entitätsseiten (einschließlich Taxonomiebegriffsseiten) das richtige Objekt erhalten:

$entity = menu_get_object($entity_type);

[~ # ~] Update [~ # ~]

Bei weiterer Überprüfung müssen Sie die Position der ID in der URL noch als Parameter an menu_get_object () übergeben, so dass es ziemlich ähnlich ist wie bei Verwendung von arg(), aber es ist wohl etwas sauberer. Für taxonomische Begriffe lautet der Pfad taxonomy/term/%. Sie würden also Folgendes aufrufen:

$term = menu_get_object('taxonomy_term', 2);

Beachten Sie, dass entity_load Nur dann einen Datenbankaufruf ausführt, wenn die Entität zuvor nicht in die aktuelle Seitenanforderung geladen wurde. Wenn es bereits geladen wurde, wird es aus dem statischen Cache bereitgestellt.

UPDATE 2

Nur um ein Beispiel für das statische Muster hinzuzufügen, um zu vermeiden, dass die Entität immer wieder neu geladen wird, wenn Speicherfehler auftreten:

$loaded_entity = &drupal_static(__FUNCTION__, NULL);
if (!$loaded_entity) {
  $loaded_entity = menu_get_object();
}
return $loaded_entity;
8
Clive

Erstellt diese agnostische aktuelle Entity Loader-Funktion ...

<?php
function my_module_menu_get_any_object() {
  // Figure out how this entity is loaded.
  $type = FALSE;
  $item = menu_get_item();
  $vals = array_values($item['load_functions']);
  $load_function = $vals[0];
  $arg_position = array_search($load_function, $item['load_functions']);

  // Compare to entity types.
  $entity_info = entity_get_info();
  foreach($entity_info as $i => $e) {
    if ($e['load hook'] == $load_function) {
      $type = $i;
    }
  }

  // Many happy returns.
  if($type && $obj = menu_get_object($type, $arg_position)) {
    if(is_object($obj)) {
      return $obj;
    }
    else {
      return FALSE;
    }
  }
  else {
    return FALSE;
  }
}
2
doublejosh

Der richtige Weg ist die Verwendung von menu_get_object().

2
gilzero

Eingabefilter haben keine Möglichkeit, die Entität abzurufen, für die sie zum Rendern aufgerufen werden.

Tatsächlich könnte ein Eingabefilter auch in Situationen aufgerufen werden, in denen eine Entität überhaupt nicht beteiligt ist. Mit dem Modul Ansichten können Sie beispielsweise die Kopfzeile einer Ansicht festlegen und die folgenden Optionen auswählen.

screenshot

screenshot

Wenn Sie Global: Textbereich auswählen, stehen folgende Optionen zur Verfügung.

screenshot

Wenn in diesem Fall ein Eingabefilter aufgerufen wird, ist dem Header der Ansicht keine Entität zugeordnet. Wenn Sie menu_get_object() verwenden würden, würden Sie wahrscheinlich die falsche Entität erhalten, oder Sie würden überhaupt keine Entität erhalten. Um die richtige Entität mit menu_get_object() zu erhalten, müssen Sie wissen, welche Entität der angezeigten Seite zugeordnet ist und wo die Entitäts-ID in der URL gespeichert ist.

Als allgemeine Richtlinie sollten Eingabefilter keine Annahmen darüber treffen, wie sie verwendet werden, da sie zum Rendern von Text verwendet werden können, der als Eingabe vom Benutzer erhalten wurde. Der vom Ansichtsmodul verwendete Header der Ansicht ist nur ein Beispiel, aber nichts hindert ein anderes Modul daran, dieselbe Methode zu verwenden.

0
kiamlaluno