ho_preprocess_page (): як сказати сторінку переглядів?


10

Я пишу користувальницький модуль, у який потрібно вставити деякі файли javascript та css лише на сторінку "Views".

Я використовую_up_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: додайте свою відповідь, пояснюючи як, щоб люди могли голосувати і сперечатися.
Strae

Це не було безпосередньо пов'язано з відповіддю, лише вказавши, що файл tpl може бути включений в модуль. DANieL ніби вказував на те, що він не може.
Джеремі Френч

добре .. я міг би включити тему page.tpl, але моя мета - тримати цей модуль повністю незалежно від теми ..
Strae

Ви можете реалізувати шаблони поглядів, попередньо обробивши ваш модуль, як це запропоновано у відповіді Джеремі Френч.
П’єр Буйле

Відповіді:


12

views_get_page_view()з'ясовує, що, якщо є, перегляд сторінки використовується зараз. Якщо він повертає NULL, поточна сторінка не є сторінкою переглядів.

Але використання drupal_add_js()та drupal_add_css()в hook_preprocess_page()не буде працювати, як очікувалося, тому що змінна $scriptта $styleзмінні вже встановлені template_preprocess_page(). Попередня обробка шаблонів Views (див. Відповідь Джеремі Френч), мабуть, краще місце для додавання ваших CSS та JavaScript.


Я оновив свою відповідь для вас другий абзац - я знаю, що є хорошою практикою додавати css або js у тему (theme_preprocess_ *), але моя потреба - модуль залежної.
Strae

Відмінно, views_get_page_view просто отримує вже завантажений вид з кешу, тому він не повинен впливати на ефективність. ІМХО, це має бути прийнятою відповіддю.
marcvangend

@Strae Моя пропозиція була використовувати HOOK_preprocess_views_view(&$variables)або інший Views 'шаблон предобработки гак замість HOOK_preprocess_page(&$variables). Таким чином , ви можете отримати точку в $variablesі використовувати drupal_add_js()і drupal_add_css()безпечно.
П'єр Буйле

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
}

Я погоджуюся, що попередня обробка результатів Перегляду замість усієї сторінки, ймовірно, є більш правильним підходом.
Гаррет Олбрайт

8

Якщо ви перебуваєте на ho_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 () у гачку_preprocess_page () не працюватиме, як очікувалося, оскільки змінні $ script та змінні $ style вже встановлені template_preprocess_page (). User views_get_page_view (), щоб отримати перегляд для поточної сторінки (якщо вона є).
П’єр Буйле

3

Для мене це працює:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.