Как отобразить ближайших потомков термина таксономии на его странице?
В Drupal 8, как я могу отобразить непосредственных потомков термина таксономии на его странице?
Например, у меня есть словарь иерархической таксономии, подобный этому (упрощенный):
Животные
-- Рыбы
---- Бленни
------ Желтый Бленни
------ Зеленый Бленни
---- Бычки
------ Голубой бычок
------ Рыжий бычок
На странице для термина таксономии "Рыбы" (например, drupal/рыбы) Я бы хотел, чтобы Бленни и бычки (но не их дети) появиться.
Я пытался настроить контекстные фильтры в Структуре>Представления>Дополнительно, но не смог этого сделать.
2 answers
Учитывая вашу дополнительную информацию, это краткое пошаговое руководство, которое должно дать вам желаемые результаты:
- Дублируйте/отключите исходное представление таксономии/измените его следующим образом.
- В разделе "Расширенные/Контекстные фильтры" удалите "Содержимое: Имеет идентификатор термина таксономии"
- Добавьте новый контекстный фильтр "Содержимое: Имеет идентификатор термина таксономии (с глубиной)":
- Глубина: 1 (также будет отображаться содержимое для дочерних терминов следующего уровня)
- Когда значение фильтра НЕ находится в URL-адрес:
- Укажите значение по умолчанию
- Тип: Идентификатор термина таксономии из URL
- Загрузить фильтр по умолчанию со страницы терминов: проверено
- Если значение фильтра УКАЗАНО в URL-адресе или указано значение по умолчанию:
- Переопределить заголовок: проверено, используйте переменную
{{ arguments.term_node_tid_depth }}
(это гарантирует, что название термина будет отображаться в заголовке страницы) - (Необязательно, но настоятельно рекомендуется) Укажите критерии проверки: проверено
- Валидатор: Идентификатор термина таксономии
- Словарный запас: (ваш проверено название словаря)
- (необязательно) Подтвердите, что пользователь имеет доступ к термину таксономии: проверено
- Переопределить заголовок: проверено, используйте переменную
Поскольку вы хотите показать изображение, вы также можете изменить формат представления с Содержимого на Поля и добавить поле изображения вашего помеченного содержимого.
Пожалуйста, обратите внимание, что модификатор глубины может привести к дубликатам. Поэтому в настройках запроса в разделе Дополнительно/Другое вы должны включить опцию "Различать".
Вы можете продолжить улучшите результаты просмотра, добавив связи к фактическим терминам, названию термина и добавив группировку. Но это, похоже, выходит за рамки вашего первоначального вопроса.
Я выполнил описанные выше действия на чистом тестовом экземпляре D8 с автоматически сгенерированным контентом и словарями, и он работал нормально.
ИЗМЕНИТЬ:
Согласно вашим комментариям, на самом деле вам нравится показывать только поля дочерних терминов таксономии. Итак, вот как это сделать:
- отключить таксономию по умолчанию просмотр
- создайте новое представление
- в настройках просмотра / Показать выберите "Термин таксономии"
- "Типа" - это ваш словарный запас
- в разделе "Настройки страницы" установите флажок "Создать страницу" и укажите URL-адрес "таксономия/термин/%"
- нажмите "Сохранить и отредактировать"
- в Расширенном/Контекстном фильтре добавьте фильтр "Термин таксономии: Родительский"
- примените те же настройки, что и в моем решении выше, к контекстному фильтру, за исключением переменной заголовка, которая теперь должна быть '{{arguments.tid }}'
В результате вы должны увидеть в представлении дочерние элементы первого уровня термина таксономии.
Если вы хотите видеть только некоторые из их свойств, переключите тип представления на поля и добавьте поле, которое вы хотите отобразить.
В представлении :
Если вы изменяете/дублируете представление 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();
}