Сниппет опупительного облака тегов

Аватар пользователя Wincert Wincert 29 сентября 2008 в 18:18

Думаю многие уже видели плагин для вордпресса WP-Cumulus, он представляет из себя красивое облако тегов выводимое с помощью Flash и JS (посмотреть его можно на этом сайте про CSS). Но я не любители вордпресса ). Поэтому пришлось поковыряться в этом плагине и присобачить его к Drupal. Решил поделиться этим сниппетом с вами.

1. Модуль tagadelic нам все равно понадобиться, ведь не у всех установлен FlashPlayer и включен JS в браузере. У кого этого нет, тому будет показываться простое облако тегов которое выводится с помощью модуля tagadelic. Поэтому качаем этот модуль и устанавливаем его.

2. В формировании облака учавствуют 2 подключемых файла: SWF файл и JS файл. Прикрепить .swf к этой статье не удалось, поэтому даю ссылки со своего хоста. Качаем эти два файла, без них ниче не выйдет ).

3. И вот наконец сам сниппет который надо вставить на страницу или в блок, вообщем куда хотите, главное формат ввода поставьте "PHP code":
<?php
//Указываем ID словаря из которого будем выводить теги
$slovar = "1";

//Запрос для вывода тегов
$query = "SELECT DISTINCT t.name, t.tid
FROM {term_data} t
WHERE t.vid = $slovar";

//получаем результат запроса
$sql = db_rewrite_sql($query);
$result = db_query($sql);

//формируем теги для вывода в облаке
$ftags = "";
while ($node = db_fetch_object($result)) {
$ftags .= ' tid.'" style="font-size: 10pt">'.$node-> name.'';
}
$ftags .= "";

//получаем теги выводимые с помощью модуля tagadelic (будет выводиться если у пользователя не установлен FlashPlayer или не включен JS в браузере)
$vocs = array(1); //Список словарей
$tags = tagadelic_get_weighted_tags($vocs, 6, 20);
$tags = tagadelic_sort_tags($tags);
$output = theme('tagadelic_weighted',$tags);

echo '
'. $output .'

var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("'. base_path() . path_to_theme() .'/tagcloud.swf?r="+rnumber, "tagcloudflash", "230", "170", "9", "#ffffff");
widget_so.addParam("allowScriptAccess", "always");
widget_so.addVariable("tcolor", "0x333333");
widget_so.addVariable("tspeed", "220");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "'.urlencode($ftags).'");
widget_so.write("tags");

';
?>

Там аккуратнее с путями не запутайтесь!!! Путь к подключаемому JS скрипту (swfobject.js) и путь к swf файлу (tagcloud.swf). Сейчас там стоят пути к дериктории вашего шаблона ('. base_path() . path_to_theme() .'/), если положить эти файлы туда, то все будет работать.

Данное облако я реализовал на последнем своем сайте о CSS и верстке.
Подробнее Почитать о параметрах плагина можно на моем блоге, там же есть пример и исходники.

0 Thanks

Комментарии

Аватар пользователя oblivion oblivion 29 сентября 2008 в 19:09

выглядит впечатляюще. только вот если слишком много тегов то немного путаница наступает. а так спасибо.

Аватар пользователя Antoniy Antoniy 29 сентября 2008 в 21:46

По Флэш и Ява не пойдут, но тут, как я понял, если Флэш и Ява в браузере нет, то выводится обычный текстовый Tagadelic, для людей так, может и для ботов тоже?

Аватар пользователя Antoniy Antoniy 29 сентября 2008 в 21:40

Спасибо! Я создал новый блок и вставил туда PHP-код, отлично работает!

У меня такой вопрос: а как сделать так, чтобы в этом облаке тегов выводились только те тэги, которые указаны в нодах (раньше без этого модуля с одним tagadelic так и было)? А сейчас выводятся все тэги, которые есть в словаре таксономии, и те что используются в нодах и те, что пока не используются.

Аватар пользователя Wincert Wincert 29 сентября 2008 в 23:26

AntonTau я тоже думаю, даже уверен в этом на 99% что поисковый бот увидит обычный Tagadelic, то есть просто ссылки. Так что на СЕО эффект флеш и JS никак не повлияют.

"AntonTau" wrote:

а как сделать так, чтобы в этом облаке тегов выводились только те тэги, которые указаны в нодах (раньше без этого модуля с одним tagadelic так и было)?

Надо в SQL запросе правельное условие сделать, точнее сазать не могу т.к. не знаю по каким критериям там отбирается. Или же сделать отдельный словарь для тегов которые хотите выводить в облаке.

Аватар пользователя Antoniy Antoniy 30 сентября 2008 в 15:50

Спасибо! В SQL я пока новичок совсем.. проще сделать отдельный словарь.

Аватар пользователя Wave Wave 30 сентября 2008 в 2:05

Глянул на тот пример: жутко неудобно. Пока нужный тег рассмотришь, потом пока его поймаешь...

Аватар пользователя Wincert Wincert 30 сентября 2008 в 11:58
"Ainur" wrote:

Рекомендую ссылки делать через l();

Прошу прощения, непонял.

"Barcelona" wrote:

А как сделать фон прозрачным?

Думаю не как. Только определенный цвет можно указать.

"Wave" wrote:

Глянул на тот пример: жутко неудобно. Пока нужный тег рассмотришь, потом пока его поймаешь...

Надо тренироваться почаще ).

Аватар пользователя VladSavitsky VladSavitsky 30 сентября 2008 в 13:19

Эффектно и ново - согласен.
С точки зрения юзабилити - неудобно.
При большом количестве тегов - каша.
При отключенном флеше ничего не выводится, а значит для поисковиков эти теги не видны. Утрачивается одна из основных фишек облака тегов - перелинковка на сайте.
Если бы при отключенном JS или флеше выводить обычные теги,
и автоматом увеличивать поле в зависимости от количества тегов, то было бы удобнее.

Аватар пользователя Ainur Ainur 30 сентября 2008 в 15:41

Гламурненькая штучка, только на моем сайте, она повесила мне браузер, очевидно из-за большого количества тегов.

"Wincert" wrote:

Прошу прощения, непонял.

Про l() имелось в виду, делать так: $ftags .= l($node->name, '/taxonomy/term/' . $node-> tid);

Аватар пользователя Antoniy Antoniy 30 сентября 2008 в 15:55
Ainur wrote:

...делать так: $ftags .= l($node->name, '/taxonomy/term/' . $node-> tid);

А что это даёт?

Да, такое облако выводит все тэги из словаря, и если их много, то, вот даже может браузер повесить. Наверное эта фишка с облаком только для некоторых (избранных тэгов), именно, как фишка.

Аватар пользователя Ainur Ainur 30 сентября 2008 в 16:08
"AntonTau" wrote:

А что это даёт?

это формирует правильную друпаловую ссылку, если для термина /taxonomy/term/1 есть алияс, то это выдаст алияс, а не /taxonomy/term/1

Аватар пользователя Wincert Wincert 30 сентября 2008 в 18:31
"VladSavitsky" wrote:

При отключенном флеше ничего не выводится, а значит для поисковиков эти теги не видны. Утрачивается одна из основных фишек облака тегов - перелинковка на сайте.

Вы уверены в этом? Почитайте повнимательней, я очень долго тестировал это облако тегов. Мои тесты показывают что при отключении флеш или JS выводится обычное облако тегов.

Аватар пользователя VladSavitsky VladSavitsky 30 сентября 2008 в 23:05
"Wincert" wrote:

Вы уверены в этом? Почитайте повнимательней, я очень долго тестировал это облако тегов. Мои тесты показывают что при отключении флеш или JS выводится обычное облако тегов.

Уверен. Специально смотрел в 2х браузерах. В ФФ у меня стоит флеш, а в опере его нет. В опере я на обоих сайтах вижу серый прямоугольник.
Может быть проверяется наличие и JS и флеша одновременно? У меня был отключен только флеш, а JS включен.

Аватар пользователя Wincert Wincert 1 октября 2008 в 14:34
"VladSavitsky" wrote:

Уверен. Специально смотрел в 2х браузерах. В ФФ у меня стоит флеш, а в опере его нет. В опере я на обоих сайтах вижу серый прямоугольник.
Может быть проверяется наличие и JS и флеша одновременно? У меня был отключен только флеш, а JS включен.

Насколько я знаю флеш устанавливается не для каждого браузера в отдельности, а для системы в целом и браузеры уже используют его если он есть.
Что касается этого облака, там нет никаких проверок на флеш и JS, там все гораздо проще. В слой id="tags" мы выводим обычное облако тегов, а дальше срабатывает JS который пытается вывести "опупительное облако" и если по каким то причинам "опупительное облако" вывести не удается (нет флеша или выключен JS), то остается обычное облако тегов которое было выведенно изначально.
Я тестирую, у меня все впорядке, выводится или "опупительное облако" или обычное облако tagadelic.

Аватар пользователя VladSavitsky VladSavitsky 10 ноября 2015 в 11:45
"Wincert" wrote:

Насколько я знаю флеш устанавливается не для каждого браузера в отдельности, а для системы в целом и браузеры уже используют его если он есть.

В винде может быть это и так - уже и не помню. Я в Линуксе и у меня каждый браузер живет своей жизнью. Я меня это устраивает.

Возможно, js отрабатывает (у меня он включен) и выводит опупительное облако поверх обычного и я его не вижу. Вот скриншот:

Аватар пользователя VladSavitsky VladSavitsky 1 октября 2008 в 19:54

Флеш JS Результат
да нет обычное
да да опупительное
нет да ничего
нет нет обычное

Аватар пользователя Wincert Wincert 1 октября 2008 в 21:01

Вот если только в Opere такая трабла, то я кажется знаю как ее разрешить. А если в FF и в IE, то там уже сложнее будет, а может и вообще нереально.

Аватар пользователя Antoniy Antoniy 1 октября 2008 в 22:05

Может быть возможно написать код, чтобы браузер к этому облаку не хотел подключать флэш, если его нету в системе?

Аватар пользователя VladSavitsky VladSavitsky 1 октября 2008 в 22:40

Я так понимаю, что переключением между флеш-облаком и обычным заведует JS.
Нужно научить его проверять наличие в браузере возможности показывать флеш.

Аватар пользователя pluser pluser 2 октября 2008 в 1:21

Жесть :-)
Я попробовал на свои 200 тегов и мой сафари чуть чуть не сдох.

Аватар пользователя Wincert Wincert 2 октября 2008 в 18:47

Ковырял недавно тему флешдетектора, кроссбраузерного решения так и не нашел. Нормальный флешдетектор получается только для опреы и ему подобных. Может как нибудь еще поковыряю, как время будет.

Аватар пользователя Drugan Drugan 4 октября 2008 в 12:24

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

Аватар пользователя Antoniy Antoniy 4 октября 2008 в 20:55

Drugan, просветите, пожалуйста, как скрестили. Я пока только html и css умею скрещивать..

Аватар пользователя Drugan Drugan 5 октября 2008 в 19:29

Я в php не силен. Можно, наверное, как-то получше это сделать. Вероятно тут даже и без tagadelic можно обойтись. У меня вот, что получилось:

<?php
$max_fontsize = 25; // Размер шрифта для тэга с максимальным весом
$min_fontsize = 8;  // Размер шрифта для тэга с минимальным весом
$metrics = 'pt';      // в чем измеряется размер px,pt,em,%
$voc = 5;            // vid словаря

// получим максимальны и минимальный вес терминов в словаре
$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);
}

$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 "
),$voc);
$ftags = "<tags>";
while($term = db_fetch_object($result)) {
 $size = $min_fontsize + ($term->cnt - $min_weight) * $font_metric_koof;
 $style = 'font-size: '.$size.$metrics.';';
 $ftags .= l($term->name,'taxonomy/term/'.$term->tid,
   array('attributes' => array('style' => $style,'class' => 'tags-voc-'.$voc))).' ';
}

$ftags .= "</tags>";

//получаем теги выводимые с помощью модуля tagadelic (будет выводиться если у пользователя не установлен FlashPlayer или не включен JS в браузере)
        $vocs = array(5); //Список словарей
        $tags = tagadelic_get_weighted_tags($vocs, 6, 20);
        $tags = tagadelic_sort_tags($tags);
        $output = theme('tagadelic_weighted',$tags);

echo '<div id="tags">
'
. $output .'
<script type="text/javascript" src="'
. base_path() . path_to_theme() .'/swfobject.js"></script>
<script type="text/javascript">
var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("'
. base_path() . path_to_theme() .'/tagcloud.swf?r="+rnumber, "tagcloudflash", "200", "200", "9", "#f1f1f1");
widget_so.addParam("allowScriptAccess", "always");
widget_so.addVariable("tcolor", "3350237");
widget_so.addVariable("tspeed", "120");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "'
.urlencode($ftags).'");
widget_so.write("tags");
</script>
</div>'
;
?>

Аватар пользователя Drugan Drugan 6 октября 2008 в 14:12

Только вот бы еще можно было ограничивать количество выводимых тэгов...

Аватар пользователя VladSavitsky VladSavitsky 6 октября 2008 в 16:26
"Drugan" wrote:

Только вот бы еще можно было ограничивать количество выводимых тэгов...

В sql-запросе добавьте в конце "LIMIT 0, $max"
где $max - нужное максимальное количество тегов.

Аватар пользователя Drugan Drugan 7 октября 2008 в 10:02
VladSavitsky wrote:

В sql-запросе добавьте в конце "LIMIT 0, $max"
где $max - нужное максимальное количество тегов.

В этом случае будет просто ограничиваться их количество или останутся теги, встречающиеся наиболее часто в нодах?

Аватар пользователя Antoniy Antoniy 6 октября 2008 в 23:36

Ввел в блок код, как предложил Drugan, ничего не меняя.

Первоначальный код теги выводил.

Аватар пользователя Drugan Drugan 7 октября 2008 в 9:59

$voc = 5; // vid словаря
$vocs = array(5); //Список словарей
Здесь нужно свой словарь указать, может в этом дело?

Аватар пользователя Antoniy Antoniy 7 октября 2008 в 15:20

Поставил $voc = 1; и $vocs = array(1); - как и было в первый раз, когда всё работало.

блок пустой и в админке текст ошибки:

"warning: htmlspecialchars() expects parameter 1 to be string, array given in /home/russerv6/public_html/includes/bootstrap.inc on line 631."

Аватар пользователя Antoniy Antoniy 7 октября 2008 в 15:23

Нет, блок не пустой, там один ооочень, аж почти не видно, маленький тег плавает.. :))

Аватар пользователя a.mohax a.mohax 7 октября 2008 в 10:07

Пока флэш не доконца згрузился, показывает теги первого словаря, а как только загрузиться отображает те теги, номер словоря которого я указал в настройках снипета.

Тока заметил массив с используемыми словарями, попробую его тоже поменять :)

Аватар пользователя olk olk 7 октября 2008 в 12:42

Интересно, а случайно у этого SWF объекта нет параметра что нибудь типа font-family ?
Ну и проверил со своим сниппетом :) вроде работает (при этом модуль tagadelic не нужен)


<?php
$max_fontsize 
18;  // Размер шрифта для тэга с максимальным весом
$min_fontsize 9;   // Размер шрифта для тэга с минимальным весом
$metrics 'pt';     // в чем измеряется размер px,pt,em, (с установкой в процентном отношении Flash  облоко глючит )  
$voc = array(3);     // массив (vid) словарей
$max_tags 20;      // максимальное количество показываемых тэгов
$width_swf 160;    // ширина и высота  SWF объекта
$height_swf 160;
$bgcolor_swf '#ffffff'// Цвет фона SWF объекта
$color_swf   '0x226688';// Цвет шрифта SWF объекта
$speed_swf   '100';     // Ну видимо скорость вращения облака

$vocs 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  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 n.cnt 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-'.$voc))).' ';

if (!empty(
$tags)) {
$tags='<tags class="voc-'.$voc.'">'.$tags.'</tags>';
$output='<div id="tags">'.$tags.'
<script type="text/javascript" src="'
base_path() . path_to_theme() .'/swfobject.js"></script>
<script type="text/javascript">
var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("'
base_path() . path_to_theme() .'/tagcloud.swf?r="+rnumber, "tagcloudflash", "'.$width_swf.'", "'.$height_swf.'", "9", "'.$bgcolor_swf.'");
widget_so.addParam("allowScriptAccess", "always");
widget_so.addVariable("tcolor", "'
.$color_swf.'");
widget_so.addVariable("tspeed", "'
.$speed_swf.'");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "'
.urlencode($tags).'");
widget_so.write("tags");
</script>
</div>'
;
echo 
$output;
}
}
?>
Аватар пользователя Antoniy Antoniy 7 октября 2008 в 15:09

$voc = array(3); - это настройки словаря, кодгда 3 стояло, то блок не выводился, поставил 1, блок появился, но вместо тегов текст ошибки:

"Parse error: parse error, unexpected '}' in /home/russerv6/public_html/includes/common.inc(1347) : eval()'d code on line 59"

Внизу кода вроде лишняя закрывающая скобка, убрал ее, блок пустой, в админке вывод:

"warning: htmlspecialchars() expects parameter 1 to be string, array given in /home/russerv6/public_html/includes/bootstrap.inc on line 631."

Видимо еще что-то лишнее стоит?

Аватар пользователя olk olk 7 октября 2008 в 16:11

$voc = array(3); да это номер словаря (может быть несколько), например $voc = array(1,2,3);
Ошибка есть :) забыл что я теги темизирую (назначаю класс) через номер словоря , ну и лишняя скобка в концe } исправленная версия ниже:

<?php
$max_fontsize = 18;  // Размер шрифта для тэга с максимальным весом
$min_fontsize = 9;   // Размер шрифта для тэга с минимальным весом
$metrics = 'pt';     // в чем измеряется размер px,pt,em, (с установкой в процентном отношении Flash  облоко глючит )  
$voc = array(3);     // массив (vid) словарей
$max_tags = 20;      // максимальное количество показываемых тэгов
$width_swf = 160;    // ширина и высота  SWF объекта
$height_swf = 160;
$bgcolor_swf = '#ffffff'; // Цвет фона SWF объекта
$color_swf   = '0x226688';// Цвет шрифта SWF объекта
$speed_swf   = '100';     // Ну видимо скорость вращения облака

$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  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 n.cnt 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)) {
$tags='<tags class="voc-'.$class_voc.'">'.$tags.'</tags>';
$output='<div id="tags">'.$tags.'
<script type="text/javascript" src="'
. base_path() . path_to_theme() .'/swfobject.js"></script>
<script type="text/javascript">
var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("'
. base_path() . path_to_theme() .'/tagcloud.swf?r="+rnumber, "tagcloudflash", "'.$width_swf.'", "'.$height_swf.'", "9", "'.$bgcolor_swf.'");
widget_so.addParam("allowScriptAccess", "always");
widget_so.addVariable("tcolor", "'
.$color_swf.'");
widget_so.addVariable("tspeed", "'
.$speed_swf.'");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "'
.urlencode($tags).'");
widget_so.write("tags");
</script>
</div>'
;
echo $output;
}
?>

Аватар пользователя Antoniy Antoniy 7 октября 2008 в 16:36

Опять та же самая ошибка в админке.. видимо код заточен под Ваши настройки системы... я пока не могу разобраться в чем дело..

Аватар пользователя Antoniy Antoniy 7 октября 2008 в 15:46

Пока сделал так:

<?php
$max_fontsize = 20;  // Размер шрифта для тэга с максимальным весом
$min_fontsize = 10;   // Размер шрифта для тэга с минимальным весом
$metrics = 'pt';     // в чем измеряется размер px,pt,em, (с установкой в процентном отношении Flash  облоко глючит )  
$max_tags = 10;      // максимальное количество показываемых тэгов

//Указываем ID словаря из которого будем выводить теги
$slovar = "1";

//Запрос для вывода тегов
$query = "SELECT DISTINCT t.name, t.tid
  FROM {term_data} t
WHERE t.vid = $slovar"
;

//получаем результат запроса
$sql = db_rewrite_sql($query);
$result = db_query($sql);

//формируем теги для вывода в облаке
$ftags = "<tags>";
while ($node = db_fetch_object($result)) {
    $ftags .= '<a href="/taxonomy/term/'.$node-> tid.'" style="font-size: 10pt">'.$node-> name.'</a>';
}
$ftags .= "</tags>";

//получаем теги выводимые с помощью модуля tagadelic (будет выводиться если у пользователя не установлен FlashPlayer или не включен JS в браузере)
        $vocs = array(1); //Список словарей
        $tags = tagadelic_get_weighted_tags($vocs, 6, 20);
        $tags = tagadelic_sort_tags($tags);
        $output = theme('tagadelic_weighted',$tags);

echo '<div id="tags">
'
. $output .'
<script type="text/javascript" src="'
. base_path() . path_to_theme() .'/swfobject.js"></script>
<script type="text/javascript">
var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("'
. base_path() . path_to_theme() .'/tagcloud.swf?r="+rnumber, "tagcloudflash", "230", "170", "9", "#eaeaea");
widget_so.addParam("allowScriptAccess", "always");
widget_so.addVariable("tcolor", "0x333333");
widget_so.addVariable("tspeed", "220");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "'
.urlencode($ftags).'");
widget_so.write("tags");
</script>
</div>'
;
?>

Чуть лучше, облако от тегов не ломится. Пока обхожусь отдельным словарем в котором только те теги, что использованы в нодах.

Аватар пользователя andrush andrush 11 октября 2008 в 22:16

Никто не пробовал выводить вместо текста картинки? Это конечно глобально меняет назначение такого облака, но может оказаться вариант интересный..

Аватар пользователя gorr gorr 12 октября 2008 в 10:34

А почему бы и нет, ведь есть taxonomy_image, который каждому тегу ставит в соответствие картинку, теперь осталось пустить их летать:)

Аватар пользователя Antoniy Antoniy 12 октября 2008 в 16:45

Даже так можно.. Я все больше склоняюсь, что "Опупительное облако тегов" - это не просто облако тегов (функционал), а скорее эдакая "изюминка" сайта.

Аватар пользователя kyky kyky 13 октября 2008 в 3:28

можно сначала выводить простой блок с тегами, а потом закрашивать его с помощью SWFObject.js.
тогда если не тфлеша, то останется простой блок

Аватар пользователя Antoniy Antoniy 14 октября 2008 в 18:54

На пятом Друпале работает, я проверял, но только с оригинальным кодом. Пробывал со всеми нововведениями - не работает. Т. е. на пятом Друпале пока так: вывод всех тегов, и если не хочется браузер вешать из-за того, что тегов слишком много, то надо создавать отдельный словарь специально для "опупительного облака тегов"

Аватар пользователя Antoniy Antoniy 14 октября 2008 в 19:14

Я подумал, а если превратить "опупительное облако" в primry links?

Можно "не настоящее" primry links, т. е. завести отдельный словарь с тегами Главная, О нас, Портфолио и т. п., привязать эти теги к соответствующим материалам и вывести словарь в "опупительном облаке" Ну такое primary, возможно, не на всех страницах, а только на главной. Но тогда вопрос, а зачем эти спец теги будут висеть в нодах по всем остальным URL? Не зачем.

Вопрос: а можно ли в "опупительное облако" встроить настоящее primary links для вывода, опять же, отдельным блоком?

Аватар пользователя Antoniy Antoniy 14 октября 2008 в 23:24

Wincert, я решил сделать, как показано в Вашем блоге http://w-blog.ru/node/22 (вставил код на страницу Т. е. чтобы не теги, а любые ссылки выводились.

Если отрубить сниппет (блок) с кодом приведенном в данной теме "Опупмиельное облако тегов", то на странице с кодом, приведенном в Вашем блоге, вообще ничего не выводится, только сам пустой Flash объект. А если сниппет оставить, то на странице выводятся все теги таксономии, но не ссылки.

Я создал файл .php с кодом из Вашего блога, кинул в корень .js и .swf и все работает. Подскажите, пожалуйста, как сделать так, чтобы на странице Друпала было так же? Т. е. ссылки, а не теги из таксономии.

Аватар пользователя Antoniy Antoniy 15 октября 2008 в 0:08

Разобрался... правильный путь до .js и .swf надо поставить. Положил .js и .swf в корень и прописал абсолютные пути до них

Вот такой код:

<script type="text/javascript" src="http://mysite.com/swfobject.js"></script>
<div id="tags">
<?php
$tags = '<tags>
<a href="http://mysite.com/about" style="font-size: 15pt">Обо мне</a>
<a href="http://mysite.com/prtfolio" style="font-size: 15pt">Портфолио</a>
<a href="http://mysite.com/blog" style="font-size: 15pt">Блог</a>
<a href="http://mysite.com/download" style="font-size: 15pt">Скачать</a>
<a href="http://mysite.com/contact" style="font-size: 15pt">Контакты</a>
<a href="http://mysite.com/glossary" style="font-size: 15pt">Глоссарий</a>
</tags>'
;
?>  
<script type="text/javascript">
var rnumber = Math.floor(Math.random()*9999999);
var widget_so = new SWFObject("http://mysite.com/tagcloud.swf?r="+rnumber, "tagcloudflash", "230", "140", "9", "#eaeaea");
widget_so.addParam("allowScriptAccess", "always");widget_so.addVariable("tcolor", "0x333333");
widget_so.addVariable("tspeed", "115");
widget_so.addVariable("distr", "true");
widget_so.addVariable("mode", "tags");
widget_so.addVariable("tagcloud", "<?php echo urlencode($tags); ?>");
widget_so.write("tags");</script>
</div>
Аватар пользователя Wincert Wincert 6 ноября 2008 в 15:42

Приветствую вас читатели и веб девлоперы!
Я рад что вам понраволсь облако и спасибо за проявленый интерес. К сожалению у меня не всегда есть возможнось отчечать, но по возможности буду это делать. Если вы знаете или видели еще какие-нибудь фишки на сайтах, пишите, я по возможности займусь ими и привинчу к друпалу. Контакты в профиле.

Аватар пользователя dpu dpu 3 декабря 2008 в 15:47

Почему сниппет выводит картинку с терминами только на странице admin/content/taxonomy, т.е. запрос к таблице

$query = "SELECT DISTINCT t.name, t.tid
  FROM {term_data}t
WHERE t.vid = $slovar"
;

работает только на этой странице. На остальных запрос возвращает пустой результат.

Аватар пользователя dpu dpu 3 декабря 2008 в 18:52

А могут быть какие-нибудь ограничения на доступ к таблицам базы из разных нодов или блоков? Такое впечатление, что у меня доступ к таблице возможен, если в этом ноде уже обращение было.

Аватар пользователя Antoniy Antoniy 4 декабря 2008 в 13:17

Не могу сказать, я в пятом Друпале создавал новый блок и вставил туда тот код, что в посте этой темы без изменений, и всё работало, только вот плохо, что все тэги собираются, и которые в нодах использованы и которые нигде не использованы.

А еще выше есть код, который можно для простых ссылок использовать, вот этот, думаю, вообще куда угодно можно вставлять, я его и в блоки и в ноды вставлял, и даже просто без Друпала он работает в файле .php. Т. е. соответственно без базы данных.

Аватар пользователя Freedom Freedom 4 декабря 2008 в 12:16

Та же проблема: маленький тег и ошибка.
warning: htmlspecialchars() expects parameter 1 to be string, array given in /var/www/virtual/*****/drupal-5.3/includes/bootstrap.inc on line 631.

Пути прописаны до файлов.
Как заметили друпал 5-й.
Изначальный код выдаёт ошибку связанную с названием таблиц при селекте.
Используется i18n.

Аватар пользователя Antoniy Antoniy 4 декабря 2008 в 13:12

В пятом Друпале работает только код, который в самом посте без изменений, потом в комментах идет измененный код, вот измененный в пятом не работает.

В пятом еще работает код для простых ссылок, что я выше приводил, этот можно куда угодно вставлять, где PHP разрешено.

Аватар пользователя Freedom Freedom 4 декабря 2008 в 13:22

А можно уточнить, какой именно из них работает на 5ке. А то их тут столько уже кодов. Заранее спасибо.

Аватар пользователя Freedom Freedom 4 декабря 2008 в 13:29

При использовании кода в изначальном посте выдаёт ошибку:
user warning: Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT t.name, t.tid FROM term_data t LEFT JOIN i18n_node i18n ON n.nid = i18n.nid WHERE (i18n.language ='ru' OR i18n.language ='' OR i18n.language IS NULL) AND ( t.vid = 1) in /var/www/virtual/*****/drupal-5.3/includes/database.mysql.inc on line 172.

Аватар пользователя dpu dpu 4 декабря 2008 в 21:07

i18n добавляет в запрос свои условия. Я отключил мультиязычность, но не помогло, т.к. в запрос добавляется проверка прав пользователя:

$sql=SELECT DISTINCT t.name, t.tid FROM {term_data} t INNER JOIN {node_access} na ON na.nid = n.nid WHERE (na.grant_view >= 1 AND ((na.gid = 0 AND na.realm = 'all') OR (na.gid = 2 AND na.realm = 'term_access'))) AND ( t.vid = 4)

это для обычного пользователя, а для админа ничего не меняется:

$sql=SELECT DISTINCT t.name, t.tid FROM {term_data} t WHERE t.vid = 4

Как обойти эту проверку, т.е. возможен ли альтернативный метод доступа к таблице?

Аватар пользователя Antoniy Antoniy 4 декабря 2008 в 22:25

Я в БД не силен, могу только сказать, что сначала попробуйте всё локально, например на Денвере, а потом залейте на тот хостинг, где все будет работать еще лучше, чем локально, без ограничений. А у Вас там доступ к БД вообще есть, к PHP MyAdmin ?

Аватар пользователя Atomic-energy.ru Atomic-energy.ru 23 февраля 2009 в 20:08

вопрос:

как сделать данный флеш-обьект из ссылок на обычные страницы сайта (новости, статьи, блоги, календарь и т п), то есть получится аналог главного меню

Аватар пользователя Antoniy Antoniy 26 февраля 2009 в 20:45

Смотрите мои ранние комменты: можно сделать вместо тегов простые ссылки и, видимо, вместо тегов сделать меню.

Аватар пользователя denser denser 26 февраля 2009 в 22:26

Здравствуйте!

Помогите пожалуйста!!!!

Офигенно понравился сниппет. Я его вставил в друпал на локалке (под денвером) и все работает. Когда перенес сайт на сервак (мастерхост), то в версии 6.6 все работало тоже, но были другие глюки.
Обновил версию до 6.9 и заодно обновилось ПО с php4 до php5, из-за чего друпал стал выдавать ошибку про временную папку. Но облако тегов работало.
Исправленно тем, что в настройках друпала (файловая система) указана временная папка не /tmp, а:
/home/uномер_площадки/nashko.ru/tmp

И я так понимаю, именно после этого у меня перестало работать облако тегов 3Д. Других существенных изменений я не проводил.

Перестало работать - это вместо самого облака выводится часть пхп-кода сниппета :(((

Посмотреть можено тут http://nashko.ru/ - в левой колонке сразу видно.

Не понимаю в чем дело, где ковырять?

Буду рад любой помощи.

Аватар пользователя PVasili PVasili 26 февраля 2009 в 22:35

Прикольно было-бы вместо текста выводить картинки (например лица, лейбы компаний, и т.д.)

Аватар пользователя FORTIS FORTIS 7 апреля 2009 в 13:04

а можно ли сделать флеш-облако навигации? чтобы пункты ссылались на Страницу, т.е. без таксономии.

я попробовал привязать к нужным страницам по тегу и вывести их в облаке, но когда нажимаешь на тег в облаке - выводится страница с тизерами всех документов связаных с этим тегом, а мне надо шобы не тизеры были а полный текст, сделать с этим ничего не смог поэтому и задал вопрос :)

Аватар пользователя patator patator 7 апреля 2009 в 19:07

Почитал посты AntonTau, но всё равно не понял, как реализовать прямые ссылки на ноды из облака.
...
Всё. Разобрался. Но вариант обходной.
Вот тут подробная инструкция http://w-blog.ru/node/22 как можно разместить облако со ссылками в ноде. Как и писал AntonTau, файлф js и swf надо кинуть в корень сайта. Прописал не в head, а прямо в содержимое перед . Всё дивно работает.

Но остался вопрос, как сделать прямые ссылки из облака использую словарь таксономии минуя анонсы.

Аватар пользователя Freedom Freedom 19 апреля 2009 в 1:00
"FORTIS" wrote:

а можно ли сделать флеш-облако навигации? чтобы пункты ссылались на Страницу

Можно. Почитайте внимательно о настройках облака. Если не здесь, то в других сайтах.

Аватар пользователя volocuga volocuga 19 апреля 2009 в 1:18

Уже вижу эти флеш-облака приобрели характер эпидемии-вижу на многих сайтах.И чё народ на эту гадость ведётся?

Аватар пользователя Gedler Gedler 25 июня 2009 в 16:30

а можно ли использовать tcolor2 и hicolor для раскраски облака и если да то как?

Аватар пользователя vko43 vko43 16 августа 2009 в 19:37

У меня выдает ошибку (предпоследний код):

user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT(n.nid)) as cnt FROM drupal_term_node tn INNER JOIN drupal_node n ON n' at line 3 query: SELECT max(cnt) AS maxcnt,min(cnt) AS mincnt FROM drupal_term_data td INNER JOIN (SELECT tn.tid,COUNT(t DISTINCT(n.nid)) as cnt FROM drupal_term_node tn INNER JOIN drupal_node n ON n.nid=tn.nid GROUP BY tn.tid) n ON n.tid=td.tid AND td.vid IN (3,6) in /home/kiron/public_html/vko/includes/common.inc(1655) : eval()'d code on line 19.
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT(n.nid)) as cnt FROM drupal_term_node tn INNER JOIN drupal_node n ON n' at line 3 query: SELECT td.tid,td.name,n.cnt FROM drupal_term_data td INNER JOIN (SELECT tn.tid,COUNT(t DISTINCT(n.nid)) as cnt FROM drupal_term_node tn INNER JOIN drupal_node n ON n.nid=tn.nid GROUP BY tn.tid) n ON n.tid=td.tid AND td.vid IN (3,6) ORDER BY n.cnt DESC LIMIT 0, 20 in /home/kiron/public_html/vko/includes/common.inc(1655) : eval()'d code on line 34.

Аватар пользователя Drednout Drednout 28 октября 2009 в 13:22
"Barcelona" wrote:

А как сделать фон прозрачным?

Можно сделать такой фон.
Замените строчку widget_so.addParam("allowScriptAccess", "always"); на (или добавить) widget_so.addParam("wmode", "transparent"); и будет вам счастье.
У меня другой вопрос. Возможно очень глупый)). Как сделать, чтобы при наведении текст не обрамлялся в рамку, а изменял свой цвет?

Аватар пользователя lopata24 lopata24 29 октября 2009 в 17:34

почему-то при включенном модуле pm_lite
облако не пашет и пишет ошибку
user warning: Unknown column 'n.type' in 'where clause' query: SELECT DISTINCT t.name, t.tid FROM shvabra_term_data t WHERE (n.type != 'pm') AND ( t.vid = 1) in V:\home\test1.ru\www\includes\common.inc(1547) : eval()'d code on line 12.

Аватар пользователя LazaruS LazaruS 27 декабря 2009 в 19:20

Создал блок с кодом, пробовал с разными вариантами указания путей, в тч по http
всё равно показывает кукиш и рисует код вместо облака :(
Народ хэл сниппет уж больно понравился, а в php и sql не силен
друпал последний 6ой ветви, хостинг Инфобокс

Аватар пользователя LazaruS LazaruS 27 декабря 2009 в 19:48

Поигрался еще с переменными
резльтат таков
Fatal error: Call to undefined function db_rewrite_sql() in /home/www/z127719/htdocs/gd/cloud.php on line 11
это симуляция - сниппет в отдельном php файле на сервере

Аватар пользователя LazaruS LazaruS 27 декабря 2009 в 21:25

хм, фон сменить получилось, но не получается сменить цвет текста. Пробовал из нарытых в инете CSS таблиц коды белого и синего не помогло, да, цвет фона сделан прозрачным а искомый цвет шрифта желтый или белый. ссылка на сайт http://globaldynamic.ru

Аватар пользователя LazaruS LazaruS 28 декабря 2009 в 17:22

странно
попробовал на другой сайт прибить на том же хостинге. Опять рисует код вместо модуля. PHP фильтр включен. Формат выбран PHP код. Вопрос: откуда могут тут расти ноги?

Аватар пользователя LazaruS LazaruS 28 декабря 2009 в 18:27

RxB
пасиба, помогло, только облако отображается пустым - без тэгов, но "будем искать" (с)
Всё еще остается без ответа вопрос почему не меняется цвет текста :(

Аватар пользователя spam123456 spam123456 3 января 2010 в 14:00
"Wincert" wrote:
<?php
//получаем результат запроса
$sql db_rewrite_sql($query);
?>

тут кажется не хватает параметров у функции db_rewrite_sql.. вообще можно было бы и обойтись без нее, ну раз уж вставили в код - надо бы дописать параметры..

<?php
//получаем результат запроса
$sql db_rewrite_sql($query't''tid');
?>

но в 99% случаев можно эту ф-ю не использовать..
p.s.: а вообще для больших таксономий это будет двойная работа.. Проще было было бы затемизировать результат, возвращаемый тагаделиком...

Аватар пользователя lopata24 lopata24 16 марта 2010 в 11:19

добрый день.
Заметил такой баг (возможно только у меня, но мало ли).

Последний добавленный термин не открывается, а ссылается на "/taxonomy/term"

например, добавляю запись с тэгом "февраль", по февралю ссылка "/taxonomy/term". Потом добавляю запись с тэгом "март" и фераль отображается из облака так "/tegs/klyuchevye-slova/fevral", а март ссылается на "/taxonomy/term"

((

может только у меня такое? что-то где-то блокируется?
просьба потестировать у себя, нет ли таких проблем?

в чем может быть эта проблема и как ее решить?

заранее спасибо!

Аватар пользователя lopata24 lopata24 17 марта 2010 в 14:37

up!

дублирую вопрос, просьба проверить у себя, у всех баг иль только у меня?

Последний добавленный термин не открывается, а ссылается на "/taxonomy/term"

например, добавляю запись с тэгом "февраль", по февралю ссылка "/taxonomy/term". Потом добавляю запись с тэгом "март" и фераль отображается из облака так "/tegs/klyuchevye-slova/fevral", а март ссылается на "/taxonomy/term"

((

может только у меня такое? что-то где-то блокируется?
просьба потестировать у себя, нет ли таких проблем?

в чем может быть эта проблема и как ее решить?

заранее спасибо!

Аватар пользователя lopata24 lopata24 18 мая 2010 в 12:33

дублирую вопрос, просьба проверить у себя, у всех баг иль только у меня?

Последний добавленный термин не открывается, а ссылается на "/taxonomy/term"

например, добавляю запись с тэгом "февраль", по февралю ссылка "/taxonomy/term". Потом добавляю запись с тэгом "март" и фераль отображается из облака так "/tegs/klyuchevye-slova/fevral", а март ссылается на "/taxonomy/term"

((

может только у меня такое? что-то где-то блокируется?
просьба потестировать у себя, нет ли таких проблем?

в чем может быть эта проблема и как ее решить?

заранее спасибо!

Аватар пользователя UHSF UHSF 6 июня 2010 в 20:27

Хоть убейте меня, но я не пойму как скачать SWF файл !!!
Открывается страница с серым фоном и всё. Что делать?

Аватар пользователя UHSF UHSF 7 июня 2010 в 17:53

Так тоже ничего не сохраняется.

Только вот на правой кнопке мыши что есть:

Аватар пользователя UHSF UHSF 7 июня 2010 в 19:33

Установил облако. Работает-крутится.
Но почему-то при нажатии на термин переходит на неправильный адрес.
Должен переходить на мой_сайт.net/папка_с_сайтом/taxonomy/term/2, а переходит на мой_сайт.net/taxonomy/term/2.
Получается что опускается папка с сайтом.
Почему такое может быть?

Аватар пользователя olk olk 7 июня 2010 в 19:58

в начале сниппета вставьте global $base_url;
и замените строку

 $ftags .= '<a href="/taxonomy/term/'.$node-> tid.'" style="font-size: 10pt">'.$node-> name.'</a>';

на

 $ftags .= '<a href="' . $base_url . '/taxonomy/term/'.$node-> tid.'" style="font-size: 10pt">'.$node-> name.'</a>';

Ну и проверьте правильно-ли прописано $base_url в settings.php

Аватар пользователя UHSF UHSF 8 июня 2010 в 0:24

Только у меня почему то только один термин выводится.( После перезагрузки иногда другой или через раз.
Так у меня их два.

Аватар пользователя lopata24 lopata24 29 августа 2011 в 15:44

друзья, подскажите, как быть с мультиязычностью?

чтобы на русском выводились теги в облаке на русском, а на английском крутилось английское облачко?

заранее спасибо!

Аватар пользователя kissfm kissfm 8 ноября 2011 в 22:19

Не качается у меня SWF файл!!!
Дайте кто-нибудь, у кого есть! Спасибо заранее.

Аватар пользователя takosan takosan 4 ноября 2012 в 22:44

Всем привет! Сделал все по интрукции с первого поста, создал блок, выбрал PHP code, положил два файла в корень сайта, прописал им абсолютные пути и получаю такую ошибку

Fatal error: Call to undefined function db_rewrite_sql() in /home/navros/k/modules/php/php.module(80) : eval()'d code on line 11

помогите

Аватар пользователя kissfm kissfm 15 ноября 2012 в 20:21

Кто-то заметил, что выводится на 1 термин меньше, чем есть в словаре!???

В этой строчке последнее использование переменной $ftags.

widget_so.addVariable("tagcloud", "'.urlencode($ftags).'");

Она содержит все термины со словаря. Потом один где-то теряется, произвольным образом.

Аватар пользователя kissfm kissfm 15 ноября 2012 в 20:22

Кто-то заметил, что выводится на 1 термин меньше, чем есть в словаре!???

В этой строчке последнее использование переменной $ftags.

widget_so.addVariable("tagcloud", "'.urlencode($ftags).'");

Она содержит все термины со словаря. Потом один где-то теряется, произвольным образом.