Объемное облако тегов Cumulus для HostCMS

#
Объемное облако тегов Cumulus для HostCMS
Как приделать облако тегов Cumulus к сайту на HostCMS?
Очень просто!

1. Качаем архив с русифицированной версией Флеш-облака и javascript-загрузчиком SWFObject - http://download.elcomspb.ru/cumulus/cumulus.zip
Файлы tagcloud.swf и swfobject.js размещаем в папке cumulus в корне сайта. (можно и в другом месте, тогда нужно будет внести изменения в пути к этим файлам в xsl-шаблоне. Соответствующие места в шаблоне выделены жирным шрифтом).

2. Слегка модифицируем php-код в шаблоне страницы, который выводит облако тегов:
<?php
// Отображаем тэги ИС

$InformationSystemId = 1;

$site = &singleton('site');
$alias_row = $site->GetAlias($_SERVER['HTTP_HOST']);
$current_alias = $site->GetCurrentAlias($alias_row['site_id']);

$InformationSystem = &singleton('InformationSystem');
$external_propertys = array();
$external_propertys['current_alias'] = $current_alias;
$InformationSystem->ShowTagsCloud($InformationSystemId, 'ОблакоТэговИнформационнойСистемы', array(),
    $external_propertys);
?>


3. Заменяем код xsl-шаблона "ОблакоТэговИнформационнойСистемы" на следующий:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <!-- ОблакоТэговИнформационнойСистемы  -->

   <xsl:template match="/">
      <xsl:apply-templates select="/document"/>
   </xsl:template>

   <xsl:template match="/document">
      <xsl:variable name="max_tag_count" select="count(//tag)"/>
      <xsl:variable name="max_size" select="24"/>
      <xsl:variable name="min_size" select="7"/>
      <xsl:variable name="coeff_size">
         <xsl:choose>
            <xsl:when test="$max_tag_count &gt; 0">
               <xsl:value-of select="($max_size - $min_size) div $max_tag_count"/>
            </xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>

      <script type="text/javascript" src="/cumulus/swfobject.js"></script>
      <div id="smallcloudflashcontent">This will be shown to users with no Flash or Javascript.</div>
      <script>         
            <xsl:text disable-output-escaping="yes">
            &lt;!--            
            <![CDATA[var tags_list = encodeURI('<tags>]]></xsl:text>
            <xsl:apply-templates select="InformationSystem/tags/tag">
               <xsl:with-param name="min_size" select="$min_size"/>
               <xsl:with-param name="total" select="count(//tag)"/>
               <xsl:with-param name="coeff_size" select="$coeff_size"/>
            </xsl:apply-templates>
            <xsl:text disable-output-escaping="yes"><![CDATA[</tags>');
                  var so = new SWFObject("/cumulus/tagcloud.swf", "tagcloud", "190", "190", "7", "#ffffff");
                  // uncomment next line to enable transparency
                  so.addParam("wmode", "transparent");
                  so.addVariable("tcolor", "0x333333");
                  so.addVariable("mode", "tags");
                  so.addVariable("distr", "true");
                  so.addVariable("tspeed", "100");
                  so.addVariable("tagcloud", tags_list);
                  so.write("smallcloudflashcontent");
               ]]>         
               --&gt;
            </xsl:text>         
      </script>
   </xsl:template>

   <!-- Облако из групп -->
   <xsl:template match="InformationSystem/tags/tag">
      <xsl:param name="min_size"/>
      <xsl:param name="total"/>
      <xsl:param name="coeff_size" select="10"/>
      <!-- Нужный размер шрифта вычисляется по формуле $min_size + количество * $coeff_size -->
      <xsl:variable name="size" select="round($min_size + ((count - 1) * $coeff_size))"/>
      <a href="http://{/document/current_alias}{parent::*/parent::*/url}tag/{tag_path_name}/" style="font-size: {$size}pt">
         <xsl:value-of select="tag_name"/>
      </a>
   </xsl:template>
</xsl:stylesheet>


4. Заходим в раздел "Константы" центра администрирования, создаем в нем новую константу с названием ALLOW_FORMAT_XSL_HTML и значением false, и делаем ее активной.

5. Наслаждаемся результатом

Демо-пример работы шаблона некоторое время можно будет посмотреть здесь: http://test.pskelectro.ru/

А здесь - http://test.pskelectro.ru/infotest/all_tags_cloud/ - вывод всех тегов со всех информационных систем в одно большое облако
Но это уже немного другая история
Заказов не беру. Консультирую редко.
#
Re: Объемное облако тегов Cumulus для HostCMS
а для магазина такое возможно сделать?
#
Re: Объемное облако тегов Cumulus для HostCMS
В шаблоне вывел так:
<?php
if (class_exists('shop'))
{
               $shop = & singleton('shop');
// Отображаем тэги

$shop_id = 1;

$site = &singleton('site');
$alias_row = $site->GetAlias($_SERVER['HTTP_HOST']);
$current_alias = $site->GetCurrentAlias($alias_row['site_id']);

$property = array();
$property['TagsOrderField'] = 'RAND()';
$property['count'] = 50;

$shop = &singleton('shop');
$external_propertys = array();
$external_propertys['current_alias'] = $current_alias;


$shop->ShowTagsCloud(to_int($GLOBALS['LA']['shop_id']), 'ОблакоТэговМагазинМакси', $property, array(),
    $external_propertys);      
}
?>

В XSL сделал так:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <!-- ОблакоТэговИнформационнойСистемы  -->
   <xsl:template match="/">
      <xsl:apply-templates select="/shop"/>
   </xsl:template>
   
   <xsl:template match="/shop">
      <xsl:variable name="max_tag_count" select="count(//tag)"/>
      <xsl:variable name="max_size" select="20"/>
      <xsl:variable name="min_size" select="4"/>
      <xsl:variable name="coeff_size">
         <xsl:choose>
            <xsl:when test="$max_tag_count &gt; 0">
               <xsl:value-of select="($max_size - $min_size) div $max_tag_count"/>
            </xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <script type="text/javascript" src="/cumulus/swfobject.js"></script>
      <div id="smallcloudflashcontent">This will be shown to users with no Flash or Javascript.</div>
      <script>
         <xsl:text disable-output-escaping="yes">
            &lt;!--
            <![CDATA[var tags_list = encodeURI('<tags>]]></xsl:text>
            <xsl:apply-templates select="shop/tags/tag">
               <xsl:with-param name="min_size" select="$min_size"/>
               <xsl:with-param name="total" select="count(//tag)"/>
               <xsl:with-param name="coeff_size" select="$coeff_size"/>
            </xsl:apply-templates>
            <xsl:text disable-output-escaping="yes"><![CDATA[</tags>');
            var so = new SWFObject("/cumulus/tagcloud.swf", "tagcloud", "810", "810", "4", "#003300");
            // uncomment next line to enable transparency
            so.addParam("wmode", "transparent");
            so.addVariable("tcolor", "0x003300");
            so.addVariable("mode", "tags");
            so.addVariable("distr", "true");
            so.addVariable("tspeed", "100");
            so.addVariable("tagcloud", tags_list);
            so.write("smallcloudflashcontent");
            ]]>
            --&gt;
         </xsl:text>
      </script>
   </xsl:template>
   
   <!-- Облако из групп -->
   <xsl:template match="tag">
      <xsl:param name="min_size"/>
      <xsl:param name="total"/>
      <xsl:param name="coeff_size" select="6"/>
      <!-- Нужный размер шрифта вычисляется по формуле $min_size + количество * $coeff_size -->
      <xsl:variable name="size" select="round($min_size + ((count - 1) * $coeff_size))"/>
      <a href="{/shop/path}tag/{tag_path_name}/" style="font-size: {$size}pt;">
         <xsl:value-of select="tag_name"/>
      </a>
   </xsl:template>
</xsl:stylesheet>

ошибки не выводит, но и ни чего не показывает. Что не так?
#
Re: Объемное облако тегов Cumulus для HostCMS
kvasiliy, в вашем случае - и не выведет
Потому что:
а) вы передаете $external_propertys в никуда - у метода ShowTagsCloud() всего 4 параметра, а не 5, как вы написали;
б) у XML для меток магазина немного другая структура, и XSLT "заточненный" под XML от меток ИС ничего в этом случае не выведет;
и, наконец, в) в template match="tag" вы еще и неправильно формируете ссылку - без http:// и имени текущего домена, который вы должны быди передать в $external_propertys но промахнулись Кумулусу надо передавать абсолютные ссылки, а не относительные.

Поэтому в следующем моем посте читайте обновленные коды для вставки в шаблоны ИС и магазина, а также универсальный XSL-шаблон, обрабатывающий оба варианта меток
Заказов не беру. Консультирую редко.
#
Re: Объемное облако тегов Cumulus для HostCMS
И так, апдейт!

Обновлен архив.
В нем - тот же самый tagcloud.swf,
обновленный swfobject.js сжатый YUICompressor'ом (экономия в полкилобайта трафика),
примеры php-кода для вставки в шаблоны страниц ИС и магазина,
и универсальный XSL-шаблон для отображения облака тегов.

И так, универсальный рецепт:

1. Качаем вышеупомянутый архив http://download.elcomspb.ru/cumulus/cumulus.zip
Файлы tagcloud.swf и swfobject.js размещаем в папке cumulus в корне сайта. (можно и в другом месте, тогда нужно будет внести изменения в пути к этим файлам в xsl-шаблоне. Соответствующие места в шаблоне выделены жирным шрифтом).

2. В шаблон страницы, в том месте где нужно выести облако тегов вставляем следующий код:
2а. Для шаблонов страниц информационных систем:
<?php
/* Отображаем тэги ИС */

// автоматическое определение id текущей инфосистемы из настроек структуры
// для шаблона главной страницы нужно вбить id вручную,
// заменив следующую строку, например, на $InformationSystemId = 1;
$InformationSystemId = to_int($GLOBALS['LA']['InformationSystemID']);

$xsl_name = 'УниверсальноеОблакоТэговCumulus';

// Определим текущий домен сайта, для передачи его в XML
$site = &singleton('site');
$alias_row = $site->GetAlias($_SERVER['HTTP_HOST']);
$current_alias = $site->GetCurrentAlias($alias_row['site_id']);

$property = array();

$external_propertys = array();

// Передадим текущий домен сайта в XML
$external_propertys['current_alias'] = $current_alias;

$InformationSystem = &singleton('InformationSystem');
$InformationSystem->ShowTagsCloud($InformationSystemId, $xsl_name, $property, $external_propertys);
?>


2б. Для шаблонов страниц Интернет-магазина
<?php
/* Отображаем тэги Магазина */

// автоматическое определение id текущего магазина из настроек структуры
// можно вбить id вручную, заменив следующую строку, например, на $shop_id = 1;
$shop_id = to_int($GLOBALS['LA']['shop_id']);

$xsl_name = 'УниверсальноеОблакоТэговCumulus';

// Определим текущий домен сайта, для передачи его в XML
$site = &singleton('site');
$alias_row = $site->GetAlias($_SERVER['HTTP_HOST']);
$current_alias = $site->GetCurrentAlias($alias_row['site_id']);

$property = array();

$external_propertys = array();

// Передадим текущий домен сайта в XML
$external_propertys['current_alias'] = $current_alias;

$shop = &singleton('shop');
$shop->ShowTagsCloud($shop_id, $xsl_name, $property, $external_propertys);
?>


3. Создаем новый XSL-шаблон с названием "УниверсальноеОблакоТэговCumulus" и помещаем в него следующий код:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <!-- УниверсальноеОблакоТэговCumulus  -->

   <xsl:template match="/">
      
      <h2>Метки</h2>

      <!--Подключим библиотеку-загрузчик Flash-->
      <script type="text/javascript" src="/cumulus/swfobject.js"></script>

      <!--Определим количество элементов для наиболее распространенной метки-->
      <xsl:variable name="max_tag_count" select="(//tag/count[not(. &lt; //tag/count)])[1] - 1"/>

      <!--Зададим минимальный и максимальный размер шрифта-->
      <xsl:variable name="max_size" select="24"/>
      <xsl:variable name="min_size" select="9"/>

      <!--Вычислим коэффициент размерности шрифта для меток с различным количеством элементов-->
      <xsl:variable name="coeff_size">
         <xsl:choose>
            <xsl:when test="$max_tag_count &gt; 0">
               <xsl:value-of select="($max_size - $min_size) div $max_tag_count"/>
            </xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>

      <!--Создадим контейнер для Flash-облака.
      ОБРАТИТЕ ВНИМАНИЕ! Если на странице несколько облаков, то id у их контейнеров должен быть разным!-->
      <div id="smallcloudflashcontent">
         <!--Выведем сюда классическое облако тегов, для тех у кого отключен Flash или Javascript-->
         <div class="TagsCloud">
            <xsl:apply-templates select="//tags/tag">
               <xsl:with-param name="min_size" select="$min_size"/>
               <xsl:with-param name="total" select="sum(//tag/count)"/>
               <xsl:with-param name="coeff_size" select="$coeff_size"/>
            </xsl:apply-templates>
         </div>
      </div>
      
      <!--Подключим Flash-облако с помощью библиотеки SWFObject-->   
      <script>
         <xsl:text disable-output-escaping="yes">
            &lt;!--            
            <![CDATA[var tags_list = encodeURI('<tags>]]></xsl:text>
         <xsl:apply-templates select="//tags/tag">
            <xsl:with-param name="min_size" select="$min_size"/>
            <xsl:with-param name="total" select="sum(//tag/count)"/>
            <xsl:with-param name="coeff_size" select="$coeff_size"/>            
         </xsl:apply-templates>
         <xsl:text disable-output-escaping="yes"><![CDATA[</tags>');
                  var so = new SWFObject("/cumulus/tagcloud.swf", "tagcloud", "190", "190", "7", "#ffffff");
                  // uncomment next line to enable transparency
                  so.addParam("wmode", "transparent");
                  so.addVariable("tcolor", "0x333333");
                  so.addVariable("mode", "tags");
                  so.addVariable("distr", "true");
                  so.addVariable("tspeed", "100");
                  so.addVariable("tagcloud", tags_list);
                  // в следующей строке параметром является ID div-контейнера, созданного выше.
                  so.write("smallcloudflashcontent");
               ]]>         
               --&gt;
            </xsl:text>
      </script>
   </xsl:template>

   <!-- Облако из групп -->
   <xsl:template match="tag">
      <xsl:param name="min_size"/>
      <xsl:param name="total"/>
      <xsl:param name="coeff_size" select="10"/>      
      <!-- Нужный размер шрифта вычисляется по формуле $min_size + количество * $coeff_size -->
      <xsl:variable name="size" select="round($min_size + ((count - 1) * $coeff_size))"/>      
      <a href="http://{//current_alias}{parent::*/parent::*/path}{parent::*/parent::*/url}tag/{tag_path_name}/" style="font-size: {$size}pt">
         <xsl:value-of select="tag_name"/>
      </a>      
      <xsl:text disable-output-escaping="yes"> </xsl:text>      
   </xsl:template>
</xsl:stylesheet>

В шаблоне, помимо универсального вывода тегов ИС и Магазина, добавлен вывод классического облака тегов, для тех у кого отключена поддержка javascript или не уставновлен FlashPlayer.

4. Заходим в раздел «Константы» центра администрирования. Если там нет константы с названием ALLOW_FORMAT_XSL_HTML, то создаем в нем такую константу со значением false, и делаем ее активной.

5. Обновляем страницы сайта и фтыкаем в облако

Демки облаков:
http://test.pskelectro.ru/ - облако на главной от ИС Новости
http://test.pskelectro.ru/articles/ - облака автоматически сменяющиеся при переходе из одной инофсистемы в другую (в данном случае - облако от ИС Статьи)
http://test.pskelectro.ru/shop/ - облако тегов Интернет-магазина
http://test.pskelectro.ru/infotest/all_tags_cloud/ - два облака тегов на одной странице. Большое облако выводит теги сразу от всех ИС сайта, а малое - только от новостей

PS: Кто юзает IE6 и 7 - проверьте как отображается и отпишитесь пожалуйста сюда. Есть подозрения что в семерке какие-то проблемы с отображением через javascript.
Заказов не беру. Консультирую редко.
#
Re: Объемное облако тегов Cumulus для HostCMS
SWFObject is not defined грит
http://www.aiventa.ru
#
Re: Объемное облако тегов Cumulus для HostCMS
Где говорит, кто говорит, в каком браузере, с моей демки или на вашем сайте?
Заказов не беру. Консультирую редко.
#
Re: Объемное облако тегов Cumulus для HostCMS
что сказать... Респект, вот только одного не учли. Что если облако слишком большое? У меня например получился сплошной комок.
Пробовал сделать ограничение и рандомный вывод, вроде получается "разрядить" облако вот только ссылки в этом случае с облака не рабочие становятся:
Вот этот код добавлял в шаблоне:
$property = array();
$property['TagsOrderField'] = 'RAND()';
$property['count'] = 50;
#
Re: Объемное облако тегов Cumulus для HostCMS
Обновил в архиве версию SWFObject с 1.4 до 1.5
Сходил в соседний кабинет, помешал своим коллегам работать и проверил облако под различными версиями IE.
С обновленным swfobject.js облако гарантированно работает:
в IE6 (6.0.2900.2180.xpsp_sp2_qfe.090206-1239);
в IE7 (7.0.5730.11 выпуски обновлений 0);
в IE8 (8.0.6001.18702IS выпуски обновлений 0).

Также проверена работа
в Safari 4.0.4 (531.21.10);
в Opera 10.10 (сборка 1893);
в Chrome 3.0.195.38.

Ну и разумеется в Firefox 3.5.5, в котором я его и отлаживал

Ссылка на обновленный архив все та же: http://download.elcomspb.ru/cumulus/cumulus.zip

Так что, hell0men, вы скорее всего просто не выложили на хостинг .js-файл или не изменили в xsl-шаблоне путь к не нему, если разместили .js и .swf файлы не в каталоге /cumulus/.

kvasiliy, демо-облако магазина по ссылке из предыдущего поста как раз выведено с параметрами
$property['TagsOrderField'] = 'RAND()';
$property['count'] = 50;
На демке оно смотрится нормально, возможно у вас тегов слишком много?

Тогда у вас есть несколько регуляторов:
Во-1х в XSL-шаблоне вы можете уменьшить минимальный и максимальный шрифт:
<!--Зададим минимальный и максимальный размер шрифта-->
<xsl:variable name="max_size" select="24"/>
<xsl:variable name="min_size" select="9"/>

Сделайте его меньше

Во-2х, можно увеличить размеры самого облака
var so = new SWFObject("/cumulus/tagcloud.swf", "tagcloud", "190", "190", "7", "#ffffff");

Поставьте не 190х190 а хоть 640х480 Если конечно ваш макет позволяет )

И в-3х - не забываем про flashvars от Облака!
Играем с параметрами distr (true|false) и mode (tags|cats|both) в строках
so.addVariable("mode", "tags");
so.addVariable("distr", "true");


Ну и в-4х, самое банальное - уменьшить число тегов в выводе:
$property['count'] = 10;


А $property['TagsOrderField'] = 'RAND()'; в данном случае, имхо, принципиального значение не имеет, т.к. флешка все-равно отображает теги по-своему, не взирая на порядок их сортировки.

Добавлю еще, я не ставил для себя задачи сделать решение на все случаи жизни Я выложил рабочий прототип, дерзайте, экспериментируйте, настраивайте

Полезно еще, почитатать вот эту документацию от облака:
http://www.roytanck.com/2008/05/19/how-to-repurpose-my-tag-cloud-flash-movie/
Заказов не беру. Консультирую редко.
#
Re: Объемное облако тегов Cumulus для HostCMS
Kotoff писал(а):
$property['TagsOrderField'] = 'RAND()';
$property['count'] = 50;

мои пардоны теперь это работает, в первой реализации не работало.
Авторизация