hook_preprocess_page (): วิธีบอกหน้ามุมมองอย่างไร


10

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

ฉันใช้ hook_preprocess_page แต่ฉันไม่สามารถบอกได้ว่าหน้าปัจจุบันมาจากมุมมอง:

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

ฉันรู้ว่าฉันสามารถใช้ไฟล์เทมเพลต (page-my_view_page_path.tpl.php) ได้ แต่ต้องรวม js และ css พิเศษเฉพาะเมื่อเปิดใช้งานโมดูลของฉันเท่านั้น ดังนั้นผมจึงชอบที่จะให้สิ่งนี้โดยตรงภายในโมดูลรหัสของฉัน

ไอเดีย?


คุณสามารถใช้ไฟล์เทมเพลตในโมดูลของคุณ
Jeremy French

@ Jeremy: เพิ่มคำตอบของคุณอธิบายวิธีการเพื่อให้ผู้คนสามารถลงคะแนนและโต้แย้ง
Strae

มันไม่ได้เกี่ยวข้องโดยตรงกับคำตอบเพียงแค่ชี้ให้เห็นว่าไฟล์ tpl สามารถรวมอยู่ในโมดูล DANieL ดูเหมือนจะแสดงว่าไม่สามารถทำได้
Jeremy French

ดี .. ฉันอาจรวมถึง page.tpl ธีม แต่เป้าหมายของฉันคือการเก็บโมดูลนี้โดยสิ้นเชิง indipendent จากรูปแบบ ..
Straßeการเดินทาง

คุณสามารถใช้เทมเพลตของ Views การประมวลผลโมดูลของคุณล่วงหน้าตามที่แนะนำในคำตอบของ Jeremy French
Pierre Buyle

คำตอบ:


12

views_get_page_view()ตรวจสอบว่ามีการใช้การดูหน้าเว็บแบบใดหากมี ถ้ามันส่งกลับ NULL แล้วหน้าปัจจุบันไม่ใช่หน้ามุมมอง '

แต่การใช้drupal_add_js()และdrupal_add_css()ใน a hook_preprocess_page()จะไม่ทำงานอย่างที่คาดไว้เพราะตัวแปร$scriptและ$styleตัวแปรถูกตั้งค่าไว้template_preprocess_page()แล้ว การประมวลผลเทมเพลตของมุมมองล่วงหน้า (ดูคำตอบของ Jeremy French) น่าจะเป็นที่ที่ดีกว่าในการเพิ่ม CSS และ JavaScript ของคุณ


ฉันอัปเดตคำตอบสำหรับคุณวรรคสอง - ฉันรู้ว่าเป็นวิธีปฏิบัติที่ดีในการเพิ่ม css หรือ js ในชุดรูปแบบ (theme_preprocess_ *) แต่ความต้องการของฉันคือโมดูลขึ้นอยู่กับ
Strae

ยอดเยี่ยม views_get_page_view เพิ่งได้รับมุมมองที่โหลดแล้วจากแคชดังนั้นจึงไม่ควรส่งผลกระทบต่อประสิทธิภาพ IMHO นี่ควรเป็นคำตอบที่ยอมรับได้
marcvangend

ข้อเสนอแนะ @Strae ของฉันคือการใช้HOOK_preprocess_views_view(&$variables)หรืออื่นชมเบ็ดแม่แบบ preprocess HOOK_preprocess_page(&$variables)แทน วิธีนี้คุณจะได้รับมุมมองใน$variablesและใช้drupal_add_js()และdrupal_add_css()ปลอดภัย
Pierre Buyle

11

มีเธรดที่มีความยาวบนตัวประมวลผลล่วงหน้าสำหรับมุมมองที่นี่ ความคิดเห็นนี้ดูเรียบง่ายสำหรับฉัน

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
}

ฉันยอมรับว่าการประมวลผลล่วงหน้าของมุมมองแทนที่จะเป็นทั้งหน้าอาจเป็นวิธีที่ถูกต้องมากกว่า
Garrett Albright

8

หากคุณอยู่ใน hook_preprocess_page () ดังนั้นตามนิยามมุมมองของคุณจะมีการแสดงหน้าและเส้นทางเมนูซึ่งจะต้องไม่ซ้ำกัน - เพื่อให้คุณสามารถทำสิ่งนี้:

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([...]);
    }
}

หากคุณมีข้อโต้แย้งที่ถูกส่งผ่านมายังหน้านี้คุณจำเป็นต้องมีส่วนของ$_GET['q']ให้ทำสิ่งนี้แทนด้วยarg()ฟังก์ชั่นของ Drupal :

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

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


ฉันจะไม่แนะนำให้ตรวจสอบ $ _GET ['q'] ใช้menu_get_item ()หรือmenu_get_object ()แทน ไม่จำเป็นต้องมีอาร์กิวเมนต์หากคุณกำลังตรวจสอบหน้าปัจจุบันและพวกเขาทั้งสองแคชผลลัพธ์ของพวกเขา
Mikey P

การใช้ drupal_add_js () และ drupal_add_css () ใน hook_preprocess_page () จะไม่ทำงานอย่างที่คาดไว้เนื่องจากตัวแปร $ script และตัวแปรสไตล์ $ ถูกตั้งค่าโดย template_preprocess_page () ผู้ใช้ views_get_page_view () เพื่อดึงมุมมองสำหรับหน้าปัจจุบัน (ถ้ามี)
Pierre Buyle

3

สำหรับฉันอันนี้ใช้งานได้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.