Логотип

Документация по макросам и шаблонам UMI.CMS

Получение значения cookie средствами XSLT-шаблонизатора

Начиная с версии 2.8.5.3 в UMI.CMS появилась возможность получать значения сookies. Это может быть полезным, если на сайте необходимо отображать контент в зависимости от параметров, которые выбрал пользователь.

Постановка задачи

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

Реализация решения

Создание нужной cookie наиболее удобно реализовать средствами библиотеки jQuery и плагина jQuery Cookie. Напишем небольшой javascript-обработчик для формы выбора региона:

 

jQuery(document).ready(function() {

  jQuery('#regionbox').submit(function() {
    var region = jQuery('#regionlist option:selected').val();
    jQuery.cookie('region', region);
  });

});

При отправке формы обработчик запишет cookie под названием "region" со значением кода региона, выбранным из списка. Для удобства, сохраним текст обработчика в файл под названием "region.js".

Осталось создать XSLT-шаблон для страницы с формой выбора региона:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">

  <xsl:param name="region">0</xsl:param>
 
  <xsl:template match="/" mode="layout">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="keywords" content="{//meta/keywords}" />
        <meta name="description" content="{//meta/description}" />
        
        <script type="text/javascript" src="/js/jquery/jquery.js" />
        <script type="text/javascript" src="/js/jquery/jquery.cookie.js" />
        
        <script type="text/javascript" src="/js/region.js" />
     </head>
      <body>
        <div>
          <xsl:choose>
            
            <xsl:when test="$region = 76">
              <xsl:apply-templates select="/" mode="Yaroslavl" />
            </xsl:when>
            
            <xsl:when test="$region = 77">
              <xsl:apply-templates select="/" mode="Moscow" />
            </xsl:when>
            
            <xsl:when test="$region = 78">
              <xsl:apply-templates select="/" mode="Saint-Petersburg" />
            </xsl:when>
            
            <xsl:otherwise>
              <form id="regionbox">
                <select id="regionlist">
                  <option value="76">Ярославская область</option>
                  <option value="77">Москва и московская область</option>
                  <option value="78">Санкт-Петербург и ленинградская область</option>
                </select>
                <input type="submit" value="Выбрать" />
              </form>
            </xsl:otherwise>
            
          </xsl:choose>
        </div>
      </body>
   </html>
  </xsl:template>
 
  <xsl:template match="/" mode="Yaroslavl">
    <span>Здесь будет информация для Ярославля</span>
  </xsl:template>
 
  <xsl:template match="/" mode="Moscow">
    <span>Здесь будет информация для Москвы</span>
  </xsl:template>
 
  <xsl:template match="/" mode="Saint-Petersburg">
    <span>Здесь будет информация для Санкт-Петербурга</span>
  </xsl:template>
 
</xsl:stylesheet>

Важно

В шаблоне необходимо создавать параметр с аналогичным названием, что и у сookie. Это нужно для того, чтобы и в отсутствие cookie, было задано значение по умолчанию. В примере - это параметр "region" со значением "0".

Для того, чтобы применить шаблон, соответствующий выбранному коду региона, используется конструкция xsl:choose. Код региона сравнивается со значением в cookie и, с помощью xsl:apply-templates, применяется нужный шаблон.

Внимание: Название cookie при переносе в шаблон приводится к нижнему регистру, поэтому если у cookie будет, например, название expandExtendedFields, то в xslt значение этой cookie будет доступно под названием expandextendedfields.