Как перечислить все группы к которым принадлежит инфоэлемент?
Инфоэлемент лежит в нескольких группах.
Основной - в одной группе, а остальные размещены в виде ярлыков.
Как отобразить через запятую все эти группы через XSL?
Основной - в одной группе, а остальные размещены в виде ярлыков.
Как отобразить через запятую все эти группы через XSL?
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
давайте начнем с того, где это нужно сделать - при просмотре элемента или списка элементов?
И там и там.
Давайте сначала список элементов разберем, а потом разберемся с выводом с одним элементом.
Давайте сначала список элементов разберем, а потом разберемся с выводом с одним элементом.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Чет замолкло все уже неделю молчание...
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
???
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Ну как же это сделать?
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
HostCMS писал(а):
В списке элементов
давайте начнем с того, где это нужно сделать — при просмотре элемента или списка элементов?
В списке элементов
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Для отображения списка информационных групп, в которые входят ярлыки информационных элементов необходимо
1) стандартную типовую динамическую страницу "Информационная система" изменить так, как показано ниже:
<?php
/* ID Информационной системы */
$InformationSystem_id = to_int($GLOBALS['LA']['InformationSystemID']);
// Получаем информацию о текущем пользователе
if (class_exists('SiteUsers'))
{
$SiteUsers = & singleton('SiteUsers');
$site_user_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_user_id = 0;
}
$form_user_name = to_str($_POST['comment_autor']);
$form_user_email = to_str($_POST['comment_email']);
$form_text = to_str($_POST['comment_text']);
$form_subject = to_str($_POST['comment_subject']);
$form_parent_id = to_int($_POST['comment_parent_id']);
/* Массив внешних параметров, передаваемых в XML */
$external_propertys = array();
/* Добавление комментария */
// ShowAddComment == 1 - только авторизированные
// ShowAddComment == 2 - все
if (isset($_POST['add_comment'])
&& (($GLOBALS['LA']['ShowAddComment'] == 1 && $site_user_id > 0) || $GLOBALS['LA']['ShowAddComment'] == 2))
{
$param['information_items_id'] = to_int($GLOBALS['InformationResult']['item_id']);
/* XSL шаблон для отправки уведомления администратору о добавлении комментария */
$param['admin_email_xsl'] = to_str($GLOBALS['LA']['xsl_admin_email']);
$xsl_add_comment = to_str($GLOBALS['LA']['xsl_add_comment']);
/* Режим добавления комментария:
1 - публиковать сразу,
0 - публиковать после проверки.*/
if (to_bool($GLOBALS['LA']['TypeAddComment'])/* || $site_user_id > 0*/)
{
$param['status'] = 1;
}
else
{
$param['status'] = 0;
}
// Текст комментария
$_POST['comment_text'] = nl2br(to_str($_POST['comment_text']));
// Типографируем текст, если доступен модуль типографирования
if (class_exists('typograph'))
{
$typograph = new typograph();
$_POST['comment_text'] = $typograph->ProcessTypographic($_POST['comment_text']);
}
$param['comment_mail_type'] = to_int($GLOBALS['LA']['comment_mail_type']);
// ID родительского комментария
$param['comment_parent_id'] = to_int($_POST['comment_parent_id']);
$param['comment_autor'] = htmlspecialchars(to_str($_POST['comment_autor']));
$param['comment_email'] = htmlspecialchars(to_str($_POST['comment_email']));
$param['comment_subject'] = htmlspecialchars(to_str($_POST['comment_subject']));
$param['comment_text'] = to_str($_POST['comment_text']);
$param['comment_grade'] = to_int($_POST['comment_grade']);
$param['allowable_tags'] = '<b><strong><i><em><br><p><u><strike><ul><ol><li>';
ob_start();
$GLOBALS['LA_InformationSystem']->ShowAddComment('УведомлениеДобавлениеКомментария', $param);
$external_propertys['message'] = ob_get_clean();
if (strpos($external_propertys['message'], '<div id="error">') === false)
{
$form_user_name = '';
$form_user_email = '';
$form_text = '';
$form_subject = '';
$form_parent_id = to_int($_POST['comment_parent_id']);
}
}
if ($GLOBALS['INFSYS_result'] != false)
{
/* XSL шаблон для отображения списка элементов информационной системы */
$xsl_list = to_str($GLOBALS['LA']['xsl_information_system_list']);
/* XSL шаблон для отображения элемента информационной системы */
$xsl_item = to_str($GLOBALS['LA']['xsl_information_item']);
$InformationResult = $GLOBALS['InformationResult'];
/* Массив внешних параметров, передаваемых в XML */
$external_propertys['ОтображатьСсылкуНаАрхив'] = 0;
$external_propertys['ОтображатьСсылкиНаСледующиеСтраницы'] = 1;
/* Массив дополнительных параметров */
$property = array();
/* Число элементов на страницу */
if (isset($InformationResult['items_on_page']))
{
if ($InformationResult['items_on_page'] !== true)
{
$InformationResult['items_on_page'] = to_int($InformationResult['items_on_page']);
}
}
else
{
$InformationResult['items_on_page'] = 10;
}
/* Номер, с которого начинается показ */
if (isset($InformationResult['items_begin']))
{
$InformationResult['items_begin'] = to_int($InformationResult['items_begin']);
}
else
{
$InformationResult['items_begin'] = 0;
}
/* Вывод списка */
if ($GLOBALS['INFSYS_result']['item'] == false)
{
// Если передано имя тэга - фильтруем
if (isset($GLOBALS['INFSYS_result']['tag_name']))
{
if (class_exists('Tag'))
{
$oTag = & singleton('Tag');
$tag_row = $oTag->GetTagByPath($GLOBALS['INFSYS_result']['tag_name']);
$property['tags'] = array($tag_row['tag_id']);
// При выводе тэгов вывод элементов ведется из всех групп
$GLOBALS['INFSYS_result']['group'] = false;
}
}
// $property['xml_show_group_type'] = 'all';
// Разрешаем передачу в XML свойств групп
$property['xml_show_group_property'] = true;
$mas_show_items = array();
ob_start();
// Получаем массив идентификаторов отображаемых элементов
$mas_show_items = $GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, $GLOBALS['INFSYS_result']['group'], $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
ob_end_clean();
if (count($mas_show_items) > 0)
{
$DataBase = & singleton('DataBase');
$mas_in = implode(',', $mas_show_items);
// Получаем список ярлыков отбражаемых элементов
$query = "SELECT * FROM information_items_table WHERE information_items_shortcut_id IN ({$mas_in})";
$resource_shotcuts = $DataBase->select($query);
$mas_groups = array();
$mas_shotcut_group = array();
// В цикле формируем массив идентификаторов информационных групп для каждого отображаемого элемента
while($row_shotcut = mysql_fetch_assoc($resource_shotcuts))
{
// Нет данных об информационной группе
if (!in_array($row_shotcut['information_groups_id'], $mas_groups))
{
$mas_groups[] = $row_shotcut['information_groups_id'];
}
$mas_shotcut_group[$row_shotcut['information_items_shortcut_id']][$row_shotcut['information_groups_id']] = $row_shotcut['information_groups_id'];
}
$xmlData = '<show_item_shotcuts>' . "\n";
// В цикле формируем XML, содержащий список идентификаторов групп, в которых находятся ярлыки отображаемых элементов
foreach ($mas_shotcut_group as $show_item_id => $mas_group_rows_id)
{
$xmlData .= '<item id="' . $show_item_id . '">' . "\n";
foreach($mas_group_rows_id as $show_group_id)
{
if ($show_group_id)
{
// Получаем информацию о группе
$group_row = $GLOBALS['LA_InformationSystem']->GetInformationGroup($show_group_id);
$xmlData .= '<group id="' . $show_group_id . '">' . "\n";
// Формируем XML для группы
$xmlData .= $GLOBALS['LA_InformationSystem']->GenXmlForGroup($InformationSystem_id, $group_row, array());
$xmlData .= '</group>' . "\n";
}
else // Ярлык находится в корне
{
$xmlData .= '<group id="0">' . "\n";
$xmlData .= '</group>' . "\n";
}
}
$xmlData .= '</item>' . "\n";
}
$xmlData .= '</show_item_shotcuts>' . "\n";
$property['external_xml'] = $xmlData;
$GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, $GLOBALS['INFSYS_result']['group'], $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
}
}
else
{
$DataBase = & singleton('DataBase');
/* Определяем идентификатор информационного элемента */
$item_id = $GLOBALS['LA_InformationSystem']->GetIdInformationItem($GLOBALS['INFSYS_result']['item'], $GLOBALS['INFSYS_result']['group'], $InformationSystem_id);
if (to_bool($GLOBALS['LA']['ShowComments']))
{
$external_propertys['show_comments'] = '1';
}
else
{
$external_propertys['show_comments'] = '0';
}
// Кому разрешено добавление комментария
$external_propertys['show_add_comments'] = to_int($GLOBALS['LA']['ShowAddComment']);
$property['part'] = $GLOBALS['part_ii'];
// Запрещаем передачу в XML свойств групп
$property['xml_show_group_property'] = false;
// Получаем идентификаторы групп, в которые входят ярлыки отбражаемого элемента
$query = "SELECT information_groups_id FROM information_items_table WHERE `information_items_shortcut_id` = '{$item_id}'";
$resource_groups_shotcuts = $DataBase->select($query);
$xmlData = '<show_item_shotcuts>' . "\n";
// Массив идентификаторов групп
$mas_groups_shotcut = array();
// В цикле формируем XML, содержащий список идентификаторов групп, в которых находятся ярлыки отображаемого элемента
while($row_group_shotcut = mysql_fetch_assoc($resource_groups_shotcuts))
{
$show_group_id = $row_group_shotcut['information_groups_id'];
// Проверка на дублирование групп
if (!in_array($show_group_id, $mas_groups_shotcut))
{
$mas_groups_shotcut[] = $show_group_id;
if ($show_group_id)
{
// Получаем информацию о группе
$group_row = $GLOBALS['LA_InformationSystem']->GetInformationGroup($show_group_id);
if ($group_row)
{
$xmlData .= '<group id="' . $show_group_id . '">' . "\n";
// Формируем XML для группы
$xmlData .= $GLOBALS['LA_InformationSystem']->GenXmlForGroup($InformationSystem_id, $group_row, array());
$xmlData .= '</group>' . "\n";
}
}
else // Ярлык находится в корне
{
$xmlData .= '<group id="0">' . "\n";
$xmlData .= '</group>' . "\n";
}
}
}
$xmlData .= '</show_item_shotcuts>' . "\n";
$property['external_xml'] = $xmlData;
$external_propertys['form_user_name'] = $form_user_name;
$external_propertys['form_user_email'] = $form_user_email;
$external_propertys['form_text'] = $form_text;
$external_propertys['form_subject'] = $form_subject;
$external_propertys['form_parent_id'] = $form_parent_id;
// Выводим элемент информационной системы
$GLOBALS['LA_InformationSystem']->ShowInformationSystemItem($item_id, $xsl_item, $external_propertys, $property);
}
}
?>
2)XSL-шаблон "СписокЭлементовИнфосистемы" изменить как указано ниже
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/document"/>
</xsl:template>
<xsl:template match="/document">
<!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
<xsl:variable name="parent_group_id" select="blocks/parent_group_id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:if test="blocks/parent_group_id = 0">
<h1>
<xsl:value-of disable-output-escaping="yes" select="blocks/name"/>
</h1>
<!-- Описание выводится при отсутствии фильтрации по тэгам -->
<xsl:if test="count(blocks/tags/tag) = 0">
<xsl:value-of disable-output-escaping="yes" select="blocks/description"/>
</xsl:if>
</xsl:if>
<!-- Если в находимся в группе - выводим название группы -->
<xsl:if test="blocks/parent_group_id != 0">
<h1>
<xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/name"/>
</h1>
<!-- Описание выводим только на первой странице -->
<xsl:if test="blocks/items/current_page = 0">
<xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/description"/>
</xsl:if>
<!-- Путь к группе -->
<p>
<xsl:apply-templates select=".//group[@id=$parent_group_id]" mode="goup_path"/>
</p>
</xsl:if>
<!-- Обработка выбранных тэгов -->
<xsl:if test="count(blocks/selected_tags/tag) = 1">
<h2>Метка — <strong><xsl:value-of select="blocks/selected_tags/tag/tag_name"/></strong>.</h2>
</xsl:if>
<!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
<xsl:if test="count(blocks/selected_tags/tag) = 0 and count(.//group[@parent_id=$parent_group_id]) > 0">
<ul class="news_group">
<xsl:apply-templates select=".//group[@parent_id=$parent_group_id]" mode="groups"/>
</ul>
</xsl:if>
<!-- Отображение записи информационной системы -->
<xsl:apply-templates select="blocks/items/item[item_status=1]"/>
<!-- Строка ссылок на другие страницы информационной системы -->
<xsl:if test="ОтображатьСсылкиНаСледующиеСтраницы=1">
<p>
<!-- Ссылка, для которой дописываются суффиксы page-XX/ -->
<xsl:variable name="link">
<xsl:value-of select="/document/blocks/url"/>
<xsl:if test="$parent_group_id != 0">
<xsl:value-of select="/document/blocks//group[@id = $parent_group_id]/fullpath"/>
</xsl:if>
</xsl:variable>
<xsl:call-template name="for">
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="blocks/items/items_on_page"/>
<xsl:with-param name="current_page" select="blocks/items/current_page"/>
<xsl:with-param name="count_items" select="blocks/items/count_items"/>
<xsl:with-param name="visible_pages">5</xsl:with-param>
</xsl:call-template>
</p>
</xsl:if>
<xsl:if test="count(blocks/properties_groups_dir) and blocks/parent_group_id != 0">
<div style="margin: 10px 0px;">
<h2>Атрибуты группы инфоэлементов</h2>
<xsl:if test="count(blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = 0])">
<table border="0">
<xsl:apply-templates select="blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = 0]"/>
</table>
</xsl:if>
<xsl:apply-templates select="blocks/properties_groups_dir"/>
</div>
</xsl:if>
<div style="clear: both"></div>
<!-- Rss -->
<div class="rss_4_ie"></div>
<a href="{blocks/url}rss/">
<img src="/images/rss/rss_2.0.png" style="filter: alpha(opacity=0); margin: 0px 0px -4px 0px"/>
</a>
<a href="{blocks/url}rss/">RSS</a>
<xsl:if test="ОтображатьСсылкуНаАрхив=1">
<div class="archives_4_ie"></div>
<a href="{blocks/url}">
<img src="/images/archives.png" style="filter: alpha(opacity=0); margin: 0px 0px -4px 0px"/>
</a>
<a href="{blocks/url}">Архив "<xsl:value-of disable-output-escaping="yes" select="blocks/name"/>"</a>
</xsl:if>
</xsl:template>
<!-- Вывод строки со значением свойства -->
<xsl:template match="property">
<tr>
<td style="padding: 5px" bgcolor="#E5DFDA">
<b><xsl:value-of select="name"/></b>
</td>
<td style="padding: 5px" bgcolor="#E5DFDA">
<xsl:choose>
<xsl:when test="type = 1">
<a href="{file_path}">Скачать файл</a>
</xsl:when>
<xsl:when test="type = 7">
<xsl:choose>
<xsl:when test="value = 1">
<input type="checkbox" checked="" disabled="" />
</xsl:when>
<xsl:otherwise>
<input type="checkbox" disabled="" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
<!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
<xsl:template match="group" mode="goup_path">
<xsl:variable name="parent_id" select="@parent_id"/>
<xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>
<xsl:if test="@parent_id=0">
<a href="{/document/blocks/url}">
<xsl:value-of disable-output-escaping="yes" select="/document/blocks/name"/>
</a>
</xsl:if>
<span class="path_arrow">→</span>
<a href="{/document/blocks/url}{fullpath}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a>
</xsl:template>
<!-- Шаблон выводит группы свойств для группы инфосистемы -->
<xsl:template match="properties_groups_dir">
<p><b><xsl:value-of select="information_propertys_groups_dir_name"/></b></p>
<xsl:variable name="dir_id" select="@id"/>
<xsl:if test="count(//blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = $dir_id])">
<table border="0">
<xsl:apply-templates select="//blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = $dir_id]"/>
</table>
</xsl:if>
<xsl:if test="count(properties_groups_dir)">
<blockquote>
<xsl:apply-templates select="properties_groups_dir"/>
</blockquote>
</xsl:if>
</xsl:template>
<!-- Шаблон выводит ссылки подгруппы информационного элемента -->
<xsl:template match="group" mode="groups">
<li>
<xsl:if test="small_image!=''">
<a href="{/document/blocks/url}{fullpath}" target="_blank">
<img src="{small_image}" align="middle"/>
</a> </xsl:if>
<a href="{/document/blocks/url}{fullpath}">
<b>
<xsl:value-of disable-output-escaping="yes" select="name"/>
</b>
</a> <span style="color: #cacaca">(<xsl:value-of select="count_all_items"/>)</span></li>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="blocks/items/item">
<div style="margin-right: 10px; margin-bottom: 20px;">
<!-- Дата время -->
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="item_datetime"/>
</span>
<!-- Название -->
<p class="news_title">
<a href="{item_path}">
<xsl:value-of disable-output-escaping="yes" select="item_name"/>
</a>
</p>
<!-- Идентификатор элемента -->
<xsl:variable name="item_id" select="@id" />
<xsl:if test="count(/document/show_item_shotcuts/item[@id=$item_id]/group) > 0">
<p>Список групп с ярлыками: <xsl:apply-templates select="/document/show_item_shotcuts/item[@id=$item_id]/group"/>
</p>
</xsl:if>
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="item_small_image!=''">
<a href="{item_path}" class="news_title">
<img src="{item_small_image}" class="news_img" alt="" align="left"/>
</a>
</xsl:if>
<xsl:value-of disable-output-escaping="yes" select="item_description"/>
<xsl:if test="count(tags/tag) > 0">
<p class="tags">
<img src="/hostcmsfiles/images/tags.gif" align="left" style="margin: 0px 5px -2px 0px"/>
<xsl:apply-templates select="tags/tag"/>
</p>
</xsl:if>
<p>
<xsl:if test="count(site_user) > 0">
<img src="/hostcmsfiles/images/user.gif" style="margin: 0px 5px -4px 0px"/>
<strong>
<a href="/users/info/{site_user/site_user_login}/" class="c_u_l">
<xsl:value-of select="site_user/site_user_login"/>
</a>
</strong>
</xsl:if>
<xsl:if test="count(item_comments/comment) > 0">
<img src="/hostcmsfiles/images/comments.gif" style="margin: 0px 5px -4px 0px"/>
<a href="{item_path}#comments">
<xsl:value-of select="count(item_comments//comment)"/> <xsl:call-template name="declension">
<xsl:with-param name="number" select="count(item_comments//comment)"/></xsl:call-template></a>
</xsl:if>
</p>
<div style="clear: both;"></div>
</div>
</xsl:template>
<!-- Список групп, в которых содержаться ярлыки элемента -->
<xsl:template match="/document/show_item_shotcuts/item/group">
<xsl:choose>
<xsl:when test="@id != 0"><a href="{/document/blocks/url}{fullpath}"><xsl:value-of select="name" /></a></xsl:when>
<xsl:otherwise><a href="{/document/blocks/url}"><xsl:value-of select="/document/blocks/name" /></a></xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>
<!-- /// Метки для информационного элемента /// -->
<xsl:template match="tags/tag">
<a href="{/document/blocks/url}tag/{tag_path_name}/" class="tag">
<xsl:value-of select="tag_name"/>
</a>
<xsl:if test="position() != last()">,</xsl:if> </xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="prefix">page</xsl:param>
<xsl:param name="link"/>
<xsl:param name="items_on_page"/>
<xsl:param name="current_page"/>
<xsl:param name="count_items"/>
<xsl:param name="visible_pages"/>
<xsl:variable name="n" select="$count_items div $items_on_page"/>
<!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
<xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id"/>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name="pre_count_page">
<xsl:choose>
<xsl:when test="$current_page > ($n - (round($visible_pages div 2) - 1))">
<xsl:value-of select="$visible_pages - ($n - $current_page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name="post_count_page">
<xsl:choose>
<xsl:when test="0 > $current_page - (round($visible_pages div 2) - 1)">
<xsl:value-of select="$visible_pages - $current_page - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="round($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$i = 0 and $current_page != 0">
<span class="ctrl">
← Ctrl
</span>
</xsl:if>
<xsl:if test="$i >= $n and ($n - 1) > $current_page">
<span class="ctrl">
Ctrl →
</span>
</xsl:if>
<xsl:if test="$count_items > $items_on_page and $n > $i">
<!-- Определяем адрес тэга -->
<xsl:variable name="tag_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="count(/document/blocks/selected_tags/tag) != 0">tag/<xsl:value-of select="/document/blocks/selected_tags/tag/tag_path_name"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Определяем адрес ссылки -->
<xsl:variable name="number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i != 0">
<xsl:value-of select="$prefix"/>-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$current_page - $pre_count_page > 0 and $i = 0">
<a href="{$link}" class="page_link" style="text-decoration: none;">←</a>
</xsl:if>
<xsl:choose>
<xsl:when test="$i >= ($current_page - $pre_count_page) and ($current_page + $post_count_page) >= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$link}{$tag_link}{$number_link}" class="page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 >= $n and $n > ($current_page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n > round($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:when>
<xsl:otherwise>
<a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
<!-- Ссылка на предыдущую страницу для Ctrl + влево -->
<xsl:if test="$current_page != 0 and $i = $current_page">
<xsl:variable name="prev_number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="($current_page - 1) != 0">page-<xsl:value-of select="$i"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<a href="{$link}{$tag_link}{$prev_number_link}" id="id_prev"></a>
</xsl:if>
<!-- Ссылка на следующую страницу для Ctrl + вправо -->
<xsl:if test="($n - 1) > $current_page and $i = $current_page">
<a href="{$link}{$tag_link}page-{$current_page+2}/" id="id_next"></a>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_page">
<span class="current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>
<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="prefix" select="$prefix"/>
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="$items_on_page"/>
<xsl:with-param name="current_page" select="$current_page"/>
<xsl:with-param name="count_items" select="$count_items"/>
<xsl:with-param name="visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Склонение после числительных -->
<xsl:template name="declension">
<xsl:param name="number" select="number"/>
<!-- Именительный падеж -->
<xsl:variable name="nominative">
<xsl:text>комментарий</xsl:text>
</xsl:variable>
<!-- Родительный падеж, единственное число -->
<xsl:variable name="genitive_singular">
<xsl:text>комментария</xsl:text>
</xsl:variable>
<xsl:variable name="genitive_plural">
<xsl:text>комментариев</xsl:text>
</xsl:variable>
<xsl:variable name="last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>
<xsl:variable name="last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits != 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits != 12
or $last_digit = 3 and $last_two_digits != 13
or $last_digit = 4 and $last_two_digits != 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
3) XSL-шаблон "ВыводЕдиницыИнформационнойСистемы" изменить так:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- ВыводЕдиницыИнформационнойСистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/document/item"/>
</xsl:template>
<xsl:template match="/document/item">
<SCRIPT>
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
// массив для хранения регулярных выражений для проверки полей
fieldType = new Array();
fieldType['minlen'] = 3;
fieldType['maxlen'] = 55;
fieldType['reg'] = '^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,}\$';
// Проверка ячейки
// elementId - идентификатор проверяемого элемента
function FieldCheckEmail(elementId)
{
var oField = document.getElementById(elementId);
var message = '';
if (oField != undefined)
{
var value = oField.value;
if (value != '')
{
// Проверка на минимальную длину
if (value.length < fieldType['minlen'])
{
var decl = declension(fieldType['minlen'], 'символ', 'символа', 'символов');
// сообщение
message += 'Минимум ' + fieldType['minlen'] + ' ' + decl + '. Текущая длина — ' + value.length + '. ';
}
// Проверка на максимальную длину
if (value.length > fieldType['maxlen'])
{
var decl = declension(fieldType['maxlen'], 'символ', 'символа', 'символов');
// сообщение
message += 'Максимум ' + fieldType['maxlen'] + ' ' + decl + '. Текущая длина — ' + value.length + '. ';
}
var t = value.match(fieldType['reg']);
//alert(t);
// Проверка на регулярное выражение
if (value.length > 0 && fieldType['reg'] && !value.match(fieldType['reg']))
{
// Сообщение
message += 'Значение поля не соответствует формату. ';
}
}
var oErrorDiv = document.getElementById('error_'+elementId);
if (oErrorDiv != undefined)
{
oErrorDiv.innerHTML = message;
}
var oSubmit = document.getElementById('submit_'+elementId);
if (oSubmit != undefined)
{
if (message != '')
{
oSubmit.disabled = true;
}
else
{
oSubmit.disabled = false;
}
}
}
}
/**
* Склонение после числительных
* int number числительное
* int nominative Именительный падеж
* int genitive_singular Родительный падеж, единственное число
* int genitive_plural Родительный падеж, множественное число
*/
function declension(number, nominative, genitive_singular, genitive_plural)
{
var last_digit = number % 10;
var last_two_digits = number % 100;
if (last_digit == 1 && last_two_digits != 11)
{
var result = nominative;
}
else
{
if ((last_digit == 2 && last_two_digits != 12) || (last_digit == 3 && last_two_digits != 13) || (last_digit == 4 && last_two_digits != 14))
{
var result = genitive_singular;
}
else
{
var result = genitive_plural;
}
}
return result;
}
// массив для хранения текущих рейтингов звезд
var curr_rate = new Array();
// функция работы со звездами рейтинга
function set_rate(id, new_rate)
{
// устанавливаем атрибуты
curr_star = document.getElementById(id);
parent_id = parseInt(curr_star.parentNode.id);
// при первом пересчете ставим рейтинг для группы звезд в 0
if (!curr_rate[parent_id])
{
curr_rate[parent_id] = 0;
}
// устанавливаем новый рейтинг в массив рейтингов и значение скрытого поля
if (new_rate != curr_rate[parent_id] && parseInt(new_rate) > 0)
{
curr_rate[parent_id] = new_rate;
curr_form = document.getElementById('comment_form_0' + (parent_id != 0 ? parent_id : ''));
curr_form.comment_grade.value = curr_rate[parent_id].charAt(curr_rate[parent_id].length - 1);
}
// пересчет стилей для звезд
for (i = 1; i < 6; i++)
{
if (parent_id != 0)
{
j = parent_id + '' + i + '_star_' + i;
}
else
{
j = i + '_star_' + i;
}
temp_obj = document.getElementById(j);
if (new_rate == 0)
{
id = curr_rate[parent_id];
}
if (parseInt(j) > parseInt(id))
{
temp_obj.className = '';
}
else
{
temp_obj.className = 'curr';
}
}
}
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
<!-- Получаем ID родительской группы и записываем в переменную $parent_group_id
-->
<xsl:variable name="parent_group_id" select="/document/information_system/parent_group_id"/>
<h1>
<xsl:value-of disable-output-escaping="yes" select="item_name"/>
</h1>
<xsl:if test="count(/document/show_item_shotcuts/group) > 0">
<p>Список групп с ярлыками: <xsl:apply-templates select="/document/show_item_shotcuts/group"/>
</p>
</xsl:if>
<xsl:if test="$parent_group_id != 0">
<!-- Путь к группе -->
<xsl:apply-templates select="//group[@id=$parent_group_id]" mode="goup_path"/>
</xsl:if>
<!-- Выводим сообщение -->
<xsl:if test="/document/message/node()">
<xsl:value-of disable-output-escaping="yes" select="/document/message"/>
</xsl:if>
<!-- Фотогафия к информационному элементу -->
<xsl:if test="item_small_image!=''">
<!-- Проверяем задан ли путь к файлу большого изображения -->
<xsl:if test="item_image!=''">
<a href="{item_image}" target="_blank" onclick="ShowImgWindow('{item_name}','{item_image}', {item_image/@width}, {item_image/@height}); return false;">
<img align="left" src="{item_small_image}" class="news_img"/>
</a>
</xsl:if>
<xsl:if test="item_image =''">
<img align="left" src="{item_small_image}" style="margin-right: 10px; margin-bottom: 10px"/>
</xsl:if>
</xsl:if>
<xsl:if test="//group[@id = $parent_group_id]/propertys/property[@xml_name='big_text'] != ''">
<p>
<xsl:value-of disable-output-escaping="yes" select="//group[@id = $parent_group_id]/propertys/property[@xml_name='big_text']/value"/>
</p>
</xsl:if>
<!-- Текст информационного элемента -->
<p>
<xsl:value-of disable-output-escaping="yes" select="item_text"/>
</p>
<!-- Средняя оценка элемента -->
<xsl:if test="item_comments/average_grade/node() and item_comments/average_grade != 0">
<div style="float: left; margin: 0px 0px 0px 0px">Оценка: <xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="item_comments/average_grade"/>
<xsl:with-param name="const_grade" select="5"/></xsl:call-template></div>
<div style="clear: both"></div>
</xsl:if>
<!-- Тэги для информационного элемента -->
<xsl:if test="count(tags/tag) > 0">
<p>
<img src="/hostcmsfiles/images/tags.gif" align="left" style="margin: 0px 5px -2px 0px"/>
<xsl:apply-templates select="tags/tag"/>
</p>
</xsl:if>
<!-- Дата информационного элемента -->
<p class="date"><xsl:value-of select="item_date"/>, <xsl:value-of select="item_show_count"/> <xsl:call-template name="declension">
<xsl:with-param name="number" select="item_show_count"/>
</xsl:call-template>.</p>
<!-- Ссылка 1-2-3 на части документа -->
<xsl:if test="part/@count > 1">
<div class="read_more">Читать дальше:</div>
<xsl:call-template name="for">
<xsl:with-param name="items_on_page">1</xsl:with-param>
<xsl:with-param name="current_page" select="part"/>
<xsl:with-param name="link" select="/document/item/item_path"/>
<xsl:with-param name="count_items" select="part/@count"/>
<xsl:with-param name="visible_pages">6</xsl:with-param>
<xsl:with-param name="prefix">part</xsl:with-param>
</xsl:call-template>
<div style="clear: both"></div>
</xsl:if>
<xsl:if test="count(/document/properties_items_dir)">
<div style="margin: 10px 0px;">
<h2>Атрибуты элемента инфосистемы</h2>
<xsl:if test="count(/document/item/item_propertys/item_property[@parent_id = 0])">
<table border="0">
<xsl:apply-templates select="/document/item/item_propertys/item_property[@parent_id = 0]"/>
</table>
</xsl:if>
<xsl:apply-templates select="/document/properties_items_dir"/>
</div>
</xsl:if>
<!-- Если указано отображать комментарии -->
<xsl:if test="/document/show_comments/node() and /document/show_comments = 1">
<!-- Отображение комментариев -->
<xsl:if test="count(item_comments/comment) > 0">
<p class="title">
<a name="comments"></a>Комментарии</p>
<xsl:apply-templates select="item_comments/comment"/>
</xsl:if>
</xsl:if>
<!-- Если разрешено отображать формы добавления комментария
1 - Только авторизированным
2 - Всем
-->
<xsl:if test="/document/show_add_comments/node() and ((/document/show_add_comments = 1 and /document/site_user_id > 0) or /document/show_add_comments = 2)">
<div id="ShowAddComment">
<a href="javascript:void(0)" onclick="javascript:cr('AddComment')">Добавить комментарий</a>
</div>
<div id="AddComment" style="display: none">
<xsl:call-template name="AddCommentForm"></xsl:call-template>
</div>
</xsl:if>
</xsl:template>
<!-- Список групп, в которых содержаться ярлыки элемента -->
<xsl:template match="/document/show_item_shotcuts/group">
<xsl:choose>
<xsl:when test="@id != 0"><a href="{/document/information_system/url}{fullpath}"><xsl:value-of select="name" /></a></xsl:when>
<xsl:otherwise><a href="{/document/information_system/url}"><xsl:value-of select="/document/information_system/name" /></a></xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>
<!-- /// Метки для информационного элемента /// -->
<xsl:template match="tags/tag">
<a href="{/document/information_system/url}tag/{tag_path_name}/" class="tag">
<xsl:value-of select="tag_name"/>
</a>
<xsl:if test="position() != last()">,</xsl:if> 
</xsl:template>
<!-- Шаблон для вывода звездочек (оценки) -->
<xsl:template name="for_star">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<!--
<input type="radio" name="_comment_grade" value="{$i}" id="id_comment_grade_{$i}"/> 
<label for="id_icomment_grade_{$i}">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$i"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</label>
-->
<br/>
<xsl:if test="$n > $i and $n > 1">
<xsl:call-template name="for_star">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Вывод рейтинга -->
<xsl:template name="show_average_grade">
<xsl:param name="grade" select="0"/>
<xsl:param name="const_grade" select="0"/>
<!-- Чтобы избежать зацикливания -->
<xsl:variable name="current_grade" select="$grade * 1"/>
<xsl:choose>
<!-- Если число целое -->
<xsl:when test="floor($current_grade) = $current_grade and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 1 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 1"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$current_grade != 0">
<img src="/hostcmsfiles/images/stars_single.gif"/>
</xsl:if>
</xsl:when>
<xsl:when test="$current_grade != 0 and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 0.5 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 0.5"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<img src="/hostcmsfiles/images/stars_half.gif"/>
</xsl:when>
<!-- Выводим серые звездочки, пока текущая позиция не дойдет то значения, увеличенного до целого -->
<xsl:otherwise>
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
<img src="/hostcmsfiles/images/stars_gray.gif"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
<xsl:template match="group" mode="goup_path">
<xsl:variable name="parent_id" select="@parent_id"/>
<!-- Выбираем рекурсивно вышестоящую группу -->
<xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>
<xsl:if test="@parent_id=0">
<a href="{/document/information_system/url}">
<xsl:value-of disable-output-escaping="yes" select="/document/information_system/name"/>
</a>
</xsl:if>
<span class="path_arrow">→</span>
<a href="{/document/information_system/url}{fullpath}">
<xsl:value-of select="name"/>
</a>
</xsl:template>
<!-- Отображение комментариев -->
<xsl:template match="comment">
<!-- Отображаем комментарий, если задан текст или тема комментария -->
<xsl:if test="comment_text != '' or comment_subject != ''">
<a name="comment{comment_id}"></a>
<div class="comment" id="comment{comment_id}">
<div class="tl"></div>
<div class="tr"></div>
<div class="bl"></div>
<div class="br"></div>
<xsl:if test="comment_subject != ''">
<div>
<strong>
<xsl:value-of select="comment_subject"/>
</strong>
</div>
</xsl:if>
<xsl:value-of select="comment_text" disable-output-escaping="yes"/>
<!-- Оценка комментария -->
<xsl:if test="comment_grade != 0">
<div>Оценка:
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="comment_grade"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</div>
</xsl:if>
</div>
<div class="comment_desc">
<xsl:choose>
<!-- Комментарий добавил авторизированный пользователь -->
<xsl:when test="site_user_login/node()">
<a href="/users/info/{site_user_login}/" class="c_u_l">
<xsl:value-of select="site_user_login"/>
</a>
</xsl:when>
<!-- Комментарй добавил неавторизированный пользователь -->
<xsl:otherwise>
<xsl:value-of select="comment_fio"/></xsl:otherwise>
</xsl:choose> · <xsl:value-of select="comment_datetime"/> · <xsl:if
test="/document/show_add_comments/node()
and ((/document/show_add_comments = 1 and /document/site_user_id > 0)
or /document/show_add_comments = 2)"><a href="javascript:cr('cr_{comment_id}');">ответить</a> · </xsl:if><a href="{/document/item/item_path}#comment{comment_id}" title="ссылка">#</a>
</div>
<!-- Отображаем только авторизированным пользователям -->
<xsl:if test="/document/show_add_comments/node() and ((/document/show_add_comments = 1 and /document/site_user_id > 0) or /document/show_add_comments = 2)">
<div class="cr" id="cr_{comment_id}">
<xsl:call-template name="AddCommentForm">
<xsl:with-param name="comment_id" select="comment_id"/>
</xsl:call-template>
</div>
</xsl:if>
<!-- Выбираем дочерние комментарии -->
<xsl:if test="count(comment) > 0">
<div class="csd">
<xsl:apply-templates select="comment"/>
</div>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- Шаблон выводит группы свойств для элемента инфосистемы -->
<xsl:template match="properties_items_dir">
<p><b><xsl:value-of select="information_propertys_items_dir_name"/></b></p>
<xsl:variable name="dir_id" select="@id"/>
<xsl:if test="count(/document/item/item_propertys/item_property[@parent_id = $dir_id])">
<table border="0">
<xsl:apply-templates select="/document/item/item_propertys/item_property[@parent_id = $dir_id]"/>
</table>
</xsl:if>
<xsl:if test="count(properties_items_dir)">
<blockquote>
<xsl:apply-templates select="properties_items_dir"/>
</blockquote>
</xsl:if>
</xsl:template>
<!-- Вывод строки со значением свойства -->
<xsl:template match="item_property">
<tr>
<td style="padding: 5px" bgcolor="#E5DFDA">
<b><xsl:value-of select="property_name"/></b>
</td>
<td style="padding: 5px" bgcolor="#E5DFDA">
<xsl:choose>
<xsl:when test="type = 1">
<a href="{file_path}">Скачать файл</a>
</xsl:when>
<xsl:when test="type = 7">
<xsl:choose>
<xsl:when test="value = 1">
<input type="checkbox" checked="" disabled="" />
</xsl:when>
<xsl:otherwise>
<input type="checkbox" disabled="" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
<!-- Шаблон вывода добавления комментария -->
<xsl:template name="AddCommentForm">
<xsl:param name="comment_id" select="0"/>
<!-- Заполняем форму -->
<xsl:variable name="subject">
<xsl:if test="/document/form_parent_id/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_subject"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="email">
<xsl:if test="/document/form_user_email/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_user_email"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="text">
<xsl:if test="/document/form_text/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of disable-output-escaping="yes" select="/document/form_text"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="name">
<xsl:if test="/document/form_user_name/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_user_name"/>
</xsl:if>
</xsl:variable>
<div class="comment">
<div class="tl"></div>
<div class="tr"></div>
<div class="bl"></div>
<div class="br"></div>
<!--Отображение формы добавления комментария-->
<form action="{/document/url}" name="comment_form_0{comment_id}" method="post">
<!-- Авторизированным не показываем -->
<xsl:if test="/document/site_user_id = 0">
Имя
<br/>
<input type="text" size="70" name="comment_autor" value="{$name}"/>
<p>
E-mail
<br/>
<input id="email{$comment_id}" type="text" size="70" name="comment_email" value="{$email}"
onblur="FieldCheckEmail(this.id)"
onkeyup="FieldCheckEmail(this.id)"
onkeydown="FieldCheckEmail(this.id)" />
<div id="error_email{$comment_id}"></div>
</p>
</xsl:if>
<p>
Тема
<br/>
<input type="text" size="70" name="comment_subject" value="{$subject}"/>
</p>
<p>
Комментарий
<br/>
<textarea name="comment_text" cols="68" rows="5" class="mceEditor"><xsl:value-of select="$text"/></textarea>
</p>
<p>
Оценка
<br/>
<input type="hidden" name="comment_grade" value="0"/>
<xsl:variable name="ul_id">
<xsl:choose>
<xsl:when test="comment_id > 0"><xsl:value-of select="comment_id"/>_stars</xsl:when>
<xsl:otherwise>0_stars</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<ul id="{$ul_id}" class="stars">
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}1_star_1"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}2_star_2"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}3_star_3"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}4_star_4"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}5_star_5"></li>
</ul>
</p>
<br />
<!-- Обработка CAPTCHA -->
<xsl:if test="//captcha_key != 0 and /document/site_user_id = 0">
Контрольные цифры
<sup>
<font color="red">*</font>
</sup>
<div style="float: left">
<img id="comment_{$comment_id}" style="border: 1px solid #000000" src="/captcha.php?get_captcha={//captcha_key}{$comment_id}&height=30&width=100" title="Код подтверждения" name="captcha"/>
</div>
<div id="captcha" style="clear:both;">
<img style="border: 0px" src="/hostcmsfiles/images/refresh.gif" /> <a href="javascript:void(0);" onclick="ReNewCaptchaById('comment_{$comment_id}', '{//captcha_key}{$comment_id}', 30); return false;">Показать другое число</a>
</div>
<div style="float: left;margin-top: 5px">
<input type="hidden" name="captcha_key" value="{//captcha_key}{$comment_id}"/>
<input type="text" name="captcha_keystring" size="15"/>
</div>
<div id="captcha" style="clear:both;margin-bottom:10px;">
Введите число, которое указано выше.
</div>
</xsl:if>
<xsl:if test="$comment_id != 0">
<input type="hidden" name="comment_parent_id" value="{comment_id}"/>
</xsl:if>
<p>
<input id="submit_email{$comment_id}" type="submit" name="add_comment" value="Опубликовать"/>
</p>
</form>
</div>
</xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="prefix">page</xsl:param>
<xsl:param name="link"/>
<xsl:param name="items_on_page"/>
<xsl:param name="current_page"/>
<xsl:param name="count_items"/>
<xsl:param name="visible_pages"/>
<xsl:variable name="n" select="$count_items div $items_on_page"/>
<!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
<xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id"/>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name="pre_count_page">
<xsl:choose>
<xsl:when test="$current_page > ($n - (round($visible_pages div 2) - 1))">
<xsl:value-of select="$visible_pages - ($n - $current_page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name="post_count_page">
<xsl:choose>
<xsl:when test="0 > $current_page - (round($visible_pages div 2) - 1)">
<xsl:value-of select="$visible_pages - $current_page - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="round($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$count_items > $items_on_page and $n > $i">
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Определяем адрес тэга -->
<xsl:variable name="tag_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="count(/document/blocks/selected_tags/tag) != 0">tag/<xsl:value-of select="/document/blocks/selected_tags/tag/tag_path_name"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Определяем адрес ссылки -->
<xsl:variable name="number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i != 0">
<xsl:value-of select="$prefix"/>-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$current_page - $pre_count_page > 0 and $i = 0">
<a href="{$link}" class="page_link" style="text-decoration: none;">←</a>
</xsl:if>
<xsl:choose>
<xsl:when test="$i >= ($current_page - $pre_count_page) and ($current_page + $post_count_page) >= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$link}{$tag_link}{$number_link}" class="page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 >= $n and $n > ($current_page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n > round($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:when>
<xsl:otherwise>
<a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_page">
<span class="current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>
<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="prefix" select="$prefix"/>
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="$items_on_page"/>
<xsl:with-param name="current_page" select="$current_page"/>
<xsl:with-param name="count_items" select="$count_items"/>
<xsl:with-param name="visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Склонение после числительных -->
<xsl:template name="declension">
<xsl:param name="number" select="number"/>
<!-- Именительный падеж -->
<xsl:variable name="nominative">
<xsl:text>просмотр</xsl:text>
</xsl:variable>
<!-- Родительный падеж, единственное число -->
<xsl:variable name="genitive_singular">
<xsl:text>просмотра</xsl:text>
</xsl:variable>
<xsl:variable name="genitive_plural">
<xsl:text>просмотров</xsl:text>
</xsl:variable>
<xsl:variable name="last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>
<xsl:variable name="last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits != 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits != 12
or $last_digit = 3 and $last_two_digits != 13
or $last_digit = 4 and $last_two_digits != 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
1) стандартную типовую динамическую страницу "Информационная система" изменить так, как показано ниже:
<?php
/* ID Информационной системы */
$InformationSystem_id = to_int($GLOBALS['LA']['InformationSystemID']);
// Получаем информацию о текущем пользователе
if (class_exists('SiteUsers'))
{
$SiteUsers = & singleton('SiteUsers');
$site_user_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_user_id = 0;
}
$form_user_name = to_str($_POST['comment_autor']);
$form_user_email = to_str($_POST['comment_email']);
$form_text = to_str($_POST['comment_text']);
$form_subject = to_str($_POST['comment_subject']);
$form_parent_id = to_int($_POST['comment_parent_id']);
/* Массив внешних параметров, передаваемых в XML */
$external_propertys = array();
/* Добавление комментария */
// ShowAddComment == 1 - только авторизированные
// ShowAddComment == 2 - все
if (isset($_POST['add_comment'])
&& (($GLOBALS['LA']['ShowAddComment'] == 1 && $site_user_id > 0) || $GLOBALS['LA']['ShowAddComment'] == 2))
{
$param['information_items_id'] = to_int($GLOBALS['InformationResult']['item_id']);
/* XSL шаблон для отправки уведомления администратору о добавлении комментария */
$param['admin_email_xsl'] = to_str($GLOBALS['LA']['xsl_admin_email']);
$xsl_add_comment = to_str($GLOBALS['LA']['xsl_add_comment']);
/* Режим добавления комментария:
1 - публиковать сразу,
0 - публиковать после проверки.*/
if (to_bool($GLOBALS['LA']['TypeAddComment'])/* || $site_user_id > 0*/)
{
$param['status'] = 1;
}
else
{
$param['status'] = 0;
}
// Текст комментария
$_POST['comment_text'] = nl2br(to_str($_POST['comment_text']));
// Типографируем текст, если доступен модуль типографирования
if (class_exists('typograph'))
{
$typograph = new typograph();
$_POST['comment_text'] = $typograph->ProcessTypographic($_POST['comment_text']);
}
$param['comment_mail_type'] = to_int($GLOBALS['LA']['comment_mail_type']);
// ID родительского комментария
$param['comment_parent_id'] = to_int($_POST['comment_parent_id']);
$param['comment_autor'] = htmlspecialchars(to_str($_POST['comment_autor']));
$param['comment_email'] = htmlspecialchars(to_str($_POST['comment_email']));
$param['comment_subject'] = htmlspecialchars(to_str($_POST['comment_subject']));
$param['comment_text'] = to_str($_POST['comment_text']);
$param['comment_grade'] = to_int($_POST['comment_grade']);
$param['allowable_tags'] = '<b><strong><i><em><br><p><u><strike><ul><ol><li>';
ob_start();
$GLOBALS['LA_InformationSystem']->ShowAddComment('УведомлениеДобавлениеКомментария', $param);
$external_propertys['message'] = ob_get_clean();
if (strpos($external_propertys['message'], '<div id="error">') === false)
{
$form_user_name = '';
$form_user_email = '';
$form_text = '';
$form_subject = '';
$form_parent_id = to_int($_POST['comment_parent_id']);
}
}
if ($GLOBALS['INFSYS_result'] != false)
{
/* XSL шаблон для отображения списка элементов информационной системы */
$xsl_list = to_str($GLOBALS['LA']['xsl_information_system_list']);
/* XSL шаблон для отображения элемента информационной системы */
$xsl_item = to_str($GLOBALS['LA']['xsl_information_item']);
$InformationResult = $GLOBALS['InformationResult'];
/* Массив внешних параметров, передаваемых в XML */
$external_propertys['ОтображатьСсылкуНаАрхив'] = 0;
$external_propertys['ОтображатьСсылкиНаСледующиеСтраницы'] = 1;
/* Массив дополнительных параметров */
$property = array();
/* Число элементов на страницу */
if (isset($InformationResult['items_on_page']))
{
if ($InformationResult['items_on_page'] !== true)
{
$InformationResult['items_on_page'] = to_int($InformationResult['items_on_page']);
}
}
else
{
$InformationResult['items_on_page'] = 10;
}
/* Номер, с которого начинается показ */
if (isset($InformationResult['items_begin']))
{
$InformationResult['items_begin'] = to_int($InformationResult['items_begin']);
}
else
{
$InformationResult['items_begin'] = 0;
}
/* Вывод списка */
if ($GLOBALS['INFSYS_result']['item'] == false)
{
// Если передано имя тэга - фильтруем
if (isset($GLOBALS['INFSYS_result']['tag_name']))
{
if (class_exists('Tag'))
{
$oTag = & singleton('Tag');
$tag_row = $oTag->GetTagByPath($GLOBALS['INFSYS_result']['tag_name']);
$property['tags'] = array($tag_row['tag_id']);
// При выводе тэгов вывод элементов ведется из всех групп
$GLOBALS['INFSYS_result']['group'] = false;
}
}
// $property['xml_show_group_type'] = 'all';
// Разрешаем передачу в XML свойств групп
$property['xml_show_group_property'] = true;
$mas_show_items = array();
ob_start();
// Получаем массив идентификаторов отображаемых элементов
$mas_show_items = $GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, $GLOBALS['INFSYS_result']['group'], $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
ob_end_clean();
if (count($mas_show_items) > 0)
{
$DataBase = & singleton('DataBase');
$mas_in = implode(',', $mas_show_items);
// Получаем список ярлыков отбражаемых элементов
$query = "SELECT * FROM information_items_table WHERE information_items_shortcut_id IN ({$mas_in})";
$resource_shotcuts = $DataBase->select($query);
$mas_groups = array();
$mas_shotcut_group = array();
// В цикле формируем массив идентификаторов информационных групп для каждого отображаемого элемента
while($row_shotcut = mysql_fetch_assoc($resource_shotcuts))
{
// Нет данных об информационной группе
if (!in_array($row_shotcut['information_groups_id'], $mas_groups))
{
$mas_groups[] = $row_shotcut['information_groups_id'];
}
$mas_shotcut_group[$row_shotcut['information_items_shortcut_id']][$row_shotcut['information_groups_id']] = $row_shotcut['information_groups_id'];
}
$xmlData = '<show_item_shotcuts>' . "\n";
// В цикле формируем XML, содержащий список идентификаторов групп, в которых находятся ярлыки отображаемых элементов
foreach ($mas_shotcut_group as $show_item_id => $mas_group_rows_id)
{
$xmlData .= '<item id="' . $show_item_id . '">' . "\n";
foreach($mas_group_rows_id as $show_group_id)
{
if ($show_group_id)
{
// Получаем информацию о группе
$group_row = $GLOBALS['LA_InformationSystem']->GetInformationGroup($show_group_id);
$xmlData .= '<group id="' . $show_group_id . '">' . "\n";
// Формируем XML для группы
$xmlData .= $GLOBALS['LA_InformationSystem']->GenXmlForGroup($InformationSystem_id, $group_row, array());
$xmlData .= '</group>' . "\n";
}
else // Ярлык находится в корне
{
$xmlData .= '<group id="0">' . "\n";
$xmlData .= '</group>' . "\n";
}
}
$xmlData .= '</item>' . "\n";
}
$xmlData .= '</show_item_shotcuts>' . "\n";
$property['external_xml'] = $xmlData;
$GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, $GLOBALS['INFSYS_result']['group'], $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
}
}
else
{
$DataBase = & singleton('DataBase');
/* Определяем идентификатор информационного элемента */
$item_id = $GLOBALS['LA_InformationSystem']->GetIdInformationItem($GLOBALS['INFSYS_result']['item'], $GLOBALS['INFSYS_result']['group'], $InformationSystem_id);
if (to_bool($GLOBALS['LA']['ShowComments']))
{
$external_propertys['show_comments'] = '1';
}
else
{
$external_propertys['show_comments'] = '0';
}
// Кому разрешено добавление комментария
$external_propertys['show_add_comments'] = to_int($GLOBALS['LA']['ShowAddComment']);
$property['part'] = $GLOBALS['part_ii'];
// Запрещаем передачу в XML свойств групп
$property['xml_show_group_property'] = false;
// Получаем идентификаторы групп, в которые входят ярлыки отбражаемого элемента
$query = "SELECT information_groups_id FROM information_items_table WHERE `information_items_shortcut_id` = '{$item_id}'";
$resource_groups_shotcuts = $DataBase->select($query);
$xmlData = '<show_item_shotcuts>' . "\n";
// Массив идентификаторов групп
$mas_groups_shotcut = array();
// В цикле формируем XML, содержащий список идентификаторов групп, в которых находятся ярлыки отображаемого элемента
while($row_group_shotcut = mysql_fetch_assoc($resource_groups_shotcuts))
{
$show_group_id = $row_group_shotcut['information_groups_id'];
// Проверка на дублирование групп
if (!in_array($show_group_id, $mas_groups_shotcut))
{
$mas_groups_shotcut[] = $show_group_id;
if ($show_group_id)
{
// Получаем информацию о группе
$group_row = $GLOBALS['LA_InformationSystem']->GetInformationGroup($show_group_id);
if ($group_row)
{
$xmlData .= '<group id="' . $show_group_id . '">' . "\n";
// Формируем XML для группы
$xmlData .= $GLOBALS['LA_InformationSystem']->GenXmlForGroup($InformationSystem_id, $group_row, array());
$xmlData .= '</group>' . "\n";
}
}
else // Ярлык находится в корне
{
$xmlData .= '<group id="0">' . "\n";
$xmlData .= '</group>' . "\n";
}
}
}
$xmlData .= '</show_item_shotcuts>' . "\n";
$property['external_xml'] = $xmlData;
$external_propertys['form_user_name'] = $form_user_name;
$external_propertys['form_user_email'] = $form_user_email;
$external_propertys['form_text'] = $form_text;
$external_propertys['form_subject'] = $form_subject;
$external_propertys['form_parent_id'] = $form_parent_id;
// Выводим элемент информационной системы
$GLOBALS['LA_InformationSystem']->ShowInformationSystemItem($item_id, $xsl_item, $external_propertys, $property);
}
}
?>
2)XSL-шаблон "СписокЭлементовИнфосистемы" изменить как указано ниже
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/document"/>
</xsl:template>
<xsl:template match="/document">
<!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
<xsl:variable name="parent_group_id" select="blocks/parent_group_id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:if test="blocks/parent_group_id = 0">
<h1>
<xsl:value-of disable-output-escaping="yes" select="blocks/name"/>
</h1>
<!-- Описание выводится при отсутствии фильтрации по тэгам -->
<xsl:if test="count(blocks/tags/tag) = 0">
<xsl:value-of disable-output-escaping="yes" select="blocks/description"/>
</xsl:if>
</xsl:if>
<!-- Если в находимся в группе - выводим название группы -->
<xsl:if test="blocks/parent_group_id != 0">
<h1>
<xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/name"/>
</h1>
<!-- Описание выводим только на первой странице -->
<xsl:if test="blocks/items/current_page = 0">
<xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/description"/>
</xsl:if>
<!-- Путь к группе -->
<p>
<xsl:apply-templates select=".//group[@id=$parent_group_id]" mode="goup_path"/>
</p>
</xsl:if>
<!-- Обработка выбранных тэгов -->
<xsl:if test="count(blocks/selected_tags/tag) = 1">
<h2>Метка — <strong><xsl:value-of select="blocks/selected_tags/tag/tag_name"/></strong>.</h2>
</xsl:if>
<!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
<xsl:if test="count(blocks/selected_tags/tag) = 0 and count(.//group[@parent_id=$parent_group_id]) > 0">
<ul class="news_group">
<xsl:apply-templates select=".//group[@parent_id=$parent_group_id]" mode="groups"/>
</ul>
</xsl:if>
<!-- Отображение записи информационной системы -->
<xsl:apply-templates select="blocks/items/item[item_status=1]"/>
<!-- Строка ссылок на другие страницы информационной системы -->
<xsl:if test="ОтображатьСсылкиНаСледующиеСтраницы=1">
<p>
<!-- Ссылка, для которой дописываются суффиксы page-XX/ -->
<xsl:variable name="link">
<xsl:value-of select="/document/blocks/url"/>
<xsl:if test="$parent_group_id != 0">
<xsl:value-of select="/document/blocks//group[@id = $parent_group_id]/fullpath"/>
</xsl:if>
</xsl:variable>
<xsl:call-template name="for">
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="blocks/items/items_on_page"/>
<xsl:with-param name="current_page" select="blocks/items/current_page"/>
<xsl:with-param name="count_items" select="blocks/items/count_items"/>
<xsl:with-param name="visible_pages">5</xsl:with-param>
</xsl:call-template>
</p>
</xsl:if>
<xsl:if test="count(blocks/properties_groups_dir) and blocks/parent_group_id != 0">
<div style="margin: 10px 0px;">
<h2>Атрибуты группы инфоэлементов</h2>
<xsl:if test="count(blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = 0])">
<table border="0">
<xsl:apply-templates select="blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = 0]"/>
</table>
</xsl:if>
<xsl:apply-templates select="blocks/properties_groups_dir"/>
</div>
</xsl:if>
<div style="clear: both"></div>
<!-- Rss -->
<div class="rss_4_ie"></div>
<a href="{blocks/url}rss/">
<img src="/images/rss/rss_2.0.png" style="filter: alpha(opacity=0); margin: 0px 0px -4px 0px"/>
</a>
<a href="{blocks/url}rss/">RSS</a>
<xsl:if test="ОтображатьСсылкуНаАрхив=1">
<div class="archives_4_ie"></div>
<a href="{blocks/url}">
<img src="/images/archives.png" style="filter: alpha(opacity=0); margin: 0px 0px -4px 0px"/>
</a>
<a href="{blocks/url}">Архив "<xsl:value-of disable-output-escaping="yes" select="blocks/name"/>"</a>
</xsl:if>
</xsl:template>
<!-- Вывод строки со значением свойства -->
<xsl:template match="property">
<tr>
<td style="padding: 5px" bgcolor="#E5DFDA">
<b><xsl:value-of select="name"/></b>
</td>
<td style="padding: 5px" bgcolor="#E5DFDA">
<xsl:choose>
<xsl:when test="type = 1">
<a href="{file_path}">Скачать файл</a>
</xsl:when>
<xsl:when test="type = 7">
<xsl:choose>
<xsl:when test="value = 1">
<input type="checkbox" checked="" disabled="" />
</xsl:when>
<xsl:otherwise>
<input type="checkbox" disabled="" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
<!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
<xsl:template match="group" mode="goup_path">
<xsl:variable name="parent_id" select="@parent_id"/>
<xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>
<xsl:if test="@parent_id=0">
<a href="{/document/blocks/url}">
<xsl:value-of disable-output-escaping="yes" select="/document/blocks/name"/>
</a>
</xsl:if>
<span class="path_arrow">→</span>
<a href="{/document/blocks/url}{fullpath}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a>
</xsl:template>
<!-- Шаблон выводит группы свойств для группы инфосистемы -->
<xsl:template match="properties_groups_dir">
<p><b><xsl:value-of select="information_propertys_groups_dir_name"/></b></p>
<xsl:variable name="dir_id" select="@id"/>
<xsl:if test="count(//blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = $dir_id])">
<table border="0">
<xsl:apply-templates select="//blocks/group[@id = //blocks/parent_group_id]/propertys/property[@parent_id = $dir_id]"/>
</table>
</xsl:if>
<xsl:if test="count(properties_groups_dir)">
<blockquote>
<xsl:apply-templates select="properties_groups_dir"/>
</blockquote>
</xsl:if>
</xsl:template>
<!-- Шаблон выводит ссылки подгруппы информационного элемента -->
<xsl:template match="group" mode="groups">
<li>
<xsl:if test="small_image!=''">
<a href="{/document/blocks/url}{fullpath}" target="_blank">
<img src="{small_image}" align="middle"/>
</a> </xsl:if>
<a href="{/document/blocks/url}{fullpath}">
<b>
<xsl:value-of disable-output-escaping="yes" select="name"/>
</b>
</a> <span style="color: #cacaca">(<xsl:value-of select="count_all_items"/>)</span></li>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="blocks/items/item">
<div style="margin-right: 10px; margin-bottom: 20px;">
<!-- Дата время -->
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="item_datetime"/>
</span>
<!-- Название -->
<p class="news_title">
<a href="{item_path}">
<xsl:value-of disable-output-escaping="yes" select="item_name"/>
</a>
</p>
<!-- Идентификатор элемента -->
<xsl:variable name="item_id" select="@id" />
<xsl:if test="count(/document/show_item_shotcuts/item[@id=$item_id]/group) > 0">
<p>Список групп с ярлыками: <xsl:apply-templates select="/document/show_item_shotcuts/item[@id=$item_id]/group"/>
</p>
</xsl:if>
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="item_small_image!=''">
<a href="{item_path}" class="news_title">
<img src="{item_small_image}" class="news_img" alt="" align="left"/>
</a>
</xsl:if>
<xsl:value-of disable-output-escaping="yes" select="item_description"/>
<xsl:if test="count(tags/tag) > 0">
<p class="tags">
<img src="/hostcmsfiles/images/tags.gif" align="left" style="margin: 0px 5px -2px 0px"/>
<xsl:apply-templates select="tags/tag"/>
</p>
</xsl:if>
<p>
<xsl:if test="count(site_user) > 0">
<img src="/hostcmsfiles/images/user.gif" style="margin: 0px 5px -4px 0px"/>
<strong>
<a href="/users/info/{site_user/site_user_login}/" class="c_u_l">
<xsl:value-of select="site_user/site_user_login"/>
</a>
</strong>
</xsl:if>
<xsl:if test="count(item_comments/comment) > 0">
<img src="/hostcmsfiles/images/comments.gif" style="margin: 0px 5px -4px 0px"/>
<a href="{item_path}#comments">
<xsl:value-of select="count(item_comments//comment)"/> <xsl:call-template name="declension">
<xsl:with-param name="number" select="count(item_comments//comment)"/></xsl:call-template></a>
</xsl:if>
</p>
<div style="clear: both;"></div>
</div>
</xsl:template>
<!-- Список групп, в которых содержаться ярлыки элемента -->
<xsl:template match="/document/show_item_shotcuts/item/group">
<xsl:choose>
<xsl:when test="@id != 0"><a href="{/document/blocks/url}{fullpath}"><xsl:value-of select="name" /></a></xsl:when>
<xsl:otherwise><a href="{/document/blocks/url}"><xsl:value-of select="/document/blocks/name" /></a></xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>
<!-- /// Метки для информационного элемента /// -->
<xsl:template match="tags/tag">
<a href="{/document/blocks/url}tag/{tag_path_name}/" class="tag">
<xsl:value-of select="tag_name"/>
</a>
<xsl:if test="position() != last()">,</xsl:if> </xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="prefix">page</xsl:param>
<xsl:param name="link"/>
<xsl:param name="items_on_page"/>
<xsl:param name="current_page"/>
<xsl:param name="count_items"/>
<xsl:param name="visible_pages"/>
<xsl:variable name="n" select="$count_items div $items_on_page"/>
<!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
<xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id"/>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name="pre_count_page">
<xsl:choose>
<xsl:when test="$current_page > ($n - (round($visible_pages div 2) - 1))">
<xsl:value-of select="$visible_pages - ($n - $current_page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name="post_count_page">
<xsl:choose>
<xsl:when test="0 > $current_page - (round($visible_pages div 2) - 1)">
<xsl:value-of select="$visible_pages - $current_page - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="round($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$i = 0 and $current_page != 0">
<span class="ctrl">
← Ctrl
</span>
</xsl:if>
<xsl:if test="$i >= $n and ($n - 1) > $current_page">
<span class="ctrl">
Ctrl →
</span>
</xsl:if>
<xsl:if test="$count_items > $items_on_page and $n > $i">
<!-- Определяем адрес тэга -->
<xsl:variable name="tag_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="count(/document/blocks/selected_tags/tag) != 0">tag/<xsl:value-of select="/document/blocks/selected_tags/tag/tag_path_name"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Определяем адрес ссылки -->
<xsl:variable name="number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i != 0">
<xsl:value-of select="$prefix"/>-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$current_page - $pre_count_page > 0 and $i = 0">
<a href="{$link}" class="page_link" style="text-decoration: none;">←</a>
</xsl:if>
<xsl:choose>
<xsl:when test="$i >= ($current_page - $pre_count_page) and ($current_page + $post_count_page) >= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$link}{$tag_link}{$number_link}" class="page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 >= $n and $n > ($current_page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n > round($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:when>
<xsl:otherwise>
<a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
<!-- Ссылка на предыдущую страницу для Ctrl + влево -->
<xsl:if test="$current_page != 0 and $i = $current_page">
<xsl:variable name="prev_number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="($current_page - 1) != 0">page-<xsl:value-of select="$i"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<a href="{$link}{$tag_link}{$prev_number_link}" id="id_prev"></a>
</xsl:if>
<!-- Ссылка на следующую страницу для Ctrl + вправо -->
<xsl:if test="($n - 1) > $current_page and $i = $current_page">
<a href="{$link}{$tag_link}page-{$current_page+2}/" id="id_next"></a>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_page">
<span class="current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>
<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="prefix" select="$prefix"/>
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="$items_on_page"/>
<xsl:with-param name="current_page" select="$current_page"/>
<xsl:with-param name="count_items" select="$count_items"/>
<xsl:with-param name="visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Склонение после числительных -->
<xsl:template name="declension">
<xsl:param name="number" select="number"/>
<!-- Именительный падеж -->
<xsl:variable name="nominative">
<xsl:text>комментарий</xsl:text>
</xsl:variable>
<!-- Родительный падеж, единственное число -->
<xsl:variable name="genitive_singular">
<xsl:text>комментария</xsl:text>
</xsl:variable>
<xsl:variable name="genitive_plural">
<xsl:text>комментариев</xsl:text>
</xsl:variable>
<xsl:variable name="last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>
<xsl:variable name="last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits != 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits != 12
or $last_digit = 3 and $last_two_digits != 13
or $last_digit = 4 and $last_two_digits != 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
3) XSL-шаблон "ВыводЕдиницыИнформационнойСистемы" изменить так:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- ВыводЕдиницыИнформационнойСистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/document/item"/>
</xsl:template>
<xsl:template match="/document/item">
<SCRIPT>
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
// массив для хранения регулярных выражений для проверки полей
fieldType = new Array();
fieldType['minlen'] = 3;
fieldType['maxlen'] = 55;
fieldType['reg'] = '^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,}\$';
// Проверка ячейки
// elementId - идентификатор проверяемого элемента
function FieldCheckEmail(elementId)
{
var oField = document.getElementById(elementId);
var message = '';
if (oField != undefined)
{
var value = oField.value;
if (value != '')
{
// Проверка на минимальную длину
if (value.length < fieldType['minlen'])
{
var decl = declension(fieldType['minlen'], 'символ', 'символа', 'символов');
// сообщение
message += 'Минимум ' + fieldType['minlen'] + ' ' + decl + '. Текущая длина — ' + value.length + '. ';
}
// Проверка на максимальную длину
if (value.length > fieldType['maxlen'])
{
var decl = declension(fieldType['maxlen'], 'символ', 'символа', 'символов');
// сообщение
message += 'Максимум ' + fieldType['maxlen'] + ' ' + decl + '. Текущая длина — ' + value.length + '. ';
}
var t = value.match(fieldType['reg']);
//alert(t);
// Проверка на регулярное выражение
if (value.length > 0 && fieldType['reg'] && !value.match(fieldType['reg']))
{
// Сообщение
message += 'Значение поля не соответствует формату. ';
}
}
var oErrorDiv = document.getElementById('error_'+elementId);
if (oErrorDiv != undefined)
{
oErrorDiv.innerHTML = message;
}
var oSubmit = document.getElementById('submit_'+elementId);
if (oSubmit != undefined)
{
if (message != '')
{
oSubmit.disabled = true;
}
else
{
oSubmit.disabled = false;
}
}
}
}
/**
* Склонение после числительных
* int number числительное
* int nominative Именительный падеж
* int genitive_singular Родительный падеж, единственное число
* int genitive_plural Родительный падеж, множественное число
*/
function declension(number, nominative, genitive_singular, genitive_plural)
{
var last_digit = number % 10;
var last_two_digits = number % 100;
if (last_digit == 1 && last_two_digits != 11)
{
var result = nominative;
}
else
{
if ((last_digit == 2 && last_two_digits != 12) || (last_digit == 3 && last_two_digits != 13) || (last_digit == 4 && last_two_digits != 14))
{
var result = genitive_singular;
}
else
{
var result = genitive_plural;
}
}
return result;
}
// массив для хранения текущих рейтингов звезд
var curr_rate = new Array();
// функция работы со звездами рейтинга
function set_rate(id, new_rate)
{
// устанавливаем атрибуты
curr_star = document.getElementById(id);
parent_id = parseInt(curr_star.parentNode.id);
// при первом пересчете ставим рейтинг для группы звезд в 0
if (!curr_rate[parent_id])
{
curr_rate[parent_id] = 0;
}
// устанавливаем новый рейтинг в массив рейтингов и значение скрытого поля
if (new_rate != curr_rate[parent_id] && parseInt(new_rate) > 0)
{
curr_rate[parent_id] = new_rate;
curr_form = document.getElementById('comment_form_0' + (parent_id != 0 ? parent_id : ''));
curr_form.comment_grade.value = curr_rate[parent_id].charAt(curr_rate[parent_id].length - 1);
}
// пересчет стилей для звезд
for (i = 1; i < 6; i++)
{
if (parent_id != 0)
{
j = parent_id + '' + i + '_star_' + i;
}
else
{
j = i + '_star_' + i;
}
temp_obj = document.getElementById(j);
if (new_rate == 0)
{
id = curr_rate[parent_id];
}
if (parseInt(j) > parseInt(id))
{
temp_obj.className = '';
}
else
{
temp_obj.className = 'curr';
}
}
}
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
<!-- Получаем ID родительской группы и записываем в переменную $parent_group_id
-->
<xsl:variable name="parent_group_id" select="/document/information_system/parent_group_id"/>
<h1>
<xsl:value-of disable-output-escaping="yes" select="item_name"/>
</h1>
<xsl:if test="count(/document/show_item_shotcuts/group) > 0">
<p>Список групп с ярлыками: <xsl:apply-templates select="/document/show_item_shotcuts/group"/>
</p>
</xsl:if>
<xsl:if test="$parent_group_id != 0">
<!-- Путь к группе -->
<xsl:apply-templates select="//group[@id=$parent_group_id]" mode="goup_path"/>
</xsl:if>
<!-- Выводим сообщение -->
<xsl:if test="/document/message/node()">
<xsl:value-of disable-output-escaping="yes" select="/document/message"/>
</xsl:if>
<!-- Фотогафия к информационному элементу -->
<xsl:if test="item_small_image!=''">
<!-- Проверяем задан ли путь к файлу большого изображения -->
<xsl:if test="item_image!=''">
<a href="{item_image}" target="_blank" onclick="ShowImgWindow('{item_name}','{item_image}', {item_image/@width}, {item_image/@height}); return false;">
<img align="left" src="{item_small_image}" class="news_img"/>
</a>
</xsl:if>
<xsl:if test="item_image =''">
<img align="left" src="{item_small_image}" style="margin-right: 10px; margin-bottom: 10px"/>
</xsl:if>
</xsl:if>
<xsl:if test="//group[@id = $parent_group_id]/propertys/property[@xml_name='big_text'] != ''">
<p>
<xsl:value-of disable-output-escaping="yes" select="//group[@id = $parent_group_id]/propertys/property[@xml_name='big_text']/value"/>
</p>
</xsl:if>
<!-- Текст информационного элемента -->
<p>
<xsl:value-of disable-output-escaping="yes" select="item_text"/>
</p>
<!-- Средняя оценка элемента -->
<xsl:if test="item_comments/average_grade/node() and item_comments/average_grade != 0">
<div style="float: left; margin: 0px 0px 0px 0px">Оценка: <xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="item_comments/average_grade"/>
<xsl:with-param name="const_grade" select="5"/></xsl:call-template></div>
<div style="clear: both"></div>
</xsl:if>
<!-- Тэги для информационного элемента -->
<xsl:if test="count(tags/tag) > 0">
<p>
<img src="/hostcmsfiles/images/tags.gif" align="left" style="margin: 0px 5px -2px 0px"/>
<xsl:apply-templates select="tags/tag"/>
</p>
</xsl:if>
<!-- Дата информационного элемента -->
<p class="date"><xsl:value-of select="item_date"/>, <xsl:value-of select="item_show_count"/> <xsl:call-template name="declension">
<xsl:with-param name="number" select="item_show_count"/>
</xsl:call-template>.</p>
<!-- Ссылка 1-2-3 на части документа -->
<xsl:if test="part/@count > 1">
<div class="read_more">Читать дальше:</div>
<xsl:call-template name="for">
<xsl:with-param name="items_on_page">1</xsl:with-param>
<xsl:with-param name="current_page" select="part"/>
<xsl:with-param name="link" select="/document/item/item_path"/>
<xsl:with-param name="count_items" select="part/@count"/>
<xsl:with-param name="visible_pages">6</xsl:with-param>
<xsl:with-param name="prefix">part</xsl:with-param>
</xsl:call-template>
<div style="clear: both"></div>
</xsl:if>
<xsl:if test="count(/document/properties_items_dir)">
<div style="margin: 10px 0px;">
<h2>Атрибуты элемента инфосистемы</h2>
<xsl:if test="count(/document/item/item_propertys/item_property[@parent_id = 0])">
<table border="0">
<xsl:apply-templates select="/document/item/item_propertys/item_property[@parent_id = 0]"/>
</table>
</xsl:if>
<xsl:apply-templates select="/document/properties_items_dir"/>
</div>
</xsl:if>
<!-- Если указано отображать комментарии -->
<xsl:if test="/document/show_comments/node() and /document/show_comments = 1">
<!-- Отображение комментариев -->
<xsl:if test="count(item_comments/comment) > 0">
<p class="title">
<a name="comments"></a>Комментарии</p>
<xsl:apply-templates select="item_comments/comment"/>
</xsl:if>
</xsl:if>
<!-- Если разрешено отображать формы добавления комментария
1 - Только авторизированным
2 - Всем
-->
<xsl:if test="/document/show_add_comments/node() and ((/document/show_add_comments = 1 and /document/site_user_id > 0) or /document/show_add_comments = 2)">
<div id="ShowAddComment">
<a href="javascript:void(0)" onclick="javascript:cr('AddComment')">Добавить комментарий</a>
</div>
<div id="AddComment" style="display: none">
<xsl:call-template name="AddCommentForm"></xsl:call-template>
</div>
</xsl:if>
</xsl:template>
<!-- Список групп, в которых содержаться ярлыки элемента -->
<xsl:template match="/document/show_item_shotcuts/group">
<xsl:choose>
<xsl:when test="@id != 0"><a href="{/document/information_system/url}{fullpath}"><xsl:value-of select="name" /></a></xsl:when>
<xsl:otherwise><a href="{/document/information_system/url}"><xsl:value-of select="/document/information_system/name" /></a></xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>
<!-- /// Метки для информационного элемента /// -->
<xsl:template match="tags/tag">
<a href="{/document/information_system/url}tag/{tag_path_name}/" class="tag">
<xsl:value-of select="tag_name"/>
</a>
<xsl:if test="position() != last()">,</xsl:if> 
</xsl:template>
<!-- Шаблон для вывода звездочек (оценки) -->
<xsl:template name="for_star">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<!--
<input type="radio" name="_comment_grade" value="{$i}" id="id_comment_grade_{$i}"/> 
<label for="id_icomment_grade_{$i}">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$i"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</label>
-->
<br/>
<xsl:if test="$n > $i and $n > 1">
<xsl:call-template name="for_star">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Вывод рейтинга -->
<xsl:template name="show_average_grade">
<xsl:param name="grade" select="0"/>
<xsl:param name="const_grade" select="0"/>
<!-- Чтобы избежать зацикливания -->
<xsl:variable name="current_grade" select="$grade * 1"/>
<xsl:choose>
<!-- Если число целое -->
<xsl:when test="floor($current_grade) = $current_grade and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 1 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 1"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$current_grade != 0">
<img src="/hostcmsfiles/images/stars_single.gif"/>
</xsl:if>
</xsl:when>
<xsl:when test="$current_grade != 0 and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 0.5 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 0.5"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<img src="/hostcmsfiles/images/stars_half.gif"/>
</xsl:when>
<!-- Выводим серые звездочки, пока текущая позиция не дойдет то значения, увеличенного до целого -->
<xsl:otherwise>
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
<img src="/hostcmsfiles/images/stars_gray.gif"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
<xsl:template match="group" mode="goup_path">
<xsl:variable name="parent_id" select="@parent_id"/>
<!-- Выбираем рекурсивно вышестоящую группу -->
<xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>
<xsl:if test="@parent_id=0">
<a href="{/document/information_system/url}">
<xsl:value-of disable-output-escaping="yes" select="/document/information_system/name"/>
</a>
</xsl:if>
<span class="path_arrow">→</span>
<a href="{/document/information_system/url}{fullpath}">
<xsl:value-of select="name"/>
</a>
</xsl:template>
<!-- Отображение комментариев -->
<xsl:template match="comment">
<!-- Отображаем комментарий, если задан текст или тема комментария -->
<xsl:if test="comment_text != '' or comment_subject != ''">
<a name="comment{comment_id}"></a>
<div class="comment" id="comment{comment_id}">
<div class="tl"></div>
<div class="tr"></div>
<div class="bl"></div>
<div class="br"></div>
<xsl:if test="comment_subject != ''">
<div>
<strong>
<xsl:value-of select="comment_subject"/>
</strong>
</div>
</xsl:if>
<xsl:value-of select="comment_text" disable-output-escaping="yes"/>
<!-- Оценка комментария -->
<xsl:if test="comment_grade != 0">
<div>Оценка:
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="comment_grade"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</div>
</xsl:if>
</div>
<div class="comment_desc">
<xsl:choose>
<!-- Комментарий добавил авторизированный пользователь -->
<xsl:when test="site_user_login/node()">
<a href="/users/info/{site_user_login}/" class="c_u_l">
<xsl:value-of select="site_user_login"/>
</a>
</xsl:when>
<!-- Комментарй добавил неавторизированный пользователь -->
<xsl:otherwise>
<xsl:value-of select="comment_fio"/></xsl:otherwise>
</xsl:choose> · <xsl:value-of select="comment_datetime"/> · <xsl:if
test="/document/show_add_comments/node()
and ((/document/show_add_comments = 1 and /document/site_user_id > 0)
or /document/show_add_comments = 2)"><a href="javascript:cr('cr_{comment_id}');">ответить</a> · </xsl:if><a href="{/document/item/item_path}#comment{comment_id}" title="ссылка">#</a>
</div>
<!-- Отображаем только авторизированным пользователям -->
<xsl:if test="/document/show_add_comments/node() and ((/document/show_add_comments = 1 and /document/site_user_id > 0) or /document/show_add_comments = 2)">
<div class="cr" id="cr_{comment_id}">
<xsl:call-template name="AddCommentForm">
<xsl:with-param name="comment_id" select="comment_id"/>
</xsl:call-template>
</div>
</xsl:if>
<!-- Выбираем дочерние комментарии -->
<xsl:if test="count(comment) > 0">
<div class="csd">
<xsl:apply-templates select="comment"/>
</div>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- Шаблон выводит группы свойств для элемента инфосистемы -->
<xsl:template match="properties_items_dir">
<p><b><xsl:value-of select="information_propertys_items_dir_name"/></b></p>
<xsl:variable name="dir_id" select="@id"/>
<xsl:if test="count(/document/item/item_propertys/item_property[@parent_id = $dir_id])">
<table border="0">
<xsl:apply-templates select="/document/item/item_propertys/item_property[@parent_id = $dir_id]"/>
</table>
</xsl:if>
<xsl:if test="count(properties_items_dir)">
<blockquote>
<xsl:apply-templates select="properties_items_dir"/>
</blockquote>
</xsl:if>
</xsl:template>
<!-- Вывод строки со значением свойства -->
<xsl:template match="item_property">
<tr>
<td style="padding: 5px" bgcolor="#E5DFDA">
<b><xsl:value-of select="property_name"/></b>
</td>
<td style="padding: 5px" bgcolor="#E5DFDA">
<xsl:choose>
<xsl:when test="type = 1">
<a href="{file_path}">Скачать файл</a>
</xsl:when>
<xsl:when test="type = 7">
<xsl:choose>
<xsl:when test="value = 1">
<input type="checkbox" checked="" disabled="" />
</xsl:when>
<xsl:otherwise>
<input type="checkbox" disabled="" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
<!-- Шаблон вывода добавления комментария -->
<xsl:template name="AddCommentForm">
<xsl:param name="comment_id" select="0"/>
<!-- Заполняем форму -->
<xsl:variable name="subject">
<xsl:if test="/document/form_parent_id/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_subject"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="email">
<xsl:if test="/document/form_user_email/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_user_email"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="text">
<xsl:if test="/document/form_text/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of disable-output-escaping="yes" select="/document/form_text"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="name">
<xsl:if test="/document/form_user_name/node() and /document/form_parent_id/node() and /document/form_parent_id= $comment_id">
<xsl:value-of select="/document/form_user_name"/>
</xsl:if>
</xsl:variable>
<div class="comment">
<div class="tl"></div>
<div class="tr"></div>
<div class="bl"></div>
<div class="br"></div>
<!--Отображение формы добавления комментария-->
<form action="{/document/url}" name="comment_form_0{comment_id}" method="post">
<!-- Авторизированным не показываем -->
<xsl:if test="/document/site_user_id = 0">
Имя
<br/>
<input type="text" size="70" name="comment_autor" value="{$name}"/>
<p>
<br/>
<input id="email{$comment_id}" type="text" size="70" name="comment_email" value="{$email}"
onblur="FieldCheckEmail(this.id)"
onkeyup="FieldCheckEmail(this.id)"
onkeydown="FieldCheckEmail(this.id)" />
<div id="error_email{$comment_id}"></div>
</p>
</xsl:if>
<p>
Тема
<br/>
<input type="text" size="70" name="comment_subject" value="{$subject}"/>
</p>
<p>
Комментарий
<br/>
<textarea name="comment_text" cols="68" rows="5" class="mceEditor"><xsl:value-of select="$text"/></textarea>
</p>
<p>
Оценка
<br/>
<input type="hidden" name="comment_grade" value="0"/>
<xsl:variable name="ul_id">
<xsl:choose>
<xsl:when test="comment_id > 0"><xsl:value-of select="comment_id"/>_stars</xsl:when>
<xsl:otherwise>0_stars</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<ul id="{$ul_id}" class="stars">
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}1_star_1"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}2_star_2"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}3_star_3"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}4_star_4"></li>
<li onclick="set_rate(this.id, this.id)" onmouseover="set_rate(this.id, '-1')" onmouseout="set_rate(this.id, 0)" id="{comment_id}5_star_5"></li>
</ul>
</p>
<br />
<!-- Обработка CAPTCHA -->
<xsl:if test="//captcha_key != 0 and /document/site_user_id = 0">
Контрольные цифры
<sup>
<font color="red">*</font>
</sup>
<div style="float: left">
<img id="comment_{$comment_id}" style="border: 1px solid #000000" src="/captcha.php?get_captcha={//captcha_key}{$comment_id}&height=30&width=100" title="Код подтверждения" name="captcha"/>
</div>
<div id="captcha" style="clear:both;">
<img style="border: 0px" src="/hostcmsfiles/images/refresh.gif" /> <a href="javascript:void(0);" onclick="ReNewCaptchaById('comment_{$comment_id}', '{//captcha_key}{$comment_id}', 30); return false;">Показать другое число</a>
</div>
<div style="float: left;margin-top: 5px">
<input type="hidden" name="captcha_key" value="{//captcha_key}{$comment_id}"/>
<input type="text" name="captcha_keystring" size="15"/>
</div>
<div id="captcha" style="clear:both;margin-bottom:10px;">
Введите число, которое указано выше.
</div>
</xsl:if>
<xsl:if test="$comment_id != 0">
<input type="hidden" name="comment_parent_id" value="{comment_id}"/>
</xsl:if>
<p>
<input id="submit_email{$comment_id}" type="submit" name="add_comment" value="Опубликовать"/>
</p>
</form>
</div>
</xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="prefix">page</xsl:param>
<xsl:param name="link"/>
<xsl:param name="items_on_page"/>
<xsl:param name="current_page"/>
<xsl:param name="count_items"/>
<xsl:param name="visible_pages"/>
<xsl:variable name="n" select="$count_items div $items_on_page"/>
<!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
<xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id"/>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name="pre_count_page">
<xsl:choose>
<xsl:when test="$current_page > ($n - (round($visible_pages div 2) - 1))">
<xsl:value-of select="$visible_pages - ($n - $current_page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name="post_count_page">
<xsl:choose>
<xsl:when test="0 > $current_page - (round($visible_pages div 2) - 1)">
<xsl:value-of select="$visible_pages - $current_page - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="round($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="round($visible_pages div 2) - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$count_items > $items_on_page and $n > $i">
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Определяем адрес тэга -->
<xsl:variable name="tag_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="count(/document/blocks/selected_tags/tag) != 0">tag/<xsl:value-of select="/document/blocks/selected_tags/tag/tag_path_name"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Определяем адрес ссылки -->
<xsl:variable name="number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i != 0">
<xsl:value-of select="$prefix"/>-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$current_page - $pre_count_page > 0 and $i = 0">
<a href="{$link}" class="page_link" style="text-decoration: none;">←</a>
</xsl:if>
<xsl:choose>
<xsl:when test="$i >= ($current_page - $pre_count_page) and ($current_page + $post_count_page) >= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$link}{$tag_link}{$number_link}" class="page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 >= $n and $n > ($current_page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n > round($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:when>
<xsl:otherwise>
<a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">→</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_page">
<span class="current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>
<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="prefix" select="$prefix"/>
<xsl:with-param name="link" select="$link"/>
<xsl:with-param name="items_on_page" select="$items_on_page"/>
<xsl:with-param name="current_page" select="$current_page"/>
<xsl:with-param name="count_items" select="$count_items"/>
<xsl:with-param name="visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Склонение после числительных -->
<xsl:template name="declension">
<xsl:param name="number" select="number"/>
<!-- Именительный падеж -->
<xsl:variable name="nominative">
<xsl:text>просмотр</xsl:text>
</xsl:variable>
<!-- Родительный падеж, единственное число -->
<xsl:variable name="genitive_singular">
<xsl:text>просмотра</xsl:text>
</xsl:variable>
<xsl:variable name="genitive_plural">
<xsl:text>просмотров</xsl:text>
</xsl:variable>
<xsl:variable name="last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>
<xsl:variable name="last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits != 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits != 12
or $last_digit = 3 and $last_two_digits != 13
or $last_digit = 4 and $last_two_digits != 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Всё работает. Огромное спасибо.Это реализовано на сайте
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
А как же реализовать отображение списка групп и ярлыков при вызове инфосистемы из тела шаблона?
Пример вызова:
<?
$InformationSystem = & singleton('InformationSystem'
;
$external_propertys=array();
$property=array();
$element = array();
$external_propertys['ОтображатьСсылкуНаАрхив']=0;
$external_propertys['ОтображатьСсылкиНаСледующиеСтраницы']=0;
$property['show_item_type']=array('active'
;
$external_propertys['current_date'] = date('Ymd', time() - 60*60*24);
$element['type'] = 1;
$element['property_id'] = 53;
$element['prefix'] = ' AND ';
$element['if'] = '=';
$element['value'] = 0;
$element['sufix']='';
$property['select'][] = $element;
$InformationSystemId = 36;
$item_count =20;
$InformationGroupId = false; // false - из всех групп, 0 - из корневой группы
$InformationSystem->ShowInformationSystem($InformationSystemId, $InformationGroupId,'СписокНаГлавной',$item_count,0, $external_propertys,$property);
?>
Пример вызова:
<?
$InformationSystem = & singleton('InformationSystem'
; $external_propertys=array();
$property=array();
$element = array();
$external_propertys['ОтображатьСсылкуНаАрхив']=0;
$external_propertys['ОтображатьСсылкиНаСледующиеСтраницы']=0;
$property['show_item_type']=array('active'
;$external_propertys['current_date'] = date('Ymd', time() - 60*60*24);
$element['type'] = 1;
$element['property_id'] = 53;
$element['prefix'] = ' AND ';
$element['if'] = '=';
$element['value'] = 0;
$element['sufix']='';
$property['select'][] = $element;
$InformationSystemId = 36;
$item_count =20;
$InformationGroupId = false; // false - из всех групп, 0 - из корневой группы
$InformationSystem->ShowInformationSystem($InformationSystemId, $InformationGroupId,'СписокНаГлавной',$item_count,0, $external_propertys,$property);
?>
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Авторизация