mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
commit
8ce6779119
@ -13,4 +13,4 @@ script:
|
|||||||
- phpunit
|
- phpunit
|
||||||
|
|
||||||
after_script:
|
after_script:
|
||||||
- CODECLIMATE_REPO_TOKEN=6739bff0f9a6eb7eaa5cfd1b086b55a3413aff24991d793b5b12da91c3803471 ./vendor/bin/test-reporter
|
- php vendor/bin/coveralls
|
@ -7,9 +7,9 @@ Fenom - Template Engine for PHP
|
|||||||
[](https://packagist.org/packages/fenom/fenom)
|
[](https://packagist.org/packages/fenom/fenom)
|
||||||
[](https://travis-ci.org/bzick/fenom)
|
[](https://travis-ci.org/bzick/fenom)
|
||||||
[](https://coveralls.io/r/bzick/fenom?branch=master)
|
[](https://coveralls.io/r/bzick/fenom?branch=master)
|
||||||
[](https://codeclimate.com/github/bzick/fenom)
|
|
||||||
[](https://packagist.org/packages/fenom/fenom)
|
[](https://packagist.org/packages/fenom/fenom)
|
||||||
## [Quick start](./docs/en/start.md) :: [Documentation](./docs/readme.md) [en](./docs/en/readme.md)/[ru](./docs/ru/readme.md) :: [Benchmark](./docs/en/benchmark.md)
|
|
||||||
|
## [Quick start](./docs/en/start.md) :: [Documentation](./docs/readme.md) [[en](./docs/en/readme.md)|[ru](./docs/ru/readme.md)] :: [Benchmark](./docs/en/benchmark.md)
|
||||||
<!-- :: [Articles](./docs/articles.md) -->
|
<!-- :: [Articles](./docs/articles.md) -->
|
||||||
|
|
||||||
### What is it
|
### What is it
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "*",
|
"phpunit/phpunit": "*",
|
||||||
"codeclimate/php-test-reporter": "dev-master"
|
"satooshi/php-coveralls": "dev-master"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": { "Fenom\\": "src/" },
|
"psr-0": { "Fenom\\": "src/" },
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Articles
|
Статьи
|
||||||
========
|
======
|
||||||
|
|
||||||
## 2013
|
## 2013
|
||||||
|
|
||||||
|
@ -50,27 +50,3 @@ $fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_INCLUDE);
|
|||||||
|
|
||||||
**Замечание**
|
**Замечание**
|
||||||
По умолчанию все параметры деактивированы.
|
По умолчанию все параметры деактивированы.
|
||||||
|
|
||||||
## Extends
|
|
||||||
|
|
||||||
### Template providers
|
|
||||||
|
|
||||||
Бывает так что шаблны не хранятся на файловой сиситеме, а хранятся в некотором хранилище, например, в базе данных MySQL.
|
|
||||||
В этом случае шаблонизатору нужно описать как забирать шаблоны из хранилища, как проверять дату изменения шаблона и где хранить кеш шаблонов (опционально).
|
|
||||||
Эту задачу берут на себя Providers, это объекты реальзующие интерфейс `Fenom\ProviderInterface`.
|
|
||||||
|
|
||||||
### Callbacks and filters
|
|
||||||
|
|
||||||
#### Before compile callback
|
|
||||||
|
|
||||||
```php
|
|
||||||
$fenom->addPreFilter(function () { /* ... */ });
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Tag filter callback
|
|
||||||
|
|
||||||
#### Filter callback
|
|
||||||
|
|
||||||
#### After compile callback
|
|
||||||
|
|
||||||
|
|
||||||
|
90
docs/ru/dev/internal.md
Normal file
90
docs/ru/dev/internal.md
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
How it work
|
||||||
|
===========
|
||||||
|
|
||||||
|
**Устарело**
|
||||||
|
|
||||||
|
## Терминология
|
||||||
|
|
||||||
|
* Исходный шаблон - изначальный вид шаблона в специальном синтаксисе
|
||||||
|
* Код шаблона - резальтат компиляции шаблона, PHP код.
|
||||||
|
* Провайдер - объект, источник исходных шаблонов.
|
||||||
|
|
||||||
|
## Классы
|
||||||
|
|
||||||
|
* `Fenom` - является хранилищем
|
||||||
|
* [шаблонов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L88)
|
||||||
|
* [модификаторов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L112)
|
||||||
|
* [фильтров](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L73)
|
||||||
|
* [тегов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L140)
|
||||||
|
* [провайдеров](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L107)
|
||||||
|
* [настройки](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L98) - маска из [опций](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L29)
|
||||||
|
* [список](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L131) разрешенных функций
|
||||||
|
|
||||||
|
а также обладает соответсвующими setter-ами и getter-ами для настройки.
|
||||||
|
* `Fenom\Tokenizer` - разбирает, при помощи [tokens_get_all](http://docs.php.net/manual/en/function.token-get-all.php), строку на токены, которые хранит [массивом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Tokenizer.php#L84).
|
||||||
|
Обладает методами для обработки токенов, работающими как с [конкретными токенами](http://docs.php.net/manual/en/tokens.php) так и с их [группами](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Tokenizer.php#L94).
|
||||||
|
* `Fenom\Render` - простейший шаблон. Хранит
|
||||||
|
* `Closure` с [PHP кодом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L30) шаблона
|
||||||
|
* [настройки](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L19)
|
||||||
|
* [зависимости](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L59)
|
||||||
|
* `Fenom\Template` - шаблон с функцией компиляции, расширен от `Fenom\Render`. Содержит различные методы для разбора выражений при помощи `Fenom\Tokenizer`.
|
||||||
|
* `Fenom\Compiler` - набор правил разбора различных тегов.
|
||||||
|
* `Fenom\Modifier` - набор модификаторов.
|
||||||
|
* `Fenom\Scope` - абстрактный уровень блочного тега.
|
||||||
|
* `Fenom\ProviderInterface` - интерфейс провадеров шаблонов
|
||||||
|
* `Fenom\Provider` - примитивный провайдер шаблонов с файловой системы.
|
||||||
|
|
||||||
|
## Процесс работы
|
||||||
|
|
||||||
|
При вызове метода `Fenom::display($template, $vars)` шаблонизатор [ищет](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L712) в своем хранилище уже загруженный шаблон.
|
||||||
|
Если шаблона [нет](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L727) - либо [загружает](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L762) код шаблона с файловой системыб либо [инициирует](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L759) его [компиляцию](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L788).
|
||||||
|
|
||||||
|
### Компиляция шаблонов
|
||||||
|
|
||||||
|
* [Создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L660) "пустой" `Fenom\Template`
|
||||||
|
* В него [загружется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L157) исходный шаблон [из провайдера](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L167)
|
||||||
|
* Исходный шаблон проходит [pre-фильтры](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L200).
|
||||||
|
* Начинается [разбор](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L196) исходного шаблона.
|
||||||
|
* [Ищется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L204) первый открывающий тег символ - `{`
|
||||||
|
* [Смотрятся](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L205) следующий за `{` символ.
|
||||||
|
* Если `}` или пробельный символ - ищется следующий символ `{`
|
||||||
|
* Если `*` - ищется `*}`, текст до которого, в последствии, вырезается.
|
||||||
|
* Ищется символ `}`. Полученный фрагмент шаблона считается тегом.
|
||||||
|
* Если [был тег](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L238) `{ignore}` название тега проверяется на закрытие этого тега.
|
||||||
|
* Для тега [создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L245) токенайзер и отдается в [диспетчер](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L488) тегов
|
||||||
|
* Диспетчер тега вызывает различные парсеры выражений, компилятор тега и возвращает PHP код (см ниже).
|
||||||
|
* Полученный фрагмент PHP кода [обрабатывается и прикрепляется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L362) к коду шаблона.
|
||||||
|
* Ищется следующий `{` символ...
|
||||||
|
* ...
|
||||||
|
* В конце проверяется токенайзер на наличие не используемых токенов, если таковые есть - выбрасывается ошибка.
|
||||||
|
* [Проверяется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L264) стек на наличие не закрытых блоковых тегов
|
||||||
|
* PHP код проходит [post-фильтры](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L282)
|
||||||
|
* Код шаблона [сохраняеться](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L799) на файлувую систему
|
||||||
|
* Код шаблона выполняется для использования
|
||||||
|
|
||||||
|
### Как работает токенайзер
|
||||||
|
|
||||||
|
Объек токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
|
||||||
|
|
||||||
|
* Код токена. Это либо число либо один символ.
|
||||||
|
* Тело токена. Содержимое токена.
|
||||||
|
* Номер строки в исходной строке
|
||||||
|
* Пробельные символы, идущие за токеном
|
||||||
|
|
||||||
|
Токенайзер обладает внутренним указателем на "текущий" токен, передвигая указатель можно получить доступ к токенам через специальные функции-проверки. Почти все функции-проверки проверяют текущее значение на соответствие кода токену. Вместо кода может быть отдан код группы токенов.
|
||||||
|
|
||||||
|
### Как работает диспетчер тегов
|
||||||
|
|
||||||
|
* Проверяет, не является выражение в токенайзере [тегом ignore](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L492).
|
||||||
|
* Проверяет, не является выражение в токенайзере [закрывающим тегом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L499).
|
||||||
|
* Проверяет, не является выражение в токенайзере [скалярным значением](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L566).
|
||||||
|
* По имени тега из [списка тегов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L140) выбирается массив и запускается [соответсвующий](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L582) парсер.
|
||||||
|
* Парсер возвращает PHP код
|
||||||
|
|
||||||
|
### Как работают парсеры
|
||||||
|
|
||||||
|
Парсер всегда получает объект токенайзера. Курсор токенайзера установлен на токен с которого начинается выражение, которое должен разобрать парсер.
|
||||||
|
Таким образом, по завершению разбора выражения, парсер должен установить курсор токенайзера на первый незнакомый ему символ.
|
||||||
|
Для примера рассмортим парсер переменной `Fenom\Template::parseVar()`.
|
||||||
|
В шаблоне имеется тег {$list.one.c|modifier:1.2}. В парсер будет отдан объект токенайзера `new Tokenizer('$list.one.c|modifier:1.2')` с токенами `$list` `.` `one` `.` `c` `|` `modifier` `:` `1.2`.
|
||||||
|
Указатель курсора установлен на токен `$list`. После разбора токенов, курсор будет установлен на `|` так как это не знакомый парсеру переменных токен. Следующий парсер может быть вызван `Fenom\Template::parseModifier()`, который распарсит модификатор.
|
22
docs/ru/dev/readme.md
Normal file
22
docs/ru/dev/readme.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Develop
|
||||||
|
=======
|
||||||
|
|
||||||
|
Если у Вас есть что обсудить или предложить создайте issue на Github или сделайте запрос на сливание.
|
||||||
|
|
||||||
|
По вопросам можете слать письмо на email : a.cobest@gmail.com (Русский и английские языки)
|
||||||
|
|
||||||
|
|
||||||
|
## Соглашение по наименованию версий
|
||||||
|
|
||||||
|
Версии именуются согласо [Semantic Versioning 2.0.0](http://semver.org/).
|
||||||
|
|
||||||
|
## Соглашение по GIT
|
||||||
|
|
||||||
|
Ветка `master` содержит стабильную последнюю версию проекта.
|
||||||
|
В ветку `master` может сливаться новая версия проекта из `develop` или исправления.
|
||||||
|
Ветка `develop`, для разработки, содержит не стабильную версию проекта. Принимает новшевства, изменения и исправления.
|
||||||
|
|
||||||
|
|
||||||
|
## Принцип работы
|
||||||
|
|
||||||
|
Разобраться в принципе работы поможе [эта схема](schema.md).
|
120
docs/ru/dev/schema.md
Normal file
120
docs/ru/dev/schema.md
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
How Fenom works
|
||||||
|
===============
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
use Fenom;
|
||||||
|
use Fenom\Render;
|
||||||
|
use Fenom\Template;
|
||||||
|
use Fenom\Tokenizer;
|
||||||
|
|
||||||
|
______________________________
|
||||||
|
| |
|
||||||
|
| Fenom::display($tpl, $var) |
|
||||||
|
|____________________________|
|
||||||
|
|
|
||||||
|
| search the template
|
||||||
|
______________|___________________________
|
||||||
|
| Template loaded into Fenom::$_storage? |
|
||||||
|
| Fenom::getTemplate($tpl) |
|
||||||
|
|________________________________________|
|
||||||
|
| |
|
||||||
|
| yes | no
|
||||||
|
______________|__________ |
|
||||||
|
| Render the template | |
|
||||||
|
| Render::display($tpl) | |
|
||||||
|
|_______________________| |
|
||||||
|
| |
|
||||||
|
| (hot start) |
|
||||||
|
| ______________________________|__________________
|
||||||
|
| | Template already compiled and stored in cache |
|
||||||
|
| | Fenom::getTemplate($template) |
|
||||||
|
| |_______________________________________________|
|
||||||
|
| | |
|
||||||
|
| | yes | no
|
||||||
|
| ____________|_______________ |
|
||||||
|
| | Load template from cache | not found |
|
||||||
|
| | Fenom::_load(...) |-------------->|
|
||||||
|
| |__________________________| |
|
||||||
|
| | |
|
||||||
|
| | found |
|
||||||
|
| ____________|___________ |
|
||||||
|
| | Validate template | invalid |
|
||||||
|
| | Render::isValid(...) |------------------>|
|
||||||
|
| |______________________| |
|
||||||
|
| | |
|
||||||
|
| | valid |
|
||||||
|
| ____________|____________ |
|
||||||
|
| | Render the template | |
|
||||||
|
|<----| Render::display(...) | |
|
||||||
|
| |_______________________| |
|
||||||
|
| |
|
||||||
|
| _____________________________ ________|___________________
|
||||||
|
| | Initialize compiler | | Compile the template |
|
||||||
|
| | Template::load($tpl) |<-----| Fenom::compile($tpl) |
|
||||||
|
| |___________________________| |__________________________|
|
||||||
|
| |
|
||||||
|
| ____________|________________
|
||||||
|
| | Load template source |
|
||||||
|
| | Provider::getSource($tpl) |
|
||||||
|
| |___________________________|
|
||||||
|
| |
|
||||||
|
| ____________|______________
|
||||||
|
| | Start compilation |
|
||||||
|
| | Template::compile($tpl) |
|
||||||
|
| |_________________________|
|
||||||
|
| |
|
||||||
|
| ____________|______________
|
||||||
|
| | Search template tag |
|
||||||
|
| | Template::compile($tpl) |<------------------------------------------------------|
|
||||||
|
| |_________________________| |
|
||||||
|
| | | |
|
||||||
|
| | not found | found |
|
||||||
|
| | _____________|_______________ _______________________________ |
|
||||||
|
| | | Tokenize the tag's code | | Parse the tag | |
|
||||||
|
| | | new Tokenizer($tag) |--->| Template::parseTag($tokens) | |
|
||||||
|
| | |___________________________| |_____________________________| |
|
||||||
|
| | | | |
|
||||||
|
| | is tag | | is expression |
|
||||||
|
| | _______________________________ | _______________|________________ |
|
||||||
|
| | | Detect tag name | | | Detect expression | |
|
||||||
|
| | | Template::parseAct($tokens) |<--- | Template::parseAct($tokens) | |
|
||||||
|
| | | Get callback by tag name | | Parse expression | |
|
||||||
|
| | | Fenom::getTag($tag_name) | | Template::parseExpr($tokens) | |
|
||||||
|
| | |_____________________________| |______________________________| |
|
||||||
|
| | | | |
|
||||||
|
| | | found | |
|
||||||
|
| | _______________|_______________ | |
|
||||||
|
| | | Invoke callback | | |
|
||||||
|
| | | Template::parseAct($tokens) | | |
|
||||||
|
| | |_____________________________| | |
|
||||||
|
| | | | |
|
||||||
|
| | _______________|________________ | |
|
||||||
|
| | | Append code to template | | |
|
||||||
|
| | | Template::_appendCode($code) |<----------------------- |
|
||||||
|
| | |______________________________| |
|
||||||
|
| | | |
|
||||||
|
| | _______________|___________ |
|
||||||
|
| | | Finalize the tag | starts search next tag |
|
||||||
|
| | | Template::compile($tpl) |>------------------------------------------------
|
||||||
|
| | |_________________________|
|
||||||
|
| |
|
||||||
|
| __|___________________________________
|
||||||
|
| | Store template to cache |
|
||||||
|
| | Fenom::compile($tpl) |
|
||||||
|
| | Store template to Fenom::$_storage |
|
||||||
|
| | Fenom::getTemplate($tpl) |
|
||||||
|
| |____________________________________|
|
||||||
|
| |
|
||||||
|
| ____________|_____________
|
||||||
|
| | Render the template |
|
||||||
|
| | Template::display(...) |
|
||||||
|
| |________________________|
|
||||||
|
| |
|
||||||
|
| | (cold start)
|
||||||
|
__|_________|________
|
||||||
|
| |
|
||||||
|
| DONE |
|
||||||
|
|___________________|
|
||||||
|
|
||||||
|
```
|
@ -1,9 +1,9 @@
|
|||||||
Extends Fenom
|
Расширение Fenom
|
||||||
=============
|
================
|
||||||
|
|
||||||
*TODO*
|
*TODO*
|
||||||
|
|
||||||
# Add tags
|
# Добавление тегов
|
||||||
|
|
||||||
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
||||||
Compilers invokes during compilation template to PHP source and have to
|
Compilers invokes during compilation template to PHP source and have to
|
||||||
@ -11,7 +11,7 @@ Compilers invokes during compilation template to PHP source and have to
|
|||||||
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
|
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
|
||||||
Среди тегов как и в HTML есть строчные и блоковые теги.
|
Среди тегов как и в HTML есть строчные и блоковые теги.
|
||||||
|
|
||||||
## Inline function
|
## Линейные функции
|
||||||
|
|
||||||
Примитивное добавление функции можно осуществить следующим образом:
|
Примитивное добавление функции можно осуществить следующим образом:
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ then
|
|||||||
```
|
```
|
||||||
Таким образом вы успешно можете добавлять Ваши функции или методы.
|
Таким образом вы успешно можете добавлять Ваши функции или методы.
|
||||||
|
|
||||||
## Block function
|
## Блоковые функции
|
||||||
|
|
||||||
Добавление блоковой функции аналогичен добавлению строковой за исключением того что есть возможность указать парсер для закрывающего тега.
|
Добавление блоковой функции аналогичен добавлению строковой за исключением того что есть возможность указать парсер для закрывающего тега.
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ $fenom->addBlockFunction(string $function_name, callable $callback[, callable $p
|
|||||||
$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */});
|
$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */});
|
||||||
```
|
```
|
||||||
|
|
||||||
## Inline compiler
|
## Линейный компилятор
|
||||||
|
|
||||||
Добавление строчного компилятора осуществляеться очень просто:
|
Добавление строчного компилятора осуществляеться очень просто:
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ $fenom->addCompilerSmart(string $compiler, $storage);
|
|||||||
|
|
||||||
`$storage` может быть как классом так и объектом. В данном случае шаблонизатор будет искать метод `tag{$compiler}`, который будет взят в качестве парсера тега.
|
`$storage` может быть как классом так и объектом. В данном случае шаблонизатор будет искать метод `tag{$compiler}`, который будет взят в качестве парсера тега.
|
||||||
|
|
||||||
## Block compiler
|
## Блоковый компилятор
|
||||||
|
|
||||||
Добавление блочного компилятора осуществяется двумя способами. Первый
|
Добавление блочного компилятора осуществяется двумя способами. Первый
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ $fenom->addBlockCompiler(string $compiler, array $parsers, array $tags);
|
|||||||
$fenom->addBlockCompilerSmart(string $compiler, $storage, array $tags, array $floats);
|
$fenom->addBlockCompilerSmart(string $compiler, $storage, array $tags, array $floats);
|
||||||
```
|
```
|
||||||
|
|
||||||
# Add modifiers
|
# Добавление модификаторов
|
||||||
|
|
||||||
```
|
```
|
||||||
$fenom->addModifier(string $modifier, callable $callback);
|
$fenom->addModifier(string $modifier, callable $callback);
|
||||||
@ -114,22 +114,55 @@ $fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
# Extends test operator
|
# Расширение тестовго оператора
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addTest($name, $code);
|
$fenom->addTest($name, $code);
|
||||||
?>
|
?>
|
||||||
```
|
```
|
||||||
|
|
||||||
# Add template provider
|
# Расширение глобальной переменной
|
||||||
|
|
||||||
Бывает так что шаблны не хранятся на файловой сиситеме, а хранятся в некотором хранилище, например, в базе данных MySQL.
|
# Источники шаблонов
|
||||||
В этом случае шаблонизатору нужно описать как забирать шаблоны из хранилища, как проверять дату изменения шаблона и где хранить кеш шаблонов (опционально).
|
|
||||||
Эту задачу берут на себя Providers, это объекты реальзующие интерфейс `Fenom\ProviderInterface`.
|
|
||||||
|
|
||||||
# Extends accessor
|
Шаблоны можно получать из самых разных источников.
|
||||||
|
Когда вы отображаете или вызываете шаблон, либо когда вы подключаете один шаблон к другому, вы указываете источник,
|
||||||
|
вместе с соответствующим путём и названием шаблона. Если источник явно не задан, то используется источник `Fenom\Provider`,
|
||||||
|
который считывает шаблоны из указанной директории.
|
||||||
|
|
||||||
# Extends cache
|
Источник шаблонов должен реализовать интерфейс `Fenom\ProviderInterface`.
|
||||||
|
Используйте метод `$fenom->setProvider(...)` что бы добавить источник в шаблонизатор, указав навание источника и, если есть необходимость,
|
||||||
|
задать директорию кеша для шаблонов из этого источника. Рассмотрим на примере, реализуем источик шаблонов из базы данных.
|
||||||
|
|
||||||
|
Создадим источник:
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
class DbProvider implements Fenom\ProviderInterface {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавляем источник, указав удобное имя.
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
$provider = new DbProvider();
|
||||||
|
$fenom->setProvider("db", $provider, "/tmp/cached/db");
|
||||||
|
```
|
||||||
|
|
||||||
|
Теперь источник можно использовать.
|
||||||
|
|
||||||
|
```php
|
||||||
|
$fenom->display("db:index.tpl", $vars);
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include "db:menu.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Расширение кеша (эксперементальное)
|
||||||
|
|
||||||
Изначально Fenom не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
|
Изначально Fenom не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
|
||||||
Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора.
|
Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора.
|
||||||
@ -150,9 +183,9 @@ For `include`:
|
|||||||
* [CacheStreamWrapper::stream_eof](http://www.php.net/manual/en/streamwrapper.stream-eof.php)
|
* [CacheStreamWrapper::stream_eof](http://www.php.net/manual/en/streamwrapper.stream-eof.php)
|
||||||
|
|
||||||
**Note**
|
**Note**
|
||||||
(On 2014-05-13) Zend OpCacher doesn't support custom protocols except `file://` and `phar://`.
|
(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддеривает другие протоколы.
|
||||||
|
|
||||||
For example,
|
Пример работы кеша
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$this->setCacheDir("redis://hash/compiled/");
|
$this->setCacheDir("redis://hash/compiled/");
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
Inheritance algorithm
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Variant #1. Sunny.
|
|
||||||
|
|
||||||
| level.2.tpl | b1 | add new block | `$tpl->block['b1'] = $content;`
|
|
||||||
| level.2.tpl | b1 | rewrite block | `$tpl->block['b1'] = $content;`
|
|
||||||
| level.1.tpl | b1 | skip because block exists | `if(!isset($tpl->block['b1'])) $tpl->block['b1'] = $content;`
|
|
||||||
| use.tpl | b1 | skip because block exists | `if(!isset($tpl->block['b1'])) $tpl->block['b1'] = $content;`
|
|
||||||
| use.tpl | b2 | add new block | `$tpl->block['b2'] = $content;`
|
|
||||||
| level.1.tpl | b2 | rewrite block | `$tpl->block['b2'] = $content;`
|
|
||||||
| parent.tpl | b1 | get block from stack
|
|
||||||
| parent.tpl | b2 | get block from stack
|
|
||||||
| parent.tpl | b3 | get own block
|
|
||||||
------Result--------
|
|
||||||
| level.2.tpl | b1 |
|
|
||||||
| level.1.tpl | b2 |
|
|
||||||
|
|
||||||
Variant #2. Сloudy.
|
|
||||||
|
|
||||||
| level.2.tpl | b1 | add new block
|
|
||||||
| level.1.tpl | b1 | skip because block exists
|
|
||||||
| use.tpl | b1 | skip because block exists
|
|
||||||
| use.tpl | b2 | add new block
|
|
||||||
| level.1.tpl | b2 | rewrite block
|
|
||||||
| $parent | b1 | dynamic extend
|
|
||||||
------Result--------
|
|
||||||
| level.2.tpl | b1 |
|
|
||||||
| level.1.tpl | b2 |
|
|
||||||
|
|
||||||
Variant #3. Rain.
|
|
||||||
|
|
||||||
Variant #4. Tornado.
|
|
@ -1,22 +0,0 @@
|
|||||||
Модификаторы [RU]
|
|
||||||
============
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
$fenom->addModifier(string $modifier, callable $callback);
|
|
||||||
```
|
|
||||||
|
|
||||||
* `$modifier` - название модификатора, которое будет использоваться в шаблоне
|
|
||||||
* `$callback` - коллбек, который будет вызван для изменения данных
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{$variable|my_modifier:$param1:$param2}
|
|
||||||
```
|
|
||||||
|
|
||||||
```php
|
|
||||||
$fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
```
|
|
@ -1,9 +0,0 @@
|
|||||||
Parsing templates [RU]
|
|
||||||
======================
|
|
||||||
|
|
||||||
### Tokenizer
|
|
||||||
|
|
||||||
Объект Tokenizer содержит список готовых к обработке токенов и необходимые для фильтрации токенов методы. Помимо основнях констант расширения Tokenizer у объекта есть макросы, объединения, определенных токенов.
|
|
||||||
|
|
||||||
### Parsers
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
Add template provider [RU]
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Источники шаблонов позволяют хранить шаблоны не только на файловой системе, а там где вам удобдно будет. Что бы указать откуда нужно взять шаблон используется схема в имени шаблона `db:page/about.tpl`, шаблон будет взят из источника `db`. Источник шаблонов добавляется через метод `addProvider`, при добавлении необходимо указать схему по которой можно запросить шаблон из этого источника:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$fenom->addProvider("db", $db_provider);
|
|
||||||
```
|
|
4
docs/ru/inheritance.md
Normal file
4
docs/ru/inheritance.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Наследование шаблонов
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Документации пока нет, почитайте на хабре пока
|
@ -1,19 +1,63 @@
|
|||||||
Modifier date_format
|
Модификатор date_format
|
||||||
====================
|
====================
|
||||||
|
|
||||||
This formats a date and time into the given [strftime()](http://docs.php.net/strftime) format.
|
Форматирует дату согласно указанному формату [strftime()](http://docs.php.net/ru/strftime).
|
||||||
Dates can be passed to Fenom as unix timestamps, DateTime objects or any string made up of month day year, parsable by [strftime()](http://docs.php.net/strftime).
|
Даты могут быть переданы в виде временных меток unix, временных меток mysql или в виде любой строки, содержащей день,
|
||||||
By default format is: `%b %e, %Y`.
|
месяц и год, которую может обработать функция [strftime()](http://docs.php.net/ru/strftime).
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$date|date_format:$format = `%b %e, %Y`}
|
||||||
|
```
|
||||||
|
|
||||||
|
Формат по умолчанию: `%b %e, %Y`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $ts = time()}
|
{var $ts = time()}
|
||||||
|
|
||||||
{$ts|date_format:"%Y/%m/%d %H:%M:%s"} outputs 2013/02/08 21:01:43
|
{$ts|date_format:"%Y/%m/%d %H:%M:%s"} выведет 2013/02/08 21:01:43
|
||||||
{$ts|date_format:"-1 day"} outputs 2013/02/07 21:01:43
|
{$ts|date_format:"-1 day"} выведет вчерашний день, например 2013/02/07 21:01:43
|
||||||
|
|
||||||
{var $date = "2008-12-08"}
|
{var $date = "2008-12-08"}
|
||||||
|
|
||||||
{$ts|date_format:"%Y/%m/%d %H:%M:%s"} outputs 2008/12/08 00:00:00
|
{$ts|date_format:"%Y/%m/%d %H:%M:%s"} выведет 2008/12/08 00:00:00
|
||||||
```
|
```
|
||||||
|
|
||||||
[Allowed quantificators](http://docs.php.net/strftime#refsect1-function.strftime-parameters) in **date_format**
|
[Конверсионные указатели](http://docs.php.net/ru/strftime#refsect1-function.strftime-parameters) в модификаторе **date_format**:
|
||||||
|
|
||||||
|
* %a - сокращенное название дня недели, в зависимости от текущей локали
|
||||||
|
* %A - полное название дня недели, в зависимости от текущей локали
|
||||||
|
* %b - сокращенное название месяца, в зависимости от текущей локали
|
||||||
|
* %B - полное название месяца, в зависимости от текущей локали
|
||||||
|
* %c - формат даты и времени по умолчанию для текущей локали
|
||||||
|
* %C - номер века (год, деленный на 100, представленный в виде целого в промежутке от 00 до 99)
|
||||||
|
* %d - день месяца в десятичном формате (от 01 до 31)
|
||||||
|
* %D - синоним %m/%d/%y
|
||||||
|
* %e - день месяца в десятичном формате без ведущего нуля (от 1 до 31)
|
||||||
|
* %g - Week-based year within century [00,99]
|
||||||
|
* %G - Week-based year, including the century [0000,9999]
|
||||||
|
* %h - синоним %b
|
||||||
|
* %H - часы по 24-часовым часам (от 00 до 23)
|
||||||
|
* %I - часы по 12-часовым часам (от 01 до 12)
|
||||||
|
* %j - день года (от 001 до 366)
|
||||||
|
* %k - часы по 24-часовым часам без ведущего нуля (от 0 до 23)
|
||||||
|
* %l - часы по 12-часовым часам без ведущего нуля (от 1 до 12)
|
||||||
|
* %m - номер месяца (от 01 до 12)
|
||||||
|
* %M - минуты
|
||||||
|
* %n - символ новой строки
|
||||||
|
* %p - `am' или `pm', в зависимости от заданного формата времени и текущей локали.
|
||||||
|
* %r - time in a.m. and p.m. notation
|
||||||
|
* %R - time in 24 hour notation
|
||||||
|
* %S - секунды
|
||||||
|
* %t - символ табуляции
|
||||||
|
* %T - время в формате %H:%M:%S
|
||||||
|
* %u - номер дня недели [1,7], где 1-ый день - понедельник
|
||||||
|
* %U - номер недели в году, считая первое воскресенья года первым днем первой недели
|
||||||
|
* %V - номер недели в году (по ISO 8601:1988) в диапазоне от 01 до 53, где первая неделя та, у которой хотя бы 4 дня находятся в данном году. Понедельник считается первым днем недели.
|
||||||
|
* %w - номер дня недели, где 0 - воскресенье
|
||||||
|
* %W - номер недели в году, считаю первый понедельник первым днем первой недели.
|
||||||
|
* %x - предпочтительное представление даты для текущих настроек locale без времени
|
||||||
|
* %X - предпочтительное представление времени для текущих настроек locale без даты
|
||||||
|
* %y - год в виде десятичного числа без века (от 00 до 99)
|
||||||
|
* %Y - год в виде десятичного числа включая век
|
||||||
|
* %Z - часовой пояс или имя или сокращение
|
||||||
|
* %% - буквальный символ `%'
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
Modifier ematch
|
Модификатор ematch
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Perform a regular expression match.
|
Выполняет проверку на соответствие регулярному выражению.
|
||||||
[Read more](http://www.php.net/manual/en/reference.pcre.pattern.syntax.php) about regular expression.
|
[Подробнее](http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php) о регулярных выражениях.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|ematch:$pattern}
|
{$string|ematch:$pattern}
|
||||||
```
|
```
|
||||||
|
|
||||||
Searches `$string` for a match to the regular expression given in `$pattern`.
|
Ищет в заданном тексте `$subject` совпадения с шаблоном `$pattern`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{if $color|ematch:'/^gr[ae]y$/i'}
|
{if $color|ematch:'/^(.*?)gr[ae]y$/i'}
|
||||||
some form of gray ...
|
какой-то оттенок серого ...
|
||||||
{/if}
|
{/if}
|
||||||
```
|
```
|
@ -1,23 +1,25 @@
|
|||||||
Modifier ereplace
|
Модификатор ereplace
|
||||||
=================
|
=================
|
||||||
|
|
||||||
Perform a regular expression search and replace.
|
Выполняет поиск и замену по регулярному выражению.
|
||||||
[Read more](http://www.php.net/manual/en/reference.pcre.pattern.syntax.php) about regular expression.
|
[Подробнее](http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php) о регулярных выражениях.
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|replace:$pattern:$replacement}
|
{$string|replace:$pattern:$replacement}
|
||||||
```
|
```
|
||||||
|
|
||||||
Searches `$string` for matches to `$pattern` and replaces them with `$replacement`.
|
Выполняет поиск совпадений в строке `$subject` с шаблоном pattern и заменяет их на replacement.
|
||||||
|
|
||||||
|
`$replacement` может содержать ссылки вида `\n`, `$n` или `${n}`, причем последний вариант предпочтительней.
|
||||||
|
Каждая такая ссылка будет заменена на подстроку, соответствующую n-ой подмаске. n может принимать значения от 0 до 99,
|
||||||
|
причем ссылка `\0` (либо $0) соответствует вхождению всего шаблона.
|
||||||
|
Подмаски нумеруются слева направо, начиная с единицы. Для использования обратного слэша, его необходимо продублировать.
|
||||||
|
|
||||||
`$replacement` may contain references of the form `\n`, `$n` or `${n}`, with the latter form being the preferred one.
|
|
||||||
Every such reference will be replaced by the text captured by the n'th parenthesized pattern. n can be from 0 to 99,
|
|
||||||
and `\0` or `$0` refers to the text matched by the whole pattern.
|
|
||||||
Opening parentheses are counted from left to right (starting from 1) to obtain the number of the capturing subpattern.
|
|
||||||
To use backslash in replacement, it must be doubled.
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $string = 'April 15, 2014'}
|
{var $string = 'April 15, 2014'}
|
||||||
|
|
||||||
{$string|ereplace:'/(\w+) (\d+), (\d+)/i':'${1}1, $3'} {* April1, 2014 *}
|
{$string|ereplace:'/(\w+) (\d+), (\d+)/i':'${1}1, $3'} {* April1, 2014 *}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Замечание:** воизбежание скрытых ошибок при выполнении сущностей регулярные выражения стоит помещать в одинарные кавычки.
|
@ -1,20 +1,19 @@
|
|||||||
Modifier escape
|
Модификатор escape
|
||||||
===============
|
===============
|
||||||
|
|
||||||
The modifier escapes a string for safe insertion into the output.
|
Используется для кодирования или экранирования спецсимволов по алгоритмам экранирования HTML, URL'ов и javascript.
|
||||||
It supports different escaping strategies depending on the template context.
|
По умолчанию активирован режим экранирования HTML.
|
||||||
By default, it uses the HTML escaping strategy:
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{$post.title|escape:'html'}
|
{$text|escape:$type = 'html':$charset = 'UTF8'}
|
||||||
```
|
```
|
||||||
|
|
||||||
The modifier supports the following escaping strategies:
|
Модификатор поддерживает несколько режимов работы
|
||||||
|
|
||||||
* html: escapes a string for the HTML body context.
|
* `html`: экранирует HTML сущности в строке.
|
||||||
* url: escapes a string for the URI or parameter contexts.
|
* `url`: экранирует строку для использования в URL.
|
||||||
* js: escapes a string for the JavaScript context.
|
* `js`: экранирует строку для использования в JavaScript.
|
||||||
|
|
||||||
For convenience, the `e` modifier is defined as an alias of `escape` modifier.
|
Модификатор `e` является псевданимом модификатора от `escape`.
|
||||||
|
|
||||||
Second parameter is charset.
|
Параметр `$charset` указывает кодировку для режима `html`.
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
Modifier esplit
|
Модификатор esplit
|
||||||
===============
|
===============
|
||||||
|
|
||||||
Split string by a regular expression.
|
Разбивает строку по регулярному выражению.
|
||||||
[Read more](http://www.php.net/manual/en/reference.pcre.pattern.syntax.php) about regular expression.
|
[Подробнее](http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php) о регулярных выражениях.
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|esplit:$pattern = '/,\s*/'}
|
{$string|esplit:$pattern = '/,\s*/'}
|
||||||
```
|
```
|
||||||
|
|
||||||
My default modifier split string by comma with spaces.
|
По умолчанию модификатор разбивает строку по запятой с возможнымиы проблеами
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $fruits1 = "banana, apple, pear"|esplit}
|
{var $fruits1 = "banana, apple, pear"|esplit}
|
||||||
$fruits1 is array ["banana", "apple", "pear"]
|
$fruits1 — массив ["banana", "apple", "pear"]
|
||||||
|
|
||||||
{var $fruits2 = "banana; apple; pear"|esplit:'/;\s/'} is ["banana", "apple", "pear"]
|
{var $fruits2 = "banana; apple; pear"|esplit:'/;\s/'} is ["banana", "apple", "pear"]
|
||||||
$fruits2 is array ["banana", "apple", "pear"] too
|
$fruits2 — массив ["banana", "apple", "pear"]
|
||||||
```
|
```
|
@ -1,7 +1,7 @@
|
|||||||
Modifier in
|
Модификатор in
|
||||||
===========
|
===========
|
||||||
|
|
||||||
The modifier is implementation of [in](../operators.md#containment-operator) operator (performs containment test).
|
Модификатор является реализацией оператора сдержания [in](../operators.md#Оператор-содержания).
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{if $number|in:[1, 3, 42]}
|
{if $number|in:[1, 3, 42]}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
Modifier split
|
Модификатор split
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Join array elements with a string.
|
Объединяет элементы массива в строку.
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|join:$delimiter = ","}
|
{$array|join:$delimiter = ","}
|
||||||
```
|
```
|
||||||
|
|
||||||
Returns an array of strings, each of which is a substring of `$string` formed by splitting it on boundaries formed by the string `$delimiter`.
|
Объединяет элементы массива с помощью строки `$delimiter`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $fruits1 = ["banana", "apple", "pear"]}
|
{var $fruits1 = ["banana", "apple", "pear"]}
|
||||||
{$fruits1|join} output banana, apple, pear
|
{$fruits1|join} выведет banana, apple, pear
|
||||||
{$fruits1|join:" is not "} output banana is not apple is not pear
|
{$fruits1|join:" is not "} выведет banana is not apple is not pear
|
||||||
```
|
```
|
@ -1,7 +1,7 @@
|
|||||||
Modifier length
|
Модификатор length
|
||||||
===============
|
===============
|
||||||
|
|
||||||
The modifier returns the number of items of a sequence or mapping, or the length of a string (works with UTF8 without `mbstring`)
|
Модификатор возвращает количество элементов массива, итератора или символов в строке (работает с UTF8).
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{if $images|length > 5}
|
{if $images|length > 5}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
Modifier lower
|
Модификатор lower
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Modifier is used to lowercase a variable or string. Have short alias `low`
|
Переводит строку в нижний регистр. Является эквивалентом функции PHP [strtolower()](http://docs.php.net/ru/lower).
|
||||||
This is equivalent to the PHP [strtolower()](http://docs.php.net/lower) function.
|
Имеет псевданим `low`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $name = "Bzick"}
|
{set $name = "Bzick"}
|
||||||
|
|
||||||
{$name} output Bzick
|
{$name} выведет Bzick
|
||||||
{$name|upper} output bzick
|
{$name|upper} выведет bzick
|
||||||
{$name|up} output bzick too
|
{$name|up} выведет bzick
|
||||||
```
|
```
|
@ -1,24 +1,26 @@
|
|||||||
Modifier match
|
Модификатор match
|
||||||
==============
|
=================
|
||||||
|
|
||||||
|
Проверяет совпадение строки с паттерном.
|
||||||
|
Среднестатистический пользователь знаком с подстановками оболочки, как минимум с самыми простыми из них - `?` и `*`,
|
||||||
|
так что использование `match` вместо `ematch` для поиска в пользовательской части сайта может быть намного удобнее для пользователей,
|
||||||
|
не являющихся программистами.
|
||||||
|
|
||||||
Match string against a pattern.
|
|
||||||
The average user may be used to shell patterns or at least in their simplest form to `?` and `*` wildcards so using `match`
|
|
||||||
instead of `ematch` for frontend search expression input may be way more convenient for non-programming users.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|match:$pattern}
|
{$string|match:$pattern}
|
||||||
```
|
```
|
||||||
|
|
||||||
Special pattern symbols:
|
Специальные символы:
|
||||||
|
|
||||||
* `?` — match one or zero unknown characters. `?at` matches `Cat`, `cat`, `Bat` or `bat`, `but` not `at`.
|
* `?` — соответствие одному или нулю любых символов. `?at` соответствует `Cat`, `cat`, `Bat` или `bat`.
|
||||||
* `*` — match any number of unknown characters. `Law*` matches `Law`, `Laws`, or `Lawyer`.
|
* `*` — соответствие любому количеству символов. `Law*` соответствует `Law`, `Laws`, или `Lawyer`.
|
||||||
* `[characters]` — Match a character as part of a group of characters. `[CB]at` matches `Cat` or `Bat` but not `cat`, `rat` or `bat`.
|
* `[characters]` — соответствие символа группе символов. `[CB]at` соответствует `Cat` или `Bat`, но не `cat`, `rat` или `bat`.
|
||||||
* `\` - Escape character. `Law\*` will only match `Law*`
|
* `\` - экрнирующийсимвол. `Law\*` будет соответвовать только `Law*`
|
||||||
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{if $color|match:"*gr[ae]y"}
|
{if $color|match:"*gr[ae]y"}
|
||||||
some form of gray ...
|
какой-то оттенок серого
|
||||||
{/if}
|
{/if}
|
||||||
```
|
```
|
@ -1,13 +1,13 @@
|
|||||||
Modifier replace
|
Модификатор replace
|
||||||
================
|
================
|
||||||
|
|
||||||
Replace all occurrences of the search string with the replacement string
|
Заменяет все вхождения строки поиска на строку замены
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|replace:$search:$replace}
|
{$string|replace:$search:$replace}
|
||||||
```
|
```
|
||||||
|
|
||||||
This modifier returns a string with all occurrences of `$search` in subject replaced with the given `$replace` value.
|
Этот модификатор возвращает строку, в котором все вхождения `$search` в `$subject` заменены на `$replace`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{$fruits|replace:"pear":"orange"}
|
{$fruits|replace:"pear":"orange"}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
Modifier split
|
Модификатор split
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Split a string by string
|
Разбивает строку с помощью разделителя
|
||||||
|
|
||||||
```
|
```
|
||||||
{$string|split:$delimiter = ","}
|
{$string|split:$delimiter = ","}
|
||||||
```
|
```
|
||||||
|
|
||||||
Returns an array of strings, each of which is a substring of `$string` formed by splitting it on boundaries formed by the string `$delimiter`.
|
Возвращает массив строк, полученных разбиением строки с использованием `$delimiter` в качестве разделителя.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $fruits1 = "banana,apple,pear"|split}
|
{var $fruits1 = "banana,apple,pear"|split}
|
||||||
|
@ -1,16 +1,27 @@
|
|||||||
Modifier strip
|
Модификатор strip
|
||||||
==============
|
==============
|
||||||
|
|
||||||
|
Заменяет все повторяющиеся пробелы, переводы строк и символы табуляции одним пробелом.
|
||||||
|
|
||||||
This replaces all repeated spaces and tabs with a single space, or with the supplied string.
|
This replaces all repeated spaces and tabs with a single space, or with the supplied string.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{" one two "|strip} => 'one two'
|
{" one two "|strip}
|
||||||
|
```
|
||||||
|
Результат обработки
|
||||||
|
```
|
||||||
|
one two
|
||||||
```
|
```
|
||||||
|
|
||||||
Optional boolean parameter tell to the modifier strip also newline
|
Опционально указывается флаг мультистрочности: `true` - тку же срезать переносы строк, `false` - срезать все кроме переносов строк.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{" multi
|
{" multi
|
||||||
line
|
line
|
||||||
text "|strip:true} => 'multi line text'
|
text "|strip:true}
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат обработки
|
||||||
|
```
|
||||||
|
multi line text
|
||||||
```
|
```
|
@ -1,16 +1,17 @@
|
|||||||
Modifier truncate
|
Модификатор truncate
|
||||||
=================
|
=================
|
||||||
|
|
||||||
Modifier truncates a variable to a character length.
|
Обрезает переменную до определенной длинны, по умолчанию - 80 символов.
|
||||||
|
В качестве необязательного второго параметра, вы можете передать строку текста, которая будет отображатся в конце обрезанной переменной. Символы этой строки не включаются в общую длинну обрезаемой строки. По умолчанию, truncate попытается обрезать строку в промежутке между словами. Если вы хотите обрезать строку строго на указаной длинне, передайте в третий необязательный параметр значение true.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{$long_string|truncate:$length:$etc:$by_words:$middle}
|
{$long_string|truncate:$length:$etc:$by_words:$middle}
|
||||||
```
|
```
|
||||||
|
|
||||||
* `$length`, required. Parameter determines how many characters to truncate to.
|
* `$length`, обязателен. Определяет максимальную длинну обрезаемой строки.
|
||||||
* `$etc`, by default `...`. This is a text string that replaces the truncated text.
|
* `$etc`, по умолчанию `...`. Текстовая строка, которая заменяет обрезанный текст. Её длинна НЕ включена в максимальную длинну обрезаемой строки.
|
||||||
* `$by_word`, by default **FALSE**. This determines whether or not to truncate at a word boundary with TRUE, or at the exact character with FALSE.
|
* `$by_word`, по умолчанию **FALSE**. Определяет, обрезать ли строку в промежутке между словами (true) или строго на указаной длинне (false).
|
||||||
* `$middle`, by default **FALSE**. This determines whether the truncation happens at the end of the string with FALSE, or in the middle of the string with TRUE.
|
* `$middle`, по умолчанию **FALSE**. Определяет, нужно ли обрезать строку в конце (false) или в середине строки (true).
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $str = "very very long string"}
|
{var $str = "very very long string"}
|
||||||
@ -19,4 +20,4 @@ Modifier truncates a variable to a character length.
|
|||||||
{$str|truncate:5:" ... ":true:true} output: very ... string
|
{$str|truncate:5:" ... ":true:true} output: very ... string
|
||||||
```
|
```
|
||||||
|
|
||||||
Modifier do not use `mbstring` when works with UTF8.
|
Модификатор работает с unicode без дополнительных расширений.
|
@ -1,5 +1,9 @@
|
|||||||
Modifier unescape
|
Модификатор unescape
|
||||||
=================
|
=================
|
||||||
|
|
||||||
`Unescape` is used to decode entity, html, js and URI. See [escape](./escape.md)
|
Модификато `unescape` является обратным действием модификатора `escape`. Так же имеет режимы `html`, `js` and `URI`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$text|unescape:$type = 'html'}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
Modifier upper
|
Модификатор upper
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Modifier is used to uppercase a variable or string. Have short alias `up`.
|
Переводит строку в верхний регистр. Является эквивалентом функции PHP [strtoupper()](http://docs.php.net/ru/strtoupper).
|
||||||
This is equivalent to the PHP [strtoupper()](http://docs.php.net/strtoupper) function.
|
Имеет псевдоним `up`.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $name = "Bzick"}
|
{var $name = "Bzick"}
|
||||||
|
|
||||||
{$name} outputs Bzick
|
{$name} выводит Bzick
|
||||||
{$name|upper} outputs BZICK
|
{$name|upper} выводит BZICK
|
||||||
{$name|up} outputs BZICK too
|
{$name|up} выводит BZICK
|
||||||
```
|
```
|
@ -1,15 +1,20 @@
|
|||||||
Documentation
|
Документация
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
||||||
### Fenom
|
### Fenom
|
||||||
|
|
||||||
* [Быстрый старт](./start.md)
|
* [Быстрый старт](./start.md)
|
||||||
* [Адаптеры для фрейморков](./adapters.md)
|
* [Адаптеры для фрейморков](./adapters.md)
|
||||||
* [Для разработчиков](./dev/readme.md)
|
* [Разработка Fenom](./dev/readme.md)
|
||||||
* [Нстройки](./configuration.md)
|
* [Настройки](./configuration.md)
|
||||||
* [Синтаксис шаблонов](./syntax.md)
|
* [Синтаксис](./syntax.md)
|
||||||
* [Операторы](./operators.md)
|
* [Переменные](./syntax.md#Переменные)
|
||||||
|
* [Значения](./syntax.md#Скалярные-значения)
|
||||||
|
* [Массивы](./syntax.md#Массивы)
|
||||||
|
* [Операторы](./operators.md)
|
||||||
|
* [Модификаторы](./syntax.md#Модификаторы)
|
||||||
|
* [Теги](./syntax.md#Теги)
|
||||||
|
* [Параметры тегов](./syntax.md#Параметры-тегов)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
@ -17,14 +22,14 @@ Documentation
|
|||||||
|
|
||||||
[Использование](./syntax.md#tags) тегов.
|
[Использование](./syntax.md#tags) тегов.
|
||||||
|
|
||||||
* [var](./tags/var.md) — определение переменной
|
* [set](./tags/set.md), `add` и `var` — определение значения переменной
|
||||||
* [if](./tags/if.md), `elseif` и `else` — условный оператор
|
* [if](./tags/if.md), `elseif` и `else` — условный оператор
|
||||||
* [foreach](./tags/foreach.md), `foreaelse`, `break` and `continue` — перебор элементов массива или объекта
|
* [foreach](./tags/foreach.md), `foreaelse`, `break` and `continue` — перебор элементов массива или объекта
|
||||||
* [for](./tags/for.md), `forelse`, `break` and `continue` — цикл
|
* [for](./tags/for.md), `forelse`, `break` and `continue` — цикл
|
||||||
* [switch](./tags/switch.md), `case`, `default` — груповой условный оператор
|
* [switch](./tags/switch.md), `case` — груповой условный оператор
|
||||||
* [cycle](./tags/cycle.md) — циклицеский перебор массива значений
|
* [cycle](./tags/cycle.md) — циклицеский перебор массива значений
|
||||||
* [include](./tags/include.md), `insert` — вставляет и испольняет указанный шаблон
|
* [include](./tags/include.md), `insert` — вставляет и испольняет указанный шаблон
|
||||||
* [extends](./tags/extends.md), `use`, `block` и `parent` — наследование шаблонов
|
* [extends](./tags/extends.md), `use`, `block` и `parent` — [наследование](./inheritance.md) шаблонов
|
||||||
* [filter](./tags/filter.md) — примение модификаторов к фрагменту шаблона
|
* [filter](./tags/filter.md) — примение модификаторов к фрагменту шаблона
|
||||||
* [ignore](./tags/ignore.md) — игнорирование тегов Fenom
|
* [ignore](./tags/ignore.md) — игнорирование тегов Fenom
|
||||||
* [macro](./tags/macro.md) и `import` — пользовательские функции шаблонов
|
* [macro](./tags/macro.md) и `import` — пользовательские функции шаблонов
|
||||||
@ -65,20 +70,25 @@ Documentation
|
|||||||
|
|
||||||
### Операторы
|
### Операторы
|
||||||
|
|
||||||
* [Арифметические операторы](./operators.md#arithmetic-operators) — `+`, `-`, `*`, `/`, `%`
|
* [Арифметические операторы](./operators.md#Арифметические-операторы) — `+`, `-`, `*`, `/`, `%`
|
||||||
* [Логические операторы](./operators.md#logical-operators) — `||`, `&&`, `!$var`, `and`, `or`, `xor`
|
* [Логические операторы](./operators.md#Логические-операторы) — `||`, `&&`, `!$var`, `and`, `or`, `xor`
|
||||||
* [Операторы сравнения](./operators.md#comparison-operators) — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>`
|
* [Операторы сравнения](./operators.md#Операторы-сравнения) — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>`
|
||||||
* [Битовые операторы](./operators.md#bitwise-operators) — `|`, `&`, `^`, `~$var`, `>>`, `<<`
|
* [Битовые операторы](./operators.md#Битовые-операторы) — `|`, `&`, `^`, `~$var`, `>>`, `<<`
|
||||||
* [Операторы присвоения](./operators.md#assignment-operators) — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=`
|
* [Операторы присвоения](./operators.md#Операторы-присвоения) — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=`
|
||||||
* [Строковый оператор](./operators.md#string-operator) — `$str1 ~ $str2`
|
* [Строковый оператор](./operators.md#Строковый-оператор) — `$str1 ~ $str2`
|
||||||
* [Тернарные операторы](./operators.md#ternary-operators) — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c`
|
* [Тернарные операторы](./operators.md#Тернарные-операторы) — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c`
|
||||||
* [Проверяющие операторы](./operators.md#check-operators) — `$var?`, `$var!`
|
* [Проверяющие операторы](./operators.md#Проверяющие-операторы) — `$var?`, `$var!`
|
||||||
* [Оператор тестирование](./operators.md#test-operator) — `is`, `is not`
|
* [Оператор тестирования](./operators.md#Оператор-тестирования) — `is`, `is not`
|
||||||
* [Оператор содержания](./operators.md#containment-operator) — `in`, `not in`
|
* [Оператор содержания](./operators.md#Оператор-содержания) — `in`, `not in`
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
### Расширение
|
### Расширение
|
||||||
|
|
||||||
|
* [Источники шаблонов](./ext/extend.md#Источники-шаблонов)
|
||||||
|
* [Добавление модификаторов](./ext/extend.md#Добавление-модификаторов)
|
||||||
|
* [Добавление тегов](./ext/extend.md#Добавление-тегов)
|
||||||
|
* [Расширение тестового оператора](./ext/extend.md#Расширение-тестовго-оператора)
|
||||||
|
* [Расширение глобальной переменной](./ext/extend.md#Расширение-глобальной-переменной)
|
||||||
* [Расширение Fenom](./ext/extend.md)
|
* [Расширение Fenom](./ext/extend.md)
|
||||||
* [Add-ons](./ext/extensions.md)
|
* [Add-ons](./ext/extensions.md)
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
Basic usage
|
Быстрый старт
|
||||||
===========
|
=============
|
||||||
|
|
||||||
## Install Fenom
|
## Установка Fenom
|
||||||
|
|
||||||
### Composer
|
### Composer
|
||||||
|
|
||||||
Add package Fenom in your require-list in `composer.json`:
|
Fenom зарегестирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom).
|
||||||
|
Что бы установить Fenom через composer пропишите в `composer.json` списке пакетов:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
@ -13,56 +14,71 @@ Add package Fenom in your require-list in `composer.json`:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
and update project's dependencies: `composer update`.
|
и обновите зависимости: `composer update`.
|
||||||
|
|
||||||
### Custom loader
|
### Custom loader
|
||||||
|
|
||||||
Clone Fenom to any directory: `git clone https://github.com/bzick/fenom.git`. Recommended use latest tag.
|
Склонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию.
|
||||||
Fenom use [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) autoloading standard. Therefore you can
|
Для загрузки классов Fenom использует [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) стандарт.
|
||||||
* use `psr-0` format in your project loader for loading Fenom's classes
|
Таким образом вы можете:
|
||||||
* or register Fenom's autoloader: `Fenom::registerAutoload();` for loading itself.
|
* использовать Ваш загрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`.
|
||||||
|
* или использовать строенный загрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя.
|
||||||
|
|
||||||
Also you can use this autoloader for loading any library with `psr-0` file naming:
|
Так же вы можете использовать встроенный в Fenom загрузчик для загрузки других классов в `psr-0` формате наименования класса и файла:
|
||||||
```php
|
```php
|
||||||
Fenom::registerAutoload(PROJECT_DIR."/src");
|
Fenom::registerAutoload(PROJECT_DIR."/classes");
|
||||||
```
|
```
|
||||||
|
|
||||||
## Setup Fenom
|
## Настройка Fenom
|
||||||
|
|
||||||
Create an object via factory method
|
Есть два варианта инициировать объект шаблонизатора: через `new` оператор и фабрику.
|
||||||
|
Пример создания Fenom через фабрику:
|
||||||
```php
|
```php
|
||||||
$fenom = Fenom::factory('/path/to/templates', '/path/to/compiled/template', $options);
|
$fenom = Fenom::factory('/path/to/templates', '/path/to/compiled/template', $options);
|
||||||
```
|
```
|
||||||
|
Пример создания Fenom через оператор `new`:
|
||||||
Create an object via `new` operator
|
|
||||||
```php
|
```php
|
||||||
$fenom = new Fenom(new Provider('/path/to/templates'));
|
$fenom = new Fenom(new Provider('/path/to/templates'));
|
||||||
$fenom->setCompileDir('/path/to/template/cache');
|
$fenom->setCompileDir('/path/to/template/cache');
|
||||||
$fenom->setOptions($options);
|
$fenom->setOptions($options);
|
||||||
```
|
```
|
||||||
|
|
||||||
* `/path/to/templates` — directory, where stores your templates.
|
* `/path/to/templates` — директория в которой хранятся шаблоны.
|
||||||
* `/path/to/template/cache` — directory, where stores compiled templates in PHP files.
|
* `/path/to/template/cache` — директория в которую Fenom будет сохранять PHP-кеш шаблонов
|
||||||
* `$options` - bit-mask or array of [Fenom settings](./configuration.md#template-settings).
|
* `$options` - битовая маска или массив [параметров](./configuration.md).
|
||||||
|
|
||||||
### Use Fenom
|
### Использование
|
||||||
|
|
||||||
|
Что бы отобразить шаблон на экран используйте метод `display`:
|
||||||
|
|
||||||
Output template
|
|
||||||
```php
|
```php
|
||||||
|
// $fenom->display(string $template, array $variables) : void
|
||||||
|
|
||||||
$fenom->display("template/name.tpl", $vars);
|
$fenom->display("template/name.tpl", $vars);
|
||||||
```
|
```
|
||||||
|
|
||||||
Get the result of rendering the template
|
Метод найдет шаблон `template/name.tpl` отрисует его в `stdout`, подставляя переменные из массива `$vars`.
|
||||||
|
|
||||||
|
Метод `fetch` возвращает вывод шаблона вместо его отображения на экран.
|
||||||
```php
|
```php
|
||||||
|
// $fenom->fetch(string $template, array $variables) : string
|
||||||
|
|
||||||
$result = $fenom->fetch("template/name.tpl", $vars);
|
$result = $fenom->fetch("template/name.tpl", $vars);
|
||||||
```
|
```
|
||||||
|
|
||||||
Create the pipeline of rendering into callback
|
Для отрисовки большого количества данных можно использовать поток
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
// $fenom->pipe(string $template, array $variables, callable $callback, int $chunk_size) : void
|
||||||
|
|
||||||
$fenom->pipe(
|
$fenom->pipe(
|
||||||
"template/sitemap.tpl",
|
"template/sitemap.tpl",
|
||||||
$vars,
|
$vars,
|
||||||
$callback = [new SplFileObject("/tmp/sitemap.xml", "w"), "fwrite"], // pipe to file /tmp/sitemap.xml
|
$callback = [new SplFileObject("compress.zlib:///tmp/sitemap.xml.gz", "w"), "fwrite"], // поток с архивацией в файл /tmp/sitemap.xml.gz
|
||||||
$chunk_size = 1e6 // chunk size for callback
|
1e6 // размер куска данных в байтах
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Поток позволяет обрабатывать большой результат по кускам, размер куска указывается в байтах аргументом `$chunk_size`.
|
||||||
|
Каждый кусок передается в `$callback` для обработки или вывода.
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
## Переменные
|
## Переменные
|
||||||
|
|
||||||
Переменные могут быть выведены на экран или могут быть использованы для функций, атрибутов, модификаторов внутри сложных выражений и т.д.
|
Переменные могут быть выведены на экран или могут быть использованы для функций, атрибутов, модификаторов внутри сложных выражений и т.д.
|
||||||
|
Переменные в Fenom представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру.
|
||||||
|
Правильное имя переменной должно начинаться с буквы или символа подчеркивания и состоять из букв, цифр и символов подчеркивания в любом количестве.
|
||||||
|
|
||||||
### Использование переменных
|
### Использование переменных
|
||||||
|
|
||||||
@ -123,13 +125,6 @@
|
|||||||
{"Hi, $username!"} выведет "Hi, Username!"
|
{"Hi, $username!"} выведет "Hi, Username!"
|
||||||
```
|
```
|
||||||
|
|
||||||
Аналогично могут быть обработаны элемент массива или свойство объекта
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{"Hi, $user.name!"}
|
|
||||||
{"Hi, $user->name!"}
|
|
||||||
```
|
|
||||||
|
|
||||||
Для чего-либо более сложного, используйте сложный синтаксис.
|
Для чего-либо более сложного, используйте сложный синтаксис.
|
||||||
|
|
||||||
##### Сложный синтаксис
|
##### Сложный синтаксис
|
||||||
@ -154,8 +149,6 @@
|
|||||||
{"Hi, {$user.name|up ~ " (admin)"}!"} выводит: Hi, USERNAME (admin)!
|
{"Hi, {$user.name|up ~ " (admin)"}!"} выводит: Hi, USERNAME (admin)!
|
||||||
```
|
```
|
||||||
|
|
||||||
but if use single quote any template expressions will be on display as it is
|
|
||||||
|
|
||||||
#### Одинарные кавычки
|
#### Одинарные кавычки
|
||||||
|
|
||||||
Простейший способ определить строку - это заключить ее в одинарные кавычки (символ `'`).
|
Простейший способ определить строку - это заключить ее в одинарные кавычки (символ `'`).
|
||||||
@ -166,10 +159,10 @@ but if use single quote any template expressions will be on display as it is
|
|||||||
это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как `\r` или `\n`, они будут выведены как есть вместо какого-либо особого поведения.
|
это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как `\r` или `\n`, они будут выведены как есть вместо какого-либо особого поведения.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{'Hi, $foo'} outputs 'Hi, $foo'
|
{'Hi, $foo'} выводит 'Hi, $foo'
|
||||||
{'Hi, {$foo}'} outputs 'Hi, {$foo}'
|
{'Hi, {$foo}'} выводит 'Hi, {$foo}'
|
||||||
{'Hi, {$user.name}'} outputs 'Hi, {$user.name}'
|
{'Hi, {$user.name}'} выводит 'Hi, {$user.name}'
|
||||||
{'Hi, {$user.name|up}'} outputs "Hi, {$user.name|up}"
|
{'Hi, {$user.name|up}'} выводит "Hi, {$user.name|up}"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Целые числа
|
### Целые числа
|
||||||
@ -189,7 +182,11 @@ but if use single quote any template expressions will be on display as it is
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Замечение**
|
**Замечение**
|
||||||
Размер целого числоа зависит от платформы, хотя, как правило, максимальное значение примерно равно 2 миллиардам (это 32-битное знаковое).
|
Двоичная запись числа (`0b1011011`) не доступна на старых версиях PHP — 5.3 или ниже.
|
||||||
|
Попытка исользовать на старых версия PHP приведет к исключению при компиляциях.
|
||||||
|
|
||||||
|
**Замечение**
|
||||||
|
Размер целого числа зависит от платформы, хотя, как правило, максимальное значение примерно равно 2 миллиардам (это 32-битное знаковое).
|
||||||
64-битные платформы обычно имеют максимальное значение около 9223372036854775807.
|
64-битные платформы обычно имеют максимальное значение около 9223372036854775807.
|
||||||
|
|
||||||
**Предупреждение**
|
**Предупреждение**
|
||||||
@ -205,216 +202,121 @@ but if use single quote any template expressions will be on display as it is
|
|||||||
{var $c = 7E-10}
|
{var $c = 7E-10}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Булев
|
||||||
|
|
||||||
|
Это простейший тип. Булевое выражает истинность значения. Он может быть либо TRUE либо FALSE.
|
||||||
|
Для указания булевого значения, используйте ключевое слово TRUE или FALSE. Оба регистро-независимы.
|
||||||
|
|
||||||
|
{set $a = true}
|
||||||
|
|
||||||
|
### NULL
|
||||||
|
|
||||||
|
Специальное значение NULL представляет собой переменную без значения. NULL - это единственно возможное значение типа null.
|
||||||
|
|
||||||
|
Обычно возникают путаницы между NULL и FALSE, так как по роли они похожи, но разлицаются по принципу:
|
||||||
|
NULL - это отсутствие присутствия, а FALSE - присутвие отсутствия.
|
||||||
|
|
||||||
### Операции
|
### Операции
|
||||||
|
|
||||||
Как и любой другой язык программирования/шаблонизации Fenom поддерживает множество различных операторов:
|
Как и любой другой язык программирования/шаблонизации Fenom поддерживает множество различных операторов:
|
||||||
|
|
||||||
* [Арифметические операторы](./operators.md#arithmetic-operators) — `+`, `-`, `*`, `/`, `%`
|
* Арифметические операторы — `+`, `-`, `*`, `/`, `%`
|
||||||
* [Логические операторы](./operators.md#logical-operators) — `||`, `&&`, `!$var`, `and`, `or`, `xor`
|
* Логические операторы — `||`, `&&`, `!$var`, `and`, `or`, `xor`
|
||||||
* [Операторы сравнения](./operators.md#comparison-operators) — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>`
|
* Операторы сравнения — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>`
|
||||||
* [Битовые операторы](./operators.md#bitwise-operators) — `|`, `&`, `^`, `~$var`, `>>`, `<<`
|
* Битовые операторы — `|`, `&`, `^`, `~$var`, `>>`, `<<`
|
||||||
* [Операторы присвоения](./operators.md#assignment-operators) — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=`
|
* Операторы присвоения — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=`
|
||||||
* [Строковый оператор](./operators.md#string-operator) — `$str1 ~ $str2`
|
* Строковый оператор — `$str1 ~ $str2`
|
||||||
* [Тернарные операторы](./operators.md#ternary-operators) — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c`
|
* Тернарные операторы — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c`
|
||||||
* [Проверяющие операторы](./operators.md#check-operators) — `$var?`, `$var!`
|
* Проверяющие операторы — `$var?`, `$var!`
|
||||||
* [Оператор тестирование](./operators.md#test-operator) — `is`, `is not`
|
* Оператор тестирование — `is`, `is not`
|
||||||
* [Оператор содержания](./operators.md#containment-operator) — `in`, `not in`
|
* Оператор содержания — `in`, `not in`
|
||||||
|
|
||||||
Подробнее об [операторах](./operators.md)
|
Подробнее об [операторах](./operators.md).
|
||||||
|
|
||||||
### Set variable
|
## Массивы
|
||||||
|
|
||||||
|
Массив (тип array) может быть создан конструкцией `[]`. В качестве параметров она принимает любое количество разделенных запятыми пар `key => value` (`ключ => значение`).
|
||||||
|
```
|
||||||
|
[
|
||||||
|
key => value,
|
||||||
|
key2 => value2,
|
||||||
|
key3 => value3,
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
Запятая после последнего элемента массива необязательна и может быть опущена.
|
||||||
|
Обычно это делается для однострочных массивов, т.е. `[1, 2]` предпочтительней `[1, 2, ]`.
|
||||||
|
Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $foo = "bar"}
|
{set $array = [
|
||||||
{var $foo = "bar"|upper} {* apply modifier *}
|
"foo" => "bar",
|
||||||
{var $foo = 5}
|
"bar" => "foo",
|
||||||
{var $foo = $x + $y}
|
]}
|
||||||
{var $foo = $x.y[z] + $y}
|
|
||||||
{var $foo = strlen($a)} {* work with functions *}
|
|
||||||
{var $foo = myfunct( ($x+$y)*3 )}
|
|
||||||
{var $foo.bar.baz = 1} {* multidimensional value support *}
|
|
||||||
{var $foo = $object->item->method($y, 'named')} {* work with object fine *}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Using block tag
|
`key` может быть либо целым числом, либо строкой. `value` может быть любого типа.
|
||||||
|
|
||||||
|
Дополнительно с ключом key будут сделаны следующие преобразования:
|
||||||
|
|
||||||
|
* Строки, содержащие целое число будут преобразованы к числу. Например, ключ со значением `"8"` будет в действительности сохранен со значением `8`. С другой стороны, значение `"08"` не будет преобразовано, так как оно не является корректным десятичным целым.
|
||||||
|
* Числа с плавающей точкой также будут преобразованы к числу, т.е. дробная часть будет отброшена. Например, ключ со значением `8.7` будет в действительности сохранен со значением `8`.
|
||||||
|
* Булев также преобразовываются к целому числу. Например, ключ со значением `true` будет сохранен со значением `1` и ключ со значением `false` будет сохранен со значением `0`.
|
||||||
|
* NULL будет преобразован к пустой строке. Например, ключ со значением `null` будет в действительности сохранен со значением `""`.
|
||||||
|
* Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).
|
||||||
|
|
||||||
|
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
|
||||||
|
|
||||||
|
Параметр `key` является необязательным. Если он не указан, Fenom будет использовать предыдущее наибольшее значение целочисленного ключа, увеличенное на 1.
|
||||||
|
|
||||||
|
Существующий массив может быть изменен явной установкой значений в нем.
|
||||||
|
Это выполняется присвоением значений массиву с указанием в скобках ключа или после точки.
|
||||||
|
Кроме того, используя скобки, вы можете опустить ключ.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $foo}
|
{set $arr.key = value}
|
||||||
content {$text|truncate:30}
|
{set $arr[] = value} {* будет взят максимальный целочисленый ключ, увеличенный на 1 *}
|
||||||
{/var}
|
|
||||||
{var $foo|truncate:50} {* apply modifier to content *}
|
|
||||||
content {$text}
|
|
||||||
{/var}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Set array
|
Если массив `$arr` еще не существует, он будет создан. Таким образом, это еще один способ определить массив.
|
||||||
|
Однако такой способ применять не рекомендуется, так как если переменная `$arr` уже содержит некоторое значение (например, строку),
|
||||||
|
то это значение останется на месте и `[]` может на самом деле означать доступ к символу в строке. Лучше инициализировать переменную путем явного присваивания значения.
|
||||||
|
|
||||||
```smarty
|
## Модификаторы
|
||||||
{var $foo = [1, 2, 3]} numeric array
|
|
||||||
{var $foo = ['y' => 'yellow', 'b' => 'blue']} associative array
|
|
||||||
{var $foo = [1, [9, 8], 3]} can be nested
|
|
||||||
{var $foo = [1, $two, $three * 3 + 9]}
|
|
||||||
{var $foo = [$a, $d.c, $a + $f]}
|
|
||||||
{var $foo = ['y' => 'yellow', $color|upper => $colors[ $color ]}
|
|
||||||
{var $foo = [1, [$parent, $a->method()], 3]}
|
|
||||||
```
|
|
||||||
|
|
||||||
See also [{var}](./tags/var.md) documentation.
|
Модификаторы переменных могут быть прмменены к переменным, пользовательским функциям или строкам.
|
||||||
|
Для их применения надо после модифицируемого значения указать символ `|` (вертикальная черта) и название модификатора.
|
||||||
|
Так же модификаторы могут принимать параметры, которые влияют на их поведение.
|
||||||
### Static method support
|
Эти параметры следуют за названием модификатора и разделяются `:` (двоеточием).
|
||||||
|
Кроме того, по умолчанию все функции PHP могут быть использованы в качестве модификаторов (что можно отключить в настройках) и модификаторы можно комбинировать.
|
||||||
```smarty
|
|
||||||
{Lib\Math::multiple x=3 y=4} static method as tag
|
|
||||||
{Lib\Math::multiple(3,4)} inline static method
|
|
||||||
{12 + Lib\Math::multiple(3,4)}
|
|
||||||
{12 + 3|Lib\Math::multiple:4} static method as modifier
|
|
||||||
```
|
|
||||||
|
|
||||||
You may disable call static methods in template, see in [security options](./settings.md) option `deny_static`
|
|
||||||
|
|
||||||
### Set variable
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $foo = "bar"}
|
|
||||||
{var $foo = "bar"|upper} {* apply modifier *}
|
|
||||||
{var $foo = 5}
|
|
||||||
{var $foo = $x + $y}
|
|
||||||
{var $foo = $x.y[z] + $y}
|
|
||||||
{var $foo = strlen($a)} {* work with functions *}
|
|
||||||
{var $foo = myfunct( ($x+$y)*3 )}
|
|
||||||
{var $foo.bar.baz = 1} {* multidimensional value support *}
|
|
||||||
{var $foo = $object->item->method($y, 'named')} {* work with object fine *}
|
|
||||||
```
|
|
||||||
|
|
||||||
Using block tag
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $foo}
|
|
||||||
content {$text|truncate:30}
|
|
||||||
{/var}
|
|
||||||
{var $foo|truncate:50} {* apply modifier to content *}
|
|
||||||
content {$text}
|
|
||||||
{/var}
|
|
||||||
```
|
|
||||||
|
|
||||||
Set array
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $foo = [1, 2, 3]} numeric array
|
|
||||||
{var $foo = ['y' => 'yellow', 'b' => 'blue']} associative array
|
|
||||||
{var $foo = [1, [9, 8], 3]} can be nested
|
|
||||||
{var $foo = [1, $two, $three * 3 + 9]}
|
|
||||||
{var $foo = [$a, $d.c, $a + $f]}
|
|
||||||
{var $foo = ['y' => 'yellow', $color|upper => $colors[ $color ]}
|
|
||||||
{var $foo = [1, [$parent, $a->method()], 3]}
|
|
||||||
```
|
|
||||||
|
|
||||||
See also [{var}](./tags/var.md) documentation.
|
|
||||||
|
|
||||||
|
|
||||||
## Scalar values
|
|
||||||
|
|
||||||
### Strings
|
|
||||||
|
|
||||||
When the string in double quotation marks, all the expressions in the string will be run.
|
|
||||||
The result of expressions will be inserted into the string instead it.
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $foo="Username"}
|
|
||||||
{var $user.name="Username"}
|
|
||||||
{"Hi, $foo"} outputs "Hi, Username"
|
|
||||||
{"Hi, {$foo}"} outputs "Hi, Username"
|
|
||||||
{"Hi, {$user.name}"} outputs "Hi, Username"
|
|
||||||
{"Hi, {$user.name|up}"} outputs "Hi, USERNAME"
|
|
||||||
{"Hi, {$user->getName(true)}"} outputs Hi, Username
|
|
||||||
{var $message = "Hi, {$user.name}"}
|
|
||||||
```
|
|
||||||
|
|
||||||
but if use single quote any template expressions will be on display as it is
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{'Hi, $foo'} outputs 'Hi, $foo'
|
|
||||||
{'Hi, {$foo}'} outputs 'Hi, {$foo}'
|
|
||||||
{'Hi, {$user.name}'} outputs 'Hi, {$user.name}'
|
|
||||||
{'Hi, {$user.name|up}'} outputs "Hi, {$user.name|up}"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Numbers
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{2|pow:10}
|
|
||||||
{var $magick = 5381|calc}
|
|
||||||
{0.2|round}
|
|
||||||
{1e-6|round}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Modifiers
|
|
||||||
|
|
||||||
* Modifiers allows change some value before output or using.
|
|
||||||
* To apply a modifier, specify the value followed by a `|` (pipe) and the modifier name.
|
|
||||||
* A modifier may accept additional parameters that affect its behavior. These parameters follow the modifier name and are separated by a `:` (colon).
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{var $foo="User"}
|
{var $foo="User"}
|
||||||
{$foo|upper} outputs "USER"
|
{$foo|upper} выведет "USER"
|
||||||
{$foo|lower} outputs "user"
|
{$foo|lower} выведет "user"
|
||||||
{"{$foo|lower}"} outputs "user"
|
{"{$foo|lower}"} выведет "user"
|
||||||
{"User"|lower}} outputs "user"
|
{"User"|lower}} выведет "user"
|
||||||
{$looong_text|truncate:80:"..."} truncate the text to 80 symbols and append <continue> symbols, like "..."
|
{$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит символы "..."
|
||||||
{$looong_text|lower|truncate:$settings.count:$settings.etc}
|
{$looong_text|lower|truncate:$settings.count:$settings.etc}
|
||||||
{var $foo="Ivan"|upper} sets $foo value "USER"
|
{set $foo="Ivan"|upper} значение переменной $foo будет "USER"
|
||||||
```
|
```
|
||||||
|
|
||||||
[List of modifiers](./main.md#modifiers)
|
## Теги
|
||||||
|
|
||||||
## Tags
|
Все сущности шаблона можно разжелить на две группы:
|
||||||
|
|
||||||
Basically, tag seems like
|
* заполнитель (placeholder) — вывод переменной в шаблоне, например `{$name}`
|
||||||
|
* тег — конструкция выполняющаяя некоторые действия, выглядит как именованный заполнитель (placeholder), например `{include $name}`
|
||||||
|
|
||||||
```smarty
|
Теги так же можно разделить на две группы:
|
||||||
{FUNCNAME attr1 = "val1" attr2 = $val2}
|
|
||||||
```
|
|
||||||
|
|
||||||
Tags starts with name and may have attributes
|
* Функии. Тег функции вызывает пользовательскую во время выполнения шаблона, результат функции будет выведен вместо тега.
|
||||||
|
Пользовательские функции являются дополнительными и могут быть индивидуальными. Они могут быть изменены по вашему желанию, также вы можете создать новые.
|
||||||
|
* Компиляторы. В отличии от функций компиляторы вызываются во время компиляции шаблона и возвращают PHP код, который описывает некоторое действие.
|
||||||
|
Компиляторы и формируют основные конструкции типа `if`, `foreach` и т.д.
|
||||||
|
|
||||||
Это общий формат функций, но могут быть исключения, например функция [{var}](./tags/var.md), использованная выше.
|
### Игнорирование кода
|
||||||
|
|
||||||
```smarty
|
|
||||||
{include file="my.tpl"}
|
|
||||||
{var $foo=5}
|
|
||||||
{if $user.loggined}
|
|
||||||
Welcome, <span style="color: red">{$user.name}!</span>
|
|
||||||
{else}
|
|
||||||
Who are you?
|
|
||||||
{/if}
|
|
||||||
```
|
|
||||||
|
|
||||||
В общем случае аргументы принимают любой формат переменных, в том числе результаты арифметических операций и модификаторов.
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{funct arg=true}
|
|
||||||
{funct arg=5}
|
|
||||||
{funct arg=1.2}
|
|
||||||
{funct arg='string'}
|
|
||||||
{funct arg="string this {$var}"}
|
|
||||||
{funct arg=[1,2,34]}
|
|
||||||
{funct arg=$x}
|
|
||||||
{funct arg=$x.c}
|
|
||||||
```
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{funct arg="ivan"|upper}
|
|
||||||
{funct arg=$a.d.c|lower}
|
|
||||||
```
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{funct arg=1+2}
|
|
||||||
{funct arg=$a.d.c+4}
|
|
||||||
{funct arg=($a.d.c|count+4)/3}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ignoring template code
|
|
||||||
|
|
||||||
В шаблонизаторе Fenom используются фигурные скобки для отделения HTML от кода Fenom.
|
В шаблонизаторе Fenom используются фигурные скобки для отделения HTML от кода Fenom.
|
||||||
Если требуется вывести текст, содержащий фигурные скобки, то есть следующие варианты это сделать:
|
Если требуется вывести текст, содержащий фигурные скобки, то есть следующие варианты это сделать:
|
||||||
@ -459,7 +361,7 @@ Outputs
|
|||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Whitespaces
|
### Пробелы
|
||||||
|
|
||||||
Шаблонизатор допускает любое количество пробелов или переносов строк в своём коде
|
Шаблонизатор допускает любое количество пробелов или переносов строк в своём коде
|
||||||
|
|
||||||
@ -483,14 +385,14 @@ Outputs
|
|||||||
{/foreach}
|
{/foreach}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tag options
|
### Параметры тегов
|
||||||
|
|
||||||
| name | code | type | description |
|
| имя | код | тип тега | описание |
|
||||||
| ------- | ---- | ----- | ------------ |
|
| ------- | ---- | --------- | ------------ |
|
||||||
| strip | s | block | enable `strip` option for a block of the template |
|
| strip | s | блокоый | активирует удаление лишних пробелов на подобии модфикатора `strip` |
|
||||||
| raw | a | any | ignore escape option |
|
| ignore | i | блокоый | парсер будет игнорировать любой Fenom синтаксис на контент блокового тега |
|
||||||
| escape | e | any | force escape |
|
| raw | a | любой | отключает экранирование |
|
||||||
| ignore | i | block | ignore Fenom syntax |
|
| escape | e | любой | принудительно активирует экранирование |
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{script:ignore} ... {/script}
|
{script:ignore} ... {/script}
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
Tag {autoescape}
|
Тег {autoescape}
|
||||||
=====================
|
================
|
||||||
|
|
||||||
Force enable or disable `auto_escape` option for block area:
|
Задает индивидуальное значение параметра `auto_escape` на фрагмент шаблона:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{autoescape true}
|
{autoescape true}
|
||||||
...
|
...
|
||||||
Text: {$text} {* value of the variable $text will be escaped *}
|
Text: {$text} {* значение переменной $text будет заэкранированно *}
|
||||||
...
|
...
|
||||||
{/autoescape}
|
{/autoescape}
|
||||||
```
|
```
|
||||||
|
|
||||||
Also see {raw} tag and :raw tag option
|
Так же смотите тег [{raw}](./raw.md) и параметр тега [:raw](../configuration.md)
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
Tag {autotrim}
|
Тег {autotrim}
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Force enable or disable `auto_trim` option for block area:
|
Задает индивидуальное значение параметра `auto_trim` на фрагмент шаблона:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{autotrim true}
|
{autotrim true}
|
||||||
...
|
...
|
||||||
Text: {$text} {* value of the variable $text will be escaped *}
|
Text: {$text}
|
||||||
...
|
...
|
||||||
{/autotrim}
|
{/autotrim}
|
||||||
```
|
```
|
||||||
|
|
||||||
Also see :trim, :rtrim and :ltrim tag options
|
|
@ -1,13 +1,16 @@
|
|||||||
Tag {cycle}
|
Тег {cycle}
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
Тег {cycle} используется для прохода через множество значений.
|
||||||
|
С его помощью можно легко реализовать чередование двух или более заданных значений.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{for $i=$a.c..}
|
{for $i=1 to=6}
|
||||||
<div class="{cycle ["odd", "even"]}">
|
<div class="{cycle ["odd", "even"]}">
|
||||||
{/for}
|
{/for}
|
||||||
|
|
||||||
|
|
||||||
{for $i=$a.c..}
|
{for $i=1 to=6}
|
||||||
<div class="{cycle ["odd", "even"] index=$i}">
|
<div class="{cycle ["odd", "even"] index=$i}">
|
||||||
{/for}
|
{/for}
|
||||||
```
|
```
|
@ -1,7 +1,7 @@
|
|||||||
Tag {extends} [RU]
|
Тег {extends}
|
||||||
==================
|
=============
|
||||||
|
|
||||||
Тег `{extends}` реализует наследование шаблонов, иерархия, обратная {include}. То есть шаблон сам выбирает своего родителя.
|
Тег `{extends}` реализует [наследование](../inheritance.md) шаблонов, иерархия, обратная {include}. То есть шаблон сам выбирает своего родителя.
|
||||||
|
|
||||||
### {extends}
|
### {extends}
|
||||||
|
|
||||||
@ -11,15 +11,15 @@ Tag {extends} [RU]
|
|||||||
{extends 'parent.tpl'}
|
{extends 'parent.tpl'}
|
||||||
```
|
```
|
||||||
|
|
||||||
Имя родительского шаблона может быть задан динамически, в этом случае производительность отрисовки может снизиться.
|
**Замечание:**
|
||||||
|
Имя родительского шаблона может быть задан динамически, но в этом случае производительность шаблона значительно снижается.
|
||||||
```smarty
|
```smarty
|
||||||
{extends $parent_tpl}
|
{extends $parent_tpl}
|
||||||
```
|
```
|
||||||
|
|
||||||
### {block}
|
### {block}
|
||||||
|
|
||||||
Блок указывает фрагмент шаблона, который будет передан родителю. Имя блока может быть задано как явно
|
Блок указывает фрагмент шаблона, который будет передан родителю. Имя блока должно быть задано явно:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{block bk1}content 1{/block}
|
{block bk1}content 1{/block}
|
||||||
@ -27,17 +27,6 @@ Tag {extends} [RU]
|
|||||||
{block 'bk2'}content 2{/block}
|
{block 'bk2'}content 2{/block}
|
||||||
```
|
```
|
||||||
|
|
||||||
так и не явно, но в данном случае пострадает производительность
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{block "bk{$number}"}content {$number}{/block}
|
|
||||||
...
|
|
||||||
{if $condition}
|
|
||||||
{block "bk-if"}content, then 'if' is true{/block}
|
|
||||||
{else}
|
|
||||||
{block "bk{$fail}"}content, then 'if' is false{/block}
|
|
||||||
{/if}
|
|
||||||
```
|
|
||||||
|
|
||||||
### {use}
|
### {use}
|
||||||
|
|
||||||
@ -47,11 +36,8 @@ Tag {extends} [RU]
|
|||||||
{use 'blocks.tpl'}
|
{use 'blocks.tpl'}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### {parent}
|
### {parent}
|
||||||
|
|
||||||
Planned. Not supported yet. Feature #5.
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{block 'block1'}
|
{block 'block1'}
|
||||||
content ...
|
content ...
|
||||||
@ -59,24 +45,3 @@ Planned. Not supported yet. Feature #5.
|
|||||||
content ...
|
content ...
|
||||||
{/block}
|
{/block}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Performance
|
|
||||||
|
|
||||||
Алгоритм реализации наследования шаблонов может работать в разных режимах, в зависимости от условий.
|
|
||||||
Каждый режим имеет свою производительность.
|
|
||||||
|
|
||||||
1. **Максимальная** производительность:
|
|
||||||
* Имена шаблонов в теге {extends } заданы явно, без использования переменных и условий.
|
|
||||||
* Имена блоков заданы явно, без использования переменных, условий и не вложены ни в какой другой тег.
|
|
||||||
2. **Средняя** производительность:
|
|
||||||
* Имена шаблонов в теге {extends } заданы явно, без использования переменных и условий.
|
|
||||||
* Имена блоков заданы **не** явно, с использованием переменныч, условий или могут быть вложенные в другие теги.
|
|
||||||
3. **Низкая** производительность:
|
|
||||||
* Имена шаблонов в теге {extends } заданы **не** явно, с использованием переменных и условий.
|
|
||||||
* Имена блоков заданы явно, без использования переменных, условий и не вложены ни в какой другой тег.
|
|
||||||
4. **Минимальная** производительность:
|
|
||||||
* Имена шаблонов в теге {extends } заданы **не** явно, с использованием переменных и условий.
|
|
||||||
* Имена блоков заданы **не** явно, с использованием переменных, условий или могут быть вложенные в другие теги.
|
|
||||||
|
|
||||||
Режим может идти только на понижение, при изменении условий во время прохождения по иерархии шаблонов.
|
|
||||||
При любом режиме работы не используется буферизация данных, то есть данные выводятся сразу.
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Tags {filter}
|
Тег {filter}
|
||||||
=============
|
=============
|
||||||
|
|
||||||
Позволяет применить модификаторы на фрагмент шаблона
|
Тег {filter} позволяет применить модификаторы на фрагмент шаблона
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{filter|strip_tags|truncate:20}
|
{filter|strip_tags|truncate:20}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Tag {for}
|
Тег {for}
|
||||||
=========
|
=========
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
Tag {foreach} [RU]
|
Тег {foreach}
|
||||||
==================
|
=============
|
||||||
|
|
||||||
|
Тег `foreach` предоставляет простой способ перебора массивов.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{foreach $list as [$key =>] $value [index=$index] [first=$first] [last=$last]}
|
{foreach $list as [$key =>] $value [index=$index] [first=$first] [last=$last]}
|
||||||
@ -81,6 +83,5 @@ Tag {foreach} [RU]
|
|||||||
|
|
||||||
В блоке `{foreachelse}...{/foreach}` использование `{break}`, `{continue}` выбросит исключение `Fenom\CompileException` при компиляции
|
В блоке `{foreachelse}...{/foreach}` использование `{break}`, `{continue}` выбросит исключение `Fenom\CompileException` при компиляции
|
||||||
|
|
||||||
### Notice
|
**Замечание:**
|
||||||
|
|
||||||
Использование last требует от `$list` быть **countable**.
|
Использование last требует от `$list` быть **countable**.
|
@ -1,5 +1,5 @@
|
|||||||
Tag {if} [RU]
|
Тег {if}
|
||||||
=============
|
========
|
||||||
|
|
||||||
Реализация оператора [if](http://docs.php.net/if) из PHP
|
Реализация оператора [if](http://docs.php.net/if) из PHP
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ Tag {if} [RU]
|
|||||||
{/if}
|
{/if}
|
||||||
```
|
```
|
||||||
|
|
||||||
Код, расположенный после тега `{elseif}` будет выполнен/выведен, если выражение <expression1> вернуло значение приводимое к **FALSE**, <expression2> - приводимое к **TRUE**
|
Код, расположенный после тега `{elseif}` будет выполнен/выведен, если выражение <expression1> вернуло значение приводимое к **FALSE**, а <expression2> - приводимое к **TRUE**
|
||||||
|
|
||||||
### {else}
|
### {else}
|
||||||
|
|
||||||
@ -46,4 +46,4 @@ Tag {if} [RU]
|
|||||||
```
|
```
|
||||||
|
|
||||||
Код, расположенный после тега `{else}` будет выполнен/выведен, если выражение <expression> вернуло значение приводимое к **FALSE**
|
Код, расположенный после тега `{else}` будет выполнен/выведен, если выражение <expression> вернуло значение приводимое к **FALSE**
|
||||||
В тестируемых выражениях могут быть использованы логические операторы , что позволяет обрабатывать сочетания нескольких условий.
|
В тестируемых выражениях могут быть использованы логические операторы, что позволяет обрабатывать сочетания нескольких условий.
|
@ -1,9 +1,9 @@
|
|||||||
Tag {ignore}
|
Тег {ignore}
|
||||||
============
|
============
|
||||||
|
|
||||||
{ignore} tags allow a block of data to be taken literally.
|
Теги `{ignore}{/ignore}` позволяют игнорировать заключенные в них другие теги.
|
||||||
This is typically used around Javascript or stylesheet blocks where {curly braces} would interfere with the template delimiter syntax.
|
Весь текст внутри тегов `{ignore}{/ignore}` не интерпретируется, а выводится "как есть".
|
||||||
Anything within {ignore}{/ignore} tags is not interpreted, but displayed as-is.
|
Обычно они используются вместе с javascript или таблицами стилей, в которых фигурные скобки конфликтуют с синтаксисом разделителей.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{ignore}
|
{ignore}
|
||||||
@ -11,8 +11,8 @@ Anything within {ignore}{/ignore} tags is not interpreted, but displayed as-is.
|
|||||||
{/ignore}
|
{/ignore}
|
||||||
```
|
```
|
||||||
|
|
||||||
{ignore} tags are normally not necessary, as Fenom ignores delimiters that are surrounded by whitespace.
|
Использование тегов {ignore} не всегда обязательное так как Fenom игнорирует фигурные скобки `{` сразу после которых идут пробельные символы.
|
||||||
Be sure your javascript and CSS curly braces are surrounded by whitespace:
|
Убедитесь что открывающие фигурные скобки в JavaScript и CSS имеют хотя бы по пробелу справа:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
var data = { "time": obj.ts };
|
var data = { "time": obj.ts };
|
||||||
|
@ -1,29 +1,35 @@
|
|||||||
Tag {include}
|
Тег {include}
|
||||||
=============
|
=============
|
||||||
|
|
||||||
`{include}` tags are used for including other templates in the current template. Any variables available in the current template are also available within the included template.
|
Тэги `{include}` используются для включения других шаблонов в текущий. Любые переменные, доступные в текущем шаблоне, доступны и во включаемом.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{include "about.tpl"}
|
{include "about.tpl"}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you need to set yours variables for template list them in attributes.
|
Вы также можете передать переменные в подключаемый шаблон в виде атрибутов.
|
||||||
|
Любая переменная, переданная в подключаемый шаблон, доступны только в области видимости подключаемого файла.
|
||||||
|
Переданные переменные имеют преимущество перед существующими переменными с аналогичными именами.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{include "about.tpl" page=$item limit=50}
|
{include "pagination.tpl" count=$total_pages current=$.get.page}
|
||||||
```
|
```
|
||||||
|
|
||||||
All variables changed in child template has no affect to variables in parent template.
|
Все значения присвоенных переменных восстанавливаются после того, как подключаемый шаблон отработал.
|
||||||
|
Это значит, что вы можете использовать все переменные из подключающего шаблона в подключаемом, но изменения переменных внутри подключаемого шаблона не будут видны внутри подключающего шаблона после команды {include}.
|
||||||
|
|
||||||
### {insert}
|
### {insert}
|
||||||
|
|
||||||
The tag insert template code instead self.
|
В отличии от `{include}` тег `{insert}` не вызывает дочерний шаблон во время отрисовки, в ставляет код дочернего шаблона в родительский на момент компиляции.
|
||||||
|
Это позволяет сэкономить ресурсы на проверке и чтении шаблона. Однако такой формат подключения шаблона имеет ограничения.
|
||||||
|
Имя шаблона должно быть задано явно, без использования переменных и выражений:
|
||||||
|
|
||||||
* No dynamic name allowed.
|
```smarty
|
||||||
* No variables as attribute allowed.
|
{insert 'pagination.tpl'} {* отработает *}
|
||||||
* Increase performance because insert code as is in compilation time.
|
{insert $pagination} {* вызовет ошибку *}
|
||||||
|
```
|
||||||
|
|
||||||
For example, main.tpl:
|
Рассмотрим тега `{insert}` на примере. Допустим шаблон `main.tpl` имеет следующий код:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
a: {$a}
|
a: {$a}
|
||||||
@ -31,13 +37,13 @@ a: {$a}
|
|||||||
c: {$c}
|
c: {$c}
|
||||||
```
|
```
|
||||||
|
|
||||||
b.tpl:
|
`b.tpl`:
|
||||||
|
|
||||||
```
|
```
|
||||||
b: {$b}
|
b: {$b}
|
||||||
```
|
```
|
||||||
|
|
||||||
Code of `b.tpl` will be inserted into `main.tpl` as is:
|
Компилятор увидит шаблон `main.tpl` таким:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
a: {$a}
|
a: {$a}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Tag {macro} [RU]
|
Тег {macro}
|
||||||
================
|
===========
|
||||||
|
|
||||||
Макросы - фрагмент шаблона который можно повторить сколь угодно раз и в каком угодно месте.
|
Макросы - фрагмент шаблона который можно повторить сколь угодно раз и в каком угодно месте.
|
||||||
Макросы не имеют общего пространства имен с шаблоном и могут оперировать только переданными переменными.
|
Макросы не имеют общего пространства имен с шаблоном и могут оперировать только переданными переменными.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Tag {raw}
|
Тег {raw}
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Tag `{raw <expression>}` allow outputs render results without escaping.
|
Тег `{raw <expression>}` позволяет вывести результат выражения без экранирования.
|
||||||
This tag rewrite global option `auto_escape` for specified code.
|
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{autoescape true}
|
{autoescape true}
|
||||||
@ -16,7 +16,7 @@ This tag rewrite global option `auto_escape` for specified code.
|
|||||||
{/autoescate}
|
{/autoescate}
|
||||||
```
|
```
|
||||||
|
|
||||||
For functions use tag with prefix `raw:`:
|
Для функций используйте параметр тега `:raw`:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{autoescape true}
|
{autoescape true}
|
||||||
@ -26,5 +26,3 @@ For functions use tag with prefix `raw:`:
|
|||||||
...
|
...
|
||||||
{/autoescape}
|
{/autoescape}
|
||||||
```
|
```
|
||||||
|
|
||||||
Tag can not be applied to compilers as `foreach`, `if` and other.
|
|
||||||
|
81
docs/ru/tags/set.md
Normal file
81
docs/ru/tags/set.md
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
Тег {set}
|
||||||
|
=========
|
||||||
|
|
||||||
|
### {set}
|
||||||
|
|
||||||
|
Тег {set} используется для установки значения переменной в процессе выполнения шаблона.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $var=(expr)}
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $var}
|
||||||
|
... any content ...
|
||||||
|
{/set}
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $var|modifiers}
|
||||||
|
... any content ...
|
||||||
|
{/set}
|
||||||
|
```
|
||||||
|
|
||||||
|
Имя переменной `$var` должно соответствовать [принятому правилу именования переменных](../syntax.md#Переменные).
|
||||||
|
Выражение `expr` может быть любое сочетание [переменных](../syntax.md#Переменные), [скалярных значений](../syntax.md#Скалярные+значения) и массивов.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $v = 5}
|
||||||
|
{set $v = "value"}
|
||||||
|
{set $v = $x+$y}
|
||||||
|
{set $v = 4}
|
||||||
|
{set $v = $z++ + 1}
|
||||||
|
{set $v = --$z}
|
||||||
|
{set $v = $y/$x}
|
||||||
|
{set $v = $y-$x}
|
||||||
|
{set $v = $y*$x-2}
|
||||||
|
{set $v = ($y^$x)+7}
|
||||||
|
|
||||||
|
{set $v = [1,2,3]}
|
||||||
|
{set $v = []}
|
||||||
|
{set $v = ["one"|upper => 1, 4 => $x, "three" => 3]}
|
||||||
|
{set $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]}
|
||||||
|
|
||||||
|
{set $v = count([1,2,3])+7}
|
||||||
|
```
|
||||||
|
|
||||||
|
В качестве значения переменной можно задать результат отрисовки фрагмента шаблона:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $v}
|
||||||
|
Some long {$text|trim}
|
||||||
|
{/var}
|
||||||
|
```
|
||||||
|
|
||||||
|
Такой вариант создания позволяет применить модификаторы к данным переде тем как они будут сохранены в переменную:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{set $v|escape} {* применение можификатора к значению *}
|
||||||
|
Some long {$text|trim}
|
||||||
|
{/var}
|
||||||
|
```
|
||||||
|
|
||||||
|
### {add}
|
||||||
|
|
||||||
|
Тег {add} делает тоже самое что и тег {set} за исключением того что сначало проверяет наличие переменной и если переменной нет — задет новое значение.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{add $var = 'value'}
|
||||||
|
```
|
||||||
|
Работу тега можнно описать следующим образом:
|
||||||
|
```smarty
|
||||||
|
{if $var is not set}
|
||||||
|
{set $var = 'value'}
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
### {var}
|
||||||
|
|
||||||
|
Тег {var} старое название тега {set}, сейчас это одно и тоже.
|
||||||
|
|
||||||
|
|
@ -1,46 +1,61 @@
|
|||||||
Tag {switch}
|
Тег {switch}
|
||||||
============
|
============
|
||||||
|
|
||||||
The `{switch}` tag is similar to a series of `{if}` statements on the same expression.
|
Тег `{switch}` подобен серии операторов `{if}` с одинаковым условием.
|
||||||
In many occasions, you may want to compare the same variable (or expression) with many different values,
|
Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений,
|
||||||
and execute a different piece of code depending on which value it equals to. This is exactly what the `{switch}` tag is for.
|
и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение).
|
||||||
|
Это именно тот случай, для которого удобен тег `{switch}`.
|
||||||
|
|
||||||
Tag `{switch}` accepts any expression. But `{case}` accepts only static scalar values or constants.
|
Тег `{switch}` в качестве аргумента принимает любое выражение.
|
||||||
|
Каждый возможный случай описывается тегом `{case value}` значения `value` которых могут быть только явно заданные скалярные значения.
|
||||||
|
Случаи могут повторятся, в этом случае блоки для которых повторялся случай будут последовательно выполнены по направлению сверху вниз.
|
||||||
|
Случай `default` подразумевает обработку если ни один случай не произошел.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{switch <condition>}
|
{switch <condition>}
|
||||||
{case <value1>}
|
{case value1}
|
||||||
...
|
...
|
||||||
{case <value2>, <value3>, ...}
|
{case value2, value3, ...}
|
||||||
...
|
...
|
||||||
{case <value3>}
|
{case value3}
|
||||||
...
|
...
|
||||||
{case default, <value1>}
|
{case default, <value1>}
|
||||||
...
|
...
|
||||||
{/switch}
|
{/switch}
|
||||||
```
|
```
|
||||||
|
|
||||||
For example,
|
Рассмотрим пример:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{switch $type}
|
{switch $color}
|
||||||
{case 'new'}
|
{case 'red', 'scarlet'}
|
||||||
It is new item
|
Оттенок красного цвета
|
||||||
{case 'current', 'new'}
|
{case 'green', 'harlequin'}
|
||||||
It is new or current item
|
Оттенок зеленого цвета
|
||||||
{case 'current'}
|
{case 'black', 'grey', 'gray'}
|
||||||
It is current item
|
Черный цвет
|
||||||
{case 'new', 'newer'}
|
{case 'white', 'grey', 'gray'}
|
||||||
It is new item, again
|
Белый цвет
|
||||||
{case default}
|
{case default, 'unknown'}
|
||||||
I don't know the type {$type}
|
Неизвестный цвет
|
||||||
{/switch}
|
{/switch}
|
||||||
```
|
```
|
||||||
|
|
||||||
if `$type = 'new'` then template output
|
если задать `$color = 'red'` результатом будет:
|
||||||
|
|
||||||
```
|
```
|
||||||
It is new item
|
Оттенок красного цвета
|
||||||
It is new or current item
|
```
|
||||||
It is new item, again
|
|
||||||
|
для случая `$color = 'grey'` будут вызваны два бока:
|
||||||
|
|
||||||
|
```
|
||||||
|
Черный цвет
|
||||||
|
Белый цвет
|
||||||
|
```
|
||||||
|
|
||||||
|
случаи `$color = 'yellow'` и `$color = 'unknown'` будут обработаны последним блоком:
|
||||||
|
|
||||||
|
```
|
||||||
|
Неизвестный цвет
|
||||||
```
|
```
|
@ -1,12 +1,12 @@
|
|||||||
Tag {unset}
|
Тег {unset}
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Unset a given variables.
|
Удаляет переменные.
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
|
|
||||||
{unset $a} unset single variable
|
{unset $a} единичное удаление
|
||||||
|
|
||||||
{unset $a $b $c.d.e} multiple unset
|
{unset $a $b $c.d.e} множественное удаление
|
||||||
|
|
||||||
```
|
```
|
@ -1,64 +0,0 @@
|
|||||||
Tag {var}
|
|
||||||
=========
|
|
||||||
|
|
||||||
The tag {var} is used for assigning template variables during the execution of a template.
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $var=EXPR}
|
|
||||||
```
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $var}
|
|
||||||
... any content ...
|
|
||||||
{/var}
|
|
||||||
```
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $var|modifiers}
|
|
||||||
... any content ...
|
|
||||||
{/var}
|
|
||||||
```
|
|
||||||
|
|
||||||
Variable names follow the same rules as other labels in PHP.
|
|
||||||
A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $v = 5}
|
|
||||||
{var $v = "value"}
|
|
||||||
|
|
||||||
{var $v = $x+$y}
|
|
||||||
{var $v = 4}
|
|
||||||
{var $v = $z++ + 1}
|
|
||||||
{var $v = --$z}
|
|
||||||
{var $v = $y/$x}
|
|
||||||
{var $v = $y-$x}
|
|
||||||
{var $v = $y*$x-2}
|
|
||||||
{var $v = ($y^$x)+7}
|
|
||||||
```
|
|
||||||
|
|
||||||
Creating array
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $v = [1,2,3]}
|
|
||||||
{var $v = []}
|
|
||||||
{var $v = ["one"|upper => 1, 4 => $x, "three" => 3]}
|
|
||||||
{var $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]}
|
|
||||||
```
|
|
||||||
|
|
||||||
Getting function result into variable
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $v = count([1,2,3])+7}
|
|
||||||
```
|
|
||||||
|
|
||||||
Collect the output of the template into a variable
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{var $v}
|
|
||||||
Some long {$text|trim}
|
|
||||||
{/var}
|
|
||||||
|
|
||||||
{var $v|escape} {* apply modifier to variable*}
|
|
||||||
Some long {$text|trim}
|
|
||||||
{/var}
|
|
||||||
```
|
|
@ -231,8 +231,18 @@ class Fenom
|
|||||||
),
|
),
|
||||||
'var' => array( // {var ...}
|
'var' => array( // {var ...}
|
||||||
'type' => self::BLOCK_COMPILER,
|
'type' => self::BLOCK_COMPILER,
|
||||||
'open' => 'Fenom\Compiler::varOpen',
|
'open' => 'Fenom\Compiler::setOpen',
|
||||||
'close' => 'Fenom\Compiler::varClose'
|
'close' => 'Fenom\Compiler::setClose'
|
||||||
|
),
|
||||||
|
'set' => array( // {set ...}
|
||||||
|
'type' => self::BLOCK_COMPILER,
|
||||||
|
'open' => 'Fenom\Compiler::setOpen',
|
||||||
|
'close' => 'Fenom\Compiler::setClose'
|
||||||
|
),
|
||||||
|
'add' => array( // {add ...}
|
||||||
|
'type' => self::BLOCK_COMPILER,
|
||||||
|
'open' => 'Fenom\Compiler::setOpen',
|
||||||
|
'close' => 'Fenom\Compiler::setClose'
|
||||||
),
|
),
|
||||||
'block' => array( // {block ...} {parent} {/block}
|
'block' => array( // {block ...} {parent} {/block}
|
||||||
'type' => self::BLOCK_COMPILER,
|
'type' => self::BLOCK_COMPILER,
|
||||||
|
@ -740,23 +740,32 @@ class Compiler
|
|||||||
* @param Tag $scope
|
* @param Tag $scope
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function varOpen(Tokenizer $tokens, Tag $scope)
|
public static function setOpen(Tokenizer $tokens, Tag $scope)
|
||||||
{
|
{
|
||||||
$var = $scope->tpl->parseVariable($tokens);
|
$var = $scope->tpl->parseVariable($tokens);
|
||||||
if ($tokens->is('=')) { // inline tag {var ...}
|
$before = $after = "";
|
||||||
|
if($scope->name == 'add') {
|
||||||
|
$before = "if(!isset($var)) {\n";
|
||||||
|
$after = "\n}";
|
||||||
|
}
|
||||||
|
if ($tokens->is(Tokenizer::MACRO_EQUALS, '[')) { // inline tag {var ...}
|
||||||
|
$equal = $tokens->getAndNext();
|
||||||
|
if($equal == '[') {
|
||||||
|
$tokens->need(']')->next()->need('=')->next();
|
||||||
|
$equal = '[]=';
|
||||||
|
}
|
||||||
$scope->close();
|
$scope->close();
|
||||||
$tokens->next();
|
|
||||||
if ($tokens->is("[")) {
|
if ($tokens->is("[")) {
|
||||||
return $var . '=' . $scope->tpl->parseArray($tokens);
|
return $before.$var . $equal . $scope->tpl->parseArray($tokens) . ';'.$after;
|
||||||
} else {
|
} else {
|
||||||
return $var . '=' . $scope->tpl->parseExpr($tokens);
|
return $before.$var . $equal . $scope->tpl->parseExpr($tokens) . ';'.$after;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$scope["name"] = $var;
|
$scope["name"] = $var;
|
||||||
if ($tokens->is('|')) {
|
if ($tokens->is('|')) {
|
||||||
$scope["value"] = $scope->tpl->parseModifier($tokens, "ob_get_clean()");
|
$scope["value"] = $before . $scope->tpl->parseModifier($tokens, "ob_get_clean()").';'.$after;
|
||||||
} else {
|
} else {
|
||||||
$scope["value"] = "ob_get_clean()";
|
$scope["value"] = $before . "ob_get_clean();" . $after;
|
||||||
}
|
}
|
||||||
return 'ob_start();';
|
return 'ob_start();';
|
||||||
}
|
}
|
||||||
@ -767,7 +776,7 @@ class Compiler
|
|||||||
* @param Tag $scope
|
* @param Tag $scope
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function varClose(Tokenizer $tokens, Tag $scope)
|
public static function setClose(Tokenizer $tokens, Tag $scope)
|
||||||
{
|
{
|
||||||
return $scope["name"] . '=' . $scope["value"] . ';';
|
return $scope["name"] . '=' . $scope["value"] . ';';
|
||||||
}
|
}
|
||||||
|
@ -693,11 +693,15 @@ class Template extends Render
|
|||||||
$cond = false;
|
$cond = false;
|
||||||
}
|
}
|
||||||
$op = $tokens->getAndNext();
|
$op = $tokens->getAndNext();
|
||||||
} elseif ($tokens->is(Tokenizer::MACRO_EQUALS)) { // assignment operator: $a = 4, $a += 3, ...
|
} elseif ($tokens->is(Tokenizer::MACRO_EQUALS, '[')) { // assignment operator: $a = 4, $a += 3, ...
|
||||||
if (!$var) {
|
if (!$var) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$op = $tokens->getAndNext();
|
$op = $tokens->getAndNext();
|
||||||
|
if($op == '[') {
|
||||||
|
$tokens->need(']')->next()->need('=')->next();
|
||||||
|
$op = '[]=';
|
||||||
|
}
|
||||||
} elseif ($tokens->is(T_STRING)) { // test or containment operator: $a in $b, $a is set, ...
|
} elseif ($tokens->is(T_STRING)) { // test or containment operator: $a in $b, $a is set, ...
|
||||||
if (!$exp) {
|
if (!$exp) {
|
||||||
break;
|
break;
|
||||||
@ -866,6 +870,9 @@ class Template extends Render
|
|||||||
}
|
}
|
||||||
$var .= $key;
|
$var .= $key;
|
||||||
} elseif ($t === "[") {
|
} elseif ($t === "[") {
|
||||||
|
if($tokens->isNext(']')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
$tokens->next();
|
$tokens->next();
|
||||||
if ($tokens->is(Tokenizer::MACRO_STRING)) {
|
if ($tokens->is(Tokenizer::MACRO_STRING)) {
|
||||||
if ($tokens->isNext("(")) {
|
if ($tokens->isNext("(")) {
|
||||||
|
@ -241,7 +241,6 @@ class Tokenizer
|
|||||||
\T_SR_EQUAL => 1,
|
\T_SR_EQUAL => 1,
|
||||||
\T_XOR_EQUAL => 1,
|
\T_XOR_EQUAL => 1,
|
||||||
'=' => 1,
|
'=' => 1,
|
||||||
// \T_CONCAT_EQUAL => 1,
|
|
||||||
),
|
),
|
||||||
self::MACRO_SCALAR => array(
|
self::MACRO_SCALAR => array(
|
||||||
\T_LNUMBER => 1,
|
\T_LNUMBER => 1,
|
||||||
|
@ -122,9 +122,11 @@ class TemplateTest extends TestCase
|
|||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('hello, {$a.}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
array('hello, {$a.}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
|
array('hello, {$b[}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
|
array('hello, {$b.}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
array('hello, {$b[c}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
array('hello, {$b[c}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
array('hello, {$b.c]}!', 'Fenom\Error\CompileException', "Unexpected token ']'"),
|
array('hello, {$b.c]}!', 'Fenom\Error\CompileException', "Unexpected token ']'"),
|
||||||
array('hello, {$b[ ]}!', 'Fenom\Error\CompileException', "Unexpected token ']'"),
|
array('hello, {$b[ ]}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
array('hello, {$b[9/].c}!', 'Fenom\Error\CompileException', "Unexpected token ']'"),
|
array('hello, {$b[9/].c}!', 'Fenom\Error\CompileException', "Unexpected token ']'"),
|
||||||
array('hello, {$b[3]$c}!', 'Fenom\Error\CompileException', "Unexpected token '\$c'"),
|
array('hello, {$b[3]$c}!', 'Fenom\Error\CompileException', "Unexpected token '\$c'"),
|
||||||
array('hello, {$b[3]c}!', 'Fenom\Error\CompileException', "Unexpected token 'c'"),
|
array('hello, {$b[3]c}!', 'Fenom\Error\CompileException', "Unexpected token 'c'"),
|
||||||
@ -471,40 +473,42 @@ class TemplateTest extends TestCase
|
|||||||
"z" => 99
|
"z" => 99
|
||||||
);
|
);
|
||||||
return array(
|
return array(
|
||||||
array('Create: {var $v = $x+$y} Result: {$v} end', $a, 'Create: Result: 36 end'),
|
array('Create: {set $v = $x+$y} Result: {$v} end', $a, 'Create: Result: 36 end'),
|
||||||
|
array('Create: {add $x = $x+$y} Result: {$x} end', $a, 'Create: Result: 9 end'),
|
||||||
|
array('Create: {add $v = 3} {add $v = 9} Result: {$v} end', $a, 'Create: Result: 3 end'),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v =
|
'Create: {set $v =
|
||||||
$x
|
$x
|
||||||
+
|
+
|
||||||
$y} Result: {$v} end',
|
$y} Result: {$v} end',
|
||||||
$a,
|
$a,
|
||||||
'Create: Result: 36 end'
|
'Create: Result: 36 end'
|
||||||
),
|
),
|
||||||
array('Create: {var $v = $z++} Result: {$v}, {$z} end', $a, 'Create: Result: 99, 100 end'),
|
array('Create: {set $v = $z++} Result: {$v}, {$z} end', $a, 'Create: Result: 99, 100 end'),
|
||||||
array('Create: {var $v = $z++ + 1} Result: {$v}, {$z} end', $a, 'Create: Result: 100, 100 end'),
|
array('Create: {set $v = $z++ + 1} Result: {$v}, {$z} end', $a, 'Create: Result: 100, 100 end'),
|
||||||
array('Create: {var $v = --$z} Result: {$v}, {$z} end', $a, 'Create: Result: 98, 98 end'),
|
array('Create: {set $v = --$z} Result: {$v}, {$z} end', $a, 'Create: Result: 98, 98 end'),
|
||||||
array('Create: {var $v = $y/$x} Result: {$v} end', $a, 'Create: Result: 3 end'),
|
array('Create: {set $v = $y/$x} Result: {$v} end', $a, 'Create: Result: 3 end'),
|
||||||
array('Create: {var $v = $y-$x} Result: {$v} end', $a, 'Create: Result: 18 end'),
|
array('Create: {set $v = $y-$x} Result: {$v} end', $a, 'Create: Result: 18 end'),
|
||||||
array('Create: {var $v = $y*$x-2} Result: {$v} end', $a, 'Create: Result: 241 end'),
|
array('Create: {set $v = $y*$x-2} Result: {$v} end', $a, 'Create: Result: 241 end'),
|
||||||
array('Create: {var $v = ($y^$x)+7} Result: {$v} end', $a, 'Create: Result: 25 end'),
|
array('Create: {set $v = ($y^$x)+7} Result: {$v} end', $a, 'Create: Result: 25 end'),
|
||||||
array('Create: {var $v = [1,2,3]} Result: {$v.1} end', $a, 'Create: Result: 2 end'),
|
array('Create: {set $v = [1,2,3]} Result: {$v.1} end', $a, 'Create: Result: 2 end'),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = []} Result: {if $v} have items {else} empty {/if} end',
|
'Create: {set $v = []} Result: {if $v} have items {else} empty {/if} end',
|
||||||
$a,
|
$a,
|
||||||
'Create: Result: empty end'
|
'Create: Result: empty end'
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = ["one"|upper => 1, 4 => $x, "three" => 3]} Result: {$v.three}, {$v.4}, {$v.ONE} end',
|
'Create: {set $v = ["one"|upper => 1, 4 => $x, "three" => 3]} Result: {$v.three}, {$v.4}, {$v.ONE} end',
|
||||||
$a,
|
$a,
|
||||||
'Create: Result: 3, 9, 1 end'
|
'Create: Result: 3, 9, 1 end'
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]} Result: {$v.key1}, {$v.key2.z} end',
|
'Create: {set $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]} Result: {$v.key1}, {$v.key2.z} end',
|
||||||
$a,
|
$a,
|
||||||
'Create: Result: 241, 99 end'
|
'Create: Result: 241, 99 end'
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = count([1,2,3])+7} Result: {$v} end',
|
'Create: {set $v = count([1,2,3])+7} Result: {$v} end',
|
||||||
$a,
|
$a,
|
||||||
'Create: Result: 10 end'
|
'Create: Result: 10 end'
|
||||||
),
|
),
|
||||||
@ -514,58 +518,59 @@ class TemplateTest extends TestCase
|
|||||||
public static function providerCreateVarInvalid()
|
public static function providerCreateVarInvalid()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('Create: {var $v} Result: {$v} end', 'Fenom\Error\CompileException', "Unclosed tag: {var} opened"),
|
array('Create: {set $v} Result: {$v} end', 'Fenom\Error\CompileException', "Unclosed tag: {set} opened"),
|
||||||
|
array('Create: {add $v} Result: {$v} end', 'Fenom\Error\CompileException', "Unclosed tag: {add} opened"),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = } Result: {$v} end',
|
'Create: {set $v = } Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected end of expression"
|
"Unexpected end of expression"
|
||||||
),
|
),
|
||||||
array('Create: {var $v = 1++} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token '++'"),
|
array('Create: {set $v = 1++} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token '++'"),
|
||||||
array('Create: {var $v = c} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token 'c'"),
|
array('Create: {set $v = c} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token 'c'"),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = ($a)++} Result: {$v} end',
|
'Create: {set $v = ($a)++} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token '++'"
|
"Unexpected token '++'"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = --$a++} Result: {$v} end',
|
'Create: {set $v = --$a++} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token '++'"
|
"Unexpected token '++'"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = $a|upper++} Result: {$v} end',
|
'Create: {set $v = $a|upper++} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token '++'"
|
"Unexpected token '++'"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = max($a,2)++} Result: {$v} end',
|
'Create: {set $v = max($a,2)++} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token '++'"
|
"Unexpected token '++'"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = max($a,2)} Result: {$v} end',
|
'Create: {set $v = max($a,2)} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Function max not found",
|
"Function max not found",
|
||||||
Fenom::DENY_NATIVE_FUNCS
|
Fenom::DENY_NATIVE_FUNCS
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = 4*} Result: {$v} end',
|
'Create: {set $v = 4*} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected end of expression"
|
"Unexpected end of expression"
|
||||||
),
|
),
|
||||||
array('Create: {var $v = ""$a} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token '\$a'"),
|
array('Create: {set $v = ""$a} Result: {$v} end', 'Fenom\Error\CompileException', "Unexpected token '\$a'"),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = [1,2} Result: {$v} end',
|
'Create: {set $v = [1,2} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected end of expression"
|
"Unexpected end of expression"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = empty(2)} Result: {$v} end',
|
'Create: {set $v = empty(2)} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token 2, isset() and empty() accept only variables"
|
"Unexpected token 2, isset() and empty() accept only variables"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'Create: {var $v = isset(2)} Result: {$v} end',
|
'Create: {set $v = isset(2)} Result: {$v} end',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Unexpected token 2, isset() and empty() accept only variables"
|
"Unexpected token 2, isset() and empty() accept only variables"
|
||||||
),
|
),
|
||||||
@ -576,32 +581,33 @@ class TemplateTest extends TestCase
|
|||||||
public static function providerArrays()
|
public static function providerArrays()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('{var $arr = []}', array()),
|
array('{set $arr[] = 4}', array(4)),
|
||||||
array('{var $arr = [1]}', array(1)),
|
array('{set $arr = []}', array()),
|
||||||
array('{var $arr = [1,]}', array(1)),
|
array('{set $arr = [1]}', array(1)),
|
||||||
array('{var $arr = [1, 2, 3, 5]}', array(1, 2, 3, 5)),
|
array('{set $arr = [1,]}', array(1)),
|
||||||
array('{var $arr = [1, true, false, null, -1, 1.1, -2.2, 5, "str"]}', array(1, true, false, null, -1, 1.1, -2.2, 5, "str")),
|
array('{set $arr = [1, 2, 3, 5]}', array(1, 2, 3, 5)),
|
||||||
array('{var $arr = [5 => 1, "two" => 2, 3]}', array(5 => 1, "two" => 2, 3)),
|
array('{set $arr = [1, true, false, null, -1, 1.1, -2.2, 5, "str"]}', array(1, true, false, null, -1, 1.1, -2.2, 5, "str")),
|
||||||
array('{var $arr = [1 + 1, 2 * 2, 3 / 3 + 7,]}', array(1 + 1, 2 * 2, 3 / 3 + 7)),
|
array('{set $arr = [5 => 1, "two" => 2, 3]}', array(5 => 1, "two" => 2, 3)),
|
||||||
array('{var $arr = [$zero, $two => $one, $num.3 => $.const.PHP_VERSION]}', array(0, 2 => 1, "three" => PHP_VERSION)),
|
array('{set $arr = [1 + 1, 2 * 2, 3 / 3 + 7,]}', array(1 + 1, 2 * 2, 3 / 3 + 7)),
|
||||||
array('{var $arr = [5 - 1 => 1, "two"|up => "two"|low, 3 => count([1,2])]}', array(4 => 1, "TWO" => "two", 3 => 2)),
|
array('{set $arr = [$zero, $two => $one, $num.3 => $.const.PHP_VERSION]}', array(0, 2 => 1, "three" => PHP_VERSION)),
|
||||||
|
array('{set $arr = [5 - 1 => 1, "two"|up => "two"|low, 3 => count([1,2])]}', array(4 => 1, "TWO" => "two", 3 => 2)),
|
||||||
|
|
||||||
array('{var $arr = [[1]]}', array(array(1))),
|
array('{set $arr = [[1]]}', array(array(1))),
|
||||||
array('{var $arr = [[],[]]}', array(array(),array())),
|
array('{set $arr = [[],[]]}', array(array(),array())),
|
||||||
array('{var $arr = [1, [2, 3], 5]}', array(1, array(2, 3), 5)),
|
array('{set $arr = [1, [2, 3], 5]}', array(1, array(2, 3), 5)),
|
||||||
array('{var $arr = [1, [true, false, null, -1, 1.1, -2.2, 5], "str"]}', array(1, array(true, false, null, -1, 1.1, -2.2, 5), "str")),
|
array('{set $arr = [1, [true, false, null, -1, 1.1, -2.2, 5], "str"]}', array(1, array(true, false, null, -1, 1.1, -2.2, 5), "str")),
|
||||||
array('{var $arr = [5 => [1, "two" => 2], 3]}', array(5 => array(1, "two" => 2), 3)),
|
array('{set $arr = [5 => [1, "two" => 2], 3]}', array(5 => array(1, "two" => 2), 3)),
|
||||||
array('{var $arr = [1 + 1, [2 * 2, 3 / 3 + 7,],]}', array(1 + 1, array(2 * 2, 3 / 3 + 7))),
|
array('{set $arr = [1 + 1, [2 * 2, 3 / 3 + 7,],]}', array(1 + 1, array(2 * 2, 3 / 3 + 7))),
|
||||||
array('{var $arr = [$zero, [$two => $one, $num.3 => $.const.PHP_VERSION]]}', array(0, array(2 => 1, "three" => PHP_VERSION))),
|
array('{set $arr = [$zero, [$two => $one, $num.3 => $.const.PHP_VERSION]]}', array(0, array(2 => 1, "three" => PHP_VERSION))),
|
||||||
array('{var $arr = [5 - 1 => 1, ["two"|up => ("two"|low ~ "..."), 3 => count([1,2])]]}', array(4 => 1, array("TWO" => "two...", 3 => 2))),
|
array('{set $arr = [5 - 1 => 1, ["two"|up => ("two"|low ~ "..."), 3 => count([1,2])]]}', array(4 => 1, array("TWO" => "two...", 3 => 2))),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function providerUnset() {
|
public static function providerUnset() {
|
||||||
return array(
|
return array(
|
||||||
array('{var $a = 5} {unset $a} {if $a is not set}not set{/if}', 'not set'),
|
array('{set $a = 5} {unset $a} {if $a is not set}not set{/if}', 'not set'),
|
||||||
array('{var $a = ["b" => 5, "c" => 6]} {unset $a.b} {if $a.b is not set}not set{/if} but c is {$a.c}', 'not set but c is 6'),
|
array('{set $a = ["b" => 5, "c" => 6]} {unset $a.b} {if $a.b is not set}not set{/if} but c is {$a.c}', 'not set but c is 6'),
|
||||||
array('{var $a = ["b" => 5, "c" => 6]} {unset $a.b $a.c} {if $a.b is not set}not set{/if} {if $a.c is not set}not set{/if}', 'not set not set'),
|
array('{set $a = ["b" => 5, "c" => 6]} {unset $a.b $a.c} {if $a.b is not set}not set{/if} {if $a.c is not set}not set{/if}', 'not set not set'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1104,7 +1110,7 @@ class TemplateTest extends TestCase
|
|||||||
"Template multi-extended by block1"
|
"Template multi-extended by block1"
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'{extends "parent.tpl"}{var $bk = "bk3"}{block "bk1"} block1 {/block}{block "bk2"} block2 {/block} {block "$bk"} block3 {/block} garbage',
|
'{extends "parent.tpl"}{set $bk = "bk3"}{block "bk1"} block1 {/block}{block "bk2"} block2 {/block} {block "$bk"} block3 {/block} garbage',
|
||||||
"Template multi-extended by block1"
|
"Template multi-extended by block1"
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -1312,7 +1318,7 @@ class TemplateTest extends TestCase
|
|||||||
try {
|
try {
|
||||||
var_dump(
|
var_dump(
|
||||||
$this->fenom->compileCode(
|
$this->fenom->compileCode(
|
||||||
'{unset $a $a.c $b}'
|
'{add $a[] = 5}'
|
||||||
)->getBody()
|
)->getBody()
|
||||||
);
|
);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user