如何为节点添加其他视图模式?


19

我正在创建自定义内容类型。默认情况下,节点仅支持两种视图模式(fullteaser):

function mymodule_view($node, $view_mode)
{
    if ($view_mode == 'full') {
         $node->content['#theme']= 'my_full_node_view_theme';
    }

    if ($view_mode == 'teaser') {
          $node->content['#theme']= 'my_teaser_node_view_theme'; 
    }
    return $node;
}

我想为此节点类型添加其他一些视图模式,例如:

  • small_box
  • small_box_with_user_pic
  • big_box

并希望使用以下代码呈现节点:

$node = node_load($my_nid);
$output = drupal_render(node_view($node, 'big_box'));

有什么建议么?



这是Tim Cosgrove关于视图模式的演示:timcosgrove.net/drupalcon-viewmodes/#1您将使用hook_entity_info_alter添加新的视图模式(示例)。
aroo 2012年

那个演讲真棒。
niksmac 2012年

1
werqious提到的链接已移至wunderkraut.com/NowOnWunderkraut/mearra/430
Andrey

页面不见了。幻灯片虽然在这里:slideshare.net/Phase2Technology/...
卡里Kääriäinen

Answers:


23

首先,我们必须使用hook_entity_info_alter添加其他视图模式

function customuserblog_entity_info_alter(&$entity_info) {
     $entity_info['node']['view modes']['blog_post_big'] = array(
        'label' => t('simple big  teaser'),
        'custom settings' => TRUE,
      );
    }

//我们可能会附加其他主题功能或模板,并使用hook_view添加变量

function customuserblog_view($node, $view_mode) {
  if ($view_mode == 'blog_post_big') {
   // add some additional variables for template
    $node->content['#theme'] = 'custom_blog_big_teaser_view';
  }
}

//在我们的钩子主题中

customuserblog_theme(){
    return array(
      'custom_blog_big_teaser_view'= array(
          'render element' => 'form',
          'template' => 'custom-blog-big-teaser-view',
       ),

    );
}

我用你的解决方案。很好,但是这个钩子customuserblog_view($ node,$ view_mode)不起作用。所以我将hook_preprocess_node与函数anonymous_profile_preprocess_node(&$ vars)一起使用,以便为自定义视图模式创建自定义tpl。
Mehrdad201 '18

我添加了有关此代码中使用的钩子的注释
werqious,

10

如果所有你想要的是自定义视图模式,那么实体视图模式可以提供帮助。通过Display Suite,还可以轻松创建自定义视图模式,创建新的伪字段,并具有漂亮的拖放界面,可在各种视图模式下布置不同的元素。

如果要通过代码完成所有操作,那么“示例”模块中的entity_example 具有查看模式IIRC。Drupal Commerce也有许多具有自定义视图模式的自定义实体。


谢谢,但不欢迎安装其他模块,感谢您对此模块的感谢。入侵模块代码可能会有所帮助
werqious 2012年

@werqious更新了答案
Andy


1

我知道这是一个较旧的主题,但是我发现以下方法对于大多数用例都可以正常工作。

这些简单的步骤将带您通过新的视图模式创建自己的模块。这很简单。我希望提供出处,但我不记得我在哪里找到了这一基础。它确实遵循与werqious的回答相同的逻辑。

文件1:my_module_view_modes.module

<?php
//Add more view modes for content type displays, in addition to default and teaser.
function almagest_view_modes_entity_info_alter(&$entity_info) {

//NB: media_ prefix required.
//You can repeat the following section for any view modes you'd like to create.

// First View Mode
// tag 1 references the entity type, ex. node or file
// tag 3 provides a machine name for your mode
  $entity_info['node']['view modes']['my_view_mode'] = array(
    'label' => t('My View Mode'), // This is what you'll see in your "Manage Display" tab.
    'custom settings' => TRUE,
  );

// Another View Mode    
  $entity_info['file']['view modes']['my_other_view_mode'] = array(
    'label' => t('Another View Mode'),
    'custom settings' => TRUE,
  );
}

文件2:my_module_view_modes.info

name = My Module View Modes
description = Add additional "View Modes" for entities in this module. Helpful for additional displays in views or node rendering.
package = My Modules
version = 7.x - 0.1
core = 7.x

将这两个文件保存在modules文件夹的my_module_view_mode文件夹中并启用。清除缓存,现在您将在各自的实体中看到新的视图模式。


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.