Lewati variabel dari fungsi preproses html ke fungsi preproses halaman?


10

Dalam tema hook_preprocess_page()dan hook_preprocess_html()fungsi khusus saya, saya sering perlu mengidentifikasi informasi yang sama. Alih-alih menjalankan dasarnya sama jika pernyataan memeriksa di kedua mengidentifikasi info yang sama, itu akan jauh lebih masuk akal untuk melakukannya sekali di keduanya dan kemudian meneruskan info itu ke fungsi preprocess lainnya. Bagaimana saya bisa melakukan ini? Saya mencoba yang berikut tetapi tidak berhasil:

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

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

Saya juga mencobanya sebaliknya (menetapkan nilai dalam fungsi html preprocess dan kemudian mengambilnya di fungsi preprocess halaman) tetapi itu tidak berhasil. Yang memunculkan pertanyaan terkait: dalam urutan apa fungsi preproses ini, eh, diproses? Sepertinya saya bahwa fungsi preproses halaman datang sebelum html, apakah itu benar?

Jawaban:


14

Anda akan memerlukan variabel globalatau staticuntuk menyelesaikan ini ... secara pribadi saya akan merekomendasikan pergi dengan staticdan menerapkan fungsi pembantu umum menggunakan pola statis Drupal seperti:

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
}

The $varsarray untuk setiap fungsi preprocess adalah objek yang sama sekali berbeda dalam memori sehingga Anda tidak akan dapat menggunakan array untuk lulus hal-hal di sekitar. Saya telah melihat pola semacam ini banyak digunakan dalam inti Drupal jadi saya pikir itu akan menjadi cara terbaik untuk pergi.

EDIT

Oh dan ya, hook_preprocess_page()dipanggil sebelumnya hook_preprocess_html()... sejauh yang saya tahu Drupal bekerja dengan cara "dalam-luar" jadi hook_preprocess_html()mungkin yang terakhir dijalankan dalam pembuatan halaman.


3

Saya menyelesaikan ini dengan kasus 'node' dan 'halaman' yang serupa dengan melakukan:

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

jadi saya membayangkan itu akan bekerja sama dengan 'halaman' dan 'html' sebagai gantinya.


Ya, itu akan berhasil. Tapi itu tidak terlalu efisien karena $ vars yang memerlukan semacam pemrosesan akan melakukan pemrosesan yang berkali-kali.
maxedison

benar, jika itu adalah sesuatu yang berat di antara fungsi preprocess, seperti mengatur variabel ke beberapa hasil sql yang kompleks, ya, Anda mungkin tidak ingin melakukannya berkali-kali, tetapi itu mudah diselesaikan dengan beberapa static pemrosesan seperti jawaban pertama. dan pengaturan ringan mungkin sebenarnya lebih cepat karena Anda tidak memiliki overhead panggilan fungsi untuk masing-masing dan setiap set variabel, hanya pertama kalinya dalam panggilan dari fungsi utama. Dan jelas bagian-bagian utama (node ​​& halaman) hanya bisa ditetapkan sekali.
Jimajamma
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.