<?php
$vid = 3; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . " ($count)", $term->depth, $count, $term->tid) ;
}
$depth =-1;
foreach ($pole as $list) {
if ($list[1] > $depth) echo "\n<ul>";
if ($list[1] < $depth) echo "\n</li>\n</ul>\n</li>";
if ($list[1] == $depth) echo "</li>";
$poc++;
echo "\n<li>$list[0]";
if ($list[2]>0) {
echo "\n<ul>";
$result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");
while($zaznam = db_fetch_array($result)) {
$node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
$node_link = l($node, "node/$zaznam[nid]");
echo "\n<li>$node_link</li>";
}
echo "\n</ul>";
}
$depth=$list[1];
}
echo "</li>\n</ul>";
?>
Comments
Уважаемый setegnom! А в этом сниппете как можно вывести документы термина по алфавиту.
По аналогии с другим, где вы мне подсказали, не получается. И сами термины тоже желательно по алфавиту расположить.
К большому сожалению, никто ответить не может.
Уважаемый setegnom! кроме вас никто ответить не может. Может поможите. Уж больно интересный сниппет. С ним можно очень многое делать на сайте.
Добрые люди мне подсказали как это сделать, может еще кому-нибудь пригодится.
Сортировка терминов по алфавиту.
После строки :
$terms = taxonomy_get_tree($vid);(5-я строка в вашем исходном файле), добавляем строку:
usort($terms,create_function('$a,$b','return strcasecmp ($a->name,$b->name);'));Для сортировки списка документов в алфавитном порядке, заменить:
$result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");while($zaznam = db_fetch_array($result)) {
$node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
$node_link = l($node, "node/$zaznam[nid]");
echo "\n<li>$node_link</li>";
}
на
$result = db_query("SELECT n.title, n.nid FROM {term_node} t INNER JOIN {node} n ON t.nid=n.nid WHERE t.tid=$list[3] ORDER BY n.title ASC");while($zaznam = db_fetch_array($result)) {
$node_link = l($zaznam[title], "node/$zaznam[nid]");
echo "\n<li>$node_link</li>";
}
Заодно избавляемся от запросов в цикле while, должно работать пошустрее.
Попробовал этот сниппет на словаре с большой и разной глубиной вложенности... Он не работает.
Он будет работать отлично в том случае, если разница между глубинами элементов не больше 1.
В моём случае после глубины 4 могла идти глубина 2 или 0.
И изменил скрипт для своих нужд - поэтому в нём нет вывода документов, которые принадлежат термину. При желании это можно добавить...
Вот код:
<?php
$vid = 13; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . (($count) ? " (".$count.")": ""). "[".$term->depth."]", $term->depth, $count, $term->tid) ;
}
$depth =-1;
foreach ($pole as $list) {
//$depth- глубина предыдущего уровня
//$list[1] - глубина текущего элемента
while ($list[1] != $depth) {
if ($list[1] > $depth) {
$depth++;
echo "\n<ul>";
}
if ($list[1] < $depth) {
$depth--;
echo "\n</li>\n</ul>\n</li>";
}
}
if ($list[1] == $depth) echo "</li>";
echo "\n<li>$list[0]";
$depth=$list[1];
}
echo "</li>\n</ul>";
?>
Предыдущий код был с ошибкой.
1. Забыл расскомментировать код, который закрывает все открытые теги в конце.
2. Оставил вывод отладочной информации
<?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 ("[".$term->depth."]" .l($term->name, "taxonomy/term/$term->tid") . (($count) ? " (".$count.")": ""), $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>";
}
}
?>
Вопрос к Владу Савицкому.
Что нужно исправить в вашем коде, чтобы в списке не выводилась глубина термина. Перед каждым термином в квадратных скобках идет 1,2, и так далее. Как это убрать?
Спасибо.
Изменить
$pole[]=Array ("[".$term->depth."]" .l($term->name, "taxonomy/term/$term->tid") . (($count) ? " (".$count.")": ""), $term->depth, $count, $term->tid) ;на
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . (($count) ? " (".$count.")": ""), $term->depth, $count, $term->tid) ;Извините, забыл убрать - торопился.
Cпасибо большое, очень полезный сниппет.
Сейчас этот сниппет выводит термины всех типов документов, связанных с определенным словарем. У меня к одному словарю прикреплено два типа документа. Что нужно исправить в сниппете, чтобы в каталоге выводились документы только одного типа?
Спасибо.
Влад Савицкий, скажите, пожалуйста, можно ли изменить этот сниппет так, чтобы решить следующий вопрос:
Мне нужно выводить в блоке термины (категории) и подтермины (подкатегории) определённого словаря (как и выводит Ваш сниппет), но только не в виде развёрнутого списка всех категорий и подкатегорий.
Нужно, чтобы в блоке выводились все категории какого-либо словаря, а при нахождении пользователя в одной из категорий, разворачивался список из соответствующих подкатегорий.
Post new comment