Контроллеры в клиентском разделе

Модератор
#
Контроллеры в клиентском разделе
Отображением различных динамических данных занимаются контроллеры. Пример показа 5 новостей:

$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
   Core_Entity::factory('Informationsystem', 1)
);
$Informationsystem_Controller_Show
   ->xsl(
      Core_Entity::factory('Xsl')->getByName('СписокНовостейНаГлавной')
   )
   ->limit(5)
   ->show();
Модератор
#
Re: Контроллеры в клиентском разделе
Ограничение по дополнительному свойству выборки элементов контроллером
Чтобы добавить дополнительные ограничения по основным или доп. св-вам, у контроллера показа ИС необходимо получить объект информационных элементов и добавить к нему доп. ограничения через QueryBuilder.
Объект получаем через $Informationsystem_Controller_Show->informationsystemItems(), это уже объект ORM (Core_Entity), у которого можно получить ->queryBuilder() и далее добавлять ограничения.
      // Новости
      $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
         Core_Entity::factory('Informationsystem', 1)
      );
      $Informationsystem_Controller_Show
         ->xsl(
            Core_Entity::factory('Xsl')->getByName('СписокНовостейНаГлавной')
         )
         ->groupsMode('none')
         ->itemsForbiddenTags(array('text'))
         ->group(FALSE)
         ->limit(3)
         //->show()
         ;

      // Объединение с нужной таблицей свойств
      $Informationsystem_Controller_Show
         ->informationsystemItems()
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
            array(
               array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
         )
         // Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')
         ->groupBy('informationsystem_items.id')
         // Количество свойств
         ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 1)
         ;

         $Informationsystem_Controller_Show->show();

Обратите внимание, что сейчас значения всех доп. свойств хранятся в 5 разных таблицах:

  1. property_value_datetimes для даты и даты-времени
  2. property_value_files для файлов
  3. property_value_ints для целых чисел
  4. property_value_strings для строк
  5. property_value_texts для текстов

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

Сортировка по дополнительному свойству товара
Пример сортировки по целочисленному значению дополнительного св-ва с кодом 63
$Shop_Controller_Show
    ->shopItems()
    ->queryBuilder()
    ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
    ->leftJoin('property_value_ints', 'shop_items.id', '=', 'property_value_ints.entity_id',
      array(
         array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
      )
    )
    ->groupBy('shop_items.id')
    ->where('property_value_ints.property_id', '=', 63)
    ->clearOrderBy()
    ->orderBy('property_value_ints.value', 'DESC');
#
Re: Контроллеры в клиентском разделе
т.е. теперь, чтобы сделать ограничение выборки, необходимо знать еще и тип дополнительного свойства?
/me с ужасом ушел смотреть код магазина
разработка сайтов, фирменных стилей, интерфейсов
Модератор
#
Re: Контроллеры в клиентском разделе
toasterec,
да, теперь св-ва хранятся в 5 разных таблицах с соответствующим типом поля, отсюда преимущество, например, значения св-ва число сортируются как числа, а не как строки
#
Re: Контроллеры в клиентском разделе
Как теперь передаются дополнительные параметры в xslt-шаблон?
(по аналогии со старым  $external_propertys),
в коде Informationsystem_Controller_Show никаких намеков на это


Сам задал вопрос сам отвечу,


->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('my_xml_tags')
      ->value('mytags')
        )


конечно хочется поэлегантнее, типа

->add_xml('name', 'value')

но на первое время сойдет
разработка сайтов, фирменных стилей, интерфейсов
#
Re: Контроллеры в клиентском разделе
HostCMS писал(а):
toasterec,
да, теперь св-ва хранятся в 5 разных таблицах с соответствующим типом поля, отсюда преимущество, например, значения св-ва число сортируются как числа, а не как строки


вот денормализация это хорошо!
но зачем было мешать в кучу свойства магазина, информационной системы, структуры?

не является ли данное решение "топтанием на месте"?
разработка сайтов, фирменных стилей, интерфейсов
Модератор
#
Re: Контроллеры в клиентском разделе
toasterec писал(а):
конечно хочется поэлегантнее, типа

Недальновидно, наше решение позволяет создавать композицию элементов и строить иерархический XML.

toasterec писал(а):
вот денормализация это хорошо!
но зачем было мешать в кучу свойства магазина, информационной системы, структуры?
не является ли данное решение «топтанием на месте»?

Не соглашусь, этот вопрос был очень хорошо проработан.
Данное решение позволило:
1. Уменьшить в разы код, сделать универсальные контроллеры для ЦА и работы со свойствами. Работа со свойствами потребует дополнительных примеров, мы разместим их в отдельной теме.
2. Сделать доступными все типы дополнительных свойств для ИС, магазина, пользователей.

Аналогично мы поступили и с комментариями, это позволило в магазине реализовывать иерархию комментариев, в пятой версии этой возможности не было.
#
Re: Контроллеры в клиентском разделе
HostCMS писал(а):
Недальновидно, наше решение позволяет создавать композицию элементов и строить иерархический XML.

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



В лоб не смог придумать как расширить класс, например Informationsystem_Controller_Show, так чтобы в основной код системы не вносить изменения
разработка сайтов, фирменных стилей, интерфейсов
#
Re: Контроллеры в клиентском разделе
toasterec писал(а):
В лоб не смог придумать как расширить класс, например Informationsystem_Controller_Show, так чтобы в основной код системы не вносить изменения


Унаследовать свой класс от контроллера показа Informationsystem_Controller_Show, и вносить любые изменения не затрагивая исходных кодов системы.
#
Re: Контроллеры в клиентском разделе
lozoffoy писал(а):
Унаследовать свой класс от контроллера показа Informationsystem_Controller_Show

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