How To: Метки магазина (облако тегов)

Показ облака тегов для меток магазинов осуществляется с использованием метода show(), контроллера показа меток магазинов Shop_Controller_Tag_Show().

Контроллер принимает экземпляр объекта Shop_Model в качестве параметра, а настройка показа осуществляется через методы контроллера:

<?php
// Метки
if (Core::moduleIsActive('shop') && Core::moduleIsActive('tag'))
{
	$Shop_Controller_Tag_Show = new Shop_Controller_Tag_Show(
		Core_Entity::factory('Shop', 1)
	);

	// Показывать метки только для товаров текущей группы
	if (is_object(Core_Page::instance()->object)
	&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show'
	&& Core_Page::instance()->object->group)
	{
		$Shop_Controller_Tag_Show->group(Core_Page::instance()->object->group);
	}

	$Shop_Controller_Tag_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('ОблакоТэговМагазина')
		)
		->show();
}
?>

Пример структуры облака тегов для меток:

<p class="h1 red">Метки</p>
<div class="TagsCloud">
	<a style="font-size: 9pt" href="/shop/tag/ajax/">ajax</a>
	<a style="font-size: 10pt" href="/shop/tag/HostCMS/">HostCMS</a>
</div>

XSL-шаблон для отображения облака тегов:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:hostcms="https://www.hostcms.ru/"
    exclude-result-prefixes="hostcms">

    <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
        encoding="utf-8" 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:if test="count(tag) != 0">
            <p class="h1 red">Метки</p>

            <xsl:variable name="max_tag_count" select="(/shop/tag/count[not(. < /shop/tag/count)])[1] - 1"/>
            <xsl:variable name="max_size" select="16"/>
            <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>
            <div class="TagsCloud">
                <xsl:apply-templates select="tag">
                    <xsl:with-param name="min_size" select="$min_size"/>
                    <xsl:with-param name="coeff_size" select="$coeff_size"/>
                </xsl:apply-templates>
            </div>
        </xsl:if>
    </xsl:template>

    <!-- Облако из групп -->
    <xsl:template match="tag">

        <xsl:param name="min_size"/>
        <xsl:param name="coeff_size" select="10"/>

        <!-- Нужный размер шрифта вычисляется по формуле $min_size + количество * $coeff_size -->
        <xsl:variable name="size" select="round($min_size + ((count - 1) * $coeff_size))"/>

        <xsl:variable name="group_path">
            <xsl:if test="/shop/ПутьКГруппе/node()">
                <xsl:value-of select="/shop/ПутьКГруппе" />
            </xsl:if>
        </xsl:variable>

        <a href="{/shop/url}{$group_path}tag/{urlencode}/" style="font-size: {$size}pt" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="tag"><xsl:value-of select="name"/></a><xsl:text> </xsl:text>

    </xsl:template>
</xsl:stylesheet>

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.