xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Вывести термины словаря таксономии в виде дерева

Опубликовано в

Имеется словарь tags:

Список терминов таксономии

Задача — вывести термины этого словаря в виде дерева:

Дерево терминов таксономии

Код:

/**
 * Return rendered taxonomy tree
 */
function mymodule_taxonomy_tree($vocabulary_name) {
  $vid = taxonomy_vocabulary_machine_name_load($vocabulary_name)->vid;
  $terms = taxonomy_get_tree($vid);
  return theme('item_list', array('items' => _mymodule_taxonomy_tree($terms)));
}
 
/**
 * Helper for mymodule_taxonomy_tree()
 */
function _mymodule_taxonomy_tree($terms, $parent = 0) {
  $items = array();
 
  foreach ($terms as $term) {
    if (in_array($parent, $term->parents)) {
      $items[] = array(
        'data' => $term->name,
        'children' => _mymodule_taxonomy_tree($terms, $term->tid),
      );
    }
  }
 
  return $items;
}

Использование:

echo mymodule_taxonomy_tree('tags');

Полезные статьи:
Вывести термины словаря таксономии в виде дерева с помощью Views Tree.
Программно вывести термины словаря в виде дерева с подсчётом количества материалов.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Еще такую штуку можно замутить через taxonomy_block

менять название словаря нужно в echo mymodule_taxonomy_tree('tags'); ?
в самом модуле трогать ничего не нужно ? кроме mymodule на имя модуля

выдает ошибку Fatal error: Call to undefined function custom_taxonomy_tree()

менять название словаря нужно в echo mymodule_taxonomy_tree('tags'); ?

да

в самом модуле трогать ничего не нужно ?

нет

выдает ошибку Fatal error: Call to undefined function custom_taxonomy_tree()

к вышеприведённому коду это не имеет отношения

спасибо тебе, дружище !
когда то искал очень долго решение...

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

foreach ($terms as $term):
        if (in_array($parent, $term->parents)):
        $items[] = array(
            'data' => l($term->name, 'taxonomy/term/' . $term->tid),
            'children' => _mymodule_taxonomy_tree($terms, $term->tid),
            );
        endif;
    endforeach;

А как добавить уровень вложенности тега и и его tid в css-класс

А как помимо самих терминов вывести кастомное поле рядом?

xandeadx, спасибо вам, спрашивал в другой теме, но здесь как раз именно то, что мне было нужно!
Вот только проблемка вылазиет, никак не хочет работать:
Fatal error: Cannot redeclare mymodule_taxonomy_tree() (previously declared in /home/vhosts/www.site.сom/modules/php/php.module(80) : eval()'d code:5) in /home/vhosts/www.site.сom/modules/php/php.module(80) : eval()'d code on line 9

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

Аллилуйя, заработало. Много извинений за беспокойство, не допёр сначала, что это не сниппет и надо код в taxonomy.module засовывать. Пошел изучать php...
Спасибо вам ещё раз, отличный блог!

Здравсвуйте, извините, возможно вопрос не по теме статьи, но касается таксономии и ее иерархии.
Возможно вы знаете модуль или путь, при котором таксономию Drupal 7 можно превратить во flat list - то есть просто набор терминов без иерархии. Суть - избавление от taxonomy_get_tree, потому как при больших "плоских" словарях (>50 000 терминов) при freetaging становится практически невозможным именно из-за taxonomy_get_tree, похоже.
Для примера нода с подобным вашему парсеру сохраняется при >50000 терминов в словаре и 1-2 терминам к ноде fretaging`ом около 3 секунд, при этом "лайтовый" taxonomy_get_tree() в Taxonomy Edge ускоряет время сохранения ноды в 2 раза.
При этом же при обычном text_field с autocomplete время сохранения не особо зависит от количества записей в поле и составляет адекватные 0,1-0,2 секунды.
При этом хочется использовать именно таксономию.

Какие подходы вы посоветуете для flat list freetaging на сотни тысяч записей?

P.S. Один из подходов - node_reference + autocreate node reference, но как-то не очень нравится.

P.P.S На скорость работы таксономии в описанном выше случае даже не особо влияет MongoDB и тп тюнинги

Спасибо, хорошо, помогло. Лайкаю в соцсети вас.

+1

Не нашел как убрать из выдачи пустых родителей поэтому сделал так

foreach ($terms as $key => $term) {
   if($obj->parents[0] == 0){
        $next = $key+1;
        if(!array_key_exists($next, $terms) OR $terms[$next]->parents[0] == 0){continue;}
      }
    $items[$term->tid] = $term->name;
 }

Если есть более цивилизованный вариант был бы рад услышать о нем.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании