Снова траблы с меню, по логике думаю нет выхода. :(

#
Снова траблы с меню, по логике думаю нет выхода. :(
Необходимо выводить меню такой структуры

1. Заголовки меню (верхняя часть сайта).
    2. Подменю (в левой части сайта)
        3. Ссылки третьего уровня меню (в основном шаблоне сайта)

Не могу реализовать зависимость в таком порядке.
Чтобы при нажатии на "1. Заголовки меню" выподало "2. Подменю" в левой части страницы, и нажатии на ссылку левом меню (если есть подменю 3-го уровня) в основном шаблоне я получал подссылки 3-го уровня.

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

затык получаю уже на меню второго уровня..
при нажатии на любую из ссылок вся структура 2 уровня разваливается..




XSL шаблон левого меню, ссылки 2 уровня выводятся нормально,
при нажатии на них выводится лишний level=1 из другово подменю 1 уровня - день бился - добится не смог..


<xsl:template match="/document">
<!-- Выбираем все корневые (у которых level равен 1) и которые показывать -->
<xsl:apply-templates select=".//structure[level=1 and show=1]"/>


</xsl:template>

<xsl:template match="structure">

<!-- начало тестинга) -->


<xsl:if test="current_structure_id=id_parent">
   <!-- Если внешняя ссылка - ставим внешнюю -->
   <xsl:if test="is_external_link=1">
        <a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
        <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->

   <xsl:if test="propertys/property[@name='font_bold']/value='Да'">
   <a href="{external_link}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a>
        </xsl:if>

   <xsl:if test="propertys/property[@name='font_bold']/value='Нет'">
   <a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
   </xsl:if>

        
   </xsl:if>

      <!-- Если внутренняя ссылка -->
      <xsl:if test="is_external_link=0">
                <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->

      <xsl:if test="propertys/property[@name='font_bold']/value='Да'">
      <a href="{link}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a>
      </xsl:if>
      
                <xsl:if test="propertys/property[@name='font_bold']/value='Нет'">
      <a href="{link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
      </xsl:if>
        
      </xsl:if>


</xsl:if>



<!-- если 1 меню = его же номеру (не работает) -->
<xsl:if test="id_parent=id_parent">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>
<!-- если 1 меню = его же номеру (не работает) -->

<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>


</xsl:template>
Модератор
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
RIV писал(а):
Пробывал это сделать на CURRENT_STRUCTURE_ID  не получается, поскольку както нужно знать родителя меню выше уровнем.


Structure::GetStructureItem
GetStructureItem( int $structure_id );

Принимаемые параметры

$structure_id

идетификатор структуры

Возвращает

ассоциативный массив с данными об узле структуры или false, если узел не найден

Описание

* Метод получения данных об элементе структуры

Выводите полученный массив как
$Structure = new structure();
$row = $Structure->GetStructureItem(CURRENT_STRUCTURE_ID);
print_r($row);


и смотрите какой параметр родителя Вам нужно взять, чтобы узнать ID родителя текущего узла сруктуры.

RIV писал(а):
затык получаю уже на меню второго уровня..
при нажатии на любую из ссылок вся структура 2 уровня разваливается..

что означает "разваливается?"

Объективнее можно будет посмотреть после получения в суппорт данных доступа к сайту и ссылок на страницы с описанием что где и как должно быть.
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
Разваливается всмысле

<xsl:if test="current_structure_id=id_parent">
тут выводится полное левое меню.

далее жму на линк в левом меню, и хочу чтобы меню было статическим (т.е. осталось как есть, максимум выделялось жирным) выполняется <xsl:if test="id_parent=id_parent"> и
получается что  остается только ссылка которую я выбрал, + к ней добавляется подменю level=1 другово парент_id  (т..е структура полностью рушится.
Модератор
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
RIV писал(а):
Разваливается всмысле

<xsl:if test="current_structure_id=id_parent">
тут выводится полное левое меню.

далее жму на линк в левом меню, и хочу чтобы меню было статическим (т.е. осталось как есть, максимум выделялось жирным) выполняется <xsl:if test="id_parent=id_parent"> и
получается что  остается только ссылка которую я выбрал, + к ней добавляется подменю level=1 другово парент_id  (т..е структура полностью рушится.


нужно смотреть, вышлете данные в суппорт
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
Попробую еще поковырять, разбираться то нужно.

тут для меня видимо главный вопрос,

1. как передать переменные в XSL шаблон.
2. как можно сохранить переменную родителя в xsl шаблоне. до назначения следующего родителя.
Модератор
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
RIV писал(а):
Попробую еще поковырять, разбираться то нужно.

ок

RIV писал(а):
1. как передать переменные в XSL шаблон.

через внешние параметры, однако думаю в данном случае это совсем не нужно.

RIV писал(а):
2. как можно сохранить переменную родителя в xsl шаблоне. до назначения следующего родителя.

не понял. проще было бы, если бы Вы на примере показали суппорту что да как ...
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
ок, чуть позже.

я попробыал передать внешние параметры через external_property.
при выводе /document вижу что значение присутствует. однако не могу установить полный путь к этому значению в XSL, как это возможно сделать ?
и вообще, можно как либо просмтореть полную XML структуру, того что я напередовал ?
Модератор
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
RIV писал(а):
при выводе /document вижу что значение присутствует. однако не могу установить полный путь к этому значению в XSL, как это возможно сделать ?

путь - /document/имя_тега

RIV писал(а):
и вообще, можно как либо просмтореть полную XML структуру, того что я напередовал ?

в адресной строке допишите show_xml, например:
/page1/?show_xml
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
получилось сделать вывод двухуровневого меню. возможно конечно кривовато. но если есть возможность прошу выдать рекомендации по оптимизации

двухуровневое меню (структура).

parent_about /about/      
    parent2 /about/p2/      
    parent3 /about/p3/      

parent_help /help/      
    parent1 /help/p1/      

parent_hobby /hobby/
    parent1  /hobby/p1/



Сайт:


<?
$structure = new Structure();
$structure->ShowStructure(4,'UPMENU';
?>


<?
$Structure = new structure();
$row = $Structure->GetStructureItem(CURRENT_STRUCTURE_ID);
$pid=$row['structure_parent_id'];
$param = array();
$external_propertys = array();
$external_propertys['id']="$pid";
$structure->ShowStructure(4,'LEFTMENU', $param, $external_propertys);
?>




XSL UPMENU:

<?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 method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">
<!-- Выбираем все, у которых level = 0 и show = 1 -->
<xsl:apply-templates select=".//structure[level=0 and show=1]"/>
</xsl:template>


<xsl:template match="structure">
<!-- Показывать ссылку, или нет -->

<xsl:if test="show_link=1">
<!-- Если внешняя ссылка - ставим внешнюю -->

<xsl:if test="is_external_link=1">
<LI/><a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
</xsl:if>

<!-- Если внутренняя ссылка -->
<xsl:if test="is_external_link=0">
            
</xsl:if>
</xsl:if>

<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>





XSL LEFTMENU:

<?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 method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">
<!-- Выбираем все корневые (у которых level равен 1) и которые показывать -->
<xsl:apply-templates select=".//structure[level=1 and show=1]"/>

</xsl:template>

<xsl:template match="structure">
<!-- Показывать ссылку, или нет -->

<!-- начало тестинга -->
<xsl:if test="current_structure_id=id_parent">

<!-- Если внешняя ссылка - ставим внешнюю -->
<xsl:if test="is_external_link=1">
<a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>

<!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
<xsl:if test="propertys/property[@name='font_bold']/value='Да'">
<div class="list"><a href="{external_link}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a></div>
</xsl:if>

<xsl:if test="propertys/property[@name='font_bold']/value='Нет'">
<div class="list"><a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></div>
</xsl:if>

</xsl:if>


<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->

<!-- Если внутренняя ссылка -->
<xsl:if test="is_external_link=0">
<!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->

<xsl:if test="propertys/property[@name='font_bold']/value='Да'">
<div class="list"><a href="{link}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a></div>
</xsl:if>
      
<xsl:if test="propertys/property[@name='font_bold']/value='Нет'">
<div class="list"><a href="{link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></div>
</xsl:if>
</xsl:if>
</xsl:if>
<!-- конец тестинга -->



<!--вывод 2 меню снова -->

<xsl:variable name="mop" select="/document/id"/>
<xsl:if test="id_parent=$mop">
<div class="list"><a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></div>
</xsl:if>
<!-- вырезал -->

<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>

</xsl:template>
</xsl:stylesheet>
Модератор
#
Re: Снова траблы с меню, по логике думаю нет выхода. :(
Для верхнего меню
RIV писал(а):
<xsl:apply-templates select=".//structure[level=0 and show=1]"/>

можно заменить на
<xsl:apply-templates select="structure[show=1]"/>


т.к. все равно выберутся только первого уровня, а не будут перебираться все. будет работать немного быстрее.

RIV писал(а):
<LI/><a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>

лучше <li> бля бля бля</li>, чем <li/>

в XSL LEFTMENU: можно было значительно проще отфильтровать по родителю:
до RIV писал(а):
<!-- Выбираем все корневые (у которых level равен 1) и которые показывать -->
<xsl:apply-templates select=".//structure[level=1 and show=1]"/>

записать в переменную, назовем ее my_parent_id, внешний переданный параметр и потом просто ограничить выбор узлов структуры:

<xsl:apply-templates select="//structure[show=1 and id_parent = $my_parent_id]"/>

других проверок делать не придется.
Авторизация