В качестве шаблонизатора по умолчанию фреймворк использует Smarty 3. Об использовании других движков шаблонов см. ниже.
Разработчик приложения технически не ограничен в возможностях дизайна и верстки интерфейса. Обязательным для соблюдения условием является только расположение и название файла шаблона. Подробнее об именовании файлов шаблонов см. в разделе «Правила и рекомендации по именованию».
Использование Smarty
Для упрощения разработки фреймворк предоставляет ряд переменных и хелперов, доступных в шаблоне.
Переменные
{$wa_url}
: путь к корню установки фреймворка от корня сайта.{$wa_app_url}
: относительный URL лицевой страницы приложения от корня сайта. В шаблонах фронтенда переменная возвращает путь к лицевой странице фронтенда приложения, в шаблонах бекенда — путь к лицевой странице бекенда приложения.{$wa_app_static_url}
: путь к каталогу приложения от корня сайта (применяется для построения ссылок на статические файлы приложения, например:{$wa_app_static_url}img/logo.png
.{$wa_app}
: возвращает APP_ID приложения.{$wa_backend_url}
: относительный URL бекенда.
Хелпер $wa
:
{$wa->header()}
— возвращает HTML-код шапки бекенда со списком установленных приложений и именем текущего пользователя.{$wa->app()}
— APP_ID приложения.{$wa->appName()}
— название приложения.{$wa->accountName()}
— название аккаунта (экземпляра установки фреймворка).{$wa->css()}
— возвращает HTML-код подключения необходимых CSS-файлов.{$wa->user()->getName()}
— имя текущего пользователя.{$wa->user()->getId()}
— идентификатор текущего пользователя.{$wa->version()}
— номер версии приложения.{$wa->url()}
— путь к корню установки фреймворка от корня сайта.{$wa->url(true)}
— путь к корню бекенда от корня сайта.
Локализация
Для отображения строк, требующих перевода в зависимости от локали пользователя, следует использовать
механизм gettext
. В этом случае в код шаблона вставляется строка-ключ для перевода в обрамлении конструкции
[` `]
, например: [`some gettext key`]
. Подробнее о механизме локализации см.
раздел «Локализация».
Пример
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{$wa->appName()} — {$wa->accountName()}</title> {$wa->css()} <script src="{$wa_url}wa-content/js/jquery/jquery-1.4.2.min.js" type="text/javascript"></script> </head> <body> <div id="wa"> {$wa->header()} <div id="wa-app"> <div class="block"> {if !$records} <p>[`Guestbook is empty. Write a new post on the public guestbook page.`]</p> {else} <ul class="zebra"> {foreach from=$records item=r} <li> {if $rights_delete}<a class="count" href="?action=delete&id={$r.id}"><i class="icon16 delete"></i></a>{/if} <span class="hint"> <strong>{$r.name|escape}</strong> {$r.datetime|wa_datetime} </span> {$r.text|escape|nl2br} </li> {/foreach} </ul> {/if} <a href="{$url}" target="_blank">[`Guestbook on site`]</a> <i class="icon10 new-window"></i> </div> </div> </div> </body> </html>
Использование альтернативных шаблонизаторов
Используемый по умолчанию шаблонизатор Smarty 3 можно заменить на любой альтернативный движок шаблонов.
Взаимодействие фреймворка с движком шаблонов происходит через специальный класс-адаптер. В частности, обращение системы к Smarty 3
происходит через системный класс waSmarty3View
, содержащийся в файле wa-system/view/waSmarty3View.class.php
.
Для использования другого движка шаблонов необходимо реализовать и подключить (через конфигурационный файл) класс-адаптер, обеспечивающий взаимодействие фреймворка и шаблонизатора.
Подключение шаблонов на чистом PHP
В состав фреймворка включен адаптер для использования в качестве шаблонов обычных PHP-файлов.
Внимание: в настоящий момент этот адаптер реализован в упрощенном виде в демонстрационных целях и не предназначен для использования в проектах с высокой нагрузкой.
Для того чтобы в вашем приложение вместо Smarty использовались шаблоны на чистом PHP, достаточно создать конфигурационный файл
wa-apps/{APP_ID}/lib/config/factories.php
следующего содержания:
<?php return array( 'view' => 'waPHPView' )
Если файл factories.php
уже существует в приложении, в него необходимо добавить соответствующую строку.
К шаблонам в виде обычных PHP-файлов применяются те же правила расположения и именования файлов, что и для шаблонов Smarty (подробнее см. «Правила и рекомендации по именованию»). Единственным отличием является расширение имён файлов шаблонов: в отличие от шаблонов Smarty с расширением.html
, шаблоны PHP имеют стандартное расширение.php
.
В PHP-шаблонах доступны те же встроенные переменные и хелпер $wa
, что и в шаблонах Smarty.
Создание адаптера для подключения альтернативного шаблонизатора
Любое разрабатываемое приложение можно настроить на использование привычного разработчику шаблонизатора.
Для этого необходимо в конфигурационном файле приложения wa-apps/{APP_ID}/lib/config/factories.php
указать класс адаптера подключения шаблонизатора:
<?php return array( 'view' => '{НАЗВАНИЕ КЛАССА-АДАПТЕРА VIEW}' );
По умолчанию в качестве значения параметра view
используется waSmarty3View
(адаптер для Smarty 3).
В качестве класса адаптера можно определить свой класс (его необходимо наследовать от системного класса waView
),
разместить его в файле с соответствующим именем (см. раздел «Правила и рекомендации по именованию»)
в любом месте внутри подкаталога lib/
приложения и реализовать в нём все необходимые функции.
Реализация адаптера для подключения шаблонизатора на примере класса waPHPView
:
<?php /** * Любой адаптер View должен быть унаследован от системного класса waView */ class waPHPView extends waView { // Здесь задаются расширения файлов шаблонов, по умолчанию используется .html, // для использования обычного PHP в качестве view, файлы шаблонов должны иметь имена вида *.php protected $postfix = '.php'; // Переменная для хранения данных, переданных во view protected $vars = array(); // Корневой каталог для шаблонов (задаётся в конструкторе) protected $template_dir = array(); // Объект waSystem приложения protected $system; // Вспомогательная переменная для хранения текущего активного шаблона protected $current_template; public function __construct(waSystem $system, $options = array()) { $this->system = $system; // Устанавливаем корневой каталог для шаблонов, // по умолчанию это каталог приложения wa-apps/{APP_ID}/ $this->template_dir = isset($options['template_dir']) ? $options['template_dir'] : $this->system->getAppPath(); } /** * Реализация функции assign - передача данных в шаблон из экшена/контроллера */ public function assign($name, $value = null) { if (is_array($name)) { $this->vars += $name; } else { $this->vars[$name] = $value; } } /** * Удаление переменной */ public function clearAssign($name) { if (isset($this->vars[$name])) { unset($this->vars[$name]); } } /** * Очистка всех переданных данных в шаблон */ public function clearAllAssign() { $this->vars = array(); } /** * Возвращает одну либо все переменные, переданные в шаблон */ public function getVars($name = null) { if ($name === null) { return $this->vars; } else { return isset($this->vars[$name]) ? $this->vars[$name] : null; } } /** * Возвращает результат рендеринга шаблона в виде строки */ public function fetch($template, $cache_id = null) { ob_start(); $this->display($template, $cache_id); $result = ob_get_contents(); ob_end_clean(); return $result; } /** * Рендерит шаблон в браузер клиента */ public function display($template, $cache_id = null) { if ($this->templateExists($template)) { $this->current_template = $template; extract($this->vars); include($this->template_dir.'/'.$this->current_template); } else { throw new waException("Template ".$template.' not found'); } } /** * Проверяет, существует ли указанный шаблон */ public function templateExists($template) { return file_exists($this->template_dir.'/'.$template); } }