Как отобразить ближайших потомков термина таксономии на его странице?


В Drupal 8, как я могу отобразить непосредственных потомков термина таксономии на его странице?

Например, у меня есть словарь иерархической таксономии, подобный этому (упрощенный):

Животные
-- Рыбы
---- Бленни
------ Желтый Бленни
------ Зеленый Бленни
---- Бычки
------ Голубой бычок
------ Рыжий бычок

На странице для термина таксономии "Рыбы" (например, drupal/рыбы) Я бы хотел, чтобы Бленни и бычки (но не их дети) появиться.

Я пытался настроить контекстные фильтры в Структуре>Представления>Дополнительно, но не смог этого сделать.

Author: Nick Hope, 2017-12-02

2 answers

Учитывая вашу дополнительную информацию, это краткое пошаговое руководство, которое должно дать вам желаемые результаты:

  • Дублируйте/отключите исходное представление таксономии/измените его следующим образом.
  • В разделе "Расширенные/Контекстные фильтры" удалите "Содержимое: Имеет идентификатор термина таксономии"
  • Добавьте новый контекстный фильтр "Содержимое: Имеет идентификатор термина таксономии (с глубиной)":
    • Глубина: 1 (также будет отображаться содержимое для дочерних терминов следующего уровня)
    • Когда значение фильтра НЕ находится в URL-адрес:
      • Укажите значение по умолчанию
      • Тип: Идентификатор термина таксономии из URL
      • Загрузить фильтр по умолчанию со страницы терминов: проверено
    • Если значение фильтра УКАЗАНО в URL-адресе или указано значение по умолчанию:
      • Переопределить заголовок: проверено, используйте переменную {{ arguments.term_node_tid_depth }} (это гарантирует, что название термина будет отображаться в заголовке страницы)
      • (Необязательно, но настоятельно рекомендуется) Укажите критерии проверки: проверено
      • Валидатор: Идентификатор термина таксономии
      • Словарный запас: (ваш проверено название словаря)
      • (необязательно) Подтвердите, что пользователь имеет доступ к термину таксономии: проверено

Поскольку вы хотите показать изображение, вы также можете изменить формат представления с Содержимого на Поля и добавить поле изображения вашего помеченного содержимого.

Пожалуйста, обратите внимание, что модификатор глубины может привести к дубликатам. Поэтому в настройках запроса в разделе Дополнительно/Другое вы должны включить опцию "Различать".

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

Я выполнил описанные выше действия на чистом тестовом экземпляре D8 с автоматически сгенерированным контентом и словарями, и он работал нормально.

ИЗМЕНИТЬ:

Согласно вашим комментариям, на самом деле вам нравится показывать только поля дочерних терминов таксономии. Итак, вот как это сделать:

  • отключить таксономию по умолчанию просмотр
  • создайте новое представление
  • в настройках просмотра / Показать выберите "Термин таксономии"
  • "Типа" - это ваш словарный запас
  • в разделе "Настройки страницы" установите флажок "Создать страницу" и укажите URL-адрес "таксономия/термин/%"
  • нажмите "Сохранить и отредактировать"
  • в Расширенном/Контекстном фильтре добавьте фильтр "Термин таксономии: Родительский"
  • примените те же настройки, что и в моем решении выше, к контекстному фильтру, за исключением переменной заголовка, которая теперь должна быть '{{arguments.tid }}'

В результате вы должны увидеть в представлении дочерние элементы первого уровня термина таксономии.

Если вы хотите видеть только некоторые из их свойств, переключите тип представления на поля и добавьте поле, которое вы хотите отобразить.

 2
Author: Mario Steinitz, 2017-12-05 12:35:20

В представлении :

Если вы изменяете/дублируете представление taxonomy_term по умолчанию, вам следует удалить контекстный фильтр по умолчанию ( имеет идентификатор термина таксономии ) и добавить новый "Имеет идентификатор термина таксономии (с глубиной)" с глубиной 1.

Программно :

$terms = \Drupal::service("entity_type.manager")->getStorage("taxonomy_term")->loadTree("<VID>","<TID of Fishes>", 1 /* the depth : 1 */, true /* to load entities */);
foreach($terms as $term){
  //rendering whatever...
  print $term->label();
}
 0
Author: Oulalahakabu, 2017-12-04 10:04:42