Для удобства вынесем все относящееся к модулю "Рассылки" в отдельный файл, допустим ~/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 " ">]>
<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 " ">]>
<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>
<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 " ">]>
<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>