Контроллеры

Контроллеры предназначены для отображения различных динамических данных в клиентском разделе. Конструктор контроллера принимает основной объект для которого идет показ. Например, контроллер показа информационной системы принимает объект информационной системы.

Шаблонизация

Допускается использование XSL-шаблонов или TPL, также контроллер может сгенерировать JSON при построении сайтов с использованием библиотек, например, React.js.

Указание контроллеру XSL-шаблона

Установить вывод с использованием XSL-шаблона можно двумя способами:

Вариант 1, передача названия XSL-шаблона:

$Informationsystem_Controller_Show
	->xsl('СписокНовостейНаГлавной')
	->show();

Вариант 2, передача объекта Xsl_Model, полученного по названию:

$Informationsystem_Controller_Show
	->xsl(
		Core_Entity::factory('Xsl')->getByName('СписокНовостейНаГлавной')
	)
	->show();

Указание контроллеру TPL-шаблона

Вариант 1, передача названия TPL-шаблона:

$Informationsystem_Controller_Show
	->tpl('СписокНовостейНаГлавной')
	->show();

Вариант 2, передача объекта Tpl_Model, полученного по названию:

$Informationsystem_Controller_Show
	->tpl(
	   Core_Entity::factory('Tpl')->getByName('СписокНовостейНаГлавной')
	)
	->show();

Генерация JSON

Для генерации JSON код обработки размещают в коде настроек типовой динамической страницы после метода parseUrl(), например:

header('Content-type: application/json; charset=utf-8'); 
header('Pragma: no-cache');
header('Cache-Control: private, no-cache');
header('Content-Disposition: inline; filename="files.json"');
header('Vary: Accept');

$Shop_Controller_Show = new Shop_Controller_Show(
  	Core_Entity::factory('Shop', 1)
 );
 
$Shop_Controller_Show
	->limit(5)
	->group(FALSE)
	->parseUrl();

$Shop_Controller_Show
	->groupsMode('all')
	->mode('json')
	->show();

Ограничения на данные, генерируемые контроллером

Контроллеры показа имеют методы addAllowedTags() и addForbiddenTags(), разрешающие и запрещающие теги для переданных элементов. Описание контроллера в API содержит доступные пути для методов addAllowedTags/addForbiddenTags.

Пример разрешения на показ у магазина только названия, у группы товаров названия и описания, а также запрета на пока у товаров описания и текста:

$Shop_Controller_Show
	->xsl(
		Core_Entity::factory('Xsl')->getByName($xslName)
	)
	->addAllowedTags('/shop', array('name'))
	->addAllowedTags('/shop/shop_group', array('name', 'description'))
	->addForbiddenTags('/shop/shop_item', array('description', 'text'))
	->show();

* с версии 7.0.5.

Кэширование в контроллерах и добавление внешних данных

Типовые контроллеры рассчитывают уникальную метку кэширования на основании опций контроллера. В случае, если вы передаете контроллеру внешние данные, которые используются в XSL и меняют его поведение, необходимо через метод addCacheSignature() передавать дополнительные сигнатуры кэширования, уникализирующие текущий вызов контроллера.

$Shop_Controller_Show->addEntity(
    Core::factory('Core_Xml_Entity')
        ->name('my_tag')
        ->value($value)
)
->addCacheSignature('my_tag=' . $value);

Если необходимо пометить кэшируемые данные особым тегом, то вызовите ->addCacheTag($tagName) *доступно с версии 6.9.3

$Shop_Controller_Show->addCacheTag('foo');

Примеры использования контроллеров показа

Пример показа 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();

Ограничение по дополнительному свойству выборки элементов контроллером

см. Ограничения по дополнительным свойствам в контроллерах

Сортировка по дополнительному свойству товара

см. Сортировка по дополнительному свойству

Добавление внешних данных в контроллер

Добавление внешних данных осуществляется через методы addEntity(object) и addEntities(array), для очистки добавляемого объекта от ранее добавленных в него дочерних элементов применяется метод clearEntities().

Добавить собственный тег можно с использованием Core::factory('Core_Xml_Entity'), ему можно указать значение или в него разместить дочерние элементы.

$Shop_Controller_Show->addEntity(
	Core::factory('Core_Xml_Entity')->name('mytag')->value(123)
);

Добавление тега и размещение в него объекта:

// Новый тег
$oMytag = Core::factory('Core_Xml_Entity')->name('mytag');

// В него помещаем объект $oMyObject
$oMytag->addEntity($oMyObject->clearEntities());

$Shop_Controller_Show->addEntity($oMytag);

Добавление списка производителей в контроллер показа магазина

 $oShop = $Shop_Controller_Show->getEntity();

 // XML-сущность, к которой будут добавляться производители
 $oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
 
 // Добавляем XML-сущность контроллеру показа
 $Shop_Controller_Show->addEntity($oProducersXmlEntity);
 
 // Список производителей
 $aShop_Producers = $oShop->Shop_Producers->findAll();
 foreach ($aShop_Producers as $oShop_Producer)
 {
    // Добавляем производителя потомком XML-сущности
    $oProducersXmlEntity->addEntity(
       $oShop_Producer->clearEntities()
    );
 }
 
 $Shop_Controller_Show
    ->xsl(
       Core_Entity::factory('Xsl')->getByName($xslName)
    )
    ->itemsProperties(TRUE)
    ->show();

Передача контроллеру структуры идентификатора текущего инфоэлемента и группы

$Structure_Controller_Show = new Structure_Controller_Show(
    Core_Entity::factory('Site', CURRENT_SITE));
 $Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
    ->getByName('ЛевоеМеню')
 )
 ->menu(3)
 // Показывать группы информационных систем в меню
 ->showInformationsystemGroups(TRUE)
 // Показывать элементы информационных систем в меню
 ->showInformationsystemItems(FALSE);
 
 if (is_object(Core_Page::instance()->object)
 && get_class(Core_Page::instance()->object) == 'Informationsystem_Controller_Show')
 {
    $Structure_Controller_Show->addEntity(
       Core::factory('Core_Xml_Entity')
          ->name('informationsystem_group_id')
          ->value(intval(Core_Page::instance()->object->group))
    )->addEntity(
       Core::factory('Core_Xml_Entity')
          ->name('informationsystem_item_id')
          ->value(intval(Core_Page::instance()->object->item))
    );
 }
 
 $Structure_Controller_Show->show();

Сортировка информационных элементов по рейтингу комментариев

$Informationsystem_Controller_Show
    ->informationsystemItems()
    ->queryBuilder()
    ->leftJoin('comment_informationsystem_items', 'comment_informationsystem_items.informationsystem_item_id', '=', 'informationsystem_items.id')
    ->leftJoin('comments', 'comments.id', '=', 'comment_informationsystem_items.comment_id')
    ->groupBy('informationsystem_items.id')
    ->clearOrderBy()
    ->orderBy('AVG(comments.grade)');

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.

Комментарии

  • Informationsystem_Controller_Show: как вывести одну запись с конкретным Id ?

    как вывести одну запись с конкретным Id ?

    25.07.2016 14:24:03
    adeveloper
    adeveloper

    Без темы

    ->limit(1)
    ->item(123)

    25.07.2016 14:36:49
    hostcms

    Данный код лишь вывод первую запись Информационной системы, а вовсе не конкретную запись

    $Informationsystem_Controller_Show->xsl(
    Core_Entity::factory('Xsl')->getByName('ВыводЕдиницыИнформационнойСистемы')
    )
    ->limit(1)
    ->item(157)
    ->show();

    25.07.2016 15:51:57
    adeveloper
    adeveloper

    Без темы

    Если элемент не из корневой группы, то укажите
    ->group(ID группы)
    или
    ->group(FALSE)

    26.07.2016 09:12:53
    hostcms
  • Добавление xml ветки

    Здравствуйте,
    Подскажите как добавить в xml свою ветку, вот такого вида:

    1026000.00

    Интересует прежде всего как к элементу id добавить?

    12.09.2015 20:05:53
    Илья

    Пример добавления с атрибутом

    // Добавляем XML-сущность контроллеру показа
    $Shop_Controller_Show->addEntity(
    Core::factory('Core_Xml_Entity')
    ->name('producers')
    ->value(123)
    ->addAttribute('id', 1)
    );

    14.09.2015 09:29:12
    hostcms
  • боже, а по человечески можно???

    "Например, контроллер показа информационной системы принимает объект информационной системы."

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

    Если есть контроллер показа, то есть и другие контроллеры? Что это за зверь "информационная система"? С ее отпрыском - "объект информационной системы"?

    Контроллер по своему названию что-то контроллит, а если он относится к цмс, то именно ЦМС и контроллит. Зачем масло маслить?

    15.05.2015 15:59:20
    Smogg
    Smogg

    Без темы

    Есть и другие контроллеры, один показывает информационную систему, другой магазин и прочее. Рано вам в контроллеры лезть, пока не ознакомились что такое информационная система и прочее. Начните с руководства пользователя, оно в PDF доступно на странице http://www.hostcms.ru/documentation/pdf/

    15.05.2015 16:05:24
    hostcms

    Без темы

    Честно говоря, документацию я тоже не очень понимаю. Вот страница 110 - есть подраздел "Настройка типа доставки «Почта России» " куда добавлять эту (private $_coefficient = 1; ) настройку?
    Я к тому, что справка у вас действительно труднодоступная не зависимо от уровня подготовки того, кто ее читает.

    16.03.2016 13:41:12
    Анна
  • Хотелось бы пример со списком

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

    23.03.2014 16:25:35
    ingram
    ingram