Календарь

Модератор
#
Re: Календарь
kvasiliy,
Это примерно как архив выпусков слева на http://gazetart.su/
#
Re: Календарь
подскажите, как сделать самый простой архив новостей (модернизировать обычную тип страницу и xsl новостей), чтобы над списков новостей вывести

Архив: 2009 / 2008 / 2007 и тп

Список новостей

Вроде фильтра, текущий год выделяется жирным, и с хорошими урл-лами (/news/2009/), и чтобы постраничная навигация при этом нормально работала, чтобы показывались только года за которые есть новости

Получается какая то чушь не хватает знаний php, из тип. страницы архива тоже немного не понятно что взять для этого

Модератор
#
Re: Календарь
h4mpy,
реализация подобного рода архива зависит от того, как у Вас хранятся новости - лежат ли новости за все годы в одной папке или новости разделены по годам (каждый год - отдельная папка).
#
Re: Календарь
все идут одним списком
без деления
#
Re: Календарь
интересно 8)
ку
Модератор
#
Re: Календарь
Пример архива новостей реализован на стандартной типовой динамической странице "Информационные системы" с небольшими изменениями в коде страницы и коде настроек страницы. Также изменения коснулись и XSL-шаблона, отвечающего за отображение списка информационных элементов (новостей).
В итоге код типовой динамической страницы выглядит следующим образом:

<?php
// Получаем информацию о текущем пользователе
if (class_exists('SiteUsers'))
{
   $SiteUsers = & singleton('SiteUsers');
   $site_user_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
   $site_user_id = 0;
}

/* Массив внешних параметров, передаваемых в 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'] = to_str($_POST['comment_autor']);
   $param['comment_email'] = to_str($_POST['comment_email']);
   $param['comment_subject'] = 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><u><strike><ul><ol><li>';

   ob_start();
   $GLOBALS['LA_InformationSystem']->ShowAddComment('УведомлениеДобавлениеКомментария', $param);
   $external_propertys['message'] = ob_get_clean();
}

$InformationSystem_id = to_int($GLOBALS['InformationSystem_id']);

// XSL шаблон для отображения списка элементов информационной системы
$xsl_list = to_str($GLOBALS['LA']['xsl_information_system_list']);

// XSL шаблон для отображения элемента информационной системы
$xsl_item = to_str($GLOBALS['LA']['xsl_information_item']);

$InformationResult = $GLOBALS['InformationResult'];

$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;
}

/* Метод определения идентификатора информационной группы и идентификатора информационного элемента по значению URI */
//$result = $GLOBALS['LA_InformationSystem']->GetInformationFromPath($InformationSystem_id);

if ($GLOBALS['INFSYS_result'] != false)
{
   /* Вывод списка */
   if ($GLOBALS['INFSYS_result']['item'] == false)
   {
      // Если передано имя тэга - фильтруем
      if (isset($GLOBALS['INFSYS_result']['tag_name']))
      {
         $oTag = & singleton('Tag');

         $tag_row = $oTag->GetTagByName($GLOBALS['INFSYS_result']['tag_name']);

         $property['tags'] = array($tag_row['tag_id']);

         // При выводе тэгов вывод элементов ведется из всех групп
         $GLOBALS['INFSYS_result']['group'] = false;
      }
      
      
                $element['type'] = 0;
      $element['prefix'] = ' AND ';
      $element['name'] = 'information_items_date';
      $element['if'] = '>=';
      $element['value'] = $GLOBALS['year'] . '-01-01 00:00:00';
      $element['sufix']='';
      $property['select'][] = $element;
      
      $element['type'] = 0;
      $element['prefix'] = ' AND ';
      $element['name'] = 'information_items_date';
      $element['if'] = '<=';
      $element['value'] = $GLOBALS['year'] . '-12-31 23:59:59';
      $element['sufix']='';
      $property['select'][] = $element;
      

      // $property['xml_show_group_type'] = 'all';

      // Запрещаем передачу в XML свойств групп
      $property['xml_show_group_property'] = true;

      $external_propertys['Год'] = $GLOBALS['year'];
      
      /* Отображаем информационную систему */
      $GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, false, $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
   }
   else
   {
      /* Определяем идентификатор информационного элемента */
      $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;
      
      // Выводим элемент информационной системы
      $GLOBALS['LA_InformationSystem']->ShowInformationSystemItem($item_id, $xsl_item, $external_propertys, $property);
   }
}
?>


Код настроек типовой динамической страницы:

<?php

$kernel = & singleton('kernel');

/* ID Информационной системы */
$InformationSystem_id = to_int($GLOBALS['LA']['InformationSystemID']);

/* Количество записей на страницу */
$items_on_page = to_int($GLOBALS['LA']['ItemsOnPage']);

$GLOBALS['LA_InformationSystem'] = & singleton('InformationSystem');

if ($items_on_page !== true)
{
   $items_on_page = to_int($items_on_page);
}

$property = to_array($property);

/* Текстовая информация для указания номера страницы, например "страница" */
if (isset($GLOBALS['LA']['page']))
{
   $property['page'] = to_str($GLOBALS['LA']['page']);
}
else
{
   $property['page'] = 'страница';
}

/* Разделитель в заголовке страницы */
if (isset($GLOBALS['LA']['separator']))
{
   $property['separator'] = to_str($GLOBALS['LA']['separator']);
}
else
{
   $property['separator'] = ' / ';
}

$GLOBALS['InformationResult'] = array();

$break_if_path_not_found = false;

// Если указание на страницу - не прерываем определение

if (ereg ("^part-([0-9]*)$", end($GLOBALS['URL_ARRAY']), $regs) && to_int($regs[1]) > 0)
{
   $GLOBALS['part_ii'] = $regs[1];
}
else
{   
   $GLOBALS['part_ii'] = 1;
}


/* получаем для пути ассоциативный массив с id группы и id/url элемента для данной инфосистемы */
$GLOBALS['INFSYS_result'] = $GLOBALS['LA_InformationSystem']->GetInformationFromPath($InformationSystem_id, '', $break_if_path_not_found);

/* Если путь существует */
if ($GLOBALS['INFSYS_result'])
{
   /* получаем массив с деревом от текущей группы до корня */
   $GLOBALS['LA_InformationSystem']->GetInformationGroupsForXml($GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

   $group_path='';

   $mas_information_groups_for_xml=$GLOBALS['LA_InformationSystem']->get_mas_information_groups_for_xml();

   /* получаем данные о группе */
   $group_result=$GLOBALS['LA_InformationSystem']->SelectInformationGroups($GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

   $row_group=mysql_fetch_assoc($group_result);

   /* получаем данные из seo - полей для групп */
   $seo_title = trim($row_group['information_groups_seo_title']);
   $seo_description = trim($row_group['information_groups_seo_description']);
   $seo_keywords = trim($row_group['information_groups_seo_keywords']);

   /* цикл по массиву с деревом для формирования пути по группам */
   for($i = count($mas_information_groups_for_xml)-1; $i >= 0; $i--)
   {
      /* seo_title для группы пустое, то в заголовок подставляем название */

      if (trim($mas_information_groups_for_xml[$i]['information_groups_seo_title'])=='')
      {
         $group_path.=$property['separator'].$mas_information_groups_for_xml[$i]['information_groups_name'];
      }
      else
      {
         $group_path.=$property['separator'].$mas_information_groups_for_xml[$i]['information_groups_seo_title'];
      }
   }

   /* определяем название информационной системы */
   $row = $GLOBALS['LA_InformationSystem']->GetInformationSystem($InformationSystem_id);

   /* имя информационной системы */
   $InformationSystem_name = $row['information_systems_name'];

   /* Если вывод информационного элемента */
   if ($GLOBALS['INFSYS_result']['item'])
   {
      /* определяем id информационного элемента */
      $item_id = $GLOBALS['LA_InformationSystem']->GetIdInformationItem($GLOBALS['INFSYS_result']['item'], $GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

      $GLOBALS['InformationResult']['item_id'] = $item_id;

      /* получаем данные об элементе */
      $row_item = $GLOBALS['LA_InformationSystem']->GetInformationSystemItem($item_id);

      if (class_exists('SiteUsers'))
      {
         $SiteUsers = & singleton('SiteUsers');
         $site_user_id = $SiteUsers->GetCurrentSiteUser();
      }
      else
      {
         $site_user_id = 0;
      }

      if ($GLOBALS['LA_InformationSystem']->GetAccessItem($site_user_id, $row_item['information_items_id'], $row_item))
      {
         /* проверяем если seo_title непустой, то в заголовок страницы подставляем его */
         if (trim($row_item['information_items_seo_title']) != '')
         {
            $item_name = $property['separator'].trim($row_item['information_items_seo_title']);
         }
         else
         {
            /* имя элемента */
            $item_name = $property['separator'].$row_item['information_items_name'];
         }
      }
   }
   else
   {
      /* Вывод информационной группы */

      /* Определяем номер страницы для показа */
      $end_array_item = end($GLOBALS['URL_ARRAY']);

      $page = to_str($end_array_item);

      if (ereg ("^page-([0-9]*)$", $page, $regs) && to_int($regs[1]) > 0)
      {
         /* Страница умножается на кол-во элементов, выводимых на страницу */
         $items_begin = ($regs[1] - 1) * $items_on_page;

         /* Если показываем группу, а не элемент, то указываем страницу (страница N), если она не первая */
         $page_number = "{$property['separator']}{$property['page']} {$regs[1]}";
         
         $pre_end_array_item = prev($GLOBALS['URL_ARRAY']);
         
         // Переданный в строке год год
         if (to_int($pre_end_array_item) > 0)
         {
            $GLOBALS['year'] =  $pre_end_array_item;
         }
         else // Текущий год
         {
            $GLOBALS['year'] = date('Y');
         }
         

      }
      else
      {
         $items_begin = 0;
         
         $end_array_item = end($GLOBALS['URL_ARRAY']);
         
         // Переданный в строке год год
         if (to_int($end_array_item) > 0)
         {
            $GLOBALS['year'] =  $end_array_item;
         }
         else // Текущий год
         {
            $GLOBALS['year'] = date('Y');
         }

      }

      /* Массив, возвращаемый методом */
      $GLOBALS['InformationResult']['items_begin'] = $items_begin;
   }

   if (isset($GLOBALS['INFSYS_result']['tag_name']))
   {
      $tag_name = "Метка: {$GLOBALS['INFSYS_result']['tag_name']} {$property['separator']}";
   }

   /* формируем заголовок страницы */
   $new_title = to_str($tag_name) . $InformationSystem_name . $group_path . to_str($item_name) . to_str($page_number);
}
else
{
   // Элемент/группа не найдены, возвращаем 404 ошибку.
   ShowHeader404();

   $site = & singleton('site');
   $site_row = $site->GetSite(CURRENT_SITE);

   if ($site_row['site_error404'])
   {
      $structure = & singleton('Structure');

      $structure_id = intval($site_row['site_error404']);
      $structure_row = $structure->GetStructureItem($structure_id);

      // Если тип - страница
      if ($structure_row['structure_type'] == 0)
      {
         $document = & singleton('documents');
         $documents_version_row = $document->GetCurrentDocumentVersion($structure_row['documents_id']);
         $documents_version_id = $documents_version_row['documents_version_id'];

         // Текущая страница
         $kernel->set_current_page(PAGE_DIR . 'documents' . $documents_version_id . '.html');
      }
      elseif ($structure_row['structure_type'] == 1)
      {
         // Текущая страница - модуль
         $kernel->set_current_page(CMS_FOLDER . 'structure/Modules/Module' . $structure_id . '.php');
      }
      else
      {
         /* типовая динамическая страница */
         $lib_id = intval($structure_row['lib_id']);

         $kernel->set_current_page(CMS_FOLDER . "lib/lib_$lib_id/lib_$lib_id.php");
      }

      // Шаблон вывода для страницы
      $kernel->set_current_page_data_template($structure_row['data_templates_id']);
   }
   elseif (to_str($_SERVER['REQUEST_URI']) != '/')
   {
      header('Location: /');
      
      // Прекращаем выполнение
      exit();
   }
}

if (!empty($new_title))
{
   /* отображаем группу, если не существует данных об элементе и родительская группа не является корнем */
   if (!isset($row_item) && $GLOBALS['INFSYS_result']['group'] != 0 || !empty($tag_name) || !empty($page_number))
   {
      /* Заголовок для группы задан */
      if (!empty($seo_title))
      {
         $kernel->set_title($seo_title);
      }
      else
      {
         $kernel->set_title($new_title);
      }

      /* Описание для группы задано */
      if (!empty($seo_description))
      {
         $kernel->set_description($seo_description);
      }
      else
      {
         $kernel->set_description($new_title);
      }

      /* Ключевые слова для группы заданы */
      if (!empty($seo_keywords))
      {
         $kernel->set_keywords($seo_keywords);
      }
      else
      {
         $kernel->set_keywords($new_title);
      }
   }
   elseif (isset($row_item)) /* отображаем элемент */
   {

      if (!empty($row_item['information_items_seo_description']))
      {
         $kernel->set_title(trim($row_item['information_items_seo_title']));
      }
      else
      {
         $kernel->set_title($new_title);
      }

      /* Описание для элемента задано */
      if (!empty($row_item['information_items_seo_description']))
      {
         $kernel->set_description(trim($row_item['information_items_seo_description']));
      }
      else
      {
         $kernel->set_description($new_title);
      }

      /* Ключевые слова для элемента заданы */
      if (!empty($row_item['information_items_seo_keywords']))
      {
         $kernel->set_keywords(trim($row_item['information_items_seo_keywords']));
      }
      else
      {
         $kernel->set_keywords($new_title);
      }
   }
}

$GLOBALS['InformationResult']['items_on_page'] = $items_on_page;

?>


Код 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>Метка &#x97; <strong><xsl:value-of select="blocks/selected_tags/tag/tag_name"/></strong>.</h2>
      </xsl:if>

      <p>
         <a href="{blocks/url}2009/">2009</a>&#xA0;<a href="{blocks/url}2008/">2008</a>&#xA0;<a href="{blocks/url}2007/">2007</a>&#xA0;<a href="{blocks/url}2006/">2006</a></p>


      <!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
      <!--
      <xsl:if test="count(blocks/selected_tags/tag) = 0 and count(.//group[@parent_id=$parent_group_id]) &gt; 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:if test="/document/Год/node() and /document/Год &gt; 0">
                  <xsl:value-of select="/document/Год"/>/</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">&#x2192;</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}"/>
            </a>&#xA0;</xsl:if>
         <a href="{/document/blocks/url}{fullpath}">
            <b>
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </b>
         </a>&#xA0;<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: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) &gt; 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>

         <xsl:if test="count(site_user) &gt; 0">
            <p>
               <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 test="count(item_comments/comment) &gt; 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)"/>&#xA0;<xsl:call-template name="declension">
                        <xsl:with-param name="number" select="count(item_comments//comment)"/></xsl:call-template></a>
               </xsl:if>
            </p>
         </xsl:if>
         <div style="clear: both;"></div>
      </div>
   </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>&#xA0;</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 &gt; ($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 &gt; $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">&#x2190;
             Ctrl</span>
      </xsl:if>

      <xsl:if test="$i &gt;= $n and ($n - 1) &gt; $current_page">
         <span class="ctrl">Ctrl &#x2192;</span>
      </xsl:if>

      <xsl:if test="$count_items &gt; $items_on_page and $n &gt; $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 &gt; 0 and $i = 0">
               <a href="{$link}" class="page_link" style="text-decoration: none;">&#x2190;</a>
            </xsl:if>

            <xsl:choose>
               <xsl:when test="$i &gt;= ($current_page - $pre_count_page) and ($current_page + $post_count_page) &gt;= $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 &gt;= $n and $n &gt; ($current_page + 1 + $post_count_page)">
               <xsl:choose>
                  <xsl:when test="$n &gt; round($n)">
                     <!-- Выводим ссылку на последнюю страницу -->
                     <a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">&#x2192;</a>
                  </xsl:when>
                  <xsl:otherwise>
                     <a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">&#x2192;</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) &gt; $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>
#
Re: Календарь
Ivanov большое вам спасибо!

только текущая группа у меня почему-то не жирная
и при заходе в test.ru/news нет новостей тк например у меня нет новостей за 2009год еще
логичнее сделать тогда так (просьба 8):

при заходе в информационную систему test.ru/news
идут новости как и есть по дефолту в системе друг за другом

все новости(текущаяя) / 2009 / 2008 / 2007 и тп

при заходе например в test.ru/news/2009 соответственно 2009 жирная текущаяя а все новости ссылка (test.ru/news/)  уже нежирная


+


но не понял..

  <p>
         <a href="{blocks/url}2009/">2009</a>&#xA0;<a href="{blocks/url}2008/">2008</a>&#xA0;<a href="{blocks/url}2007/">2007</a>&#xA0;<a href="{blocks/url}2006/">2006</a></p>


это года добавлены вручную а как сделать чтобы выводились только те которые собственно есть ( у новостей) 8)


cпасибо
ку
Модератор
#
Re: Календарь
Код типовой динамической страницы:

<?php

// Получаем информацию о текущем пользователе
if (class_exists('SiteUsers'))
{
   $SiteUsers = & singleton('SiteUsers');
   $site_user_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
   $site_user_id = 0;
}

/* Массив внешних параметров, передаваемых в 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'] = to_str($_POST['comment_autor']);
   $param['comment_email'] = to_str($_POST['comment_email']);
   $param['comment_subject'] = 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><u><strike><ul><ol><li>';

   ob_start();
   $GLOBALS['LA_InformationSystem']->ShowAddComment('УведомлениеДобавлениеКомментария', $param);
   $external_propertys[0]['xml_name'] = 'message';
   $external_propertys[0]['value'] = ob_get_clean();
}

$InformationSystem_id = to_int($GLOBALS['InformationSystem_id']);

// XSL шаблон для отображения списка элементов информационной системы
$xsl_list = to_str($GLOBALS['LA']['xsl_information_system_list']);

// XSL шаблон для отображения элемента информационной системы
$xsl_item = to_str($GLOBALS['LA']['xsl_information_item']);

$InformationResult = $GLOBALS['InformationResult'];

$count_external_propertys = count($external_propertys);

$external_propertys[$count_external_propertys]['xml_name'] = 'ОтображатьСсылкуНаАрхив';
$external_propertys[$count_external_propertys]['value'] = 0;


$external_propertys[++$count_external_propertys]['xml_name'] = 'ОтображатьСсылкиНаСледующиеСтраницы';
$external_propertys[$count_external_propertys]['value'] = 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;
}

/* Метод определения идентификатора информационной группы и идентификатора информационного элемента по значению URI */
//$result = $GLOBALS['LA_InformationSystem']->GetInformationFromPath($InformationSystem_id);

if ($GLOBALS['INFSYS_result'] != false)
{
   /* Вывод списка */
   if ($GLOBALS['INFSYS_result']['item'] == false)
   {
      // Если передано имя тэга - фильтруем
      if (isset($GLOBALS['INFSYS_result']['tag_name']))
      {
         $oTag = & singleton('Tag');

         $tag_row = $oTag->GetTagByName($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;

      // Получаем список годов, для которых есть новости
      $query = "SELECT DISTINCT DATE_FORMAT(information_items_date, '%Y') as news_date FROM information_items_table
               WHERE information_systems_id = '1' AND information_items_status = '1'
               ORDER BY news_date DESC";

      $DataBase = & singleton ('DataBase');

      $result = $DataBase->select($query);
      $ExternalXml = new ExternalXml();

      $param_ext_xml = array();

      $year_ext_xml = array();
      $i = 0;

      while($row_date = mysql_fetch_assoc($result))
      {
         $year_ext_xml[$i]['xml_name'] = 'Год';
         $year_ext_xml[$i++]['value'] = intval($row_date['news_date']);
      }


      //$xmlData = $ExternalXml->GenXml($year_ext_xml, 1);

      $external_propertys[++$count_external_propertys]['xml_name'] = 'Годы';//$xmlData;
      $external_propertys[$count_external_propertys]['value'] = $year_ext_xml;


      // Передан год
      if (isset($GLOBALS['year']))
      {
         $element['type'] = 0;
         $element['prefix'] = ' AND ';
         $element['name'] = 'information_items_date';
         $element['if'] = '>=';
         $element['value'] = $GLOBALS['year'] . '-01-01 00:00:00';
         $element['sufix']='';
         $property['select'][] = $element;

         $element['type'] = 0;
         $element['prefix'] = ' AND ';
         $element['name'] = 'information_items_date';
         $element['if'] = '<=';
         $element['value'] = $GLOBALS['year'] . '-12-31 23:59:59';
         $element['sufix']='';
         $property['select'][] = $element;

         $external_propertys[++$count_external_propertys]['xml_name'] = 'ТекущийГод';
         $external_propertys[$count_external_propertys]['value'] = $GLOBALS['year'];


         $group_id = false;
      }
      else // Год не передан - отображаем по умолчанию
      {
         $group_id = $GLOBALS['INFSYS_result']['group'];
      }

      $property['GenXml_type'] = 1;

      /* Отображаем информационную систему */
      $GLOBALS['LA_InformationSystem']->ShowInformationSystem($InformationSystem_id, $group_id, $xsl_list, $InformationResult['items_on_page'], $InformationResult['items_begin'], $external_propertys, $property);
   }
   else
   {
      /* Определяем идентификатор информационного элемента */
      $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;

      // Выводим элемент информационной системы
      $GLOBALS['LA_InformationSystem']->ShowInformationSystemItem($item_id, $xsl_item, $external_propertys, $property);
   }
}
?>


Код настроек типовой динамической страницы:

<?php

$kernel = & singleton('kernel');

/* ID Информационной системы */
$InformationSystem_id = to_int($GLOBALS['LA']['InformationSystemID']);

/* Количество записей на страницу */
$items_on_page = to_int($GLOBALS['LA']['ItemsOnPage']);

$GLOBALS['LA_InformationSystem'] = & singleton('InformationSystem');

if ($items_on_page !== true)
{
   $items_on_page = to_int($items_on_page);
}

$property = to_array($property);

/* Текстовая информация для указания номера страницы, например "страница" */
if (isset($GLOBALS['LA']['page']))
{
   $property['page'] = to_str($GLOBALS['LA']['page']);
}
else
{
   $property['page'] = 'страница';
}

/* Разделитель в заголовке страницы */
if (isset($GLOBALS['LA']['separator']))
{
   $property['separator'] = to_str($GLOBALS['LA']['separator']);
}
else
{
   $property['separator'] = ' / ';
}

$GLOBALS['InformationResult'] = array();

$break_if_path_not_found = false;

// Если указание на страницу - не прерываем определение

if (ereg ("^part-([0-9]*)$", end($GLOBALS['URL_ARRAY']), $regs) && to_int($regs[1]) > 0)
{
   $GLOBALS['part_ii'] = $regs[1];
}
else
{   
   $GLOBALS['part_ii'] = 1;
}


/* получаем для пути ассоциативный массив с id группы и id/url элемента для данной инфосистемы */
$GLOBALS['INFSYS_result'] = $GLOBALS['LA_InformationSystem']->GetInformationFromPath($InformationSystem_id, '', $break_if_path_not_found);

/* Если путь существует */
if ($GLOBALS['INFSYS_result'])
{
   /* получаем массив с деревом от текущей группы до корня */
   $GLOBALS['LA_InformationSystem']->GetInformationGroupsForXml($GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

   $group_path='';

   $mas_information_groups_for_xml=$GLOBALS['LA_InformationSystem']->get_mas_information_groups_for_xml();

   /* получаем данные о группе */
   $group_result=$GLOBALS['LA_InformationSystem']->SelectInformationGroups($GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

   $row_group=mysql_fetch_assoc($group_result);

   /* получаем данные из seo - полей для групп */
   $seo_title = trim($row_group['information_groups_seo_title']);
   $seo_description = trim($row_group['information_groups_seo_description']);
   $seo_keywords = trim($row_group['information_groups_seo_keywords']);

   /* цикл по массиву с деревом для формирования пути по группам */
   for($i = count($mas_information_groups_for_xml)-1; $i >= 0; $i--)
   {
      /* seo_title для группы пустое, то в заголовок подставляем название */

      if (trim($mas_information_groups_for_xml[$i]['information_groups_seo_title'])=='')
      {
         $group_path.=$property['separator'].$mas_information_groups_for_xml[$i]['information_groups_name'];
      }
      else
      {
         $group_path.=$property['separator'].$mas_information_groups_for_xml[$i]['information_groups_seo_title'];
      }
   }

   /* определяем название информационной системы */
   $row = $GLOBALS['LA_InformationSystem']->GetInformationSystem($InformationSystem_id);

   /* имя информационной системы */
   $InformationSystem_name = $row['information_systems_name'];

   /* Если вывод информационного элемента */
   if ($GLOBALS['INFSYS_result']['item'])
   {
      /* определяем id информационного элемента */
      $item_id = $GLOBALS['LA_InformationSystem']->GetIdInformationItem($GLOBALS['INFSYS_result']['item'], $GLOBALS['INFSYS_result']['group'], $InformationSystem_id);

      $GLOBALS['InformationResult']['item_id'] = $item_id;

      /* получаем данные об элементе */
      $row_item = $GLOBALS['LA_InformationSystem']->GetInformationSystemItem($item_id);

      if (class_exists('SiteUsers'))
      {
         $SiteUsers = & singleton('SiteUsers');
         $site_user_id = $SiteUsers->GetCurrentSiteUser();
      }
      else
      {
         $site_user_id = 0;
      }

      if ($GLOBALS['LA_InformationSystem']->GetAccessItem($site_user_id, $row_item['information_items_id'], $row_item))
      {
         /* проверяем если seo_title непустой, то в заголовок страницы подставляем его */
         if (trim($row_item['information_items_seo_title']) != '')
         {
            $item_name = $property['separator'].trim($row_item['information_items_seo_title']);
         }
         else
         {
            /* имя элемента */
            $item_name = $property['separator'].$row_item['information_items_name'];
         }
      }
   }
   else
   {
      /* Вывод информационной группы */

      /* Определяем номер страницы для показа */
      $end_array_item = end($GLOBALS['URL_ARRAY']);

      $page = to_str($end_array_item);

      if (ereg ("^page-([0-9]*)$", $page, $regs) && to_int($regs[1]) > 0)
      {
         /* Страница умножается на кол-во элементов, выводимых на страницу */
         $items_begin = ($regs[1] - 1) * $items_on_page;

         /* Если показываем группу, а не элемент, то указываем страницу (страница N), если она не первая */
         $page_number = "{$property['separator']}{$property['page']} {$regs[1]}";
         
         $pre_end_array_item = prev($GLOBALS['URL_ARRAY']);
         
         // Переданный в строке год
         if (to_int($pre_end_array_item) > 0)
         {
            $GLOBALS['year'] =  $pre_end_array_item;
         }
/*
         else // Текущий год
         {
            $GLOBALS['year'] = date('Y');
         }
*/
         
      }
      else
      {
         $items_begin = 0;
         
         $end_array_item = end($GLOBALS['URL_ARRAY']);
         
         // Переданный в строке год
         if (to_int($end_array_item) > 0)
         {
            $GLOBALS['year'] =  $end_array_item;
         }
         /*else // Текущий год
         {
            $GLOBALS['year'] = date('Y');
         }
*/
      }

      /* Массив, возвращаемый методом */
      $GLOBALS['InformationResult']['items_begin'] = $items_begin;
   }

   if (isset($GLOBALS['INFSYS_result']['tag_name']))
   {
      $tag_name = "Метка: {$GLOBALS['INFSYS_result']['tag_name']} {$property['separator']}";
   }

   /* формируем заголовок страницы */
   $new_title = to_str($tag_name) . $InformationSystem_name . $group_path . to_str($item_name) . to_str($page_number);
}
else
{
   // Элемент/группа не найдены, возвращаем 404 ошибку.
   ShowHeader404();

   $site = & singleton('site');
   $site_row = $site->GetSite(CURRENT_SITE);

   if ($site_row['site_error404'])
   {
      $structure = & singleton('Structure');

      $structure_id = intval($site_row['site_error404']);
      $structure_row = $structure->GetStructureItem($structure_id);

      // Если тип - страница
      if ($structure_row['structure_type'] == 0)
      {
         $document = & singleton('documents');
         $documents_version_row = $document->GetCurrentDocumentVersion($structure_row['documents_id']);
         $documents_version_id = $documents_version_row['documents_version_id'];

         // Текущая страница
         $kernel->set_current_page(PAGE_DIR . 'documents' . $documents_version_id . '.html');
      }
      elseif ($structure_row['structure_type'] == 1)
      {
         // Текущая страница - модуль
         $kernel->set_current_page(CMS_FOLDER . 'structure/Modules/Module' . $structure_id . '.php');
      }
      else
      {
         /* типовая динамическая страница */
         $lib_id = intval($structure_row['lib_id']);

         $kernel->set_current_page(CMS_FOLDER . "lib/lib_$lib_id/lib_$lib_id.php");
      }

      // Шаблон вывода для страницы
      $kernel->set_current_page_data_template($structure_row['data_templates_id']);
   }
   elseif (to_str($_SERVER['REQUEST_URI']) != '/')
   {
      header('Location: /');
      
      // Прекращаем выполнение
      exit();
   }
}

if (!empty($new_title))
{
   /* отображаем группу, если не существует данных об элементе и родительская группа не является корнем */
   if (!isset($row_item) && $GLOBALS['INFSYS_result']['group'] != 0 || !empty($tag_name) || !empty($page_number))
   {
      /* Заголовок для группы задан */
      if (!empty($seo_title))
      {
         $kernel->set_title($seo_title);
      }
      else
      {
         $kernel->set_title($new_title);
      }

      /* Описание для группы задано */
      if (!empty($seo_description))
      {
         $kernel->set_description($seo_description);
      }
      else
      {
         $kernel->set_description($new_title);
      }

      /* Ключевые слова для группы заданы */
      if (!empty($seo_keywords))
      {
         $kernel->set_keywords($seo_keywords);
      }
      else
      {
         $kernel->set_keywords($new_title);
      }
   }
   elseif (isset($row_item)) /* отображаем элемент */
   {

      if (!empty($row_item['information_items_seo_description']))
      {
         $kernel->set_title(trim($row_item['information_items_seo_title']));
      }
      else
      {
         $kernel->set_title($new_title);
      }

      /* Описание для элемента задано */
      if (!empty($row_item['information_items_seo_description']))
      {
         $kernel->set_description(trim($row_item['information_items_seo_description']));
      }
      else
      {
         $kernel->set_description($new_title);
      }

      /* Ключевые слова для элемента заданы */
      if (!empty($row_item['information_items_seo_keywords']))
      {
         $kernel->set_keywords(trim($row_item['information_items_seo_keywords']));
      }
      else
      {
         $kernel->set_keywords($new_title);
      }
   }
}

$GLOBALS['InformationResult']['items_on_page'] = $items_on_page;
?>


Код 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>Метка &#x97; <strong><xsl:value-of select="blocks/selected_tags/tag/tag_name"/></strong>.</h2>
      </xsl:if>
      
      <p>
         <xsl:for-each select="Годы/Год">
            <xsl:variable name="year_style">
               <xsl:choose>
                  <xsl:when test=". = /document/ТекущийГод">font-weight: bold</xsl:when>
                  <xsl:otherwise></xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
            <a href="{/document/blocks/url}{.}/">
               <span style="{$year_style}"><xsl:value-of select="."/></span>
         </a>&#xA0;</xsl:for-each>
      </p>
      
      <!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
      <!--
      <xsl:if test="count(blocks/selected_tags/tag) = 0 and count(.//group[@parent_id=$parent_group_id]) &gt; 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:if test="/document/ТекущийГод/node() and /document/ТекущийГод &gt; 0">
                  <xsl:value-of select="/document/ТекущийГод"/>/</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">&#x2192;</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}"/>
         </a>&#xA0;</xsl:if>
         <a href="{/document/blocks/url}{fullpath}">
            <b>
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </b>
   </a>&#xA0;<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: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) &gt; 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>
         
         <xsl:if test="count(site_user) &gt; 0">
            <p>
               <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 test="count(item_comments/comment) &gt; 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)"/>&#xA0;<xsl:call-template name="declension">
                     <xsl:with-param name="number" select="count(item_comments//comment)"/></xsl:call-template></a>
               </xsl:if>
            </p>
         </xsl:if>
         <div style="clear: both;"></div>
      </div>
   </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>&#xA0;</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 &gt; ($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 &gt; $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">&#x2190;
         Ctrl</span>
      </xsl:if>
      
      <xsl:if test="$i &gt;= $n and ($n - 1) &gt; $current_page">
         <span class="ctrl">Ctrl &#x2192;</span>
      </xsl:if>
      
      <xsl:if test="$count_items &gt; $items_on_page and $n &gt; $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 &gt; 0 and $i = 0">
               <a href="{$link}" class="page_link" style="text-decoration: none;">&#x2190;</a>
            </xsl:if>
            
            <xsl:choose>
               <xsl:when test="$i &gt;= ($current_page - $pre_count_page) and ($current_page + $post_count_page) &gt;= $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 &gt;= $n and $n &gt; ($current_page + 1 + $post_count_page)">
               <xsl:choose>
                  <xsl:when test="$n &gt; round($n)">
                     <!-- Выводим ссылку на последнюю страницу -->
                     <a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">&#x2192;</a>
                  </xsl:when>
                  <xsl:otherwise>
                     <a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">&#x2192;</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) &gt; $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>
#
Re: Календарь
ошибки лезут теперь странно

ПРЕДУПРЕЖЕДЕНИЕ: DOMDocument::loadXML() [function.DOMDocument-loadXML]: StartTag: invalid element name in Entity, line: 4 в файле Z:\home\hostcmsfree.local\www\modules\Xsl\Xsl.class.php (строка 0)
ПРЕДУПРЕЖЕДЕНИЕ: DOMDocument::loadXML() [function.DOMDocument-loadXML]: expected '>' in Entity, line: 7 в файле Z:\home\hostcmsfree.local\www\modules\Xsl\Xsl.class.php (строка 0)
ПРЕДУПРЕЖЕДЕНИЕ: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Opening and ending tag mismatch: document line 2 and unparseable in Entity, line: 7 в файле Z:\home\hostcmsfree.local\www\modules\Xsl\Xsl.class.php (строка 0)
ПРЕДУПРЕЖЕДЕНИЕ: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Extra content at the end of the document in Entity, line: 7 в файле Z:\home\hostcmsfree.local\www\modules\Xsl\Xsl.class.php (строка 0)
ку
Модератор
#
Re: Календарь
При копировании 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>Метка &#x97; <strong><xsl:value-of select="blocks/selected_tags/tag/tag_name"/></strong>.</h2>
      </xsl:if>
      
      <p>
         <xsl:for-each select="Годы/Год">
            <xsl:variable name="year_style">
               <xsl:choose>
                  <xsl:when test=". = /document/ТекущийГод">font-weight: bold</xsl:when>
                  <xsl:otherwise></xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
            <a href="{/document/blocks/url}{.}/">
               <span style="{$year_style}"><xsl:value-of select="."/></span>
         </a>&#xA0;</xsl:for-each>
      </p>
      
      <!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
      <!--
      <xsl:if test="count(blocks/selected_tags/tag) = 0 and count(.//group[@parent_id=$parent_group_id]) &gt; 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:if test="/document/ТекущийГод/node() and /document/ТекущийГод &gt; 0">
                  <xsl:value-of select="/document/ТекущийГод"/>/</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">&#x2192;</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}"/>
         </a>&#xA0;</xsl:if>
         <a href="{/document/blocks/url}{fullpath}">
            <b>
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </b>
   </a>&#xA0;<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: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) &gt; 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>
         
         <xsl:if test="count(site_user) &gt; 0">
            <p>
               <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 test="count(item_comments/comment) &gt; 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)"/>&#xA0;<xsl:call-template name="declension">
                     <xsl:with-param name="number" select="count(item_comments//comment)"/></xsl:call-template></a>
               </xsl:if>
            </p>
         </xsl:if>
         <div style="clear: both;"></div>
      </div>
   </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>&#xA0;</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 &gt; ($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 &gt; $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">&#x2190;
         Ctrl</span>
      </xsl:if>
      
      <xsl:if test="$i &gt;= $n and ($n - 1) &gt; $current_page">
         <span class="ctrl">Ctrl &#x2192;</span>
      </xsl:if>
      
      <xsl:if test="$count_items &gt; $items_on_page and $n &gt; $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 &gt; 0 and $i = 0">
               <a href="{$link}" class="page_link" style="text-decoration: none;">&#x2190;</a>
            </xsl:if>
            
            <xsl:choose>
               <xsl:when test="$i &gt;= ($current_page - $pre_count_page) and ($current_page + $post_count_page) &gt;= $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 &gt;= $n and $n &gt; ($current_page + 1 + $post_count_page)">
               <xsl:choose>
                  <xsl:when test="$n &gt; round($n)">
                     <!-- Выводим ссылку на последнюю страницу -->
                     <a href="{$link}{$prefix}-{round($n+1)}/" class="page_link" style="text-decoration: none;">&#x2192;</a>
                  </xsl:when>
                  <xsl:otherwise>
                     <a href="{$link}{$prefix}-{round($n)}/" class="page_link" style="text-decoration: none;">&#x2192;</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) &gt; $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>
Авторизация