This commit is contained in:
Ivan Shalganov 2013-02-01 14:53:01 +04:00
parent 439533f5ad
commit e498f4042f

607
README.md
View File

@ -1,303 +1,306 @@
Aspect templater Aspect templater
================ ================
## Быстрый старт ## Быстрый старт
Отрисовать шаблон `pages/about.tpl`: Отрисовать шаблон `pages/about.tpl`:
```php ```php
$aspect = Aspect::factory('./templates', './compiled', Aspect::CHECK_MTIME); <?php
$aspect->display("pages/about.tpl", $data); $aspect = Aspect::factory('./templates', './compiled', Aspect::CHECK_MTIME);
``` $aspect->display("pages/about.tpl", $data);
```
Получить результат отрисовки шаблона:
Получить результат отрисовки шаблона:
```php
$aspect = Aspect::factory('./templates', './compiled', Aspect::CHECK_MTIME); ```php
$content = $aspect->fetch("pages/about.tpl", $data); <?php
``` $aspect = Aspect::factory('./templates', './compiled', Aspect::CHECK_MTIME);
$content = $aspect->fetch("pages/about.tpl", $data);
Создание шаблона в реальном времени: ```
```php Создание шаблона в реальном времени:
$aspect = new Aspect();
$tempate = $aspect->compileCode('Hello {$user.name}! {if $user.email?} Your email: {$user.email} {/if}'); ```php
$tempate->display($data); <?php
$content = $tempate->fetch($data); $aspect = new Aspect();
``` $tempate = $aspect->compileCode('Hello {$user.name}! {if $user.email?} Your email: {$user.email} {/if}');
$tempate->display($data);
## Синтаксис $content = $tempate->fetch($data);
```
Базовый синтаксис, по бОльшей части, унаследован от Smarty3.
## Синтаксис
### Переменные
Базовый синтаксис, по бОльшей части, унаследован от Smarty3.
#### Вывод переменной
### Переменные
Вывод значений переменных в шаблонизаторе Aspect идентичен правилам вывода шаблонизатора Smarty
#### Вывод переменной
```smarty
{$foo} <-- displaying a simple variable (non array/object) Вывод значений переменных в шаблонизаторе Aspect идентичен правилам вывода шаблонизатора Smarty
{$foo[4]} <-- display the 5th element of a zero-indexed array
{$foo.4} ```smarty
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar'] {$foo} <-- displaying a simple variable (non array/object)
{$foo.'bar'} {$foo[4]} <-- display the 5th element of a zero-indexed array
{$foo."bar"} {$foo.4}
{$foo[bar]} {$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
{$foo['bar']} {$foo.'bar'}
{$foo["bar"]} {$foo."bar"}
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar] {$foo[bar]}
{$foo[$bar]} {$foo['bar']}
{$foo->bar} <-- display the object property "bar" {$foo["bar"]}
{$foo->bar()} <-- display the return value of object method "bar" {$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
``` {$foo[$bar]}
{$foo->bar} <-- display the object property "bar"
#### Комбинированные варианты {$foo->bar()} <-- display the return value of object method "bar"
```
```smarty
{$foo.bar.baz} #### Комбинированные варианты
{$foo.$bar.$baz}
{$foo[4].baz} ```smarty
{$foo[4].$baz} {$foo.bar.baz}
{$foo.bar.baz[4]} {$foo.$bar.$baz}
{$foo->bar($baz, 2, $bar)} <-- passing parameters {$foo[4].baz}
{"foo"} <-- static values are allowed {$foo[4].$baz}
``` {$foo.bar.baz[4]}
{$foo->bar($baz, 2, $bar)} <-- passing parameters
#### Математические операции {"foo"} <-- static values are allowed
```
```smarty
{$x+$y} // will output the sum of x and y. #### Математические операции
{$foo[$x+3]} // as array index
{$foo[$x+3]*$x+3*$y % 3} ```smarty
``` {$x+$y} // will output the sum of x and y.
{$foo[$x+3]} // as array index
#### Объявление переменных {$foo[$x+3]*$x+3*$y % 3}
```
```smarty
{var $foo = $x + $y} #### Объявление переменных
{var $foo = $x.y[z] + $y}
{var $foo = strlen($a)} ```smarty
{var $foo = myfunct( ($x+$y)*3 )} {var $foo = $x + $y}
{var $foo.bar.baz = 1} {var $foo = $x.y[z] + $y}
``` {var $foo = strlen($a)}
{var $foo = myfunct( ($x+$y)*3 )}
#### Объявление массивов {var $foo.bar.baz = 1}
```
```smarty
{var $foo=[1,2,3]} #### Объявление массивов
{var $foo=['y'=>'yellow','b'=>'blue']}
{var $foo=[1,[9,8],3]} // can be nested ```smarty
``` {var $foo=[1,2,3]}
{var $foo=['y'=>'yellow','b'=>'blue']}
#### Работа с объектами {var $foo=[1,[9,8],3]} // can be nested
```
```smarty
{$object->method1($x)->method2($y)} #### Работа с объектами
{var $foo=$object->item->method($y, 'named')}
``` ```smarty
{$object->method1($x)->method2($y)}
{var $foo=$object->item->method($y, 'named')}
#### Работа со строками ```
Строки в Aspect обрабатываются идентично правилам подстановки переменных в строки в PHP, т.е. в двойных кавычках переменная заменяется на её значение, в одинарных замены не происходит.
В отличие от Smarty в строках не обрабатываются управляющие конструкции, например "if", но работают модификаторы. #### Работа со строками
```smarty Строки в Aspect обрабатываются идентично правилам подстановки переменных в строки в PHP, т.е. в двойных кавычках переменная заменяется на её значение, в одинарных замены не происходит.
{var $foo="Ivan"} В отличие от Smarty в строках не обрабатываются управляющие конструкции, например "if", но работают модификаторы.
{var $user.name="Ivan"}
{"Hi, $foo"} выведет "Hi, Ivan" ```smarty
{"Hi, {$foo}"} выведет "Hi, Ivan" {var $foo="Ivan"}
{"Hi, {$user.name}"} выведет "Hi, Ivan" {var $user.name="Ivan"}
{'Hi, $foo'} выведет 'Hi, $foo' {"Hi, $foo"} выведет "Hi, Ivan"
{'Hi, {$foo}'} выведет 'Hi, {$foo}' {"Hi, {$foo}"} выведет "Hi, Ivan"
``` {"Hi, {$user.name}"} выведет "Hi, Ivan"
{'Hi, $foo'} выведет 'Hi, $foo'
### Модификаторы {'Hi, {$foo}'} выведет 'Hi, {$foo}'
```
* Модификаторы позволяют изменить значение переменной перед выводом или использованием в выражении
* Модификаторы записываются после переменной через символ вертикальной черты "|" ### Модификаторы
* Модификаторы могут иметь параметры, которые записываются через символ двоеточие ":" после имени модификатора
* Параметры модификаторов друг от друга также разделяются символом двоеточие ":" * Модификаторы позволяют изменить значение переменной перед выводом или использованием в выражении
* В качестве параметров могут использоваться переменные. * Модификаторы записываются после переменной через символ вертикальной черты "|"
* Модификаторы могут составлять цепочки. В этом случае они применяются к переменной последовательно слева направо * Модификаторы могут иметь параметры, которые записываются через символ двоеточие ":" после имени модификатора
* Параметры модификаторов друг от друга также разделяются символом двоеточие ":"
```smarty * В качестве параметров могут использоваться переменные.
{var $foo="Ivan"} * Модификаторы могут составлять цепочки. В этом случае они применяются к переменной последовательно слева направо
{$foo|upper} выведет "IVAN"
{$foo|lower} выведет "ivan" ```smarty
{$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит "..." в конец текста {var $foo="Ivan"}
{$looong_text|lower|truncate:$settings.count:$settings.etc} {$foo|upper} выведет "IVAN"
{var $foo="Ivan"|upper} переменная $foo будет содержать "IVAN" {$foo|lower} выведет "ivan"
``` {$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит "..." в конец текста
{$looong_text|lower|truncate:$settings.count:$settings.etc}
Подробнее модификаторы описаны в разделе [модификаторы](docs/modifiers.md) {var $foo="Ivan"|upper} переменная $foo будет содержать "IVAN"
```
### Функции
Подробнее модификаторы описаны в разделе [модификаторы](docs/modifiers.md)
Каждый тэг шаблонизатора либо выводит переменную, либо вызывает какую-либо функцию.
Тег вызова функции начинается с названия функции и содержит список аргументов: ### Функции
```smarty Каждый тэг шаблонизатора либо выводит переменную, либо вызывает какую-либо функцию.
{FUNCNAME attr1 = "val1" attr2 = $val2} Тег вызова функции начинается с названия функции и содержит список аргументов:
```
```smarty
Это общий формат функций, но могут быть исключения, например функция {var}, использовавшаяся выше. {FUNCNAME attr1 = "val1" attr2 = $val2}
```
```smarty
{include file="my.tpl"} Это общий формат функций, но могут быть исключения, например функция {var}, использовавшаяся выше.
{mailto address="bzick@megagroup.ru" text="Article's author"}
{var $foo=5} ```smarty
{if $user.loggined} {include file="my.tpl"}
Welcome, <span style="color: red">{$user.name}!</span> {mailto address="bzick@megagroup.ru" text="Article's author"}
{else} {var $foo=5}
Who are you? {if $user.loggined}
{/if} Welcome, <span style="color: red">{$user.name}!</span>
``` {else}
Who are you?
#### Аргументы {/if}
```
Аргументы принимают любой формат переменных, в том числе результаты арифметических операций и модификаторов.
#### Аргументы
```smarty
{funct arg=true} Аргументы принимают любой формат переменных, в том числе результаты арифметических операций и модификаторов.
{funct arg=5}
{funct arg=1.2} ```smarty
{funct arg='string'} {funct arg=true}
{funct arg="string this {$var}"} {funct arg=5}
{funct arg=[1,2,34]} {funct arg=1.2}
{funct arg=$x} {funct arg='string'}
{funct arg=$x.c} {funct arg="string this {$var}"}
``` {funct arg=[1,2,34]}
{funct arg=$x}
```smarty {funct arg=$x.c}
{funct arg="ivan"|upper} ```
{funct arg=$a.d.c|lower}
``` ```smarty
{funct arg="ivan"|upper}
```smarty {funct arg=$a.d.c|lower}
{funct arg=1+2} ```
{funct arg=$a.d.c+4}
{funct arg=($a.d.c|count+4)/3} ```smarty
``` {funct arg=1+2}
{funct arg=$a.d.c+4}
{funct arg=($a.d.c|count+4)/3}
```
### Вставка JS
Как и в Smarty, в шаблонизаторе Aspect используются фигурные скобки для отделения HTML от кода Aspect.
Если требуется вывести текст, содержащий фигурные скобки помните о следующих возможностях: ### Вставка JS
1. Использование блочного тега `{literal}{/literal}`. Текст внутри этого тега не компилируется шаблонизатором и выводится "как есть". Как и в Smarty, в шаблонизаторе Aspect используются фигурные скобки для отделения HTML от кода Aspect.
2. Если после открывающей фигурной скобки есть пробельный символ, то она не воспринимается как разделитель Aspect и код после неё выводится "как есть". Если требуется вывести текст, содержащий фигурные скобки помните о следующих возможностях:
Пример: 1. Использование блочного тега `{literal}{/literal}`. Текст внутри этого тега не компилируется шаблонизатором и выводится "как есть".
2. Если после открывающей фигурной скобки есть пробельный символ, то она не воспринимается как разделитель Aspect и код после неё выводится "как есть".
```smarty
{literal} Пример:
<style>
h1 {font-size: 24px; color: #F00;} ```smarty
</style> {literal}
{/literal} <style>
<script> h1 {font-size: 24px; color: #F00;}
(function (text) { </style>
var e = document.createElement('P'); {/literal}
e.innerHTML = text; <script>
document.body.appendChild(e); (function (text) {
})('test'); var e = document.createElement('P');
</script> e.innerHTML = text;
``` document.body.appendChild(e);
})('test');
Выведет </script>
```
```html
<style> Выведет
h1 {font-size: 24px; color: #F00;}
</style> ```html
<script> <style>
(function (text) { h1 {font-size: 24px; color: #F00;}
var e = document.createElement('P'); </style>
e.innerHTML = text; <script>
document.body.appendChild(e); (function (text) {
})('test'); var e = document.createElement('P');
</script> e.innerHTML = text;
``` document.body.appendChild(e);
})('test');
## Настройка </script>
```
### Параметры
## Настройка
#### Исходные шаблоны
### Параметры
Добавить папку с шаблонами:
#### Исходные шаблоны
```php
$aspect->addTemplateDir($dir); Добавить папку с шаблонами:
```
```php
Шаблонизатор последовательно будет перебирать папки и искать указанный шаблон. $aspect->addTemplateDir($dir);
```
#### Сборки шаблонов
Шаблонизатор последовательно будет перебирать папки и искать указанный шаблон.
Задаёт папку в которую будут сохранятся преобразованные в PHP шаблоны
#### Сборки шаблонов
```php
$aspect->setCompileDir($dir); Задаёт папку в которую будут сохранятся преобразованные в PHP шаблоны
```
```php
#### Опции $aspect->setCompileDir($dir);
```
```php
$aspect->setOptions($options); #### Опции
```
```php
Массив `'option_name' => boolean` (если ключ не указан автоматически задаётся false) $aspect->setOptions($options);
```
* **disable_methods**, `boolean`, запретить вызов методов у объектов
* **disable_native_funcs**, `boolean`, запретить использование PHP функций, кроме разрешенных Массив `'option_name' => boolean` (если ключ не указан автоматически задаётся false)
* **disable_set_vars**, `boolean`, запретить изменять или задавать переменные
* **include_sources**, `boolean`, вставлять исходный код шаблона в его сборку * **disable_methods**, `boolean`, запретить вызов методов у объектов
* **compile_check**, `boolean`, сравнивать mtime у исходного шаблона и его сборки. При изменении исходного шаблона будет производится его пересборка (замедляет работу шаблонизатора). * **disable_native_funcs**, `boolean`, запретить использование PHP функций, кроме разрешенных
* **force_compile**, `boolean`, пересобирать шаблон при каждом вызове (сильно замедляет работу шаблонизатора). * **disable_set_vars**, `boolean`, запретить изменять или задавать переменные
* **include_sources**, `boolean`, вставлять исходный код шаблона в его сборку
или битовая маска из флагов: * **compile_check**, `boolean`, сравнивать mtime у исходного шаблона и его сборки. При изменении исходного шаблона будет производится его пересборка (замедляет работу шаблонизатора).
* **force_compile**, `boolean`, пересобирать шаблон при каждом вызове (сильно замедляет работу шаблонизатора).
* `Aspect::DENY_METHODS` то же что и **disable_methods**
* `Aspect::DENY_INLINE_FUNCS` то же что и **disable_native_funcs** или битовая маска из флагов:
* `Aspect::DENY_SET_VARS` то же что и **disable_set_vars**
* `Aspect::INCLUDE_SOURCES` то же что и **include_sources** * `Aspect::DENY_METHODS` то же что и **disable_methods**
* `Aspect::CHECK_MTIME` то же что и **compile_check** * `Aspect::DENY_INLINE_FUNCS` то же что и **disable_native_funcs**
* `Aspect::FORCE_COMPILE` то же что и **force_compile** * `Aspect::DENY_SET_VARS` то же что и **disable_set_vars**
* `Aspect::INCLUDE_SOURCES` то же что и **include_sources**
### Модификаторы * `Aspect::CHECK_MTIME` то же что и **compile_check**
* `Aspect::FORCE_COMPILE` то же что и **force_compile**
Добавить модификатор:
### Модификаторы
```php
$aspect->addModifier($modifier, $callback); Добавить модификатор:
```
```php
* `$modifier` - имя модификатора $aspect->addModifier($modifier, $callback);
* `$callback` - строка с именем функции ```
### Теги * `$modifier` - имя модификатора
* `$callback` - строка с именем функции
Теги делятся на компилеры и функции.
Компилеры формируют синтаксис языка шаблона, добавляя такой функционал как foreach, if, while и т.д. В то время как функции - обычный вызов некоторой именованной функции ### Теги
Добавить компилер: Теги делятся на компилеры и функции.
Компилеры формируют синтаксис языка шаблона, добавляя такой функционал как foreach, if, while и т.д. В то время как функции - обычный вызов некоторой именованной функции
```php
$aspect->addCompiler($compiler, $parser); Добавить компилер:
```
```php
* `$compiler` - имя модификатора $aspect->addCompiler($compiler, $parser);
* `$parser` - функция разбора тега в формате function (MF\Tokenizer $tokens, MF\Aspect\Template $tpl) {} ```
Добавить блочный компилер: * `$compiler` - имя модификатора
* `$parser` - функция разбора тега в формате function (MF\Tokenizer $tokens, MF\Aspect\Template $tpl) {}
```php
$aspect->addBlockCompiler($compiler, $parsers, $tags); Добавить блочный компилер:
```php
$aspect->addBlockCompiler($compiler, $parsers, $tags);
``` ```