Bir görünüme özgü JavaScript'i nasıl eklerim?


26

Sitemde belirli bir sınıf adı olan bir manzara var. Bir temanın template.php dosyasında, istenen sayfada belirli bir sınıf adına sahip bir görünüm olup olmadığını nasıl bilebilirim.

Bu benim için çok önemli çünkü belirli bir sınıf adına sahip bir görüntü (resim galerisi gibi) bir sayfada kullanıldığında belirli JavaScript ve CSS eklemem gerekiyor.

Yanıtlar:


40

Bunu template_preprocess_views_view()yapmak için kancayı kullanabilirsiniz :

function THEME_preprocess_views_view(&$vars) {
  $view = &$vars['view'];
  // Make sure it's the correct view
  if ($view->name == 'your-view-name') {
    // add needed javascript
    drupal_add_js(drupal_get_path('theme', 'your-theme') . '/your-js.js');
    // add needed stylesheet
    drupal_add_css(drupal_get_path('theme', 'your-theme') . '/your-css.css');
  }
}

Aşağıdakileri kullanarak görünümün belirli görüntüsünü de kontrol edebileceğinizi unutmayın:

if ($view->name == 'your-view-name' && $view->current_display == 'your-display-id') {
  // include javascript & css here
}

Bunun gibi özel bir css sınıfını kontrol edebilmelisiniz:

if ($view->name == 'your-view-name' && $view->display[$view->current_display]->display_options['css_class'] == 'your-css-class') {
   // include javascript & css here
}

Çok teşekkürler, ancak bu işlev görünümü adıyla tanıyor, Sınıf adını tanımak istiyorum, çünkü bir sayfada aynı sınıf adına sahip birkaç görünüm var. örneğin 2 görünümde 'galeri-resim' sınıf adı, 3 görünümde 'light-box' sınıf adı var. Sayfada 'light-box' css sınıf ismi ile bir görünüm varsa, örneğin js eklemek istiyorum.
Mehrdad201

Sadece ekranı kontrol edemez misin? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
Cyclonecode

hayır, çünkü sayfada kaç görüntülenme olduğu açık değil. Belki de hepsinin aynı css sınıf adına sahip olduğu 10 görüş vardı.
Mehrdad201

Bu kancayı kullandım ve tüm önbellekleri temizledim - ama çağrılmadı. Emin değilim neden. Evet ismini iki kere kontrol ettim.
jdhildeb

Bu çok garip görünüyor? TEMA'yı gerçek temanın adı ile mi değiştirdin? Doğru uyguladığınız sürece bu işe yarayacaktır.
Cyclonecode

8

Sayfada hangi görünümün sunulmakta olduğunu bulmak için views_get_page_view işlevini kullanabilirsiniz. Görüntüleme nesnesini döndürür. Aşağıdaki kod pasajında, görünüm makinesinin okunabilir adıyla karşılaştırmanız gerektiğini unutmayın; ancak elbette views_get_page_view tarafından döndürülen görüntüleme nesnesine dayanarak kendi karşılaştırmanızı yazabilirsiniz.

function YOURTHEMENAME_preprocess_page(&$variables) {
    $view = views_get_page_view();
    if($view->name == 'YOURVIEW') {
    //Do what ever you want 
    }

6

Sırf bu soruya rastlayan herhangi biri için faydalı olması durumunda, Drupal View'a JavaScript eklemek için yaptığım gibi arama . D7 ve Gösterim 3.7 açısından, aşağıdakiler benim için en iyisidir:

function HOOK_views_pre_render ( &$view ) { 
  /// check to make sure the view has a classname
  if ( $view->display_handler && !empty($view->display_handler->options['css_class']) ) {
    $cln = $view->display_handler->options['css_class'];
    $cls = 'CLASS GOES HERE';
    /// test that the classname contains our class
    if ( preg_match('/(^|\s+)' . preg_quote($cls) . '(\s+|$)/i', $cln) ) {
      /// build the path to the js, which is local to my module, js/view.js
      $sep = DIRECTORY_SEPARATOR;
      $dir = rtrim(drupal_get_path('module', 'HOOK'), $sep);
      $pth = "{$dir}{$sep}js{$sep}view.js";
      drupal_add_js($pth);
    }
  }
}

Bu, tema yerine kodumu modülümde tutmak istediğim için faydalıydı - çünkü JavaScript'in getirdiği yeniliklerin görsel görünümle hiçbir ilgisi yoktu.

NOT: Açıkçası HOOK, her iki yerde de modül adınız CLASS GOES HEREile değiştirilmeli ve ayrıca aradığınız sınıfla değiştirilmelidir.


Netlik açısından, pre_render neden pre_process'ten daha iyi?
Nick

@Nick ~ Bu yöntemi kullanmanın nedenini anlamadığınız sürece bir HOOK_views_pre_process( api.drupal.org/api/views/views.api.php/7 ) bulunmazTHEME_preprocess_views_view - bu durumda bu yalnızca tercih edilme olasılığını ortadan kaldırır . kod değişikliklerinizi eklemek istersiniz. HOOK_views_pre_renderBir modülün içine bağlanabilir, oysa THEME_preprocess_views_viewtema / şablon dosyanızda yer almalıdır. İsterseniz de kullanabilirsiniz HOOK_views_post_render.
Pebbl

Üzgünüm, demek istedim THEME_preprocess_views_view, evet ... Daha hook_preprocess_views_viewönce modüllerde yaptığımdan eminim .
Nick,

4

Eğer drupal 6 veya 7'deyseniz, javascript varlıklarını da modül bağlamı ekle varlıklarına dahil edebilirsiniz. Hangi bağlam gerektirir, ancak görünüm oluşturulurken her zaman ekleneceğinden emin olabilirsiniz.

https://drupal.org/project/context_addassets

Modülün proje sayfasından:

Belirli bir görünüm veya blok oluşturulurken hiç javascript veya css eklemek istediniz mi? Veya hiç kod yazmak zorunda kalmadan sadece ön sayfa için javascript veya css eklemek istediniz mi?

Bağlam ekleme varlıkları bunu yapmanıza izin verir. Bunları herhangi bir kod yazmadan yapabilmeniz için kullanıcı arayüzünü kullanmak kolaydır. Ctools kullandığı için bunların hepsi de ihraç edilebilir.


2

JQuery's hasClass () öğesini kullanarak görünümde belirli bir sınıfı arayan JavaScript kodunu yazın ve koşul yerine getirildiğinde JavaScript dosyanızı ekleyin.

Başka bir yol, görünümünüz için bir şablon koymak ve drupal_add_js () kullanarak bu şablona JavaScript kodu eklemektir .


Söyler misiniz, bunu nasıl yapabilirim. Nitekim, java betiğinde koşullu bir ifade verildikten sonra css ve js dosyalarını nasıl içerebilir?
Mehrdad201

Drupal 8 için bu cevap, görüntüleme çıktısı için özel bir görünüm şablonunun nasıl yapılacağını ana hatlarıyla
belirtir
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.