[РЕШЕНО] Красивый вывод терминов таксономии для отдельно взятого словаря
Прислано: Nodachi
вс, 31/05/2009 - 12:54
Всем доброго времени суток!
Есть у меня на сайте страничка, которая выводит все термины определенного словаря. Для этих целей используется данный код:
<?php
$vid = 1; // Номер словаря
$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 (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>";
}
}
?>Но так как мой словарь очень велик, то терминов на странице очень много... Не подскажете, как мне изменить данный код чтобы термины, у которых нет нод, не выводились?
Заранее спасибо за ответы!
- Nodachi's blog
- Для комментирования войдите или зарегистрируйтесь
Текст запрос для терминов у которых есть ноды:
<?php
...
$sql = 'SELECT DISTINCT(tn.tid) from {tern_node} tn
INNER JOIN {node} n ON n.nid = tn.nid
INNER JOIN {term_data} td ON td.tid = tn.tid
WHERE n.status = 1 AND td.vid = %d';
$result = db_query($sql,$vid);
...
?>- Для комментирования войдите или зарегистрируйтесь
Вот запрос:
SELECT t.* , h.parent, COUNT( n.nid ) AS nodes
FROM {term_data} t
INNER JOIN {term_hierarchy} h ON t.tid = h.tid
INNER JOIN {term_node} n ON t.tid = n.tid
WHERE t.vid =1
GROUP BY t.tid
ORDER BY t.tid ASCПопробуйте получить из неё нужные вам данные.
Добавлено: Хехе, пока писал - опередили. :)
- Для комментирования войдите или зарегистрируйтесь
А применительно к моему коду? Я не шарю просто, куда вставлять строчки?
- Для комментирования войдите или зарегистрируйтесь
Юзаю такой код:
<?php $max_fontsize = 17; // Размер шрифта для тэга с максимальным весом $min_fontsize = 8; // Размер шрифта для тэга с минимальным весом $metrics = 'pt'; // в чем измеряется размер px,pt,em, (с установкой в процентном отношении Flash облоко глючит ) $voc = array(1); // массив (vid) словарей $max_tags = 1000; // максимальное количество показываемых тэгов $vocs = implode(',',$voc); $class_voc = implode('-',$voc); $result = db_query(db_rewrite_sql("SELECT max(cnt) AS maxcnt,min(cnt) AS mincnt FROM {term_data} td INNER JOIN (SELECT tn.tid,COUNT(tn.nid) as cnt FROM {term_node} tn INNER JOIN {node} n ON n.nid=tn.nid GROUP BY tn.tid) n ON n.tid=td.tid AND td.vid IN (".$vocs.")")); $term = db_fetch_object($result); $min_weight = $term->mincnt; $max_weight = $term->maxcnt; // вычислим коэффициент для размера шрифт if ($min_weight == $max_weight ) { $font_metric_koof = 0; } else { $font_metric_koof = ($max_fontsize - $min_fontsize) / ($max_weight - $min_weight); } $result = db_query_range(db_rewrite_sql("SELECT td.tid,td.name,n.cnt FROM {term_data} td INNER JOIN (SELECT tn.tid,COUNT(tn.nid) as cnt,MAX(n.created) as created FROM {term_node} tn INNER JOIN {node} n ON n.nid=tn.nid GROUP BY tn.tid) n ON n.tid=td.tid AND td.vid IN (".$vocs.") ORDER BY td.name,n.created DESC"),0,$max_tags); $tags = ''; while($term = db_fetch_object($result)) { $size = $min_fontsize + ($term->cnt - $min_weight) * $font_metric_koof; $style = 'font-size: '.$size.$metrics.';'; $tags .= l($term->name,'taxonomy/term/'.$term->tid, array('attributes' => array('style' => $style,'class' => 'tags-voc-'.$class_voc))).' '; } if (!empty($tags)) { $output = '<tags class="voc-'.$class_voc.'">'.$tags.'</tags>'; echo $output; } ?>
- Для комментирования войдите или зарегистрируйтесь
А применительно к моему коду? Я не шарю просто, куда вставлять строчки?
Попробуйте заменить:
$pole[] = Array(l($term->name, "taxonomy/term/$term->tid") . (($count) ? " (".$count.")": ""), $term->depth, $count, $term->tid);
на:
if($count) { $pole[] = Array (l($term->name, "taxonomy/term/$term->tid") . " (".$count.")"), $term->depth, $count, $term->tid); }
- Для комментирования войдите или зарегистрируйтесь
Parse error: syntax error, unexpected '(', expecting ')' in .....\includes\common.inc(1645) : eval()'d code on line 14
- Для комментирования войдите или зарегистрируйтесь
Parse error: syntax error, unexpected '(', expecting ')' in .....\includes\common.inc(1645) : eval()'d code on line 14
Забыл скобку убрать... пардон...
if($count) { $pole[] = Array (l($term->name, "taxonomy/term/$term->tid") . " (".$count.")", $term->depth, $count, $term->tid); }
- Для комментирования войдите или зарегистрируйтесь
Спасибо! То, что доктор прописал!
- Для комментирования войдите или зарегистрируйтесь
Так, чем дальше - тем красивее... Граждане, решил тут добавить немного красивостей и выложить тут решение.
Итак, ставим модуль taxonomy_image, в нем есть такая функция: taxonomy_image_display(). Добавляем ее в наш с вами общий код в таком виде: taxonomy_image_display($term->tid) и получаем красивый вывод терминов со значками. Надеюсь вам пригодится. Вот полный код:
<?php
$vid = 1; // Номер словаря
$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));
if($count) {
$pole[] = Array (taxonomy_image_display($term->tid) . l($term->name, "taxonomy/term/$term->tid") . " (".$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>";
}
}
?>P. S.
Кстати, после того, как загрузите картинки для терминов и будете причесывать страничку, можете спокойно создать при помощи модуля image_cache пресет для данных картинок. Ибо функция taxonomy_image_display($term->tid) использует их без проблем. Всем удачи!
- Для комментирования войдите или зарегистрируйтесь
А можно как-то вывести только термины 2-го уровня (уровней 2) и определенного родителя?
- Для комментирования войдите или зарегистрируйтесь
Сейчас этот сниппет выводит термины всех типов документов, связанных с определенным словарем. У меня к одному словарю прикреплено два типа документа. Что нужно исправить в сниппете, чтобы в каталоге выводились документы только одного типа?
Спасибо.
- Для комментирования войдите или зарегистрируйтесь
этот код нужно в ноду вставлять или как?
- Для комментирования войдите или зарегистрируйтесь
В блок или в ноду, фильтр php.
- Для комментирования войдите или зарегистрируйтесь
Я так понимаю, что никому теперь в интернете w3c валидация не нужна :).
- Для комментирования войдите или зарегистрируйтесь
Я так понимаю, что никому теперь в интернете w3c валидация не нужна :).
В моем случае чем больше пхп - тем меньше верстки, так что хороший прогер != хороший верстальщик. ;)
- Для комментирования войдите или зарегистрируйтесь







Комментарии