Version 1.0 (2010-11-02)
Copyright © 2010, Alexey Burkov, www.exlab.net
This manual also available in English.
Dextep — довольно простой движок для работы с шаблонами на PHP. Он создавался как легкий инструмент для использования архитектурного шаблона MVC. Другими словами, вы сможете отделить логику приложения от пользовательских интерфейсов.
Движок поддерживает базовую логику, используемую в представлении, — простейшие выражения, условный оператор ({if}
), циклы ({for}
и {foreach}
) и применение подшаблонов. Синтаксис Dextep напоминает Smarty, однако он гораздо проще, учитывая меньшее количество функций и предлагаемых возможностей. Dextep также компилирует шаблон и кэширует его для достижения максимальной скорости работы.
Для работы Dextep требуется веб-сервер с PHP 4.4.9 или выше. Предыдущие версии должны поддерживаться вплоть до PHP 4.0.6, но тестирование не проводилось. Можете попробовать запустить test.php
, чтобы проверить это самостоятельно.
Чтобы установить Dextep:
Dextep.class.php
на сервер, если вы используете PHP 5 или выше;Dextep-php4.class.php
(при желании вы можете переименовать его в Dextep.class.php
).Вы можете включить/отключить кэширование, изменить пути к папкам шаблонов и кэша, а также расширения файлов шаблонов. Для этого измените соответствующие значения свойств класса Dextep
. Значения по умолчанию:
$cacheEnabled = true; // true = кэширование включено, false = отключено
$cachePath = 'cache/'; // путь к папке кэша
$templatePath = 'templates/'; // путь к папке шаблонов
$templateExt = '.html'; // расширение файлов шаблонов
Убедитесь, что папки $cachePath
и $templatePath
существуют. Если вы используете кэширование, то установите права на запись папке кэша.
Во-первых, необходимо создать объект класса Dextep
:
require_once "Dextep.class.php";
$template = new Dextep();
Шаблоны — в сущности файлы с расширением .html
(определяется в свойстве $templateExt
), хранимые в папке для шаблонов (определяется в свойстве $templatePath
) или ее подпапках. Метод getTemplate($tpl)
возвращает выполненный код шаблона, где $tpl
— имя файла с шаблоном без расширения. Например, следующий код выводит шаблон из файла page.html
:
echo $template->getTemplate('page');
А этот пример присвоит строку с выполненным шаблоном blocks/header.html
переменной $content
:
$content = $template->getTemplate('blocks/header');
Вы можете передать в шаблон переменную любого типа (включая ассоциативные и числовые массивы) с помощью метода setVar($key, $value)
:
$template->setVar('title', 'Привет, мир!');
$test = array('foo', 'sub' => array('bar', true, 3.5));
$template->setVar('test', $test);
Значение переменной может быть изменено в процессе выполнения шаблона. Чтобы получить новое значение используйте метод getVar($key)
:
echo $template->getVar('title');
Для извлечения определенного элемента массива применяется точечный синтаксис:
echo $template->getVar('test.0'); // foo
echo $template->getVar('test.sub.2'); // 3.5
Точечный синтаксис можно использовать и с методом setVar()
, для того чтобы добавить в массив новый элемент или изменить значение существующего, не затрагивая массив целиком:
$template->setVar('test.sub.0', 'Новое значение'); // заменяет "bar" на "Новое значение"
ЗАМЕТКА: Ассоциативные ключи приоритетней числовых. Например, если в массиве содержатся элементы с ключами 2
и "2"
, то точечный синтаксис указывает на последний.
Шаблон кэшируется (если кэширование включено) при первом вызове метода getTemplate()
. При последующих вызовах будет использован кэш. Он не имеет ограничений по времени или каких-либо проверок актуальности. Все просто — если кэш существует, то он будет использован. Таким образом, если вы изменили шаблон (или подключенный к нему подшаблон), то чтобы получить актуальный результат существует три варианта:
$cacheEnabled = false
;getTemplate()
, указав вторым параметром true
. Это означает, что вы хотите обновить кэш шаблона.Установить уровень отображения ошибок можно с помощью PHP функции error_reporting()
. Однако, два типа ошибок обрабатываются непосредственно движком Dextep. Это ошибки "шаблон не найден" и "зацикленное подключение подшаблона". При возникновении одной из них Dextep просто останавливает выполнение скрипта командой die()
. Вы можете переопределить такое поведение, переписав метод error()
с учетом своих потребностей.
Теги Dextep обрамляются фигурными скобками {
и }
. Содержимое шаблонов вне этих скобок отображается без изменений. Чтобы отобразить фигурную скобку {
или }
, используйте специальный тег {lb}
или {rb}
соответственно.
Комментарии полностью игнорируются и на результате выполнения шаблона не сказываются. Вы можете закомментировать любую часть шаблона, используя следующий синтаксис:
{* Это комментарий *}
Чтобы отобразить значение переменной, просто укажите ее имя с префиксом $
, заключив все это в фигурные скобки. Элемент массива может быть отображен с помощью точечного синтаксиса, описанного выше. Например:
{$title}
{$test.sub.0}
Кроме того, вы можете использовать выражения и присваивать значения переменным:
{$var = $array.key + 5}
{$a * (2 + $b)}
Первое выражение присвоит вычисленное значение переменной $var
и отобразит его. Второе — только отобразит вычисленное значение без каких-либо присвоений. Если вам необходимо установить значение переменной, не отображая его, воспользуйтесь префиксом @
перед выражением:
{@$b = 5}
Операторы выражений в Dextep практически идентичны операторам в PHP. Полный список приведен в приложении.
ЗАМЕТКА: Строковые выражения поддерживаются не полностью. Можно соединять строковые переменные оператором .
(точка), но нельзя использовать строковые константы. Также необходимо оставлять пробел перед оператором .
(точка), чтобы избежать путаницы с точечным синтаксисом в массивах:
{$s = $test.0 . $test.sub.0}
Переменные с префиксом $
в основном используются для передачи значений из скрипта в шаблон. Однако, как можно увидеть в выше, позволяется изменять значения и даже определять новые переменные внутри шаблона в процессе его выполнения. Все эти переменные доступны из скрипта благодаря методу getVar
. Если же необходимо определить переменную, недоступную извне, то вместо $
следует применять префикс %
:
{%var = 2*$var}
Заметьте, что переменные %var
и $var
не идентичны. Переменные с префиксом %
также используются с циклами for
и foreach
(см. ниже).
ЗАМЕТКА: Вероятно, вам понадобится использовать какую-либо переменную в качестве индекса для поиска нужного элемента массива. Здесь необходимо запомнить, что это возможно только с %
-переменными. Чтобы обойти это ограничение, можно поступить следующим образом:
{%i = $i}
{$array.%i}
{if}
Конструкция {if}
аналогична if
в PHP. Каждому тегу {if}
должен соответствовать закрывающий тег {/if}
. В качестве условия допускаются любые выражения или переменные:
{if $bool} Этот текст будет отображен, только если выражение $bool истинно {/if}
Также допускается применение тегов {else}
и/или {elseif}
:
{if $a < 5}
Низкий
{elseif $a > 10}
Высокий
{else}
Средний
{/if}
{foreach}
{foreach}
в шаблоне практически соответствует foreach
в PHP. Она используется для обхода ассоциативного или числового массива. Каждому тегу {foreach}
должен соответствовать закрывающий тег {/foreach}
:
{foreach $array as %item}
Элемент = {%item},
{/foreach}
На этом пример строка внутри {foreach}
повторяется столько раз, сколько элементов в массиве $array
. Обратите внимение на префикс %
второй переменной. В каждой итерации переменной %item
присваивается значение соответствующего элемента массива. Если она была определена до {foreach}
, то первоначальное значение будет утеряно. Доступ к ключам массива реализуется так же, как и в PHP:
{foreach $array as %key => %value}
Заметьте, что здесь {$array.%key} — тоже, что и {%value}
{/foreach}
{for}
Тег {for}
применяется для повторения какой-либо части шаблона определенное число раз. Он обладает четырмя обязательными аттрибутами: var
определяет изменяемую переменную, from
и to
— границы повторений, а step
— насколько будет изменяться значение var
с каждой итерацией. Тегу {for}
также должен соответствовать закрывающий тег {/for}
:
{for var=%i from=9 to=0 step=-2}
{%i}
{/for}
Этот пример вернет результат "9 7 5 3 1".
ЗАМЕТКА: Аттрибуты from
и to
могут быть также выражениями или переменными, но step
может быть только числом.
Наконец, Dextep позволяет подключать в шаблон подшаблоны с помощью тега {include}
:
{include "subtemplate"}
Имя шаблона может быть заключено в одинарные (') или двойные кавычки ("), хотя это и не обязательно. Область видимости переменных распространяется на подшаблоны.
$a
, $b
и $c
, используемые ниже, являются переменными, но могут представлять константы и подвыражения (за некоторыми исключениями, аналогичными синтаксису PHP).
Арифметические операторы: | |
$a = $b |
Устанавливает переменную $a в значение $b |
$a . $b |
Объединяет строковые переменные $a и $b |
$a + $b |
Складывает $a и $b |
$a - $b |
Вычитает $b из $a |
$a * $b |
Умножает $a на $b |
$a / $b |
Делит $a на $b |
$a % $b |
Делит $a на $b и возвращает остаток деления |
-$a |
Возвращает число, противоположное $a |
++$a |
Прибавляет единицу к $a до вычисления всего выражения |
--$a |
Вычитает единицу из $a до вычисления всего выражения |
$a++ |
Прибавляет единицу к $a после вычисления всего выражения |
$a-- |
SВычитает единицу из $a после вычисления всего выражения |
$a += $b |
То же, что и $a = $a + b |
$a -= $b |
То же, что и $a = $a - b |
$a *= $b |
То же, что и $a = $a * b |
$a /= $b |
То же, что и $a = $a / b |
Логические операторы: | |
$a ? $b : $c |
Если $a истинно, то возвращает $b , в противном случае возвращает $c |
$a && $b |
Выражение истинно, если истинны оба $a и $b |
$a || $b |
Выражение истинно, если истинно хотя бы $a или $b |
!$a |
Выражение истинно, если $a ложно |
$a == $b |
Выражение истинно, если значения равны |
$a === $b |
Выражение истинно, если значения и типы данных равны |
$a != $b |
Выражение истинно, если значения не равны |
$a !== $b |
Выражение истинно, если значения или типы данных не равны |
$a < $b |
Выражение истинно, если $a меньше $b |
$a > $b |
Выражение истинно, если $a больше $b |
$a <= $b |
Выражение истинно, если $a меньше либо равно $b |
$a >= $b |
Выражение истинно, если $a больше либо равно $b |
Также вы можете переопределять порядок вычисления частей выражения с помощью скобок (
и )
.
Этот класс распространяется под лицензией BSD:
Copyright © 2010, Alexey Burkov, www.exlab.net
Разрешается повторное распространение и использование как в виде исходного кода, так и в двоичной форме, с изменениями или без, при соблюдении следующих условий:
ЭТА ПРОГРАММА ПРЕДОСТАВЛЕНА ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИМИ СТОРОНАМИ «КАК ОНА ЕСТЬ» БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ СООТВЕТСТВУЮЩИМ ЗАКОНОМ, ИЛИ НЕ УСТАНОВЛЕНО В УСТНОЙ ФОРМЕ, НИ ОДИН ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК БЫЛО СКАЗАНО ВЫШЕ, НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ ИЛИ ПОСЛЕДОВАВШИЕ УБЫТКИ, ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ ПРИНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ВЛАДЕЛЕЦ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.