Как изменить режимы отображения для каждого узла (режимы просмотра)?
В Drupal 8 режимы просмотра поддерживаются ядром, что делает режимы просмотра сущностей устаревшими. Я хотел бы иметь возможность изменять режим просмотра для каждого узла без использования Набора дисплеев.
Кто-нибудь знает, могу ли я сделать это, используя только ядро Drupal или более легкий модуль вклада, чем набор для отображения?
В идеале у меня будет список выбора, чтобы выбрать режим просмотра в пользовательском интерфейсе на уровне узла.
5 answers
Я использовал модуль выбора режима просмотра в Drupal 7 именно для этой цели. Я не пробовал это в D8, но есть релиз для разработчиков сразу после даты 8.0.0.
Это задача для 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
вы можете получить любое значение поля узла. Таким образом, вы можете добавить некоторое поле списка выбора или таксономия ссылается на ваш тип контента, а затем настраивает это значение по узлам. Наконец, вы можете использовать приведенный выше фрагмент кода для переключения режима просмотра в зависимости от этих значений. Миссия выполнена.
Определить режим просмотра для каждого типа контента (типов узлов) просто, Drupal 8 уже может это сделать.
Перейдите в раздел Структура -> Тип контента -> Управление отображением
Если вам нужен только один режим просмотра для вашего узла (я имею в виду, что все узлы определенного типа отображаются одинаково), просто используйте только режим просмотра по умолчанию и определите, как он будет отображаться. На изображении ниже показан экран с более подробным объяснением.
Редактировать: только что понял, что в исходном сообщении сказано без с использованием набора дисплеев. Оставлю ответ здесь в любом случае, если он будет полезен другим, кто сталкивался с этим вопросом и, возможно, пожелает узнать, как это делается с помощью Display Suite.
Другие доступные опции - использовать модуль Display Suite. У меня возникло бы искушение использовать это через модуль Выбора режима просмотра, у которого еще нет стабильной версии. Используя Display Suite, вы не будете будет иметь дело только со стабильным модулем, но также будет охватываться политикой безопасности Drupal, которая применяется только к стабильным выпускам модулей (альфа-, бета- и dev-модули не охватываются).
Для переключения режимов отображения на отдельных узлах вам необходимо:
- Установите модули
Display Suite
иDisplay Suite Switch View Mode
, оба из которых включены в пакет модулей Display Suite.
- Перейдите на страницу редактирования содержимого/узла, который вы хотите изменить. На форма редактирования будет представлять собой вкладку под названием
Display settings
. На этой вкладке вы можете выбрать режим отображения, который будет использоваться для этого узла.
Для более полного описания этого процесса см.: Использование набора дисплеев в Drupal 8: Как использовать подмодуль Переключения режима просмотра
Это похоже на 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;
}
?>