如何提供特定视图模式的模板?


46

我想用模板为搜索结果查看模式设置主题。

我脑子里想出了一个模板文件节点--article--search-result.tpl.php可以解决这个问题,但是我显然错了。

我意识到我可以执行node--article.tpl.php并在$ view_mode检查中进行此操作,但是与其他所有我不想模板化的视图模式相比,这很尴尬。

有想法吗?

Answers:


45

在节点预处理功能中添加主题挂钩建议应该可以解决问题:

function MYMODULE_preprocess_node(&$vars) {
  if ($vars['node']->type == 'article' && $vars['view_mode'] == 'search_result') {
    $vars['theme_hook_suggestions'][] = 'node__article__search_result';
  }
}

清除缓存后,您应该可以使用node--article--search-result.tpl.php作为模板文件名。

注意 您也可以通过调用该函数在主题的template.php文件中执行此操作MYTHEME_preprocess_node()


2
辉煌!谢谢。即将在此处添加指向相同建议的链接:mearra.com/blogs/juha-niemi/drupal-7-custom-node-view-modes
artfulrobot 2012年

1
没问题:)仅供参考,search_result已经被声明为一个视图模式,这样你就不需要实现hook_entity_info_alter()你的情况
克莱夫

3

实体视图模式模块会自动将这些模板建议

Drupal 7到Build模式的后继者,它将允许管理员定义实体的自定义视图模式。自定义实体是通过hook_entity_info_alter()添加到实体注册表中的,因此它们可用于任何使用entity_get_info()为实体提供查看模式列表的代码。这包括节点和用户参考字段,视图等。


2

这是一项允许您动态添加新功能的功能。如果已声明一个预处理函数,它也会调用相应的预处理函数。

然后致电drush cache-clear theme-registry以使其正常工作。

要使用它,请用您的主题名称替换THEME,并将其放置在您的theme template.php文件中。

例如,对于名为Droid的主题,您可以将其命名为droid_preprocess_node(&$variables, $hook) {...

function THEME_preprocess_node(&$variables, $hook) {
  $view_mode = $variables['view_mode'];
  $content_type = $variables['type'];
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode;
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode . '_' . $content_type;

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode . '_' . $content_type;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }
}
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.