====== Компиляция и выполнение шаблона. Активные компоненты шаблона. Дерево контекстов. ====== ===== Цели и задачи раздела ===== Цель - дать необходимые знания о том, как работает шаблонизатор WACT: * что такое компиляция шаблонов, * какие типы тегов поддерживаются, * что такое компоненты времени исполнения, * что такое контейнеры данных Предполагается, что вы уже имеете небольшой опыт работы с WACT, например, выполнили самостоятельно [[limb3:ru:tutorials:basic|базовый туториал]], хотя это не обязательно. Мы рекомендуем вам прочтение данного раздела в любом случае, в целях ознакомления с механизмом работы WACT-а. Если что-то здесь покажется вам немного непонятным или сложным - не беспокойтесь. Самое важное, чтобы после прочтения вы имели начальное представление о дереве контейнеров данных (иначе - контексты), из которых состоит шаблон во время его работы. Эти знания потребуются чтобы эффективно использовать [[.expressions|"Выражения"]] и легко оперировать данными внутри шаблона (например, передавать данные с уровня на уровень). ===== Фаза компиляции и фаза исполнения шаблонов ===== Шаблонизатор WACT - является **компилирующим обработчиком**. То есть на основе базового шаблона создается php-скрипт, который записывается на диск, затем этот скрипт подключается и исполняется. Это дает значительное преимущество в скорости работы ввиду того, что php-скрипт создается только 1 раз и затем только исполняется, а также в том, что скомпилированные шаблоны могут кэшироваться php-акселераторами, например, eAccelerator. Другими словами WACT шаблоны обрабатываются в 2 стадии * **фаза компиляции (CompileTime)** * **фаза исполнения (RunTime)** Так как фаза компиляции является достаточно "тяжелой" с точки зрения скорости выполнения, при помощи опции файла wact.conf.php (или settings.ini, если используете только WACT без WEB_APP пакета) вы можете отменить фазу компиляции. О том как это сделать см. раздел "Рендеринг WACT шаблона". Обычно фаза компиляции нужна только в то время, когда вы создаете шаблон, во время разработки приложения, то есть тогда, когда шаблон активно исправляется. На рабочей же копии приложения, компиляцию отключают. То есть шаблонная система, однажды скомпилировав шаблон, уже не будет делать это повторно. Скомпилированные шаблоны хранятся обычно в папке /var/compiled вашего приложения ===== Компиляция шаблона ===== Во время компиляции шаблон разбирается, и создается дерево тегов, наподобие DOM. Элементы этого дерева называются элементами (нодами) дерева компиляции (CompileTreeNode). Фильтры, выражения и предопределенные свойства также являются элементами этого дерева. WACT предоставляет широкие возможности по повторному использование шаблонов: * **включение** (include), то есть вставка другого шаблона в текущий шаблон и * **обворачивание** (wrap), то есть вставка текущего шаблона или его части внутрь другого шаблона. Это накладывает свой отпечаток на процесс компиляции. **WACT шаблон компилируется всегда только целиком**. Это очень важно понимать! Поясним: если шаблон является составным, то есть включает другие шаблоны или же сам включается в другой шаблон, то компиляция производится в 2 этапа: - сначала создается общий шаблон, - потом общий шаблон компилируется На самом деле это процесс немного сложнее, однако на данном этапе можно понимать компиляцию именно так. Подробнее об этом в разделе [[template_composition|"Композиция шаблонов"]]. Из-за этих особенностей WACT не может поддерживать режим перекомпиляции при изменении только базового шаблона, как это имеет место в Smarty - ведь любая часть составного шаблона может быть изменена, а проверять все составляющие слишком накладно. После сборки дерева производится обход всех его элементов (тегов, выражений, фильтров), каждый из которых выдает свою порцию php-скрипта откомпилированного шаблона. Откомпилированный шаблон - это WACT шаблон переведенный в обычный, готовый к запуску php-скрипт, содержащий 2 функции: * инициализующая - содержит код, который позволяет создать дерево **активных компонентов фазы выполнения** * выполняющая - код, занимающийся логикой вывода данных. ===== Работа с шаблоном. Выполнение шаблона. ===== После того, как шаблонизатор откомпилировал шаблон, он сразу же вызывает инициализирующую функцию, которая создает в памяти дерево активных компонентов фазы исполнения (RuntimeComponentTree). К любому элементу этого дерева вы можете получить доступ через API шаблонной системы, что позволяет контролировать поведение этих компонентов, например, передавать в них данные, менять состояния и т.д: Шаблон:

Newsline

И код, который использует этот шаблон: $template = new WactTemplate('news.html'); $list = $template->findChild('news'); $list->registerDataset($some_news_data); $template->display(); То есть, вы из скрипта ставите данные или еще каким-либо образом модифицируете состояние компонентов фазы исполнения, а затем вызываете метод WactTemplate :: **display()**. В результате выполняется вторая, исполняющая фунция php-скрипта шаблона, и результат выводится в output-буфер. ===== Типы тегов. Связь тегов и компонентов фазы исполнения ===== Теперь мы покажем, какие типы тегов поддерживает WACT и связь между тегами начального шаблона и активными компонентами, доступными после компиляции. Не волнуйтесь, если что-то покажется непонятным. Что именно необходимо уяснить: * некоторым тегам соответствуют активные компоненты, * эти активные компоненты объеденены в дерево, * некоторые из таких объектов являются **контейнерами данных**. Из контейнеров данных выводятся данные при помощи выражений вида {$title} WACT поддерживает теги нескольких видов: * **Теги, которые не имеют активного компонента**: * WACT-теги, которые участвуют в процессе сборки шаблона. Это теги и . * WACT-теги, которые просто генерируют php-код в процессе компиляции шаблона. Например, , , и т.д. * **Теги, которые имеют активный компонент**: * WACT-теги, которые генерируют php-код. Например, , , , , и т.д. * HTML-теги, которые генерируют php-код. Например тэги ,