Контроллеры
Контроллеры предназначены для отображения различных динамических данных в клиентском разделе. Конструктор контроллера принимает основной объект для которого идет показ. Например, контроллер показа информационной системы принимает объект информационной системы.
Шаблонизация
Допускается использование 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 ?
Без темы
->limit(1)
->item(123)Данный код лишь вывод первую запись Информационной системы, а вовсе не конкретную запись
$Informationsystem_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ВыводЕдиницыИнформационнойСистемы')
)
->limit(1)
->item(157)
->show();Без темы
Если элемент не из корневой группы, то укажите
->group(ID группы)
или
->group(FALSE)
-
Добавление 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)
);
-
боже, а по человечески можно???
"Например, контроллер показа информационной системы принимает объект информационной системы."
Тут одни междометия да знаки препинания из общего словаря. Все прочее - ваш личный местечковый жаргон.
Если есть контроллер показа, то есть и другие контроллеры? Что это за зверь "информационная система"? С ее отпрыском - "объект информационной системы"?
Контроллер по своему названию что-то контроллит, а если он относится к цмс, то именно ЦМС и контроллит. Зачем масло маслить?Без темы
Есть и другие контроллеры, один показывает информационную систему, другой магазин и прочее. Рано вам в контроллеры лезть, пока не ознакомились что такое информационная система и прочее. Начните с руководства пользователя, оно в PDF доступно на странице http://www.hostcms.ru/documentation/pdf/
Без темы
Честно говоря, документацию я тоже не очень понимаю. Вот страница 110 - есть подраздел "Настройка типа доставки «Почта России» " куда добавлять эту (private $_coefficient = 1; ) настройку?
Я к тому, что справка у вас действительно труднодоступная не зависимо от уровня подготовки того, кто ее читает.
16.03.2016 13:41:12Анна
-
Хотелось бы пример со списком
Все супер, но как быть со списками? например у меня есть список со странами, и мне нужно отсортировать товары по названиям стран по алфавиту. Помогите примерчиком пожалуйста.