Drupal 7 preprocess_views不起作用

Cyb*_*ell 6 drupal drupal-views drupal-7 drupal-templates

我在Drupal 7 template.php文件中有以下代码:

 function mytheme_preprocess_views_view__videos__videos(&$vars) {
        drupal_add_css(drupal_get_path('theme', 'mytheme') . "/css/qwembed-jquery-1.0.css");
        drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/jquery.swfobject.1-1-1.min.js', array('type' => 'file', 'scope' => 'footer'));
        drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/qwembed-jquery-1.0.js', array('type' => 'file', 'scope' => 'footer'));
    }
Run Code Online (Sandbox Code Playgroud)

我只需要在显示此视图时加载这些css和js文件.

视图显示名称为:Videos 视图机器名称为:videos

和覆盖文件是:

views-view--videos--videos.tpl.php

views-view-unformatted--videos--videos.tpl.php

views-view-fields--videos--videos.tpl.php
Run Code Online (Sandbox Code Playgroud)

任何想法为什么这不起作用?

Hen*_*pel 22

问题很可能是您尝试基于与模板覆盖相同的命名模式实现预处理功能.但是预处理函数有点不同,默认情况下,它们只能基于"基础"模板的名称实现,并且不具有基于模板建议的"特定"版本的相同机制.有关详细信息,请参阅我对更通用问题的回答.

所以你需要回到实现'base'预处理函数,并检查它是否在该函数中调用所需的视图(并可选择显示),大致如下:

function [yourThemeName]_preprocess_views_view(&$vars) {
  $view = $vars['view'];
  if ('videos' == $view->name) {
    // Add desired manipulations for all 'videos' views
    if ('videos' == $view->current_display) {
      // Add desired manipulations for the 'videos' display only
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

可能还可以添加你通过实现尝试通过适当的名称为功能检查调用特定版本的通用预处理功能所期望的行为-见结束这篇文章的一个例子-但是这引入了相当长的一段处理开销,并只会使感觉,如果你需要许多视图的特定预处理功能.

每种视图类型都有更多"基本"预处理函数可以直接实现 - 请参阅template_preprocess_views_view_*"views/theme/theme.inc" 列表中的可用选项.

作为基本规则,只要有template_preprocess_*模板功能,您也可以实现相应的yourThemeOrModuleName_preprocess_*功能.如果需要根据模板名称建议操作模板,则需要找到"基本"预处理函数名称,实现该函数并检查该函数中的特定情况(如上例中的特定视图).

  • 哇!!!非常感谢你这么清楚详细的答案.我无法表达我多么感激你为帮助一个你甚至不知道的人而付出的努力.我可以确认你的答案100%正确!! 测试和工作!! 再次感谢@Henrik Opel (2认同)