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

ср, 01.10.2008 14:28 :: olk

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

  1. <?php
  2. $max_fontsize = 150; // Размер шрифта для тэга с максимальным весом
  3. $min_fontsize = 90;  // Размер шрифта для тэга с минимальным весом
  4. $metrics = '%';      // в чем измеряется размер px,pt,em,%
  5. $voc = 3;            // vid словаря
  6. $order = 1;          // сортировка терминов
  7. // 0 - сортировка по ид термина
  8. // 1 - сортировка по весу по убыванию (с наибольшим весом выше)
  9. // 2 - сортировка по весу по возрастанию (с наибольшим весом ниже)
  10. // другое значение - сортировка по имени термина
  11. // получим максимальны и минимальный вес терминов в словаре
  12. $result = db_query(db_rewrite_sql("SELECT max(cnt) AS maxcnt,min(cnt) AS mincnt
  13. FROM {term_data} td  INNER JOIN
  14. (SELECT tn.tid,COUNT(tn.nid) as cnt  FROM {term_node} tn
  15. INNER JOIN {node} n ON n.nid=tn.nid GROUP BY tn.tid) n
  16. ON n.tid=td.tid AND td.vid=%d"),$voc);
  17. $term = db_fetch_object($result);
  18. $min_weight = $term->mincnt;
  19. $max_weight = $term->maxcnt;
  20. // вычислим коэффициент для размера шрифта
  21. if ($min_weight == $max_weight ) {
  22.     $font_metric_koof = 0;
  23. }
  24. else {
  25.     $font_metric_koof = ($max_fontsize - $min_fontsize) / ($max_weight - $min_weight);
  26. }
  27. $ord = '';
  28. switch($order){
  29.  case 0:
  30.        $ord = 'ORDER BY td.tid';
  31.        break;
  32.  case 1:
  33.        $ord = 'ORDER BY n.cnt DESC';
  34.        break;
  35.  case 2:
  36.        $ord = 'ORDER BY n.cnt';
  37.        break;
  38.  default:
  39.        $ord = 'ORDER BY td.name';
  40. }
  41. $result = db_query(db_rewrite_sql("SELECT td.tid,td.name,n.cnt
  42. FROM {term_data} td  INNER JOIN
  43. (SELECT tn.tid,COUNT(tn.nid) as cnt  FROM {term_node} tn
  44. INNER JOIN {node} n ON n.nid=tn.nid GROUP BY tn.tid) n
  45. ON n.tid=td.tid AND td.vid=%d ".$ord),$voc);
  46. $tags = '';
  47. while($term = db_fetch_object($result)) {
  48.  $size = $min_fontsize + ($term->cnt - $min_weight) * $font_metric_koof;
  49.  $style = 'font-size: '.$size.$metrics.';';
  50.  $tags .= l($term->name,'taxonomy/term/'.$term->tid,
  51.    array('attributes' => array('style' => $style,'class' => 'tags-voc-'.$voc))).' ';
  52. }
  53. if (!empty($tags)) {
  54.   print '<tags class="voc-'.$voc.'">'.$tags.'</tags>';
  55. }
  56. ?>

Комментарии

На сколько целесообразно писать сниппет при обработки большого количества данных, скажем 10 000 нод к одному термину?

Сниппет, это все таки "Быстрое (в смысле быстренько, что нибудь сделать :) но не оптимизированное решение", в некоторых случаях он будет отрабатывать быстрее (за счет четкого детерминированного запроса") но в общем случае будет работать медленнее, хотя бы только из за того, что данные не кэшируются.

Добавить комментарий
« Добавить комментарий
» Добавить комментарий