Привет всем! Сейчас мучаюсь над такой вроде бы простой задачкой, но что-то процесс затянулся...
Дано:
Словарь (двухуровневый) с кучей терминов, одним терминам соответствуют ноды, другим пока нет:
- Термин А
----Термин А1
----Термин А2
----Термин А3
- Термин В
----Термин В1
----Термин В2
----Термин В3
Требуется:
Меню или блок, который выводит термины. Не просто, а по такому принципу: сортировка - выше те термины, у которых больше нод. Выводить только первые 10 терминов (самых-самых по кол-ву нод). Плюс ко всему выводить надо только термины первого уровня (которые на схеме с буквами без цифр).
Сейчас ковыряю модули taxonomy_menu и taxonomy_block. Но че-то не то... Думал сделать даже при помощи tagadelic, он сортирует термины по кол-ву нод. Но как быть с дочерними терминами? Он их тоже выводит...
Еще примерчик:
К примеру такой словарь:
-- DVD-проигрыватели (4)
---- Sony (1)
---- Panasonic (3)
---- SHARP (0)
-- Сотовые телефоны (9)
---- Nokia (5)
---- Motorolla (1)
---- LG (3)
В скобках - количество нод (у родительских терминов тупо сумма дочерних нод, своих нод нет).
На выходе надо такое меню:
-Сотовые телефоны
-ДВД проигрыватели
Сотики первые, так как больше нод, дочерние не выводятся. Как-то так...
Комментарии
Так, истина где-то рядом: нашел модуль term_node_count. Он работает совместно с Views и добавляет параметр "количество нод". По этому параметру можно сортировать и отсеивать нули.
Пока сделано так: выводятся первые 10 терминов, выше те, у которых больше нод. Минус - выводятся также дочерние термину...
Вопрос: как добавить проверку уровня термина и выводить только термины первого уровня без дочерних? Жалко, во вьюс нет фильтра по уровню термина...
И плохо, что нет фильтра по "весу" термина, ибо все родители у меня одного веса, а дочки другого. Можно было бы отсеять дочек по весу... Товарищи, помогите!
больше на ум ничего не пришло
<?php
$vid = 6;
$result = db_query_range("SELECT term.name, term.tid, SUM(tc.count) as total_count FROM {term_data} term
INNER JOIN term_hierarchy th ON th.parent = term.tid
INNER JOIN (
SELECT td.tid, COUNT( n.nid ) AS count FROM {term_data} td
INNER JOIN {term_node} tn ON tn.tid = td.tid
INNER JOIN {node} n ON n.vid = tn.vid
WHERE n.status = 1 AND td.vid = %d
GROUP BY td.tid
) tc ON tc.tid = th.tid
GROUP BY th.parent
ORDER BY total_count DESC", $vid, 0, 10);
while ($term = db_fetch_object($result)) {
$links[] = l($term->name, 'taxonomy/term/'. $term->tid) .'('. $term->total_count .')';
}
print theme('item_list', $links);
?>
Спасибо. Попробую сделать так, чтобы выводились все термины, даже с нулями в скобках
Ох, скажите, а как мне это применить? Я так понял, это в теме надо прописать, т. е. нужные мне ссылки выводить будет функция... В php у меня знания просто поверхностные, а в мускуле вообще ноль ))) Но все равно спасибо - буду мудрить.
в первой строке "6" исправить на id своего словаря, а юзать можно хоть в шаблоне хоть в блоке с php-фильтром
Прописал ваш код в template.php в виде отдельной функции и засунул эту функцию тупо сразу в page.tpl.php посередине для проверки. Пошел было кеш почистить - а ссылки уже на месте и работают. Ура!!!
Спасибо вам большое - весь день тупил над этим геммороем))) Правильно говорят - учи php смолоду. Не раз убеждался уже что эти знания экономят кучу времени. Я вот тоже книжку запоем прочитал по pxp, програмить не могу, но по крайней мере на код уже без страха смотрю - время экономит)))
ЗЫ
Разобрался сам до появления вашего каммента - пока СПАСИБО писал вы и ответили)))
Удаляю нафиг свой вьюс и юзаю эту функцию.
Спасибо! пригодилось!
Ребята-кодеры, а как сюда по-быстрому еще сортировку в алфавитном порядке добавить?
ап
Возожно, так:
ORDER BY total_count DESC, term.name ASC
...
Спасибо!
а можно как нибудь сделать что бы при нажатии на термины первого уровня выпадали дочернии?