it-swarm.com.de

Variablen von der HTML-Vorverarbeitungsfunktion an die Seitenvorverarbeitungsfunktion übergeben?

In den Funktionen hook_preprocess_page() und hook_preprocess_html() meines benutzerdefinierten Themas muss ich häufig dieselben Informationen identifizieren. Anstatt im Wesentlichen dasselbe auszuführen, wenn die Anweisung beide eingecheckt hat, um die gleichen Informationen zu identifizieren, wäre es viel sinnvoller, dies nur einmal in beiden zu tun und diese Informationen dann an die andere Vorverarbeitungsfunktion zu übergeben. Wie kann ich das machen? Ich habe Folgendes versucht, aber es hat nicht funktioniert:

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

Ich habe es auch umgekehrt versucht (den Wert in der HTML-Vorverarbeitungsfunktion festlegen und dann in der Seitenvorverarbeitungsfunktion abrufen), aber das hat auch nicht funktioniert. Was eine verwandte Frage aufwirft: In welcher Reihenfolge werden diese Vorverarbeitungsfunktionen verarbeitet? Es scheint mir, dass die Seitenvorverarbeitungsfunktion vor der HTML-Funktion steht. Ist das richtig?

10
maxedison

Sie benötigen entweder eine global oder eine static Variable, um dies zu erreichen ... Ich persönlich würde empfehlen, mit static eine generische Hilfsfunktion mit Drupals Statik zu implementieren Muster wie folgt:

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

Die $vars - Arrays für jede Vorverarbeitungsfunktion sind völlig unterschiedliche Objekte im Speicher, sodass Sie dieses Array nicht zum Weitergeben von Dingen verwenden können. Ich habe gesehen, dass diese Art von Muster häufig in Drupal core) verwendet wird, daher denke ich, dass dies der beste Weg wäre.

EDIT

Oh und ja, hook_preprocess_page() wird vor hook_preprocess_html()... aufgerufen, soweit ich weiß Drupal arbeitet in einer Art "Inside-Out" "Weise so hook_preprocess_html() wäre wahrscheinlich die letzte, die in einem Seitenaufbau ausgeführt wird.

14
Clive

Ich habe dies mit einem ähnlichen Fall von 'Knoten' und 'Seite' erreicht, indem ich Folgendes getan habe:

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

ich würde mir also vorstellen, dass es stattdessen ähnlich mit 'page' und 'html' funktioniert.

3
Jimajamma