====== Создание собственных предопределенных св-в ====== Предопределенные св-ва - это образно говоря переменные, которые определены на этапе выполнения шаблона только в рамках (внутри) определенных тегов. Предопределенные св-ва это классы, дочерние от WactCompilerProperty (limb/wact/src/compiler/property/WactCompilerProperty.class.php). Предопределенные св-ва хранятся в файлах с именем some_property_name.prop.php, который должен быть расположен в одной из директорий вида src/template/tags (при использовании WEB_APP пакета). Обратите внимание на окончание .prop.php. Рассмотрим в качестве примера предопределенное св-во WactParityProperty (limb/wact/src/tags/list/parity.prop.php). ===== Код класса WactParityProperty ===== temp_var = $code_writer->getTempVariable(); $code_writer->writePHP('$' . $this->temp_var . ' = 0;'); } function generatePreStatement($code_writer) { if (!$this->has_increment) { $this->hasIncrement = TRUE; $code_writer->writePHP('$' . $this->temp_var . '++;'); } } function generateExpression($code_writer) { $code_writer->writePHP('(( $' . $this->temp_var . ' % 2) ? "odd" : "even")'); } } ?> ===== Аннотации предопределенных св-в ===== Обратите внимание на использование следующего фрагмента кода в файле WactParityProperty: /** * @property Parity * @tag_class WactListItemTag */ Это аннотации. По этим аннотациям словарь предопределенных свойств формирует свое содержимое. Подробнее о словарях в разделе [[limb3:ru:packages:wact:dictionaries|"Словари элементов WACT-шаблона"]]. Полный список аннотация для фильтров: * property - название предопределенного св-ва * tag_class - название класса тега, внутри которого может применяться св-во. В нашем случае св-во WactParityProperty можно применять внутри тега , например, в виде выражения {$Parity}. ===== Методы, которые можно перекрывать ===== Предопределенные св-ва по определению имеют динамический характер. Список методов, которые обычно перекрывают в своих предопределенных св-вах: * **generateScopeEntry($code_writer)** - вызывается один раз перед генерацией содержимого родительского тега (в котором св-во может использоваться). Обычно здесь генерится код, подготавливающий необходимое состояние. * **generatePreStatement($code_writer)** - вызывается чуть раньше, чем generateExpression. Здесь можно генерить код, изменяющий состояние каких-то служебных переменных. * **generateExpression($code_writer)** - генерит основной код, выводящий значение св-ва. Echo генерить не нужно, так как на самом деле выражение вида {$Parity} - это на самом деле 2-х составная конструкция, {$} - генерит echo, а Parity - генерит значение. Остальные методы перекрываются крайне редко, чаще всего это только один generateExpression(). $code_writer - это экземпляр класса WactCodeWriter, который описан в разделе [[compiler|"Как работает компилятор WACT-шаблонов"]]. Здесь лишь отметим метод WactCodeWriter :: **getTempVariable()**, который генерит уникальное название, которое можно использовать в качестве имени переменной в компилированном шаблоне.