Değişkenleri html önişleme işlevinden sayfa önişleme işlevine geçirilsin mi?


10

Özel temam hook_preprocess_page()ve hook_preprocess_html()işlevlerimde, genellikle aynı bilgileri tanımlamam gerekir. Eğer aynı bilgiyi tanımlamak her ikisini de bir kez yapmak ve daha sonra bu bilgileri diğer önişleme fonksiyonuna iletmek çok daha mantıklı olacaktır. Bunu nasıl yapabilirim? Aşağıdakileri denedim ama işe yaramadı:

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

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

Ayrıca (önişleme html işlevinde değer ayarlama ve sonra sayfa önişleme işlevinde alma) etrafında başka bir şekilde denedim ama o da işe yaramadı. Hangisi ilgili bir soruyu gündeme getirir: bu önişlem fonksiyonları hangi sırayla işlenir? Bana öyle geliyor ki sayfa önişleme fonksiyonu html olandan önce geliyor, doğru mu?

Yanıtlar:


14

Bunu başarmak için bir globalveya staticdeğişkene ihtiyacınız olacak ... kişisel olarak staticDrupal'ın statik desenini kullanarak genel bir yardımcı işlevle devam etmenizi ve uygulamayı tavsiye ederim :

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
}

$varsEğer etrafında şeyleri geçirmek üzere bu diziyi kullanmak mümkün olmayacaktır böylece her preprocess fonksiyonu için diziler bellekte bambaşka nesnelerdir. Drupal çekirdeğinde bu tür desenlerin çok kullanıldığını gördüm, bu yüzden gitmek için en iyi yol olacağını düşünüyorum.

DÜZENLE

Oh ve evet, hook_preprocess_page()daha önce çağrılıyor hook_preprocess_html()... Bildiğim kadarıyla Drupal bir tür "içten dışa" şekilde çalışıyor, bu yüzden hook_preprocess_html()muhtemelen bir sayfa derlemesinde çalışan sonuncusu olurdu.


3

Bunu benzer bir 'düğüm' ve 'sayfa' örneği ile başardım:

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

bu yüzden bunun yerine 'page' ve 'html' ile benzer şekilde çalışacağını düşünürdüm.


Evet, işe yarar. Ama çok verimli değil çünkü bir çeşit işleme ihtiyacı olan bu $ değişkenleri, bu işlemin birden çok kez yapılmasını sağlayacaktır.
maxedison

doğru, bazı karmaşık sql sonucuna bir değişken ayarlamak gibi önişleme işlevleri arasında ortak bir şey varsa, evet, muhtemelen birden çok kez yapmak istemezsiniz, ancak bu static ilk cevap gibi bazı işlemlerle kolayca çözülür . ve hafif ayarlar aslında daha hızlı olabilir, çünkü her bir değişken seti için fonksiyon çağrısı ek yükü yoktur, sadece ana fonksiyondan ilk çağrıda. Ve belli ki büyük bölümler (düğüm ve sayfa) sadece bir kez ayarlanır.
Jimajamma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.