Passare le variabili dalla funzione di pre-elaborazione HTML alla funzione di pre-elaborazione della pagina?


10

Nelle mie tematiche hook_preprocess_page()e hook_preprocess_html()funzioni personalizzate, spesso devo identificare le stesse informazioni. Piuttosto che essenzialmente eseguire lo stesso se l'istruzione controlla entrambi identificando le stesse informazioni, sarebbe molto più sensato farlo una sola volta in entrambi e quindi passare quelle informazioni all'altra funzione di preelaborazione. Come posso fare questo? Ho provato quanto segue ma non ha funzionato:

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

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

Ho anche provato il contrario (impostando il valore nella funzione html di preelaborazione e quindi recuperandolo nella funzione di preelaborazione della pagina) ma non ha funzionato neanche. Il che fa sorgere una domanda correlata: in che ordine vengono elaborate queste funzioni di preelaborazione? Mi sembra che la funzione di preprocesso della pagina preceda quella html, è corretta?

Risposte:


14

Avrai bisogno di una globalo di una staticvariabile per raggiungere questo obiettivo ... personalmente consiglierei di staticimplementare una funzione di supporto generica usando il modello statico di Drupal in questo modo:

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
}

Gli $varsarray per ciascuna funzione di preelaborazione sono oggetti completamente diversi in memoria, quindi non sarà possibile utilizzare quell'array per passare le cose. Ho visto questo tipo di pattern usato molto nel core di Drupal, quindi penso che sarebbe il modo migliore per andare.

MODIFICARE

Oh e sì, hook_preprocess_page()viene chiamato prima hook_preprocess_html()... per quanto ne so Drupal funziona in una sorta di "dentro-fuori", quindi hook_preprocess_html()probabilmente sarebbe l'ultimo che viene eseguito in una creazione di pagine.


3

Ho realizzato questo con un caso simile di 'nodo' e 'pagina' facendo:

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

quindi immagino che funzionerebbe allo stesso modo con 'page' e 'html' invece.


Sì, funzionerebbe. Ma non è molto efficiente perché quei $ var che necessitano di un qualche tipo di elaborazione farebbero quell'elaborazione più volte.
maxedison,

vero, se è qualcosa di pesante in comune tra le funzioni di preelaborazione, come impostare una variabile su un risultato sql complesso, sì, probabilmente non vorrai farlo più volte, ma questo è facilmente risolto con alcune static elaborazioni come la prima risposta. e le impostazioni di peso leggero potrebbero effettivamente essere più veloci poiché non si dispone della funzione overhead di chiamata di funzione per ciascuna variabile impostata, solo la prima volta che si chiama dalla funzione principale. E ovviamente le parti principali (nodo e pagina) vengono impostate una sola volta.
Jimajamma,
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.