hook_preprocess_page (): görünümler sayfası nasıl söylenir?


10

Im sadece bir Views sayfasına bazı javascript ve css dosyaları eklemek gerekir özel bir modül yazma.

Im hook_preprocess_page kullanarak, ancak geçerli sayfanın bir görünümden olup olmadığını söyleyemem:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

Bir şablon dosyası (page-my_view_page_path.tpl.php) kullanabileceğimi biliyorum, ancak js ve extra css yalnızca modülüm etkinse dahil edilmelidir; bu yüzden bunu doğrudan modül kodumda tutmak istiyorum .

Fikirler?


Modülünüzdeki şablon dosyalarını kullanabilirsiniz.
Jeremy French

@Jeremy: insanların nasıl oy kullanabileceğini ve tartışabileceğini açıklayan cevabınızı ekleyin.
Strae

Yanıtla doğrudan ilgili değildi, sadece bir tpl dosyasının bir modüle dahil edilebileceğine işaret etti. bir DANieL bunu yapamayacağını gösteriyor gibi görünüyordu.
Jeremy French

şey .. ben tema page.tpl içerebilir, ama benim amacım bu modül tema tamamen bağımsız tutmak ..
Strae

Jeremy Fransızca'nın yanıtında önerildiği gibi, modülünüzün ön işlemlerini gerçekleştirirken Views şablonlarını uygulayabilirsiniz.
Pierre Buyle

Yanıtlar:


12

views_get_page_view()şu anda hangi sayfa görünümünün kullanımda olduğunu öğrenir. NULL döndürürse, geçerli sayfa bir görünümler sayfası değildir.

Ama kullanarak drupal_add_js()ve drupal_add_css()bir de hook_preprocess_page()değişken çünkü beklendiği gibi çalışmaz $scriptve $styledeğişkenler zaten tarafından seti olmuştur template_preprocess_page(). Views'ın şablon önişlemesi (bkz. Jeremy French'in cevabı) muhtemelen CSS ve JavaScript'inizi eklemek için daha iyi bir yerdir.


Sana ikinci paragraf için cevabımı güncelledim - biliyorum tema (theme_preprocess_ *) css veya js eklemek için iyi bir uygulama, ama benim ihtiyaç modül dependandt.
Strae

Mükemmel, views_get_page_view zaten yüklü olan görünümü önbellekten alır, bu nedenle performans etkisi olmamalıdır. IMHO bu kabul edilen cevap olmalı.
marcvangend

@Strae Benim önerim HOOK_preprocess_views_view(&$variables)veya başka bir Views 'şablon önişleme kancası kullanmak yerine HOOK_preprocess_page(&$variables). Bu şekilde görüşlerini alabilirsiniz $variablesve kullanım drupal_add_js()ve drupal_add_css()güvenli bir şekilde.
Pierre Buyle

11

Buradaki görünümler için önişlemcilerde uzun bir iplik var. Bu yorum benim için çok basit görünüyor.

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}

Görünümün tüm sayfa yerine çıktısını önceden işlemenin muhtemelen daha doğru bir yaklaşım olduğunu kabul ediyorum.
Garrett Albright

8

Eğer bir hook_preprocess_page () içindeyseniz, tanım gereği, görünümünüzün bir sayfa görüntüsü ve benzersiz olması gereken bir menü yolu vardır - böylece bunu yapabilirsiniz:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

Bu sayfaya iletilen bağımsız değişkenleriniz varsa, bunun kısımlarına ihtiyacınız varsa $_GET['q'], bunun yerine Drupal'ın arg()işleviyle bunu yapın:

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg


$ _GET ['q'] incelemenizi önermem. Kullan menu_get_item () veya menu_get_object () yerine. Geçerli sayfayı inceliyorsanız ikisi de bağımsız değişken gerektirmez ve her ikisi de sonuçlarını önbelleğe alır.
Mikey P

Hook_preprocess_page () içinde drupal_add_js () ve drupal_add_css () kullanılması, $ script ve $ stil değişkenleri zaten template_preprocess_page () tarafından ayarlandığı için beklendiği gibi çalışmaz. Geçerli sayfanın (varsa) görünümünü almak için views_get_page_view () öğesini kullanın.
Pierre Buyle

3

Benim için bu işe yarıyor:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}

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.