Подскажите, есть ли сниппет для вывода дочерних терминов заданного родителя таксономии? Если нет готового решения, то может кто-нибудь подскажет как реализовать подобное? В php не силён, к сожалению...
Просто список детей нужно будет выводить в нужных местах сайта, а с помощью вьюс я пока умею создавать только либо блоки, либо целые страницы с адресом...
http://www.drupal.ru/node/39829
Нашёл сниппет, который выводит список терминов заданного словаря. Может в нём что-то подправить, что бы выводилась иерархия не словаря, а термина?
Просто список детей нужно будет выводить в нужных местах сайта, а с помощью вьюс я пока умею создавать только либо блоки, либо целые страницы с адресом...
Это вывод детей термина $parent (этой переменной нужно присвоить ID нужного термина). Берет только детей конкретного этого термина, без глубины.
Если нужно выводить только названия, то оставьте внутри цикла while только $terms[] = $term->name;
Если нужно выводить названия ссылками на страницу таксономии, оставьте только $terms[] = l($term->name, 'taxonomy/term/' . $term->tid);
Если у выбранного термина есть дети, то они выведутся списком ul li.
Если нет - выведется текст 'Упс'
<?php $result = db_query(' SELECT COUNT(tn.nid) AS c, td.tid, td.name FROM {term_hierarchy} th INNER JOIN {term_data} td ON td.tid = th.tid LEFT JOIN {term_node} tn ON tn.tid = td.tid LEFT JOIN {node} n ON n.nid = tn.nid WHERE th.parent = %d AND (n.status <> 0 OR n.status IS NULL) GROUP BY tn.tid ORDER BY td.weight ASC, td.name ASC', $parent); $terms = array(); while ($term = db_fetch_object($result)) { $terms[] = l($term->name . " ({$term->c})", 'taxonomy/term/' . $term->tid); } print count($terms) ? theme('item_list', $terms) : 'Упс';?>
Всё работает шикарно!) Спасибо ещё раз!
Понимаю, что уже надоел, но у меня остался последний вопрос: как выводить термины не списком, а просто сплош друг за другом? Потыркался сам, но ничего путного не вышло... Всё дело в item_list?
Увы, но вышеприведённый код работает не совсем правильно... Почему-то, с первым по порядку родителем всё в порядке - выводятся все дети, но вот если взять родителя из конца списка терминов или из середины, то выводится только один первый подтермин... Кто знает, в чём может быть проблема?
Комментарии
а чем не устраивает во вьюс фильтр term id with depth?
Просто список детей нужно будет выводить в нужных местах сайта, а с помощью вьюс я пока умею создавать только либо блоки, либо целые страницы с адресом...
http://www.drupal.ru/node/39829
Нашёл сниппет, который выводит список терминов заданного словаря. Может в нём что-то подправить, что бы выводилась иерархия не словаря, а термина?
поищите про views_embed
$result = db_query('
SELECT td.tid, td.name
FROM {term_hierarchy} th
INNER JOIN {term_data} td
ON td.tid = th.tid
WHERE th.parent = %d
ORDER BY td.weight ASC, td.name ASC', $parent);
$terms = array();
while ($term = db_fetch_object($result)) {
$terms[] = $term->name;
// или ссылкой на страницу термина
$terms[] = l($term->name, 'taxonomy/term/' . $term->tid);
}
print count($terms) ? theme('item_list', $terms) : 'Упс';
Ещё бы пояснение хотя б на пару слов ) А то я:
Это уже весь сниппет или только часть?
Это вывод детей термина $parent (этой переменной нужно присвоить ID нужного термина). Берет только детей конкретного этого термина, без глубины.
Если нужно выводить только названия, то оставьте внутри цикла while только $terms[] = $term->name;
Если нужно выводить названия ссылками на страницу таксономии, оставьте только $terms[] = l($term->name, 'taxonomy/term/' . $term->tid);
Если у выбранного термина есть дети, то они выведутся списком ul li.
Если нет - выведется текст 'Упс'
.
Всё получилось!
Обухов Никита, спасибо!
Подскажите, как ещё дополнить модуль, что б в скобках после каждого термина выводилось количество нод? Это реально?
Ну неужели никто не знает? Подскажите, оч нужно...
http://druit.ru/blogs/views/18
<?php
$result = db_query('
SELECT COUNT(tn.nid) AS c, td.tid, td.name
FROM {term_hierarchy} th
INNER JOIN {term_data} td
ON td.tid = th.tid
LEFT JOIN {term_node} tn
ON tn.tid = td.tid
LEFT JOIN {node} n
ON n.nid = tn.nid
WHERE th.parent = %d AND (n.status <> 0 OR n.status IS NULL)
GROUP BY tn.tid
ORDER BY td.weight ASC, td.name ASC', $parent);
$terms = array();
while ($term = db_fetch_object($result)) {
$terms[] = l($term->name . " ({$term->c})", 'taxonomy/term/' . $term->tid);
}
print count($terms) ? theme('item_list', $terms) : 'Упс';?>
Ну, замени theme('item_list', $terms) на implode(', ', $terms) - будут выводиться через запятую, например.
Увы, но вышеприведённый код работает не совсем правильно... Почему-то, с первым по порядку родителем всё в порядке - выводятся все дети, но вот если взять родителя из конца списка терминов или из середины, то выводится только один первый подтермин... Кто знает, в чём может быть проблема?
Ничего не понимаю... у одних родителей выводит по одному термину, у других четыре и лишь у одного выводит всех детей... Загадка О_о
Замени GROUP BY tn.tid на GROUP BY td.tid
других ошибок вроде нет