¿Cómo agrego modos de vista adicionales para un nodo?

19

Estoy creando un tipo de contenido personalizado. Por defecto, los nodos solo admiten dos modos de visualización ( fully teaser):

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

Quiero agregar algunos otros modos de vista para este tipo de nodo, como:

  • small_box
  • small_box_with_user_pic
  • big_box

y quiere renderizar el nodo con un código como este:

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

¿Alguna sugerencia?

werqious
fuente
2
Encontré este mearra.com/blogs/juha-niemi/drupal-7-custom-node-view-modes ¡ tal vez sea útil!
werqious
Aquí está la presentación de Tim Cosgrove sobre los modos de vista: timcosgrove.net/drupalcon-viewmodes/#1 Utilizará hook_entity_info_alter para agregar un nuevo modo de vista ( ejemplo ).
aroo
Esa presentación fue asombrosa.
niksmac
1
El enlace mencionado por werqious se traslada a wunderkraut.com/NowOnWunderkraut/mearra/430
Andrey Rudenko el
La página se ha ido. Sin embargo, las diapositivas están aquí: slideshare.net/Phase2Technology/…
Kari Kääriäinen

Respuestas:

23

primero tenemos que agregar modos de vista adicionales con 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,
      );
    }

// podemos adjuntar funciones o plantillas de temas adicionales y agregar variables con 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';
  }
}

// en nuestro tema de gancho

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

    );
}
werqious
fuente
Usé tu solución. es bueno pero este gancho customuserblog_view ($ nodo, $ view_mode) no funcionó. así que usé hook_preprocess_node con la función anonymous_profile_preprocess_node (& $ vars) para hacer tpl personalizado para el modo de vista personalizada.
Mehrdad201
He agregado comentarios sobre los ganchos utilizados en este código
werqious
10

Si todo lo que desea son modos de vista personalizados, entonces el Modo de vista de entidad puede ayudar. Display Suite también facilita la creación de modos de vista personalizados, la creación de nuevos pseudocampos y una buena interfaz de arrastrar y soltar para diseñar diferentes elementos en los distintos modos de vista.

Si desea hacer todo esto en código, entidad_ejemplo del módulo Ejemplos tiene un modo de vista IIRC. Drupal Commerce también tiene una serie de entidades personalizadas con modos de vista personalizados.

Andy
fuente
gracias, pero no se agradece la instalación de módulos adicionales, gracias a estos módulos, hackear códigos de módulos puede dar algo útil
werqious
@werqious respuesta actualizada
Andy
1

Si está utilizando Display Suite, asegúrese de que el módulo ds_ui esté habilitado y vaya a admin / structure / ds / view_modes para obtener una lista de los modos de vista existentes y crear nuevos.

Alex Skrypnyk
fuente
1

Sé que este es un tema antiguo, pero he encontrado que el siguiente método funciona bien para la mayoría de los casos de uso.

Estos sencillos pasos lo llevarán a crear su propio módulo con el nuevo modo de vista. Es bastante simple. Me encantaría proporcionar atribución, pero no recuerdo dónde encontré la base para esto. Sin embargo, sigue la misma lógica que la respuesta de werqious.

Archivo 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,
  );
}

Archivo 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

Guarde estos dos archivos en su carpeta my_module_view_mode en su carpeta de módulos y habilítelos. Borre su caché y ahora verá los nuevos modos de vista en sus respectivas entidades.

FranCarstens
fuente
¿En qué se diferencia esto de drupal.stackexchange.com/a/37488/13366 ?
Andre Baumeier