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

Drupal → Программно вывести термины словаря в виде дерева с подсчётом количества материалов

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

Ранее писал, как программно вывести термины словаря с подсчётом количества материалов и как программно вывести термины словаря в виде дерева. Теперь очередь объединить эти два способа и программно вывести термины словаря в виде дерева с подсчётом количества материалов:

Термины словаря в виде дерева

Код:

/**
 * Return rendered taxonomy tree
 */
function mymodule_taxonomy_tree($vid) {
  $terms = db_query("
    SELECT td.tid, td.name, th.parent, (
      SELECT COUNT(*) FROM {taxonomy_index} ti
      LEFT JOIN {node} n ON ti.nid = n.nid
      WHERE ti.tid = td.tid AND n.status = 1
    ) node_count FROM {taxonomy_term_data} td
    INNER JOIN {taxonomy_term_hierarchy} th ON th.tid = td.tid
    WHERE vid = :vid
    ORDER BY weight
  ", array(':vid' => $vid))->fetchAll();
 
  return theme('item_list', array('items' => _mymodule_taxonomy_tree($terms)));
}
 
/**
 * Helper for mymodule_taxonomy_tree()
 */
function _mymodule_taxonomy_tree($terms, $parent = 0, &$node_count = 0) {
  $items = array();
  $node_count = 0;
 
  foreach ($terms as $term) {
    if ($term->parent == $parent) {
      $children = _mymodule_taxonomy_tree($terms, $term->tid, $childs_node_count);
      $node_count += $term->node_count + $childs_node_count;
      $items[] = array(
        'data' => l($term->name, 'catalog/' . $term->tid) . ' (' . ($term->node_count + $childs_node_count) . ')',
        'children' => $children,
      );
    }
  }
 
  return $items;
}

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

echo mymodule_taxonomy_tree(1);

Для вывода плоского списка можно воспользоваться Views — Как с помощью Views 3 вывести список терминов с количеством помеченных ими нод.

Update 06.02.2013: добавил подсчёт количества нод у дочерних терминов.

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

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

А есть возможность при открытой ноде как-то передавать active-trail термину в списке?

А может все таки о кешах упомянешь, а то твой блог читаем много новичков... ;)

А как сделать, чтобы нулевые термины не отображались?
Спасибо!

Добрый вечер!
Подскажите, можно ли зная tid дочернего термина, вывести имя термина родителя?

Раньше использовал модуль Hierarchical Select, который хранил оба параметра в поле.
Теперь же перешел на shs, он лучше дружит с views, но хранит в поле только значение дочернего термина, отсюда и такая проблема.

Благодарю ,,, то что нужно

По умолчанию выводится простой список с вложенными списками дочерних терминов.
Можно ли вывести такое дерево сеткой, т.е. обернуть родителя и влож. список дивом?

А для i18n-дерева код будет сильно отличаться?

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

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

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