В сложных проектах возникают задачи, в которых стандартные возможности гибридных данных, такие как фильтрация или сортировка, не позволяют определить список выводимых документов.
В качестве примера можно привести корзину электронного магазина, в которой записаны id выбранных товаров.
Для того, чтобы вывести такой список гибридных документов (предположим, что он хранится в переменной $idlist в виде строки разделенных запятой id документов, напр. «1,3,7,86») в Open Constructor используется прием, называемый «иньекция».
Объект, который будет формировать контент, помещается в stub блок (объекты, находящиеся в stub блоках по умолчанию не выводятся и используются для «запуска вручную» из PHP кода или шаблона SMARTY), и нижеприведенным кодом иньектируем $idlist в объект.
В дальнейшем можно «вывести» объект, т. е. добавить сгенерированный объектом HTML в генерируемую страницу или «не выводить», а присвоить переменной для последующего использования.
Smarty
{*--- без вывода ---*}
{inject block='stub' field='ids' value=$idlist}
{assign_by_ref var=stub value=$ctx->getObjectAt('stub')}
{set documents=$stub->getDocuments()}
{*--- с выводом ---*}
{inject block='stub' field='ids' value=$idlist}
{run_block id='stub'}
PHP
//--- без вывода ---
$obj = &$ctx->getObjectAt('stub');
$ctx->inject($obj, 'ids', $idlist); // $obj->ids = $idlist;
$docs=$obj->getDocuments();
//--- вывод ---
$obj = &$ctx->getObjectAt('stub');
$ctx->inject($obj, 'ids', $idlist);
$obj->exec($ctx->_smarty);

Комментарии