Как приделать облако тегов Cumulus к сайту на HostCMS?
Очень просто!
1. Качаем архив с русифицированной версией Флеш-облака и javascript-загрузчиком SWFObject - http://download.elcomspb.ru/cumulus/cumulus.zip
Файлы tagcloud.swf и swfobject.js размещаем в папке cumulus в корне сайта. (можно и в другом месте, тогда нужно будет внести изменения в пути к этим файлам в xsl-шаблоне. Соответствующие места в шаблоне выделены жирным шрифтом).
2. Слегка модифицируем php-код в шаблоне страницы, который выводит облако тегов:
<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">
<!--
<![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");
]]>
-->
</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, и делаем ее активной.
kvasiliy, в вашем случае - и не выведет
Потому что:
а) вы передаете $external_propertys в никуда - у метода ShowTagsCloud() всего 4 параметра, а не 5, как вы написали;
б) у XML для меток магазина немного другая структура, и XSLT "заточненный" под XML от меток ИС ничего в этом случае не выведет;
и, наконец, в) в template match="tag" вы еще и неправильно формируете ссылку - без http:// и имени текущего домена, который вы должны быди передать в $external_propertys но промахнулись Кумулусу надо передавать абсолютные ссылки, а не относительные.
Поэтому в следующем моем посте читайте обновленные коды для вставки в шаблоны ИС и магазина, а также универсальный XSL-шаблон, обрабатывающий оба варианта меток
Обновлен архив.
В нем - тот же самый 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;
// автоматическое определение 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;
<!--Определим количество элементов для наиболее распространенной метки-->
<xsl:variable name="max_tag_count" select="(//tag/count[not(. < //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 > 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">
<!--
<![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");
]]>
-->
</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, и делаем ее активной.
PS: Кто юзает IE6 и 7 - проверьте как отображается и отпишитесь пожалуйста сюда. Есть подозрения что в семерке какие-то проблемы с отображением через javascript.
что сказать... Респект, вот только одного не учли. Что если облако слишком большое? У меня например получился сплошной комок.
Пробовал сделать ограничение и рандомный вывод, вроде получается "разрядить" облако вот только ссылки в этом случае с облака не рабочие становятся:
Вот этот код добавлял в шаблоне:
$property = array();
$property['TagsOrderField'] = 'RAND()';
$property['count'] = 50;
Обновил в архиве версию 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, в котором я его и отлаживал
Так что, 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) в строках
Ну и в-4х, самое банальное - уменьшить число тегов в выводе:
$property['count'] = 10;
А $property['TagsOrderField'] = 'RAND()'; в данном случае, имхо, принципиального значение не имеет, т.к. флешка все-равно отображает теги по-своему, не взирая на порядок их сортировки.
Добавлю еще, я не ставил для себя задачи сделать решение на все случаи жизни Я выложил рабочий прототип, дерзайте, экспериментируйте, настраивайте