Comment ajouter des modes d'affichage supplémentaires pour un nœud?

19

Je crée un type de contenu personnalisé. Par défaut, les nœuds ne prennent en charge que deux modes d'affichage ( fullet 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;
}

Je veux ajouter d'autres modes d'affichage pour ce type de nœud, comme:

  • small_box
  • small_box_with_user_pic
  • big_box

et souhaitez rendre le nœud avec du code comme celui-ci:

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

Aucune suggestion?

werqious
la source
2
j'ai trouvé ce mearra.com/blogs/juha-niemi/drupal-7-custom-node-view-modes c'est peut-être utile!
werqious
Voici la présentation de Tim Cosgrove sur les modes d'affichage: timcosgrove.net/drupalcon-viewmodes/#1 Vous utiliserez hook_entity_info_alter pour ajouter de nouveaux modes d'affichage ( exemple ).
aroo
Cette présentation était géniale.
niksmac
1
Le lien mentionné par werqious est déplacé vers wunderkraut.com/NowOnWunderkraut/mearra/430
Andrey Rudenko
La page est partie. Les diapositives sont ici cependant: slideshare.net/Phase2Technology/…
Kari Kääriäinen

Réponses:

23

nous devons d'abord ajouter des modes d'affichage supplémentaires avec 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,
      );
    }

// nous pouvons attacher des fonctions de thème ou des modèles supplémentaires et ajouter des variables avec 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';
  }
}

// dans notre thème crochet

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

    );
}
werqious
la source
J'ai utilisé votre solution. c'est bien mais ce hook customuserblog_view ($ node, $ view_mode) n'a pas fonctionné. j'ai donc utilisé hook_preprocess_node avec la fonction anonymous_profile_preprocess_node (& $ vars) afin de créer un tpl personnalisé pour le mode d'affichage personnalisé.
Mehrdad201
J'ai ajouté des commentaires sur les crochets utilisés dans ce code
werqious
10

Si tout ce que vous voulez, ce sont des modes d'affichage personnalisés, le mode d'affichage d' entité peut vous aider. Display Suite facilite également la création de modes d'affichage personnalisés, la création de nouveaux pseudo-champs et une interface glisser-déposer agréable pour disposer différents éléments dans les différents modes d'affichage.

Si vous voulez tout faire en code, alors entity_example du module Exemples a un mode d'affichage IIRC. Drupal Commerce possède également un certain nombre d'entités personnalisées avec des modes d'affichage personnalisés.

Andy
la source
merci mais l'installation de modules supplémentaires n'est pas appréciée merci pour ce module le piratage des codes de module peut donner quelque chose d'utile
werqious
@werqious mise à jour de la réponse
Andy
1

Si vous utilisez Display Suite, assurez-vous que le module ds_ui est activé et accédez à admin / structure / ds / view_modes pour obtenir une liste des modes d'affichage existants et créer de nouveaux.

Alex Skrypnyk
la source
1

Je sais que c'est un sujet plus ancien, mais j'ai trouvé que la méthode suivante fonctionnait très bien pour la plupart des cas d'utilisation.

Ces étapes simples vous permettront de créer votre propre module avec le nouveau mode d'affichage. C'est assez simple. J'aimerais fournir une attribution, mais je ne me souviens pas où j'ai trouvé la base de cela. Cela suit la même logique que la réponse de werqious.

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

Fichier 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

Enregistrez ces deux fichiers dans votre dossier my_module_view_mode dans votre dossier modules et activez. Videz votre cache et vous verrez maintenant les nouveaux modes d'affichage dans leurs entités respectives.

FranCarstens
la source
en quoi est-ce différent de drupal.stackexchange.com/a/37488/13366 ?
Andre Baumeier