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;所以我喜欢把这些东西直接放在我的模块代码中

有想法吗?


您可以在模块中使用模板文件。
杰里米·法兰西

@杰里米(Jeremy):添加您的答案以说明方式,以便人们可以投票和辩论。
Strae 2011年

它与答案没有直接关系,只是指出可以将tpl文件包含在模块中。DANieL似乎表明不可能。
杰里米·法兰西

好..我包括主题page.tpl,但我的目标是把这个模块从主题完全indipendent ..
Strae

您可以按照Jeremy French的答案中的建议,实现Views的模板预处理模块。
Pierre Buyle

Answers:


12

views_get_page_view()找出当前正在使用的页面视图(如果有)。如果返回NULL,则当前页面不是视图页面。

但是,使用drupal_add_js()drupal_add_css()hook_preprocess_page()预期,因为变量将无法正常工作$script$style变量通过已经设定template_preprocess_page()。Views的模板预处理(请参阅Jeremy French的答案)可能是添加CSS和JavaScript的更好位置。


我在第二段为您更新了答案-我知道在主题(theme_preprocess_ *)中添加css或js是一个好习惯,但是我需要模块依赖。
Strae 2011年

很好,views_get_page_view只是从缓存中获取已经加载的视图,因此不会对性能造成影响。恕我直言,这应该是公认的答案。
marcvangend 2011年

@Strae我的建议是使用HOOK_preprocess_views_view(&$variables)或其他Views的模板预处理钩子代替HOOK_preprocess_page(&$variables)。这样你可以得到的意见$variables,并使用drupal_add_js()drupal_add_css()安全。
Pierre Buyle,2015年

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'],然后使用Drupal的arg()函数执行此操作:

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

在hook_preprocess_page()中使用drupal_add_js()和drupal_add_css()不能按预期方式工作,因为template_preprocess_page()已设置了变量$ script和$ style变量。用户views_get_page_view()检索当前页面的视图(如果有)。
Pierre Buyle

3

对我来说,这有效:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.