По API вопрос

#
По API вопрос
Structure::GetStructureForParent
Получение дочерних узлов структуры для узла структуры.
Результирующий массив размещается в $this->StructureMass Перед вызовом метода должен быть заполнен $this->StructureParentMass с помощью метода $this->GetStructure()



Последние две строки меня вводят в ступор. Пожалуйста объясните на примере как мне получить элементы подструктуры.

d-sant.com
#
Re: По API вопрос
Да, некоторые описания в api способны ввести в медитативное состояние

метод GetStructureForParent() использовать, кажется, не доводилось, но есть некоторые идеи:

1. Попробуйте перед вызовом этого мметода просто вызвать
$structure = new Structure();
$structure->GetStructure($separator, $site_id, $menu_id, $level, $parent_id);
передав все нужные параметры, хотя этот вызов кажется несовсем логичным, но результат выполнения этого вызова нам не нужен, а массив StructureParentMass, как мне кажется, должен при этом заполняться сам.

Если же это не поможет, можно попробовать еще вот такой вызов
$structure->StructureParentMass = $structure->GetStructure($separator, $site_id, $menu_id, $level, $parent_id);
явно указав заполнение массива, хотя такой вариант немного противоречит идеологии ООП (объекты не должны допускать прямого обращения к своим полям, всё взаимодействие с полями объекта должно осуществляться через метода объекта), но тут уж ничего не поделашь, как нынче модно говорить "ООП в ПХП такое ООП"

ИМХО, в идеале, при вызове метода GetStructureForParent() должна бы происходить внутренняя проверка заполненности массива StructureParentMass, и если он пуст то должен следовать внутренний же вызов метода, этот массив заполняющего.
Заказов не беру. Консультирую редко.
#
Re: По API вопрос
Пост так и не помог сверху.

Всё я сдаюсь, не получается у меня менюшка не методами пхп не XSL шаблоном. Помогите. Кто может? У меня уже паника.
Метод вызова

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

      <?php
       $Structure = & singleton('Structure');
       $param = array();
       $param['show_groups'] = true;
       $param['parent_id'] = CURRENT_STRUCTURE_ID;
       $param['show_information_systems'] =true;
       $Structure->ShowStructure(1,'Меню',$param);
?>


XML


<?xml version="1.0" encoding="windows-1251"?>
<document>
   <site site_id="1">
      <site_name>Демонстрационный сайт</site_name>
      <site_coding>windows-1251</site_coding>
      <site_locale>ru_RU.CP1251</site_locale>
      <site_chmod>0777</site_chmod>
      <site_files_chmod>0777</site_files_chmod>
      <site_date_format>%d.%m.%Y</site_date_format>
      <site_date_time_format>%d.%m.%Y %H:%M:%S</site_date_time_format>
      <site_html_cache_clear_probability>10000</site_html_cache_clear_probability>
      <alias alias_id="2" alias_current="1">
         <alias_name>md-realty.ru</alias_name>
      </alias>
   </site>
   <structure id="97" menu_id="1">
      <current_structure_id>85</current_structure_id>
      <name>История</name>
      <show>0</show>
      <show_link>1</show_link>
      <level>0</level>
      <id_parent>85</id_parent>
      <is_external_link>0</is_external_link>
      <external_link></external_link>
      <link>/o-kompanii/istorija/</link>
      <structure_change_frequency>0</structure_change_frequency>
      <structure_priority>0.5</structure_priority>
      <propertys>
         <property type="InformationSystemItem" id="54" xml_name="inf_sys_test1" name="inf_sys_test1">
            <property_name>inf_sys_test1</property_name>
            <order>40</order>
         </property>
      </propertys>
   </structure>
   <structure id="98" menu_id="1">
      <current_structure_id>85</current_structure_id>
      <name>Коллетив</name>
      <show>1</show>
      <show_link>1</show_link>
      <level>0</level>
      <id_parent>85</id_parent>
      <is_external_link>0</is_external_link>
      <external_link></external_link>
      <link>/o-kompanii/kolletiv/</link>
      <structure_change_frequency>0</structure_change_frequency>
      <structure_priority>0.5</structure_priority>
      <propertys>
         <property type="InformationSystemItem" id="55" xml_name="inf_sys_test1" name="inf_sys_test1">
            <property_name>inf_sys_test1</property_name>
            <order>40</order>
         </property>
      </propertys>
   </structure>
</document>



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="/document/structure"/>
   </xsl:template>

   <xsl:template match="structure">
          <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   
          <a href = "{link}" >
            <xsl:value-of disable-output-escaping="yes" select="name"/>
          </a>
          <br />
   </xsl:template>
</xsl:stylesheet>




А вот и собственно что я делаю http://md-realty.ru/o-kompanii
d-sant.com
#
Re: По API вопрос
подменюшка появляется когда я попадаю на нужный пункт меню, но она пропадает, когда я тыкаю на ссылку в подменю
d-sant.com
#
Re: По API вопрос
#
Re: По API вопрос
Проблема такая же, по ссылке http://www.hostcms.ru/forums/22/527/ похожий рецепт, но не тот.
Есть многоуровневое меню:
1
1.1
1.2
1.2.1
1.2.2
1.3
2
3

При переходе на пункт 1, выводится подпункты 1.1 и 1.2.
При переходе на пункт 1.2, выводятся подпункты 1.2.1 и 1.2.2.
При переходе на пункт 1.2.1, не выводятся ни чего (т.к. у него нет подпунктов).

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

В приведенном примере http://www.hostcms.ru/forums/22/527/, это реализовано, но работает только на дочерних пунктах первого уровня. Так же ниже есть пример (http://www.hostcms.ru/forums/17/1622/page-3/, http://www.hostcms.ru/documentation/server/site-archive/) когда в том же меню появляется подменю.

<?php
$Structure = new Structure();

/* Получаем данные о текущем узле */
$structure_row = $Structure->GetStructureItem(CURRENT_STRUCTURE_ID);
$structure_parent_id = $structure_row['structure_parent_id'];

$param = array();

/* В качестве родительского узла указываем текущий */
$param['parent_id'] = CURRENT_STRUCTURE_ID;

$Structure->ShowStructure(2,'ВнутреннееЛевоеМеню', array('parent_id' => $param['parent_id']));
?>


Думаю XML и XSLT выкладывать не нужно, здесь они не причем, реализовать выделение пункта не проблема.
Авторизация