Инструменты пользователя

Инструменты сайта


limb3:ru:packages:wact:how_to_create_new_tag_property

Создание собственных предопределенных св-в

Предопределенные св-ва - это образно говоря переменные, которые определены на этапе выполнения шаблона только в рамках (внутри) определенных тегов.

Предопределенные св-ва это классы, дочерние от 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

<?php
/**
 * @property Parity
 * @tag_class WactListItemTag
 */
class WactParityProperty extends WactCompilerProperty
{
  protected $temp_var;
  protected $has_increment = FALSE;
 
  function generateScopeEntry($code_writer)
  {
    $this->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
 */

Это аннотации. По этим аннотациям словарь предопределенных свойств формирует свое содержимое. Подробнее о словарях в разделе "Словари элементов WACT-шаблона".

Полный список аннотация для фильтров:

  • property - название предопределенного св-ва
  • tag_class - название класса тега, внутри которого может применяться св-во.

В нашем случае св-во WactParityProperty можно применять внутри тега <list:item>, например, в виде выражения {$Parity}.

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

Предопределенные св-ва по определению имеют динамический характер.

Список методов, которые обычно перекрывают в своих предопределенных св-вах:

  • generateScopeEntry($code_writer) - вызывается один раз перед генерацией содержимого родительского тега (в котором св-во может использоваться). Обычно здесь генерится код, подготавливающий необходимое состояние.
  • generatePreStatement($code_writer) - вызывается чуть раньше, чем generateExpression. Здесь можно генерить код, изменяющий состояние каких-то служебных переменных.
  • generateExpression($code_writer) - генерит основной код, выводящий значение св-ва. Echo генерить не нужно, так как на самом деле выражение вида {$Parity} - это на самом деле 2-х составная конструкция, {$} - генерит echo, а Parity - генерит значение.

Остальные методы перекрываются крайне редко, чаще всего это только один generateExpression().

$code_writer - это экземпляр класса WactCodeWriter, который описан в разделе "Как работает компилятор WACT-шаблонов". Здесь лишь отметим метод WactCodeWriter :: getTempVariable(), который генерит уникальное название, которое можно использовать в качестве имени переменной в компилированном шаблоне.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
     __ ______   _  __  _____   _  __
 __ / //_  __/  / |/ / / ___/  / |/ /
/ // /  / /    /    / / /__   /    / 
\___/  /_/    /_/|_/  \___/  /_/|_/
 
limb3/ru/packages/wact/how_to_create_new_tag_property.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)