ฉันจะเพิ่ม JavaScript เฉพาะสำหรับมุมมองได้อย่างไร


26

ฉันมีมุมมองในไซต์ของฉันที่มีชื่อคลาสเฉพาะ ฉันต้องการทราบว่าภายในไฟล์ template.php ของชุดรูปแบบฉันจะทราบได้อย่างไรว่ามุมมองที่มีชื่อคลาสเฉพาะนั้นมีอยู่ในหน้าเว็บที่ร้องขอ

สิ่งนี้สำคัญมากสำหรับฉันเพราะฉันต้องรวม JavaScript และ CSS เฉพาะเมื่อใช้มุมมองที่มีชื่อคลาสที่เฉพาะเจาะจง (เช่นแกลเลอรี่ภาพ) ในเพจ

คำตอบ:


40

คุณสามารถใช้template_preprocess_views_view()เบ็ดทำสิ่งนี้:

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

โปรดทราบว่าคุณสามารถตรวจสอบการแสดงผลของมุมมองโดยใช้:

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

คุณควรจะตรวจสอบคลาส css ที่กำหนดเองเช่นนี้:

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

ขอบคุณมาก แต่ฟังก์ชั่นนี้รับรู้มุมมองตามชื่อฉันต้องการจดจำชื่อคลาสเนื่องจากมีหลายมุมมองในหน้าเดียวที่มีชื่อคลาสเดียวกัน ตัวอย่างเช่น 2 มุมมองมีชื่อคลาส 'แกลเลอรี่ภาพ' และ 3 มุมมองมีชื่อคลาส 'กล่องไฟ' ฉันต้องการเพิ่ม js เช่นหากมุมมองที่มีชื่อคลาส css 'กล่องไฟ' มีอยู่ในหน้า
Mehrdad201

คุณไม่สามารถตรวจสอบจอแสดงผลใช่หรือไม่ if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
Cyclonecode

ไม่เพราะยังไม่ชัดเจนว่ามีจำนวนการดูในหน้าเท่าใด อาจมีการดู 10 ครั้งที่ทุกคนมีชื่อคลาส css เหมือนกัน
Mehrdad201

ฉันใช้ตะขอนี้และล้างแคชทั้งหมด - แต่มันไม่ได้ถูกเรียก ไม่แน่ใจว่าทำไม ใช่ฉันตรวจสอบชื่ออีกครั้ง
jdhildeb

ดูเหมือนจะแปลกมากใช่ไหม คุณเปลี่ยนธีมด้วยชื่อธีมจริงของคุณหรือไม่ สิ่งนี้จะทำงานได้ดีตราบใดที่คุณใช้อย่างถูกต้อง
Cyclonecode

8

คุณสามารถใช้ฟังก์ชัน views_get_page_view เพื่อค้นหามุมมองที่จะแสดงบนหน้า มันจะคืนค่ามุมมองวัตถุ โปรดทราบว่าในข้อมูลโค้ดด้านล่างคุณควรเปรียบเทียบกับชื่อเครื่องอ่านที่อ่านได้ของวิว แต่แน่นอนว่าคุณสามารถเขียน comparaison ของคุณเองโดยอ้างอิงจากมุมมองวัตถุที่ส่งคืนโดย views_get_page_view

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

6

ในกรณีนี้จะเป็นประโยชน์กับคนอื่นสะดุดข้ามคำถามนี้ค้นหาเช่นผมไม่สำหรับแนบ JavaScript กับ Drupal ดู ในแง่ของ D7 & Views 3.7 ต่อไปนี้ทำงานได้ดีที่สุดสำหรับฉัน:

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

สิ่งนี้มีประโยชน์เนื่องจากฉันต้องการเก็บรหัสไว้ในโมดูลของฉันแทนที่จะเป็นธีม - เนื่องจากการปรับปรุงที่นำเสนอโดย JavaScript ไม่มีส่วนเกี่ยวข้องกับลักษณะที่ปรากฏทางภาพ

หมายเหตุ:เห็นได้ชัดว่าHOOKควรจะถูกแทนที่ด้วยชื่อโมดูลของคุณในสถานที่ทั้งสองและCLASS GOES HEREก็ควรจะถูกแทนที่ด้วยชั้นเรียนที่คุณกำลังค้นหา


เพื่อความชัดเจนทำไม pre_render ถึงดีกว่า pre_process
Nick

@ Nick ~ ไม่มีHOOK_views_pre_process( api.drupal.org/api/views/views.api.php/7 ) จนกว่าคุณจะหมายถึงเหตุผลที่จะใช้มากกว่านี้THEME_preprocess_views_view- ในกรณีที่มันเป็นเพียงออกจากการตั้งค่าของการที่ คุณต้องการเพิ่มการแก้ไขโค้ดของคุณ HOOK_views_pre_renderสามารถเชื่อมต่อจากโมดูลได้ในขณะที่THEME_preprocess_views_viewควรไปในไฟล์ธีม / แม่แบบของคุณ คุณสามารถใช้HOOK_views_post_renderถ้าคุณต้องการ
Pebbl

ขอโทษทีฉันหมายความว่าTHEME_preprocess_views_viewใช่แล้ว ... ฉันแน่ใจว่าฉันเคยทำhook_preprocess_views_viewในโมดูลมาก่อน
Nick

4

หากคุณใช้ drupal 6 หรือ 7 คุณสามารถรวมเนื้อหาจาวาสคริปต์เข้ากับบริบทของโมดูลเพิ่มเนื้อหาได้ ซึ่งต้องใช้บริบท แต่คุณจะมั่นใจได้ว่าจะมีการรวมไว้เสมอเมื่อมีการแสดงผลมุมมอง

https://drupal.org/project/context_addassets

จากหน้าโครงการของโมดูล:

คุณเคยต้องการที่จะรวมจาวาสคริปต์หรือ CSS เมื่อมีการแสดงผลมุมมองหรือบล็อกที่เฉพาะเจาะจงหรือไม่? หรือคุณเคยต้องการที่จะรวม javascript หรือ css ไว้สำหรับหน้าแรกโดยไม่ต้องเขียนโค้ด?

การเพิ่มเนื้อหาตามบริบทช่วยให้คุณทำสิ่งนี้ได้ มี UI ที่ใช้งานง่ายเพื่อให้คุณทำสิ่งนี้ได้โดยไม่ต้องเขียนโค้ดใด ๆ เพราะมันใช้ ctools ทั้งหมดนี้ก็สามารถส่งออกได้เช่นกัน


2

เขียนโค้ด JavaScript ที่ค้นหาคลาสเฉพาะในมุมมองโดยใช้ jQuery's hasClass ()และรวมไฟล์ JavaScript ของคุณเมื่อตรงตามเงื่อนไข

อีกวิธีหนึ่งคือการใส่แม่แบบสำหรับมุมมองของคุณและเพิ่ม JavaScript รหัสผ่านแม่แบบที่ใช้drupal_add_js ()


คุณบอกฉันได้ฉันจะทำสิ่งนี้ได้อย่างไร แน่นอนว่าสามารถรวมไฟล์ css และ js หลังจากนิพจน์เงื่อนไขในจาวาสคริปต์เป็นจริงได้อย่างไร!
Mehrdad201

สำหรับ Drupal 8 คำตอบนี้จะสรุปวิธีสร้างเทมเพลตมุมมองที่กำหนดเองสำหรับเอาต์พุตมุมมองเพื่อทำสิ่งนี้: stackoverflow.com/a/43131240/227926
therobyouknow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.