Логотип

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

Для удобства вынесем все относящееся к модулю "Рассылки" в отдельный файл, допустим ~/imports/dispatches.xsl, который мы подключим к основному шаблону.

Сведения о том, какой именно пользователь открыл данную страницу, находятся в атрибутах элемента user xml-данных UMI Data. Поэтому вывод форм мы будем осуществлять следующим образом — вставим инструкцию <xsl:apply-templates select="user" mode="dispatches"/> в место, где мы хотим отобразить рассылки и зададим 2 шаблона с условиями соответствия:

  • Для формы, отображаемой только гостям, зададим match="user"

  • Для формы, отображаемой для зарегистрированных пользователей зададим match="user[@status = 'auth']"

Для страницы успешной подписки (~/dispatches/subscribe_do/) нужно будет описать шаблоны с условиями:

  • match="result[@module='dispatches'][@method='subscribe_do'] — для гостей сайта

  • match="result[@module='dispatches'][@method='subscribe_do'][user[@status='auth']]" — для зарегистрированных пользователей

Для вывода результатов работы шаблонов успешной подписки необходимо, чтобы в контентной части стояла инструкция <xsl:apply-templates select="result" />.

Например, предположим, что все страницы сайта отображаются по шаблону примерно следующего содержания:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" version="4.01" encoding="utf-8" indent="yes"/>

     ...
  <xsl:include href="imports/dispatches.xsl" />
     ...
  
  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

      <head>
        ...
      </head>

      <body>
        ...

       <div id="page">

          <div id="left">
             // вставляем формы для подписки 
             <xsl:apply-templates select="user" mode="dispatches" />
          </div>

          <div id="content">
            <xsl:apply-templates select="result" />
          </div>
 
       </div>

        ...
      </body>
</html>

</xsl:stylesheet>

Подписка для незарегистрированных пользователей

Условие match="user" является менее специфичным, поэтому для незарегистрированных пользователей будет выбран именно этот шаблон из вариантов mode="dispatches".

Создадим файл ~/imports/dispatches.xsl следующего содержания:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet  [<!ENTITY nbsp "&#160;">]>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

// dispatches.for-guest 

 <xsl:template match="user" mode="dispatches">
   <form name="subscribe_guest"  method="post"  action="/dispatches/subscribe_do/">

     <h2>Подписка на новости</h2>
  
     <span>
       <input name="sbs_mail" value="Введите E-mail"
         onfocus="(this.value == 'Введите E-mail' ? this.value='' : void(0))" 
         onblur="(!this.value.length ? this.value='Введите E-mail' : void(0))" 
         type="text" 
        />
     </span>
  
     <input type="submit" value="Отправить" />

   </form>
 </xsl:template>

// dispatches.for-guest 

</xsl:stylesheet>

В этом шаблоне выводится обычная форма, без получения дополнительных данных. Следует иметь в виду, что атрибут name="sbs_mail" для тега <input> является служебным, и без него форма работать не будет.

Метод subscribe_do обработает данные формы и отобразит страницу успешной подписки.

Подписка для зарегистрированных пользователей

Условие match="user[@status = 'auth']" является более специфичным, поэтому в случае зарегистрированного пользователя у этого шаблона будет приоритет и именно он будет выбран из вариантов mode="dispatches".

Для получения списка рассылок, существующих на сайте воспользуемся методом subscribe модуля "Рассылки". Структуру возвращаемых xml-данных в формате UMI Data можно посмотреть набрав в адресной строке:

http://ваш_сайт/udata/dispatches/subscribe/

Добавим в файл ~/imports/dispatches.xsl следующий шаблон:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet  [<!ENTITY nbsp "&#160;">]>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

// dispatches.for-guest 
     ...
// dispatches.for-guest 

// dispatches.for-auth 

 <xsl:template match="user[@status = 'auth']" mode="dispatches">
    <xsl:apply-templates select="document('udata://dispatches/subscribe/notemplate/')/udata" mode="dispatches.for-auth"/>
  </xsl:template>

// dispatches.for-auth 

</xsl:stylesheet>

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

<xsl:template match="subscriber_dispatches" mode="dispatches.for-auth">
    
   <h2>Вы подписаны на рассылки:</h2>

   <form method="post" name="sbs_frm" enctype="multipart/form-data" action="/dispatches/subscribe_do/">

     <ul class="dispatches">
       // здесь мы хотим увидеть список рассылок 
     </ul>

     <input type="submit" value="Отправить" class="submit-send" />
   </form>

</xsl:template>

Метод subscribe_do обработает данные формы и отобразит страницу успешной подписки. Необходимо также иметь в виду, что name="sbs_frm" для этой формы является служебным и обязательным.

Для того чтобы отобразить каждую рассылку нам нужно обработать дочерние элементы items ветви subscriber_dispatches — для чего мы создадим еще один шаблон:

<xsl:template match="items" mode="dispatches.for-auth">
  <li>

    <input name="subscriber_dispatches[]" value="{./@id}" type="checkbox">

     <xsl:if test="./@is_checked">
       <xsl:attribute name="checked">checked</xsl:attribute>
     </xsl:if>

    </input>
      &nbsp;

    <span>
      <xsl:value-of select="." />
    </span>

  </li>
</xsl:template>

Атрибут name="subscriber_dispatches[]" для тега <input> также является служебным и обязательным. Атрибут is_checked для каждого элемента items позволяет нам узнать, на какие рассылки уже подписан пользователь.

Страница успешной подписки

Условие match="result[@module='dispatches'][@method='subscribe_do'] является менее специфичным, поэтому для гостей сайта будет выбран именно этот шаблон. Добавим его в наш файл:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet  [<!ENTITY nbsp "&#160;">]>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

// dispatches.for-guest 
     ...
// dispatches.for-guest 

// dispatches.for-auth 
     ...
// dispatches.for-auth 

// dispatches.subscribe_do 

 <xsl:template match="result[@module='dispatches'][@method='subscribe_do']">
    Вы подписались на рассылки.
 </xsl:template>

// dispatches.subscribe_do 

</xsl:stylesheet>

Добавим в match условие, позволяющее определить, что эту страницу загрузил зарегистрированный пользователь: match="result[@module='dispatches'][@method='subscribe_do'][user[@status='auth']]"

Для зарегистрированных пользователей на этой странице отобразим список подписок, на которые уже подписан этот пользователь — воспользуемся тем же методом subscribe модуля "Рассылки" и применим дополнительные шаблоны к результатам, возвращаемым методом:

<xsl:template match="result[@module='dispatches'][@method='subscribe_do'][user[@status='auth']]">
      <xsl:apply-templates select="document('udata://dispatches/subscribe/notemplate/')/udata" mode="dispatches.list" />
</xsl:template>

Теперь у нас есть 2 варианта и нужно добавить шаблоны на каждый из них:

  • Пользователь не подписан ни на одну рассылку (например, если он только что отписался). Это условие с менее специфичным шаблоном:

    <xsl:template match="subscriber_dispatches"  mode="dispatches.list">
          Вы не подписаны ни на одну рассылку.
    </xsl:template>
  • Пользователь подписан на одну или более рассылок. Тогда выводим заголовок и список рассылок, на которые подписан этот пользователь:

    <xsl:template match="subscriber_dispatches[items[@is_checked = '1']]" mode="dispatches.list">
      
      <h2>Вы подписаны на рассылки:</h2>
    
      <ul>
        // здесь мы хотим увидеть список рассылок 
      </ul>
    
    </xsl:template>

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

    <xsl:template match="subscriber_dispatches[items[@is_checked = '1']]" mode="dispatches.list">
    
      <h2>Вы подписаны на рассылки:</h2>
    
      <ul>
        <xsl:apply-templates select="items[@is_checked = '1']" mode="dispatches.list" />
      </ul>
    
    </xsl:template>
     
    <xsl:template match="items" mode="dispatches.list">
      <li>
        <span><xsl:value-of select="." /></span>
      </li>
    </xsl:template>