【问题标题】:Drupal 7 preprocess_views not workingDrupal 7 preprocess_views 不工作
【发布时间】:2012-05-03 14:50:10
【问题描述】:

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

只有在显示这个视图时才需要加载这些css和js文件。

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

覆盖文件是:

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

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

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

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

【问题讨论】:

  • 是双 __videos__videos 只是一个错字吗?如果视图名称是“视频”,我希望[yourThemeName]_preprocess_views_view__videos(&$vars)
  • 我认为这是因为显示名称是视频,在这种情况下机器名称是视频。上面列出的模板文件完美运行,它们是视频——视频。我会尝试删除一个以防万一。谢谢
  • 等一下,我想我被某些东西弄错了,所以我想它也只适用于一个“__videos”。将重新检查并添加答案。

标签: drupal drupal-7 drupal-views drupal-templates


【解决方案1】:

问题很可能是您尝试基于与模板覆盖相同的命名模式来实现预处理功能。但是预处理函数有点不同,默认情况下,它们只能基于“base”模板的名称来实现,并且对于基于模板建议的“特定”版本没有相同的机制。详情请见我的answer to a more generic question

因此,您需要回退到实现“基本”预处理函数,并检查它是否被该函数中所需的视图(以及可选的显示)调用,大致如下:

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

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

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

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

【讨论】:

  • 哇!非常感谢您提供如此清晰而详细的答案。我无法表达我多么感谢您为帮助您甚至不认识的人所做的努力。我可以确认你的答案是 100% 正确的!!测试和工作!再次感谢@Henrik Opel
  • 对于您出色答案的未来读者,我想指出,这首先是必要的,因为 Drupal 7 核心中有一个重大错误。查看此问题了解更多详情:drupal.org/node/939462
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多