Jak dodać dodatkowe tryby widoku dla węzła?

19

Tworzę niestandardowy typ zawartości. Domyślnie węzły obsługują tylko dwa tryby widoku ( fulli 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;
}

Chcę dodać inne tryby widoku dla tego typu węzła, takie jak:

  • small_box
  • small_box_with_user_pic
  • big_box

i chcesz renderować węzeł za pomocą takiego kodu:

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

Jakieś sugestie?

gwałtowny
źródło
2
Znalazłem to mearra.com/blogs/juha-niemi/drupal-7-custom-node-view-modes, może to jest pomocne!
werqious,
Oto prezentacja z Timem Cosgrove temat trybów wyświetlania: timcosgrove.net/drupalcon-viewmodes/#1 Będziesz korzystać hook_entity_info_alter aby dodać nowe tryby widoku ( przykładowe ).
aroo
Ta prezentacja była niesamowita.
niksmac
1
Link wymieniony przez werqious został przeniesiony na wunderkraut.com/NowOnWunderkraut/mearra/430
Andrey Rudenko
Strona zniknęła. Prezentacje są tutaj: slideshare.net/Phase2Technology/…
Kari

Odpowiedzi:

23

najpierw musimy dodać dodatkowe tryby widoku z 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,
      );
    }

// możemy dołączyć dodatkowe funkcje motywu lub szablony i dodać zmienne za pomocą 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';
  }
}

// w naszym temacie haka

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

    );
}
gwałtowny
źródło
Użyłem twojego rozwiązania. jest dobrze, ale ten hak customuserblog_view ($ node, $ view_mode) nie działał. więc użyłem węzła hook_preprocess_node z funkcją anonymous_profile_preprocess_node (& $ vars), aby utworzyć niestandardową tpl dla niestandardowego trybu widoku.
Mehrdad201
Dodałem komentarze na temat haków używanych w tym kodzie
werqious
10

Jeśli wszystko, czego potrzebujesz, to niestandardowe tryby widoku, a następnie Tryb widoku encji może pomóc. Display Suite ułatwia także tworzenie niestandardowych trybów widoku, tworzenie nowych pseudopól oraz przyjemny interfejs przeciągania i upuszczania do układania różnych elementów w różnych trybach widoku.

Jeśli chcesz to wszystko zrobić w kodzie, to encja_przykład z modułu Przykłady ma tryb widoku IIRC. Drupal Commerce ma również wiele niestandardowych elementów z niestandardowymi trybami widoku.

Andy
źródło
dzięki, ale instalowanie dodatkowych modułów nie jest mile widziane dzięki za hakowanie kodów modułów może dać coś pomocnego
werqious
@werqious zaktualizowana odpowiedź
Andy
1

Jeśli korzystasz z Display Suite, upewnij się, że moduł ds_ui jest włączony i przejdź do admin / structure / ds / view_modes, aby uzyskać listę istniejących i utworzyć nowe tryby widoku.

Alex Skrypnyk
źródło
1

Wiem, że to starszy temat, ale znalazłem następującą metodę, która działa dobrze w większości przypadków użycia.

Te proste kroki poprowadzą Cię przez proces tworzenia własnego modułu w nowym trybie widoku. To dość proste. Chciałbym podać atrybucję, ale nie pamiętam, gdzie znalazłem podstawę do tego. Zachowuje jednak tę samą logikę, co odpowiedź werqiousa.

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

Plik 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

Zapisz te dwa pliki w folderze my_module_view_mode w folderze modułów i włącz. Wyczyść pamięć podręczną, a teraz zobaczysz nowe tryby widoku w odpowiednich jednostkach.

FranCarstens
źródło
czym to się różni od drupal.stackexchange.com/a/37488/13366 ?
Andre Baumeier