Небольшой сниппет вместо модуля tagadelic (Облако тэгов)

ср, 01.10.2008 14:28 :: olk

Небольшой сниппет, показывающее облако тэгов по заданному (через код vid) словарю ...
Конечно он не покрывает все возможности и настройки модуля tagadelic, но в некоторых случаях может оказаться полезным
Для темизации всего блока можно использовать стилизацию tags.voc-номер-словаря,
для темизации терминов a.tags-voc-номер-словаря ...
PS.Данный код выводит только «реальные» термины словаря, т.е. термины которые «привязаны» к нодам (просто мне показалось не логичным выводить «пустые» тэги, не связанные с материалом)
Обновление:
Добавил сортировку терминов в сниппет, переменная $order может принимать следующие значения
0 - сортировка по ид термина
1 - сортировка по весу по убыванию (с наибольшим весом выше)
2 - сортировка по весу по возрастанию (с наибольшим весом ниже)
другое значение - сортировка по имени термина

<?php
$max_fontsize = 150; // Размер шрифта для тэга с максимальным весом
$min_fontsize = 90;  // Размер шрифта для тэга с минимальным весом
$metrics = '%';      // в чем измеряется размер px,pt,em,%
$voc = 3;            // vid словаря
$order = 1;          // сортировка терминов
// 0 - сортировка по ид термина
// 1 - сортировка по весу по убыванию (с наибольшим весом выше)
// 2 - сортировка по весу по возрастанию (с наибольшим весом ниже)
// другое значение - сортировка по имени термина
// получим максимальны и минимальный вес терминов в словаре
$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=%d"
),$voc);
$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);
}
$ord = '';
switch($order){
 case 0:
       $ord = 'ORDER BY td.tid';
       break;
 case 1:
       $ord = 'ORDER BY n.cnt DESC';
       break;
 case 2:
       $ord = 'ORDER BY n.cnt';
       break;
 default:
       $ord = 'ORDER BY td.name';
}
$result = db_query(db_rewrite_sql("SELECT td.tid,td.name,n.cnt
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=%d "
.$ord),$voc);
$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-'.$voc))).' ';
}
if (!empty($tags)) {
  print '<tags class="voc-'.$voc.'">'.$tags.'</tags>';
}
?>
Добавить комментарий
« Добавить комментарий
» Добавить комментарий