Чистый способ построения простого таксономического браузера произвольной глубины

23

Я потратил несколько дней, пытаясь найти правильный способ сделать следующее:

  1. Показать список всех терминов верхнего уровня в словаре со ссылками на их дочерние термины
  2. После нажатия на ссылку, перейдите к списку детей этих терминов.
  3. До бесконечности до термина самого нижнего уровня, для которого будет отображаться список узлов, помеченных этим термином.

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

Идеальным решением было бы то, которое использует Views 3, Contexts, EntityFieldQueries или что-нибудь еще, что хорошо поддерживается в Drupal 7.

Я могу сделать почти то, что хочу, создав простое представление с тремя узлами: отношениями терминов (термин, родитель термина и родитель родителя термина) и пользовательские для последовательных контекстных фильтров. Единственная проблема с этим заключается в том, что если есть узел с слишком малой глубиной термопата, он будет указан как «некатегоризованный» и генерирует неработающую ссылку. Вместо того, чтобы делать это, я бы хотел, чтобы он ссылался на следующий доступный термин.

в промежутке
источник

Ответы:

23

Я нашел способ сделать это только с помощью модуля Views. Она не идеальна - она ​​не генерирует хороший URL-адрес и крошку с таксономической линией, как мое решение для таксономии одной глубины.

Браузер статической глубины

Для таксономии статической глубины (где все термины имеют одинаковую глубину дочерних терминов), вы должны сделать следующее:

  1. Создать вид узлов
  2. Добавить отношение к термину таксономии (Термин)
  3. Добавить связь с таксономическим термином родительский, доступный через термин (родительский)
  4. Добавить связь с родителем термина таксономии, доступный через Родителя (Parent Parent)
  5. Повторите шаг 4 столько раз, сколько необходимо для глубины вашей таксономии.
  6. Добавьте контекстные фильтры для каждого и убедитесь, что они в правильном порядке. Установите для отображения сводки, когда фильтр отсутствует в URL.
  7. Возможно, вы захотите переопределить крошку и заголовок для каждого фильтра.
  8. ???
  9. ПРИБЫЛЬ

Браузер переменной глубины

Для таксономии переменной глубины (где некоторые деревья терминов имеют более глубокие уровни вложенности, чем другие), это немного сложнее:

  1. Добавьте новый термин верхнего уровня (Foo) в свой словарь и поместите в него все остальные термины.
  2. Создать вид терминов на странице, отображающей названия терминов.
  3. Добавить контекстный фильтр: Термин таксономии: Родительский термин
  4. Если значение по умолчанию отсутствует в URL, укажите значение по умолчанию
  5. Установите значение по умолчанию для вашего имени термина верхнего уровня (Foo)
  6. Укажите критерии проверки
    • Валидатор: термин таксономии
    • Критерии: ваш словарный запас
    • Тип значения фильтра: имя термина, преобразованное в идентификатор термина
  7. Нажмите кнопку «+ Добавить» в верхней части панели «Представления», чтобы добавить вложение в представление.
  8. Добавить только в это вложение (переопределить) Отношение: Термин таксономии: Содержание с термином
  9. Добавить только в это вложение (переопределить) display: fields: названия узлов, связанные с узлами, и удалить (только из этого вложения!) Display: fields: term name
  10. Добавить в это вложение (переопределить) контекстный фильтр: Термин таксономии: Имя
  11. Если значение фильтра недоступно, укажите значение по умолчанию: Необработанное значение из URL: Компонент пути: 2 (или более, если путь к вашей странице содержит> 1 компонент)
  12. Настройки вложения: Присоединить к: [название страницы, которую вы только что сделали]
  13. ???
  14. ПРИБЫЛЬ

Скриншоты пользовательского интерфейса Views для справки: введите описание изображения здесь

в промежутке
источник
Красиво сделано! Высказывание вопроса и вашего ответа - это, кажется, довольно распространенная вещь, которую нужно сделать, и ваше решение лучше, чем все, что я нашел при первоначальной попытке ответить.
Эндрю
8
  1. Создать представление типа Таксономия
  2. Добавьте контекстный фильтр типа Термин таксономии: Родительский термин
  3. Установить Предоставить значение по умолчанию и сохранить его как фиксированный. дать идентификатор термина верхнего родительского термина
  4. Добавить идентификатор термина таксономии качестве поля и исключить его из отображения
  5. Добавьте имя термина таксономии, нажмите на ссылку и вставьте это поле в качестве ссылки; дать ссылку как «путь, который вы устанавливаете в представлении / [tid]»
    Примечание: вы должны снять галочку «Связать это поле с его страницей терминов таксономии»

Когда вы посещаете страницу просмотра, вы видите детей верхнего родителя; согласно примеру вы получите:

  • term1
  • term2

Когда вы нажмете на term1, вы получите детей. Пока вы не достигнете term1.1.1. Если вы нажмете на term1.1.1, вы не получите никакого результата. Чтобы достичь этого, нам нужно создать еще один блок представления в представлении выше.

  1. Добавить блок
  2. Удалите существующий контекстный фильтр и поле.
    Примечание. Когда вы удаляете их, убедитесь, что вы выбрали « Эта страница» (Over Ride) из раскрывающегося списка вверху рядом с пунктом «Для полем полем полем противном случае поля и контекстные фильтры, созданные на странице, также будут удалены. ,
  3. Добавить новый контекстный фильтр Термин таксономии: Термин ID
  4. Добавить отношение Термин таксономии: Содержание с термином
  5. Добавьте заголовок контента, и вы используете связь из выпадающего списка вверху.
  6. Сохраните вид и вернитесь на страницу, которую мы создали (это важно, если вы не сможете выполнить следующий шаг).
  7. Добавление поля в FOOTER ИЛИ ЗАГОЛОВОК
  8. Выберите «Global: View area» из списка и выберите блок, который мы создали, из выпадающего меню View, чтобы вставить, пока вы там, отметьте « Inherit contextual filters». чтобы мы могли также передать значение из этого представления в блок.
  9. Установите флажок Отображать, даже если представление не имеет результата, поэтому, когда это представление не показывает результат, блок все равно будет показан

Сохраните вид, и все готово.

Мохаммед Шамим
источник
Я последовал четкому объяснению Мохаммеда Шамима. Спасибо, отлично работает !!
Стивен
3

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

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

Очевидно, у этого модуля есть проблема, мешающая ему работать с терминами таксономии. Бу.

Тем не менее, я нашел следующий код, который, кажется, делает то, что вы хотите (вы можете заставить его отображать / скрывать элементы через некоторый довольно элементарный код jQuery):

<?php

// The ID of the taxonomy vocabulary for which you'd like to create a nested list
$vid = 10;

$depth = 0;
$num_at_depth = 0;
$tree = taxonomy_get_tree($vid);

print "<ul class=\"menu\">\n<li>";
foreach ($tree as $term) {
  $diffdepth = 0;
  if ($term->depth > $depth) {
    print "\n<ul>\n<li>";
    $depth = $term->depth;
    $num_at_depth = 0;
  }
  if ($term->depth < $depth) {
    $diffdepth = $depth - $term->depth;
    while ($diffdepth > 0) {
      print "</li>\n</ul>\n";
      $diffdepth--;
    }
    $depth = $term->depth;
  }
  if (($term->depth == $depth) && ($num_at_depth > 0)) {
    print "</li>\n<li>";
  }
  print l($term->name, 'taxonomy/term/' . $term->tid);
  $num_at_depth++;
}
print "</li>\n</ul>\n";

Через « Вложенные списки категорий со ссылками на страницы ».

aendrew
источник
Я включил этот модуль и попытался поэкспериментировать с ним, и у меня есть две проблемы: 1. Я подозреваю, что он просто дает вам простой список, а не многостраничный просмотр и 2. Я не могу заставить его работать. Как-то было бы очень полезно.
Beth
Обновленный ответ. Извинения, по-видимому, у дерева представлений есть открытый вопрос относительно использования терминов таксономии. Альтернативный ответ опубликован.
Андрей
Похоже, что это простой вложенный список, а не последовательный браузер.
Beth
@beth - Было бы достаточно, если бы я написал jQuery, который показывает / скрывает элементы этого списка при нажатии на родительские / дочерние элементы?
Эндрю
Я не хочу, чтобы это зависело от JavaScript.
Бэт
0

Если вы просто хотите иметь набор динамических страниц для просмотра таксономии, я бы пошел следующим образом, требуя модуль 3 Views + Taxonomy Display, который позволяет вам использовать Views для отображения содержимого taxonomy/term/%страниц:

  1. Условия верхнего уровня - список терминов, родитель которых является нулевым
  2. Условия среднего уровня - список терминов, чей родитель НЕ является нулевым. Нет результата: дисплей View # 3
  3. Узлы с терминами - список узлов, помеченных терминами.

Поскольку представления 1 и 2, вероятно, будут тематически похожим образом, вы можете рассмотреть возможность объединения их в виде дисплеев в одно представление - это было бы проще в управлении.

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

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

Артур
источник