Термин «шаблонные команды» пока взят в кавычки, так как это рабочее название, окончальный термин еще не определен.
Суть использования шаблонных команд следующая:
Объект, наследник от WactTemplateCommand, и который был вызван, имеет доступ к корневому активному компоненту шаблона, к активному компоненту, из которого был сделан вызов, а также все, что можно получить при помощи глобальных источников, например, lmbToolkit. Это открывает весьма широкий простор для изменения содержимого шаблона. Например, можно изменить количество элементов в каком-либо pager-е, можно поместить в корневой контейнер данных шаблона какие-либо данные(см. пример ниже) и т.д.
Для реализации такого вызова используется тег <perform>, а также дополнительный тег <perform:params>, который позволяет передать в вызываемый метод дополнительные параметры.
Класс WactTemplateCommand находится в папке limb/wact/src/components/perform.
Разберем небольшой пример, в котором мы будем ставить в контейнеры данных шаблона данные. Пример несколько абстрактный, но должен продемонстрировать основные моменты использования шаблонных команд.
Итак, нам нужна «шаблонная команда». Это должен быть класс, дочерний от класса WactTemplateCommand, который находится в limb/wact/src/components/WactTemplateCommand.class.php
Внутри WactTemplateCommand доступны атрибуты:
Как мы уже говорили, по-умолчанию вызывается метод doPerform(), поэтому для начала мы реализуем именно его. Этот метод будет устанавливать в корневой контейнер данных и в текущий контейнер данных значения некоторых переменных.
lmb_require('limb/wact/src/components/perform/WactTemplateCommand.class.php'); class MyTemplateCommand extends WactTemplateCommand { function doPerform() { $this->template->set('my_var', 'This was set from template command object'); $this->context_component->getDatasourceComponent()->set('my_other_var', 'This was also set from template command object'); } }
Обратите внимание, template - это корневой активной компоонент, который является корневым контейнером данных. Поэтому у него безопасно вызывать метод set(). context_component - может быть любым активным компонентом, и не являться контейнером данных, поэтому мы использовали метод getDatasourceComponent(), который возвращает ближайший контейнер данных вверх по иерархии.
Допустим, мы сохраним наш класс в пути, где он будет доступен через include_path(), например, так src/template/command/MyTemplateCommand.class.php.
Теперь можно попробовать вызвать метод MyTemplateCommand :: doPerform() из шаблона при помощи тега <perform>:
<core:datasource> <perform command='src/template/command/MyTemplateCommand'/> {$#my_var}<br/> {$my_other_var} </core:datasource>
В результате получим:
This was set from template command object<br/> This was also set from template command object
При помощи атрибута method тега <perform> можно указать другой метод вызываемой шаблонной команды. Значение атрибута method приводится к виду doMethodValue(), например: <perform method='my_method'> приведет к вызову метода doMyMethod() в шаблонной команде.
Методы шаблонных команд могут принимать произвольное количество параметров.
При помощи тега <perform:params> можно передать им эти параметры прямо из шаблона.
Например, путь у нас будет метод MyTemplateCommand :: doOtherPerform() который будет принимать 2 дополнительных параметра, значения которых он и будет ставить в шаблон:
lmb_require('limb/wact/src/components/perform/WactTemplateCommandclass.php'); class MyTemplateCommand extends WactTemplateCommandclass { [...] function doOtherPerform($param1, $param2) { $this->template->set('my_var', $param1); $this->context_component->getDatasourceComponent->set('my_other_var', $param2); } }
В вызываемый метод передаются значения атрибутов тега <perform:params> в том порядке, в котором они указаны в шаблоне. Названия атрибутов не имеют значения:
<core:datasource> <perform command='src/template/command/MyTemplateCommand' method='other_perform'> <perform:params p1='For root datasource' p2='For current datasource'/> </perform> {$#my_var}<br/> {$my_other_var} </core:datasource>
В результате получим:
For root datasource<br/> For current datasource
Обсуждение