如何以编程方式更改视图模式?


11

我想以编程方式更改节点的查看模式。我使用hook_preprocess_node(&$vars)并设置了视图模式:

function moduleName_preprocess_node(&$vars) {
      // if conditions to apply particular view mode
      $vars['view_mode'] = 'teaser';
      $vars['elements']['#view_mode'] = 'teaser';
}

但这没有按预期工作。我在这里想念什么吗?


您是否尝试过审查?drupal.org/node/1334206
chrisjlee

Answers:


13

在预处理功能中更改视图模式太晚了。
更改视图模块的正确方法是实现hook_entity_view_mode_alter(),该方法在呈现实体内容之前被调用。例如,在node_view()中,从钩子node_build_content()中调用该钩子,这是从中调用的第一个函数node_view()

  if (!isset($langcode)) {
    $langcode = $GLOBALS['language_content']->language;
  }

  // Populate $node->content with a render() array.
  node_build_content($node, $view_mode, $langcode);

4
谢谢。请注意,此钩子需要drupal> = 7.17
cissharp

6

如果您只需要为某些页面进行更改,则建议使用查看模式页面。它非常方便且易于使用。


谢谢。但是我确实有不同的情况。我想对具有相同内容类型的节点使用不同的查看模式。我想更改在节点中使用的分类法的查看模式。我的意思是节点将具有相同的URL模式。
cissharp
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.