hook_preprocess_page (): как узнать страницу просмотров?

10

Я пишу пользовательский модуль, который должен вставить некоторые файлы JavaScript и 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 должны быть включены, только если мой модуль включен; поэтому мне нравится хранить эти вещи прямо внутри кода моего модуля .

Идеи?

Strae
источник
Вы можете использовать файлы шаблонов в вашем модуле.
Джереми Френч
@ Джереми: добавьте свой ответ, объясняющий как, чтобы люди могли голосовать и спорить.
Stra
Это не было напрямую связано с ответом, просто указывало, что файл tpl может быть включен в модуль. Даниэль, казалось, указывал, что не может.
Джереми Френч
хорошо .. я мог бы включить тему page.tpl, но моя цель - сохранить этот модуль полностью независимым от темы ..
Strae
Вы можете реализовать шаблоны Views, предварительно обработав ваш модуль, как предложено в ответе Джереми Френча.
Пьер Байль,

Ответы:

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)или обработчик предварительной обработки шаблона Представлений вместо 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
}
Джереми Френч
источник
Я согласен, что предварительная обработка вывода View вместо всей страницы, вероятно, является более правильным подходом.
Гаррет Олбрайт,
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

Greg
источник
Я бы не рекомендовал проверять $ _GET ['q']. Используйте взамен menu_get_item () или menu_get_object () . Ни один из них не требует аргумента, если вы просматриваете текущую страницу, и они оба кешируют свои результаты.
Майки П
Использование drupal_add_js () и drupal_add_css () в hook_preprocess_page () не будет работать должным образом, потому что переменные $ script и $ style уже были установлены с помощью template_preprocess_page (). Пользователь views_get_page_view (), чтобы получить представление для текущей страницы (если есть).
Пьер Байль,
3

Для меня это работает:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}
leymannx
источник
2

Если вы добавляете JS или CSS к определенному обратному вызову, лучше использовать hook_page_build():

Саймон Полстон
источник