Содержание

Создание собственных WACT тегов

Мы предполагаем, что вам уже знакомы материалы следующих разделов:

То есть вам должны быть знакомо следующее:

Теги хранятся в файлах с именем some_tag_name.tag.php, который должен быть расположен в одной из директорий вида src/template/tags (при использовании WEB_APP пакета). Обратите внимание на окончание .tag.php.

Аннотации тегов

Перед самой декларацией класса тега существует зона комментариев в стиле phpDoc - это зона аннотаций тега, например:

<?php
/**
 * Include another template into the current template
 * @tag core:INCLUDE
 * @req_const_attributes file
 * @forbid_end_tag
 */
class WactCoreIncludeTag extends WactCompilerTag
{
[...]
}
?>

Полный список аннотация для тегов:

Методы, которые можно перекрывать

То, какие методы перекрывать, зависит от типа создаваемого тега:

Если это будет обычный тег (не имеющий html-аналога), тогда вы скорее всего будете наследоваться от WactCompilerTag или WactRuntimeComponentTag и вам лучше всего перекрывать следующие методы:

Если вы создаете тег-контекст, когда вы скорее всего будете наследоваться от WactRuntimeDatasourceComponentTag. Будьте внимательны - метод generateBeforeContent($code_writer) уже перекрыт.

Если вы создаете тег, у которого есть html-аналог, тогда скорее всего вам будет удобнее отнаследоваться от WactRuntimeComponentHTMLTag или WactRuntimeDatasourceComponentHTMLTag и перекрывать методы:

Динамические атрибуты

Начиная с версии 0.5 если вы желаете поддерживать динамические атрибуты в тегах, то вам нужно лишь в нужном месте вызвать у этого атрибута метод generateExpression($code_writer). Пример - это атрибут from тега <list:list>, о котором рассказано на странице "Как работает компилятор WACT-шаблонов". Все действия, связанные с подготовкой (так называемая прегенерация), находится к классе WactCompilerTag. Именно поэтому при создании дочерних классов от класса WactCompilerTag рекомендуется перекрывать методы generateBeforeContent($code_writer) и generateAfterContent($code_writer) (в некоторых случаях - generateTagContent($code_writer)), но не generate($code_writer).