Вывод последних зарегистрированных пользователей (XSLT) — различия между версиями
Velross (обсуждение | вклад) |
Velross (обсуждение | вклад) |
||
Строка 62: | Строка 62: | ||
В следующем листинге, мы:<br/> | В следующем листинге, мы:<br/> | ||
1) Получаем udata-результат работы макроса list_users.<br/> | 1) Получаем udata-результат работы макроса list_users.<br/> | ||
− | 2 | + | 2) Вызываем новый темплейт, в котором передаем элементы из udata предварительно их отсортировав в обратном порядке по значению атрибута @id.<br/> |
− | + | 3) Продолжаем тянуть за собой параметр countpage с общим количеством пользователей на сайте.<br/> | |
− | + | 4) Пишем общий для всех элементов код верстки. | |
− | |||
<source lang="xml" > | <source lang="xml" > | ||
<xsl:template match="udata[@module = 'users'][@method = 'list_users']" mode="lastreg"> | <xsl:template match="udata[@module = 'users'][@method = 'list_users']" mode="lastreg"> | ||
Строка 84: | Строка 83: | ||
</div> | </div> | ||
</xsl:template> | </xsl:template> | ||
− | + | </source> | |
+ | В следующем листинге, мы:<br/> | ||
+ | 1) Получаем отсортированный список элементов, берем у них значение атрибута @id и вызываем темплейт с получением объекта по протоколу uobject.<br/> | ||
+ | 2) В качестве параметра к темплейту, передаем текущую позицию элемента начиная отсчет от общего количества всех пользователей на сайте.<br/> | ||
+ | <source lang="xml" > | ||
+ | <xsl:template match="items/item" mode="lastreg"> | ||
+ | <xsl:param name="countpage"/> | ||
+ | <xsl:variable name="countpage" select="($countpage + 1) - position()" /> | ||
+ | |||
+ | <xsl:apply-templates select="document(concat('uobject://',@id))" mode="lastreg" > | ||
+ | <xsl:with-param name="countpage" select="$countpage"/> | ||
+ | </xsl:apply-templates> | ||
+ | |||
+ | </xsl:template> | ||
</source> | </source> |
Версия 20:07, 25 мая 2013
Задача: Вывести на сайте список последних зарегистрированных на сайте пользователей (на примере шаблонов demodizzy).
Решение: Для решения задачи будем использовать макросы %users count_users()% и %users list_users()%.
Для начала, если Вы хотите чтобы список пользователей был виден всем пользователям сайта, а не только зарегистрированным, то необходимо изменить права на указанные макросы при помощи файла permissions.custom.php:
<?php
$permissions = Array(
'registrate' => Array('list_users','count_users')
);
?>
Так как макрос %users list_users()% выводит по умолчанию только 10 первых пользователей, то чтобы при вызове макроса получить последних пользователей, нам будет необходимо использовать пейджинг (udata://users/list_users/notemplate/10/?p=2).
Чтобы высчитать число последней страницы пейджинга, нам необходимо узнать общее количество всех активированных пользователей на сайте(%users count_users()%) и количество пользователей выводимых макросом %users list_users()% на одну страницу (задаем самостоятельно).
В шаблоне дизайна (layouts/default.xsl) там, где мы хотим увидеть результаты своей работы, сделаем вызов темплейта с передачей параметра количества элементов выводимых на одной странице. Заметьте, что мы везде используем mode="lastreg":
<!-- @name="Вывод последних зарегистрированных пользователей"
@path="/modules/users/lastRegisteredUsers.xsl"
-->
<xsl:apply-templates select="document('udata://users/count_users')/udata" mode="lastreg">
<xsl:with-param name="perpage" select="10"/>
</xsl:apply-templates>
Разрабатываемая функциональность относится к модулю users, поэтому перейдем в папку /modules/users/ и скопируем какой-либо шаблон, сделав из него заготовку и переименовав lastRegisteredUsers.xsl. Также подключим созданный файл шаблона в файле common.xsl:
<xsl:include href="lastRegisteredUsers.xsl" />
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">
<!-- @name="Вывод последних зарегистрированных пользователей"
@import="common.xsl"
@call="/layouts/default.xsl"
-->
</xsl:stylesheet>
В следующем листинге, мы:
1) Получаем данные от вызываемого в layouts/default.xsl макроса, в том числе получаем переданный параметр perpage.
2) В переменной countpage вычисляем значение последней страницы, используя функции floor и dev.
Справка: floor()- возвращает наибольшее целое, меньшее, чем переданное функции число; div - деление; . (точка) - ссылка на текущий узел (в нашем случае это общее количество пользователей).
3) Вызываем макрос %users list_users()% с нужными нам параметрами.
<xsl:template match="udata[@module = 'users'][@method = 'count_users']" mode="lastreg">
<xsl:param name="perpage"/>
<xsl:variable name="countpage" select="floor((. - 1) div $perpage)" />
<xsl:apply-templates select="document(concat('udata://users/list_users/notemplate/',$perpage,'/?p=',$countpage))/udata" mode="lastreg" >
<xsl:with-param name="countpage" select="."/>
</xsl:apply-templates>
</xsl:template>
В следующем листинге, мы:
1) Получаем udata-результат работы макроса list_users.
2) Вызываем новый темплейт, в котором передаем элементы из udata предварительно их отсортировав в обратном порядке по значению атрибута @id.
3) Продолжаем тянуть за собой параметр countpage с общим количеством пользователей на сайте.
4) Пишем общий для всех элементов код верстки.
<xsl:template match="udata[@module = 'users'][@method = 'list_users']" mode="lastreg">
<xsl:param name="countpage"/>
<div class="infoblock">
<div class="title"><h2>К нам присоеденились:</h2></div>
<div class="body">
<div class="in">
<strong>Приветствуем новых пользователей: </strong>
<ol class="recentPages">
<xsl:apply-templates select="items/item" mode="lastreg" >
<xsl:with-param name="countpage" select="$countpage"/>
<xsl:sort order="descending" select="@id"/>
</xsl:apply-templates>
</ol>
</div>
</div>
</div>
</xsl:template>
В следующем листинге, мы:
1) Получаем отсортированный список элементов, берем у них значение атрибута @id и вызываем темплейт с получением объекта по протоколу uobject.
2) В качестве параметра к темплейту, передаем текущую позицию элемента начиная отсчет от общего количества всех пользователей на сайте.
<xsl:template match="items/item" mode="lastreg">
<xsl:param name="countpage"/>
<xsl:variable name="countpage" select="($countpage + 1) - position()" />
<xsl:apply-templates select="document(concat('uobject://',@id))" mode="lastreg" >
<xsl:with-param name="countpage" select="$countpage"/>
</xsl:apply-templates>
</xsl:template>