[решено] Посоветуйте пожалуйста решение или модуль (таксономия)

Главные вкладки

Аватар пользователя Nodachi Nodachi 27 мая 2009 в 17:59

Привет всем! Сейчас мучаюсь над такой вроде бы простой задачкой, но что-то процесс затянулся...

Дано:
Словарь (двухуровневый) с кучей терминов, одним терминам соответствуют ноды, другим пока нет:

- Термин А
----Термин А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)

В скобках - количество нод (у родительских терминов тупо сумма дочерних нод, своих нод нет).
На выходе надо такое меню:

-Сотовые телефоны
-ДВД проигрыватели

Сотики первые, так как больше нод, дочерние не выводятся. Как-то так...

Комментарии

Аватар пользователя Nodachi Nodachi 27 мая 2009 в 19:18

Так, истина где-то рядом: нашел модуль term_node_count. Он работает совместно с Views и добавляет параметр "количество нод". По этому параметру можно сортировать и отсеивать нули.

Пока сделано так: выводятся первые 10 терминов, выше те, у которых больше нод. Минус - выводятся также дочерние термину...

Вопрос: как добавить проверку уровня термина и выводить только термины первого уровня без дочерних? Жалко, во вьюс нет фильтра по уровню термина...

Аватар пользователя Nodachi Nodachi 27 мая 2009 в 19:31

И плохо, что нет фильтра по "весу" термина, ибо все родители у меня одного веса, а дочки другого. Можно было бы отсеять дочек по весу... Товарищи, помогите!

Аватар пользователя penexe penexe 27 мая 2009 в 21:32

больше на ум ничего не пришло Smile

<?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"
$vid010);
while (
$term db_fetch_object($result)) {
  
$links[] = l($term->name'taxonomy/term/'$term->tid) .'('$term->total_count .')';
}
print 
theme('item_list'$links);
?>
Аватар пользователя matveev matveev 7 июня 2009 в 22:31

penexe wrote:
больше на ум ничего не пришло Smile

<?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"
$vid010);
while (
$term db_fetch_object($result)) {
  
$links[] = l($term->name'taxonomy/term/'$term->tid) .'('$term->total_count .')';
}
print 
theme('item_list'$links);
?>

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

Аватар пользователя Nodachi Nodachi 27 мая 2009 в 21:46

Ох, скажите, а как мне это применить? Я так понял, это в теме надо прописать, т. е. нужные мне ссылки выводить будет функция... В php у меня знания просто поверхностные, а в мускуле вообще ноль ))) Но все равно спасибо - буду мудрить.

Аватар пользователя penexe penexe 27 мая 2009 в 21:56

в первой строке "6" исправить на id своего словаря, а юзать можно хоть в шаблоне хоть в блоке с php-фильтром

Аватар пользователя Nodachi Nodachi 27 мая 2009 в 22:05

Прописал ваш код в template.php в виде отдельной функции и засунул эту функцию тупо сразу в page.tpl.php посередине для проверки. Пошел было кеш почистить - а ссылки уже на месте и работают. Ура!!!

Спасибо вам большое - весь день тупил над этим геммороем))) Правильно говорят - учи php смолоду. Не раз убеждался уже что эти знания экономят кучу времени. Я вот тоже книжку запоем прочитал по pxp, програмить не могу, но по крайней мере на код уже без страха смотрю - время экономит)))

ЗЫ
Разобрался сам до появления вашего каммента - пока СПАСИБО писал вы и ответили)))

Аватар пользователя Nodachi Nodachi 29 мая 2009 в 11:44

"penexe" wrote:
больше на ум ничего не пришло Smile

<?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"
$vid010);
while (
$term db_fetch_object($result)) {
  
$links[] = l($term->name'taxonomy/term/'$term->tid) .'('$term->total_count .')';
}
print 
theme('item_list'$links);
?>

Ребята-кодеры, а как сюда по-быстрому еще сортировку в алфавитном порядке добавить?

Аватар пользователя thehil thehil 29 мая 2009 в 14:22

"Nodachi" wrote:
а как сюда по-быстрому еще сортировку в алфавитном порядке добавить?

Возожно, так:

...
ORDER BY total_count DESC, term.name ASC
...