Меню

#
Re: Re: Меню
Вот спасибо! Теперь нет ошибок.
www.dsaleks.ru - создание сайтов и интернет-магазинов
Модератор
#
Re: Меню
Пожалуйста.
#
Re: Меню
HostCMS писал(а):
Absolut,
Судя по всему Вам нужно также, как у нас в правом меню: http://www.hostcms.ru/documentation/server/site-archive/

Тогда делаете так:
<?
   $Structure = new Structure();

   // Получаем данные о текущей странице
   $structure_parent_id = CURRENT_STRUCTURE_ID;

   while ($structure_parent_id != 0)
   {
      $row_structure = $Structure->GetStructureItem($structure_parent_id);
      $structure_parent_id = $row_structure['structure_parent_id'];
   }

   $Structure->ShowStructure(false, 'СписокЭлементовМеню', array('parent_id' => $row_structure['structure_id'], 'show_groups' => true));
   ?>


и 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">
   <div class="left_menu">
      <ul>
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure[show=1]"/>
      </ul>
   </div>
</xsl:template>

<xsl:template match="structure">
<li>
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
   
   <!-- Расчитываем размер отступа -->
   <xsl:variable name="padding" select="level * 10" />
   
      <!-- Показывать ссылку, или нет -->
      <xsl:if test="show_link = 1">
      
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link"><xsl:choose>
            <!-- Если внешняя ссылка -->
            <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="external_link"/></xsl:when>
            <!-- Иначе если внутренняя ссылка -->
            <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
         </xsl:choose></xsl:variable>
         
         <!-- Определяем стиль вывода ссылки -->
         <xsl:variable name="link_style"><xsl:choose>
            <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
            <!-- Иначе обычный вывод с пустым стилем -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>
         
         <a href="{$link}"><span style="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></span></a>
      </xsl:if>

      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <!-- <img border="0" src="/images/menu_point.gif" class="menu_point" width="4" height="7" /> -->
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>

      <!-- Выбираем подузлы структуры -->
      <xsl:if test="current_structure_id = @id
      or count(.//structure[@id=$current_structure_id]) = 1
      and count(structure[show=1]) > 0">
         <ul>
            <!-- Выбираем узлы структуры -->
            <xsl:apply-templates select="structure[show=1]"/>
         </ul>
      </xsl:if>
   </li>
</xsl:template>
</xsl:stylesheet>



А подскажите пожалуйста какую проверку добавить в шаблон основного меню чтобы он оставался выделенным при нахождении в детях


Вот наш шаблон, выделил момент проверки

<?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">
      <ul class="menu">
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="structure[show=1]"/>
      </ul>
   </xsl:template>

   <xsl:template match="structure">

      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
   <xsl:variable name="class" select="propertys/property[@name = 'css']/value"/>
<!-- Определяем стиль вывода ссылки -->
            <xsl:variable name="active">
               <xsl:choose>
                  <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
                  <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
                  <!-- Иначе обычный вывод с пустым стилем -->
                  <xsl:otherwise></xsl:otherwise>
               </xsl:choose>
            </xsl:variable>

        <li class="{$class} {$active}">
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show_link=1">
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link">
               <xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="is_external_link=1">
                     <xsl:value-of disable-output-escaping="yes" select="external_link"/>
                  </xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <xsl:otherwise>
                     <xsl:value-of disable-output-escaping="yes" select="link"/>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:variable>



            <a href="{$link}" title="{name}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>

         <!-- Если не показывать ссылку - выводим просто имя ссылки -->
         <xsl:if test="show_link=0">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>
ку
Модератор
#
Re: Меню
namez,
Так Вы же сами выделили болдом условие:
<xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
#
Re: Меню
странно но не работает..  я не понимаю почему

класс active не подставляется когда я в детях
ку
#
Re: Меню
Здравствуйте.
Помогите пожалуйста с меню, уже второй день мучаюсь, не могу найти на форуме подходящего решения.
У меня трехуровневое меню.

Типа такого:

Портфолио
--Камины
----Классические
----Модерн
--Интерьер
----Лестницы

Выводится это таким образом:
<?php

$Structure = & singleton('Structure');
$param = array();
$param['show_groups'] = true;
$Structure->ShowStructure(1,'ЛевоеМенюВнутренняя', $param);

?>


Дело в том что мне нужно:

  1. При нахождении в разделе показывать только ЕГО подразделы. Сейчас я, находясь в "Каминах" вижу список разделов, касающихся интерьеров. Использование $param['parent_id'] = CURRENT_STRUCTURE_ID; мне не подходит, так как это скрывает верхний уровень, а он должен отображаться всегда. Видимо нужно задавать ID подразделов через внешние параметры select?

  2. Выделять стилем текущий подраздел. Как это сделать, ума не приложу. Проверка
    current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1 не подходит, так как current_structure_id всегда равно коду информационной системы, то есть целого портфолио. Я просмотрел XML, там нет идентификатора текущего подраздела (что довольно странно)
#
Re: Меню
HostCMS писал(а):
alexmak,
универсального шаблона для вывода многоуровневого меню нет, у одного пользователя он должен выглядеть по одному, у другого — иначе и так далее.
Вначале берут скрипт с многоуровневым выпадающим меню и делают из него XSL, а не наоборот.

Столько вопросов, проблем из-за меню. Мне кажется можно сделать какое-то одно общее меню, которое подойдет под многие задачи, обсуждаемые тут.
В Битриксе такое меню есть: задается кол-во вложенностей, горизонтальность-вертикальность, вывод определенных групп или в определенных группах, остается только настроить стиль в CSS. Там это давно все решено и нет ни у кого с ним проблем.
Мне вот надо вывести отдельно вложенное меню как у вас тут: http://hostcms.ru/hostcms/modules/, но для информационной системы. Получается вывести только второй уровень, все остальные уровни не выводятся. Пол дня курил форум, но все задачи обсуждаются только для структуры сайта, а для ИС не нашел.
www.dsaleks.ru - создание сайтов и интернет-магазинов
#
Re: Меню
Доброго времени суток! Подскажите, пожалуйста, как сделать выпадающее меню как у вас на сайте - http://www.hostcms.ru ?
Модератор
#
Re: Меню
neket2,
была такая тема с готовыми кодами, воспользуйтесь поиском.
#
Re: Меню
HostCMS,
Пробую способ, описанный здесь http://www.hostcms.ru/forums/22/622/

XSL-шаблон:

function SlideLayer(Num)
   {
   var el = document.getElementById(Num);
   if (el.style.display==«none»)
      {
         el.style.display=«block»;
         el.style.position=«absolute»;
      }
   }
        
function SlideLayerHide(Num)
   {
   var el = document.getElementById(Num);
   if (el.style.display==«block»)
      {
         el.style.display=«none»;
         el.style.position=«absolute»;
      }
   }

Подключаю файл:

function SlideLayer(Num)
   {
   var el = document.getElementById(Num);
   if (el.style.display==«none»)
      {
         el.style.display=«block»;
         el.style.position=«absolute»;
      }
   }
        
function SlideLayerHide(Num)
   {
   var el = document.getElementById(Num);
   if (el.style.display==«block»)
      {
         el.style.display=«none»;
         el.style.position=«absolute»;
      }
   }

В макете вывожу вот так:

<?php
$Structure = & singleton('Structure');
$Structure->ShowStructure(1, 'ВерхнееМеню');
?>

После этого на всю страницу выводится повтор ошибка XSL
Авторизация