Корректный вывод разделов инфосистем в меню
Знаю, что вопрос распространенный (отчасти), но ответа именно на свою проблему не могу найти. Структура меню сайта сайта новости:
- О компании
-- Список сотрудников
-- Контактная информация
- Новости
-- Главные новости
-- Второстепенные новости
- Статьи
-- Главные статьи
-- Второстепенные статьи
Меню вертикальное. Когда пользователь заходит в раздел 1го уровня (новости, статьи, о компании), то ссылка на эту страницу становится неактивной, показываются все подраздела 2го уровня только этого раздела. Когда пользователь заходит в какой-то подраздел - ссылка этого подраздела становится неактивной, ссылка раздела становится активной, но выделена (чтобы было понятно, где пользователь находится). Вывод меню сделан так:
<ul class="parent-dept">
<?php
$Structure = & singleton('Structure');
$menuparam = array();
$menuparam['show_groups'] = true;
$menuexternalpropertys = array();
$menuexternalpropertys['ТекущаяГруппа'] = "group_".to_int( $GLOBALS['mas_information_groups_for_xml'][0]['information_groups_id'] );
$Structure->ShowStructure(3,'ГлавноеМеню',$menuparam, $menuexternalpropertys);
?>
</ul>
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="/document">
<xsl:apply-templates select="structure[show=1]"/>
</xsl:template>
<xsl:template match="structure">
<xsl:variable name="current_structure_id">
<xsl:choose>
<xsl:when test="item/node()">item_<xsl:value-of select="item"/></xsl:when>
<xsl:when test="group/node()">group_<xsl:value-of select="group"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="structure/current_structure_id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="URL" select="link" />
<li>
<xsl:choose>
<!-- Что будет, если ID структуры равен данному -->
<xsl:when test="current_structure_id=@id">
<span class="selected-parent"><xsl:value-of select="name" /></span>
<!-- Определяем, есть ли вложенные структуры -->
<xsl:if test="count(structure[show=1]) > 0">
<ul class="sub-dept">
<xsl:for-each select="structure">
<xsl:variable name="subURL" select="link" />
<li><a href="{$subURL}"><xsl:value-of select="name" /></a></li>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:when>
<!-- Что будет, если ID структуры не равен данному -->
<xsl:otherwise>
<!-- Что делать, если у нас есть дети с каррент ID-->
<xsl:choose>
<xsl:when test="count(.//structure[@id=$current_structure_id])=1">
<span class="selected-parent"><a href="{$URL}" class="current-dept"><xsl:value-of select="name" /></a></span>
<ul class="sub-dept">
<xsl:for-each select="structure[show=1]">
<xsl:variable name="subURL" select="link" />
<xsl:choose>
<xsl:when test="current_structure_id=@id">
<li><span class="selected-sub"><xsl:value-of select="name" /></span></li>
</xsl:when>
<xsl:otherwise>
<li><a href="{$subURL}"><xsl:value-of select="name" /></a></li>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</ul>
</xsl:when>
<xsl:otherwise>
<a href="{$URL}"><xsl:value-of select="name" /></a>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:template>
</xsl:stylesheet>
Все отлично работает, если раздел (и подразделы) не являются информационными системами. А вот в случае инфосистем ничего не происходит. Как поправить вывод XSLT?
- О компании
-- Список сотрудников
-- Контактная информация
- Новости
-- Главные новости
-- Второстепенные новости
- Статьи
-- Главные статьи
-- Второстепенные статьи
Меню вертикальное. Когда пользователь заходит в раздел 1го уровня (новости, статьи, о компании), то ссылка на эту страницу становится неактивной, показываются все подраздела 2го уровня только этого раздела. Когда пользователь заходит в какой-то подраздел - ссылка этого подраздела становится неактивной, ссылка раздела становится активной, но выделена (чтобы было понятно, где пользователь находится). Вывод меню сделан так:
<ul class="parent-dept">
<?php
$Structure = & singleton('Structure');
$menuparam = array();
$menuparam['show_groups'] = true;
$menuexternalpropertys = array();
$menuexternalpropertys['ТекущаяГруппа'] = "group_".to_int( $GLOBALS['mas_information_groups_for_xml'][0]['information_groups_id'] );
$Structure->ShowStructure(3,'ГлавноеМеню',$menuparam, $menuexternalpropertys);
?>
</ul>
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="/document">
<xsl:apply-templates select="structure[show=1]"/>
</xsl:template>
<xsl:template match="structure">
<xsl:variable name="current_structure_id">
<xsl:choose>
<xsl:when test="item/node()">item_<xsl:value-of select="item"/></xsl:when>
<xsl:when test="group/node()">group_<xsl:value-of select="group"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="structure/current_structure_id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="URL" select="link" />
<li>
<xsl:choose>
<!-- Что будет, если ID структуры равен данному -->
<xsl:when test="current_structure_id=@id">
<span class="selected-parent"><xsl:value-of select="name" /></span>
<!-- Определяем, есть ли вложенные структуры -->
<xsl:if test="count(structure[show=1]) > 0">
<ul class="sub-dept">
<xsl:for-each select="structure">
<xsl:variable name="subURL" select="link" />
<li><a href="{$subURL}"><xsl:value-of select="name" /></a></li>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:when>
<!-- Что будет, если ID структуры не равен данному -->
<xsl:otherwise>
<!-- Что делать, если у нас есть дети с каррент ID-->
<xsl:choose>
<xsl:when test="count(.//structure[@id=$current_structure_id])=1">
<span class="selected-parent"><a href="{$URL}" class="current-dept"><xsl:value-of select="name" /></a></span>
<ul class="sub-dept">
<xsl:for-each select="structure[show=1]">
<xsl:variable name="subURL" select="link" />
<xsl:choose>
<xsl:when test="current_structure_id=@id">
<li><span class="selected-sub"><xsl:value-of select="name" /></span></li>
</xsl:when>
<xsl:otherwise>
<li><a href="{$subURL}"><xsl:value-of select="name" /></a></li>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</ul>
</xsl:when>
<xsl:otherwise>
<a href="{$URL}"><xsl:value-of select="name" /></a>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:template>
</xsl:stylesheet>
Все отлично работает, если раздел (и подразделы) не являются информационными системами. А вот в случае инфосистем ничего не происходит. Как поправить вывод XSLT?
первое что видно - не передается параметр item или group (и переданный $menuexternalpropertys['ТекущаяГруппа'] нигде не используется, можно не передавать)
$InformationSystem = & singleton('InformationSystem');
$InformationSystem_id = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);
if ($InformationSystem_id)
{
$result = $InformationSystem->GetInformationFromPath($InformationSystem_id, '', false);
if ($result['item'])
{
$item_id = $InformationSystem->GetIdInformationItem($result['item'], $result['group'], $InformationSystem_id);
}
else
{
$item_id = false;
}
if (is_array($result) && ($item_id != 0 || $result['group'] > 0))
{
$menuexternalpropertys['item'] = $item_id;
$menuexternalpropertys['group'] = $result['group'];
}
$menuparam['show_groups'] = true;
$menuparam['show_items'] = true;
$menuparam['show_information_systems'][] = $InformationSystem_id;
}
$InformationSystem_id = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);
if ($InformationSystem_id)
{
$result = $InformationSystem->GetInformationFromPath($InformationSystem_id, '', false);
if ($result['item'])
{
$item_id = $InformationSystem->GetIdInformationItem($result['item'], $result['group'], $InformationSystem_id);
}
else
{
$item_id = false;
}
if (is_array($result) && ($item_id != 0 || $result['group'] > 0))
{
$menuexternalpropertys['item'] = $item_id;
$menuexternalpropertys['group'] = $result['group'];
}
$menuparam['show_groups'] = true;
$menuparam['show_items'] = true;
$menuparam['show_information_systems'][] = $InformationSystem_id;
}
Авторизация