Вывод последних зарегистрированных пользователей (XSLT) — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 86: Строка 86:
 
В следующем листинге, мы:<br/>
 
В следующем листинге, мы:<br/>
 
1) Получаем отсортированный список элементов, берем у них значение атрибута @id и вызываем темплейт с получением объекта по протоколу uobject.<br/>
 
1) Получаем отсортированный список элементов, берем у них значение атрибута @id и вызываем темплейт с получением объекта по протоколу uobject.<br/>
2) В качестве параметра к темплейту, передаем текущую позицию элемента начиная отсчет от общего количества всех пользователей на сайте.<br/>
+
2) В качестве параметра к темплейту, передаем текущую позицию элемента начиная отсчет от общего количества всех пользователей на сайте и уменьшенную на 2 шага (пользователи "супервайзер" и "гость").<br/>
 
<source lang="xml" >
 
<source lang="xml" >
 
<xsl:template match="items/item" mode="lastreg">
 
<xsl:template match="items/item" mode="lastreg">
 
<xsl:param name="countpage"/>
 
<xsl:param name="countpage"/>
<xsl:variable name="countpage" select="($countpage + 1) - position()" />
+
<xsl:variable name="countpage" select="($countpage - 1) - position()" />
 
 
 
<xsl:apply-templates select="document(concat('uobject://',@id))"  mode="lastreg" >
 
<xsl:apply-templates select="document(concat('uobject://',@id))"  mode="lastreg" >
Строка 100: Строка 100:
 
В следующем листинге, мы:<br/>
 
В следующем листинге, мы:<br/>
 
1) Получаем объект и распределяем данные (порядковый номер, дата регистрации, имя пользователя, логин) по верстке.<br/>
 
1) Получаем объект и распределяем данные (порядковый номер, дата регистрации, имя пользователя, логин) по верстке.<br/>
 +
2) Запрещаем показывать пользователей из группы Супервайзеры и учетную запись Гостя.<br/>
 
<source lang="xml" >
 
<source lang="xml" >
 
<xsl:template match="object" mode="lastreg">
 
<xsl:template match="object" mode="lastreg">
 
<xsl:param name="countpage"/>
 
<xsl:param name="countpage"/>
 
+
        <xsl:if test="not(//property[@name='groups']/value/item[@name='Супервайзеры'] or //property[@name='login']/value = 'Гость')" >
<li>
+
    <li>
<xsl:value-of select="$countpage" />)  
+
  <xsl:value-of select="$countpage" />)  
<xsl:value-of select="//property[@name='register_date']/value/@formatted-date" /> -  
+
  <xsl:value-of select="//property[@name='register_date']/value/@formatted-date" /> -  
<xsl:value-of select="//property[@name='fname']/value" />
+
  <xsl:value-of select="//property[@name='fname']/value" />
(<xsl:value-of select="//property[@name='login']/value" />)
+
    (<xsl:value-of select="//property[@name='login']/value" />)
</li>
+
    </li>
+
</xsl:if>
 
 
 
</xsl:template>
 
</xsl:template>
 
</source>
 
</source>

Версия 20:28, 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) В качестве параметра к темплейту, передаем текущую позицию элемента начиная отсчет от общего количества всех пользователей на сайте и уменьшенную на 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>

В следующем листинге, мы:
1) Получаем объект и распределяем данные (порядковый номер, дата регистрации, имя пользователя, логин) по верстке.
2) Запрещаем показывать пользователей из группы Супервайзеры и учетную запись Гостя.

<xsl:template match="object" mode="lastreg">
	<xsl:param name="countpage"/>
        <xsl:if test="not(//property[@name='groups']/value/item[@name='Супервайзеры'] or //property[@name='login']/value = 'Гость')" >
	    <li>
		   <xsl:value-of select="$countpage" />) 
		   <xsl:value-of select="//property[@name='register_date']/value/@formatted-date" /> - 
		   <xsl:value-of select="//property[@name='fname']/value" />
	  	   (<xsl:value-of select="//property[@name='login']/value" />)
	    </li>
	</xsl:if>
				
</xsl:template>