Teilen Sie einen Wert zwischen zwei verschiedenen Hooks

7

Ich habe 2 Hook-Funktionen in meinem Modul: hook_views_pre_render()und hook_form_alter(); In hook_views_pre_render()rufe ich einige Daten darüber ab, welche verfügbaren Knoten ich benötige hook_form_alter().

Ich suche nach einer Möglichkeit, die Daten von hook_views_pre_render()an weiterzugeben hook_form_alter(). Es scheint einfach, aber ich kann es nicht zum Laufen bringen. Hat jemand eine Idee?

Was im Moment global $aVariablefunktioniert, ist, beide Hook-Funktionen zu erweitern, aber ich glaube, es sollte einen besseren Weg geben.

blenden
quelle

Antworten:

3

Sie können variable_set($name, $value)und verwendenvariable_get($name, $default = NULL)

Stefan
quelle
1
Wenn sich die Daten von Seite zu Seite ändern, schlägt dieser Ansatz merkwürdig fehl, wenn zwei Benutzer dieselbe Seite anzeigen.
mpdonadio
Ich habe dies nicht verwendet, da der form_alter vor dem views_pre_render aufgerufen wird, sodass die Daten, die ich teilen möchte, nicht einmal vorhanden sind. Aber im Konzept funktioniert die Verwendung von variable_set und get, aber auch die globale.
Blenden
Diese Lösung funktioniert nur, wenn Ihre Website nur einen Benutzer hat. Wer nutzt Drupal für Einzelbenutzer-Websites? Es ist auch langsam.
Rudolfbyker
@rudolfbyker Man kann sagen, dass es für einen einzelnen Wert funktioniert, nicht für einen einzelnen Benutzer. Und "Einzelwert" ist umstritten, weil Sie serialisierte Daten verwenden können ... Und es ist langsam im Vergleich zu was?
Stefan
1. Siehe den ersten Kommentar von MPD. Dies liegt daran, dass variable_set keine eindeutige Variable pro Benutzer festlegt, sondern in die Datenbank schreibt, wodurch sich die Variable für alle Benutzer ändert, die derzeit auf Ihre Site zugreifen. 2. Langsam im Vergleich zu Lösungen, die die Datenbank nicht erreichen.
Rudolfbyker
8

In Drupal 7 kann auch drupal_static () verwendet werden, wenn der gespeicherte Wert nicht zwischen verschiedenen Seiten bestehen bleiben muss.

drupal_static()wird normalerweise als aufgerufen drupal_static(__FUNCTION__, $default_value), aber wenn Sie den Namen der Funktion verwenden, können Sie auf denselben Wert zugreifen, auf den über die aufrufende Funktion zugegriffen wird drupal_static().

Die Verwendung von variable_set()und variable_get()der Wert bleibt zwischen verschiedenen Seiten bestehen und wird nicht automatisch entfernt. Wenn der erste Hook Code ähnlich dem folgenden ausführt, erhält das zweite Modul einen älteren Wert.

if ($condition) {
  variable_set($variable_name, $value);
}

Anstatt solchen Code zu verwenden, sollte der erste Hook Code ausführen, der dem folgenden ähnlich ist.

if ($condition) {
  variable_set($variable_name, $value);
}
else {
  variable_del($variable_name);
}

Stellen Sie unabhängig von der gewählten Methode sicher, dass der Hook, der den Wert liest, effektiv ausgeführt wird, nachdem der Hook diesen Wert festgelegt hat.

kiamlaluno
quelle
Sie erwähnen, dass drupal_static verwendet werden kann, um Werte zwischen hook_functions zu übergeben. Können Sie bitte Ihre Antwort aktualisieren, um ein klares Beispiel für die Verwendung von drupal_static zum Festlegen des Werts in einer Funktion zu zeigen, und diese Daten dann in einer separaten Funktion aufrufen?
blue928
Können Sie auch näher erläutern, wie Sie sicherstellen können, dass der Variablensatz ausgelöst wird, bevor die Variable abgerufen wird? Gibt es eine Möglichkeit, Haken "Hakenfeuer Vorrang" oder Gewicht zu geben, damit sie in einer bevorzugten Reihenfolge feuern?
blue928
@ blue928 Nein, es gibt keine Möglichkeit, Drupal einen Hook zuerst einen anderen Hook nennen zu lassen. Es gibt nur eine Möglichkeit, verschiedene Implementierungen desselben Hooks zu bestellen.
Kiamlaluno
In beiden Fällen werden die Hooks drupal_static()als aufgerufen &drupal_static($value_name, $default_value). Die Funktion, die den Wert einstellt, wird normalerweise __FUNCTION__als verwendet $value_name, dies ist jedoch nicht erforderlich. Solange die Funktion keine Konflikte mit anderen Funktionen erzeugt, ist jeder Wert gut, auch wenn ihm __FUNCTION__Hilfen vorangestellt werden .
Kiamlaluno
0

Wenn Sie Informationen zu übergeben , die nur in zur Verfügung steht , hook_views_pre_renderum hook_form_altereine globale Variable könnte die beste Option sein; vorzugsweise benannt, um die eingeschränkte Rolle klar zu machen, z _mymodule_available_nodes.

Der beste Ansatz wäre, Ihre Daten zu Objekten hinzuzufügen, die die beiden Aufrufe gemeinsam haben. In diesem Fall scheint es leider keine Gemeinsamkeiten zu geben, so dass dies nicht funktioniert.

Möglicherweise können Sie Sitzungsdaten verwenden, aber das wäre für diese Anwendung übertrieben und scheint keine klaren Vorteile gegenüber einer globalen zu bieten.

Ich empfehle nicht, variable_set / variable_get zu verwenden. variable_setLöscht den Variablencache bei jedem Aufruf und alle Variablenwerte werden bei jeder Seitenanforderung abgerufen. Dies ist keine gute Übereinstimmung für Daten, die sich ständig ändern und möglicherweise groß sind.

Keithm
quelle
Kann in Drupal 7 drupal_static () dafür verwendet werden?
Kalabro
Eine statische Variable ist lokal für die Funktion, behält jedoch den Wert zwischen den Aufrufen bei. Das OP möchte eine Möglichkeit zur Kommunikation zwischen Funktionen, damit dies nicht zutrifft. drupal_static bietet eine Methode zum Speichern statischer Daten, die von außerhalb der definierenden Funktion zurückgesetzt und bearbeitet werden können.
Keithm
2
Die Variable, die von zurückgegeben wird, drupal_static()ist lokal für drupal_static(), aber die Funktion gibt den Wert der Variablen als Referenz zurück. Dies bedeutet, dass die aufrufende Funktion den Wert der Variablen ändern kann, auch wenn es sich um eine statische lokale Variable für handelt drupal_static().
Kiamlaluno