Решение
<?php
$vid = 13; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
//var_dump($terms);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array ((($count) ? l($term->name, "taxonomy/term/$term->tid")." (".$count.")" : $term->name), $term->depth, $count, $term->tid);
}
$depth =-1;
foreach ($pole as $list) {
//$depth- глубина предыдущего уровня
//$list[1] - глубина текущего элемента
if ($list[1] == $depth) {
echo "</li>";
next;
}
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "\n<ul>";
next;
}
if ($list[1] < $depth) {
$depth--;
echo "\n</li>\n</ul>";
}
}
echo "\n<li>$list[0]";
$depth=$list[1];
}
//Закрываем все открытые теги до нулевого уровня:
$depth=0;
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "</li>\n</ul>";
}
}
?>
$vid = 13; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
//var_dump($terms);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array ((($count) ? l($term->name, "taxonomy/term/$term->tid")." (".$count.")" : $term->name), $term->depth, $count, $term->tid);
}
$depth =-1;
foreach ($pole as $list) {
//$depth- глубина предыдущего уровня
//$list[1] - глубина текущего элемента
if ($list[1] == $depth) {
echo "</li>";
next;
}
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "\n<ul>";
next;
}
if ($list[1] < $depth) {
$depth--;
echo "\n</li>\n</ul>";
}
}
echo "\n<li>$list[0]";
$depth=$list[1];
}
//Закрываем все открытые теги до нулевого уровня:
$depth=0;
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "</li>\n</ul>";
}
}
?>
Использованные материалы
Оригинальный код содержал ошибку, которая не позволяла выводить списки с большим разбросом глубины. То есть при резком изменении глубины терминов скрипт это не обрабатывал и теги оставались не закрытыми. В этом коде это исправлено.
Bookmark/Search this post with











Комментарии
Для этого также есть модуль Taxonomy Menu
Косяк. Код считает также и неопубликованные ноды.
И кажется при выводе последнего пункта нет закрывающего тэга /li
Выводит неопубликованные ноды.
В последнем пункте не выводится закрывающий тег /li
Да, считает все ноды и опубликованные, и - нет. Если нужно - просто вставьте проверку в запрос.
Добрый день!
Это скрипт для друпал 6 ? У меня на шестом пустой блок, зато работает этот скрипт, но он к сожалению выводит меню в развернутом виде, подскажите, как сделать свернутое?
<?php
$vid = 1; /* <---- put correct vocabulary ID here */
$terms = taxonomy_get_tree($vid);
print '
';- ";
foreach ( $terms as $term ) {
$tcount = taxonomy_term_count_nodes($term->tid);
$children_terms = taxonomy_get_children($term->tid);
if ($term->depth == 0) {
print "
print l($term->name." (".$tcount.")",'taxonomy/term/'
. $term->tid, array('title' => $tcount." posts in "
.$term->name));
if ($children_terms) {
print "
";- ";
foreach ( $children_terms as $children_term ) {
$t_children_count =
taxonomy_term_count_nodes($children_term->tid);
print "
print l($children_term->name." (".$t_children_count.")",
'taxonomy/term/'.$children_term->tid, array('title' =>
$t_children_count." posts in ".$children_term->name));
print "
";
}/* end foreach children */
print "
";
}
print "
";
}
} /* end foreach */
print "
";
?>
как сделать меню сворачивающимся?
Использовать fieldset и свойство collapsable