Как изменить режимы отображения для каждого узла (режимы просмотра)?


В Drupal 8 режимы просмотра поддерживаются ядром, что делает режимы просмотра сущностей устаревшими. Я хотел бы иметь возможность изменять режим просмотра для каждого узла без использования Набора дисплеев.

Кто-нибудь знает, могу ли я сделать это, используя только ядро Drupal или более легкий модуль вклада, чем набор для отображения?

В идеале у меня будет список выбора, чтобы выбрать режим просмотра в пользовательском интерфейсе на уровне узла.

Author: itsdarrylnorris, 2016-03-02

5 answers

Я использовал модуль выбора режима просмотра в Drupal 7 именно для этой цели. Я не пробовал это в D8, но есть релиз для разработчиков сразу после даты 8.0.0.

Https://www.drupal.org/project/view_mode_selector

 6
Author: Les Lim, 2016-03-02 22:24:00

Это задача для hook_entity_view_mode_alter.

Измените режим просмотра отображаемого объекта.

Смотрите следующий рабочий пример, который автоматически позволяет отображать узел 123 в режиме просмотра teaser при доступе в виде полной страницы. Вы также можете просто добавить свою собственную логику (тип, пользователь, дата и время и т.д.).

/**
 * Implements hook_entity_view_mode_alter().
 */
function MYMODULE_entity_view_mode_alter(&$view_mode, Drupal\Core\Entity\EntityInterface $entity, $context) {

  // Change the view mode to teaser on full page view for node ID 123.
  if ($entity->getEntityTypeId() == 'node' && $entity->id() == '123' && $view_mode == 'full') {
    $view_mode = 'teaser';
  }
}

Как вы можете себе представить, из $entity вы можете получить любое значение поля узла. Таким образом, вы можете добавить некоторое поле списка выбора или таксономия ссылается на ваш тип контента, а затем настраивает это значение по узлам. Наконец, вы можете использовать приведенный выше фрагмент кода для переключения режима просмотра в зависимости от этих значений. Миссия выполнена.

 8
Author: leymannx, 2018-07-27 21:28:30

Определить режим просмотра для каждого типа контента (типов узлов) просто, Drupal 8 уже может это сделать.

Перейдите в раздел Структура -> Тип контента -> Управление отображением

Manage Display

Если вам нужен только один режим просмотра для вашего узла (я имею в виду, что все узлы определенного типа отображаются одинаково), просто используйте только режим просмотра по умолчанию и определите, как он будет отображаться. На изображении ниже показан экран с более подробным объяснением.

Explanation

 2
Author: Vagner, 2016-03-02 23:26:55

Редактировать: только что понял, что в исходном сообщении сказано без с использованием набора дисплеев. Оставлю ответ здесь в любом случае, если он будет полезен другим, кто сталкивался с этим вопросом и, возможно, пожелает узнать, как это делается с помощью Display Suite.

Другие доступные опции - использовать модуль Display Suite. У меня возникло бы искушение использовать это через модуль Выбора режима просмотра, у которого еще нет стабильной версии. Используя Display Suite, вы не будете будет иметь дело только со стабильным модулем, но также будет охватываться политикой безопасности Drupal, которая применяется только к стабильным выпускам модулей (альфа-, бета- и dev-модули не охватываются).

Для переключения режимов отображения на отдельных узлах вам необходимо:

  1. Установите модули Display Suite и Display Suite Switch View Mode, оба из которых включены в пакет модулей Display Suite.

enter image description here

  1. Перейдите на страницу редактирования содержимого/узла, который вы хотите изменить. На форма редактирования будет представлять собой вкладку под названием Display settings. На этой вкладке вы можете выбрать режим отображения, который будет использоваться для этого узла.

enter image description here

Для более полного описания этого процесса см.: Использование набора дисплеев в Drupal 8: Как использовать подмодуль Переключения режима просмотра

 2
Author: Benjen, 2017-01-31 04:53:37

Это похоже на Drupal 7. Вы захотите использовать template_preprocess_node() для изменения режима просмотра перед визуализацией.

<?php

/**
 * Implements template_preprocess_node()
 **/
function THEME_preprocess_node(&$variables) {
  $node = $variables['node'];

  // Check if a field that lists view modes is asking for
  // a different one than currently set. If it is, change it.
  // There is a D7 module that might be ported to D8:
  // https://www.drupal.org/project/view_mode_field

  $variables['#element']['#view_mode'] = 'teaser';
  $variables['view_mode'] = 'teaser';

  // might need to rework other node variables
  $variables['teaser'] = true;
}
?>
 0
Author: joshmiller, 2016-03-02 21:33:41