6

我的 Drupal 7template.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'));
    }

仅当显示此视图时,我才需要加载这些 css 和 js 文件。

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

覆盖文件是:

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

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

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

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

4

1 回答 1

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

您还可以通过实现一个通用预处理函数来添加您期望的行为,该函数尝试通过检查具有正确名称的函数来调用特定版本 - 请参阅本文末尾示例 - 但这会引入相当多的处理开销并且只会使感觉,如果您需要许多视图的特定预处理功能。

您可以直接实现每种视图类型的更多“基本”预处理功能 - 请参阅template_preprocess_views_view_*“views/theme/theme.inc”中的列表以获取可用选项。

As a base rule, whenever there is a template_preprocess_* function for a template, you can implement a corresponding yourThemeOrModuleName_preprocess_* function as well. If you need to manipulate for templates based on template name suggestions, you need to find the 'base' preprocess function name, implement that and check for your specific case in that function (like for the specific view as in the example above).

于 2012-05-04T10:26:25.493 回答