Формирование списка разделов ИМ

#
Re: Формирование списка разделов ИМ
Модератору спасибо за помощь, все работает... Сам затупил, написал Shop_Group.onBeforeGetXml вместо shop_group.onBeforeGetXml.

Большая просьба помочь еще чуть-чуть. Для того чтобы не выводить товары во все группы, а только в текущую мне надо добавить в onBeforeGetXml условие


static public function onBeforeGetXml($object, $args)
{
  if(текущая обрабатываемая группа в объекте == intval(Core_Page::instance()->object->group))
  {
    ...
  }
}


Можно ли как-то определить "текущая обрабатываемая группа в объекте"? Если я опять неправильно мыслю, прошу напишите, пожалуйста, маленький пример кода, как добавить любой тег в группу (и только в нее), которая является активной на просматриваемой в данный момент странице магазина.
Модератор
#
Re: Формирование списка разделов ИМ
Trogvar,
Не понимаю Вас. Вы хотели внутри отображаемых групп выводить их товары. Какой смысл теперь все это ограничивать только одной группой? $object - это и есть Shop_Group_Model, соответственно его ID будет в $object->id, но смысл затеи по прежнему не ясен.
#
Re: Формирование списка разделов ИМ
Мое первое сообщение
Trogvar писал(а):
Что надо прописать в код, чтобы в XML-документ к текущей (активной) группе добавлялся список информационных элементов данного раздела.

Мне нужно выводить список товаров только для активного в данный момент раздела и только, если мы находимся в любом товаре данного раздела. Если мы в корне группы (т.е. Core_Page::instance()->object->item == 0), то товары в данном меню не нужны.
Выводить товары для неактивных разделов тоже не надо.

Наглядный пример. Допусти мы находимся в товаре №2 раздела №2. Меню в данном случае должно быть таким:

Раздел №1
Раздел №2 (активный в данный момент)
  Товар №1
  Товар №2 (активный в данный момент)
  Товар №3
  ...
Раздел №3
...
Раздел №n

Если мы находимся в разделе №2 (в контекстной части у нас отображается список товаров, т.е. конкретный товар еще не выбран), меню выглядит так

Раздел №1
Раздел №2 (активный в данный момент)
Раздел №3
...
Раздел №n

Вот что собственно мне нужно.
Модератор
#
Re: Формирование списка разделов ИМ
так из предыдущего ответа сравнение с $object->id Вам помогло?

if(is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show'
&& $object->id == intval(Core_Page::instance()->object->group))
{
// ...
}
#
Re: Формирование списка разделов ИМ
Огромное спасибо. Ваше решение мне помогло.
#
Re: Формирование списка разделов ИМ
Понимаю, что достал, но все же прошу еще мне помочь довести код до ума. Чтобы внутри указанного вами в последнем сообщении условия получить список всех товаров группы и добавить их к итоговому XML, мне надо (так я вижу решение) сделать выборку из БД этих товаров по идентификатору группы, оформить каждый товар в XML-сущность и добавить их в цикле к группе.
Но мне хочется верить, что часть этого функционала уже реализована в системе, только я не могу ничего найти. Смотрел исходники модулей - безрезультатно. Покапал интернет, тоже ничего не нашел (может плохо искал или искал не то). Помогите, пожалуйста, если это уже где-то было описано, покажите, где посмотреть или напишите (пусть в общих чертах без конкретики) пример реализации того, что мне нужно.
Модератор
#
Re: Формирование списка разделов ИМ
Trogvar,
никаких прямых выборок, в системе есть замечательный ORM, также Вам нет необходимости оформлять товар в XML-сущность, объект ORM замечательно умеет сам генерировать свой XML. Фактически весь наш XML, это композиция объектов.
if(is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show'
&& $object->id == intval(Core_Page::instance()->object->group))
{
   // в $object у нас объект Shop_Group_Model, найдем все его товары
   $aShop_Items = $object->Shop_Items->findAll();
   
   foreach ($aShop_Items as $oShop_Item)
   {
      // Добавим в композицию объектов дочерний элемент
      $object->addEntity(
         // Очистим композицию внутри каждого товара, мало ли что до этого при генерации страницы в него добавляли
         $oShop_Item->clearEntities()
      );
   }
}
#
Re: Формирование списка разделов ИМ
Модератору огромное спасибо за помощь. Наконец-то я допилил полностью функционал.

Чего я не смог сам найти, так это Shop_Items у объекта Shop_Group_Model. Где об этом можно почитать?

Все работает как надо, но теперь я заморочился с оптимизацией. Вижу, что на выходе получается очень большой (относительно большой, конечно) XML-документ. Путем добавления фильтра в хук мне удалось исключить ненужные теги из XML для группы. Для того чтобы очистить от "мусора" элементы Shop_Item мне надо создать класс Shop_Item_Observer и уже в обработчике события для данного класса исключать ненужные теги? Или можно это сделать как-то еще?

И самое главное, как по вашему мнению, нужно ли это вообще делать? Ведь уменьшая объем XML-кода, я возможно увеличиваю нагрузку на процессор и расход памяти за счет дополнительных циклов, в которых происходит добавление исключаемых тегов к объектам.
Модератор
#
Re: Формирование списка разделов ИМ
Trogvar,
пожалуйста. Прочитать про связи можно в ORM: http://www.hostcms.ru/documentation/modules/core/orm/
Сами связи прописаны в моделях, в данном случае это связь hasMany.
Что касается лишних тегов, то посмотрите опции контроллера, там можно передать массив тегов и запретить лишние теги у товаров.
В данном случае запретить лишние теги, полагаю, будет вполне разумно.
#
Re: Формирование списка разделов ИМ
HostCMS писал(а):
Что касается лишних тегов, то посмотрите опции контроллера, там можно передать массив тегов и запретить лишние теги у товаров.

Это первое, что я сделал...
В код

$Shop_Controller_Show->xsl(Core_Entity::factory('Xsl')->getByName('МенюКаталогТоваров'))->groupsMode('tree')->group(0)->limit(0);

я добавил itemsForbiddenTags(array('text'), но теги <text> как были у товаров, так и остались. Кстати, у корневого тега <shop> есть объемный и совсем не нужный мне тег <description>, пытался убрать и его, но тоже ничего не вышло. ПисАл такой код

$Shop_Controller_Show->xsl(Core_Entity::factory('Xsl')->getByName('МенюКаталогТоваров'))->groupsMode('tree')->itemsForbiddenTags(array('text', 'description'))->group(0)->limit(0);

Авторизация