====== Создание собственных предопределенных св-в ======
Предопределенные св-ва - это образно говоря переменные, которые определены на этапе выполнения шаблона только в рамках (внутри) определенных тегов.
Предопределенные св-ва это классы, дочерние от 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()**, который генерит уникальное название, которое можно использовать в качестве имени переменной в компилированном шаблоне.