mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Done ru docs [beta]
This commit is contained in:
parent
11af8fd2c1
commit
295ad63cf1
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*
|
||||
|
||||
# Add tags
|
||||
# Добавление тегов
|
||||
|
||||
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
||||
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 есть строчные и блоковые теги.
|
||||
|
||||
## 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) { /* ... */});
|
||||
```
|
||||
|
||||
## Inline compiler
|
||||
## Линейный компилятор
|
||||
|
||||
Добавление строчного компилятора осуществляеться очень просто:
|
||||
|
||||
@ -78,7 +78,7 @@ $fenom->addCompilerSmart(string $compiler, $storage);
|
||||
|
||||
`$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);
|
||||
```
|
||||
|
||||
# Add modifiers
|
||||
# Добавление модификаторов
|
||||
|
||||
```
|
||||
$fenom->addModifier(string $modifier, callable $callback);
|
||||
@ -114,22 +114,55 @@ $fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
||||
});
|
||||
```
|
||||
|
||||
# Extends test operator
|
||||
# Расширение тестовго оператора
|
||||
|
||||
```php
|
||||
$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 не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
|
||||
Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора.
|
||||
@ -150,9 +183,9 @@ For `include`:
|
||||
* [CacheStreamWrapper::stream_eof](http://www.php.net/manual/en/streamwrapper.stream-eof.php)
|
||||
|
||||
**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
|
||||
$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 @@
|
||||
Наследование шаблонов
|
||||
=====================
|
||||
|
||||
Документации пока нет, почитайте на хабре пока
|
@ -8,13 +8,13 @@
|
||||
* [Разработка Fenom](./dev/readme.md)
|
||||
* [Настройки](./configuration.md)
|
||||
* [Синтаксис](./syntax.md)
|
||||
* Переменные
|
||||
* Значения
|
||||
* [Переменные](./syntax.md#Переменные)
|
||||
* [Значения](./syntax.md#Скалярные-значения)
|
||||
* [Массивы](./syntax.md#Массивы)
|
||||
* [Операторы](./operators.md)
|
||||
* Модификаторы
|
||||
* Функции
|
||||
* Компиляторы
|
||||
* Параметры тегов
|
||||
* [Модификаторы](./syntax.md#Модификаторы)
|
||||
* [Теги](./syntax.md#Теги)
|
||||
* [Параметры тегов](./syntax.md#Параметры-тегов)
|
||||
|
||||
***
|
||||
|
||||
@ -85,10 +85,10 @@
|
||||
|
||||
### Расширение
|
||||
|
||||
* Источники шаблонов
|
||||
* Добавление модификаторов
|
||||
* Добавление функиций
|
||||
* Добавление компиляторов
|
||||
* Фильтры и обратные вызовы
|
||||
* [Источники шаблонов](./ext/extend.md#Источники-шаблонов)
|
||||
* [Добавление модификаторов](./ext/extend.md#Добавление-модификаторов)
|
||||
* [Добавление тегов](./ext/extend.md#Добавление-тегов)
|
||||
* [Расширение тестового оператора](./ext/extend.md#Расширение-тестовго-оператора)
|
||||
* [Расширение глобальной переменной](./ext/extend.md#Расширение-глобальной-переменной)
|
||||
* [Расширение Fenom](./ext/extend.md)
|
||||
* [Add-ons](./ext/extensions.md)
|
||||
|
@ -233,6 +233,56 @@ NULL - это отсутствие присутствия, а FALSE - прису
|
||||
|
||||
Подробнее об [операторах](./operators.md).
|
||||
|
||||
## Массивы
|
||||
|
||||
Массив (тип array) может быть создан конструкцией `[]`. В качестве параметров она принимает любое количество разделенных запятыми пар `key => value` (`ключ => значение`).
|
||||
```
|
||||
[
|
||||
key => value,
|
||||
key2 => value2,
|
||||
key3 => value3,
|
||||
...
|
||||
]
|
||||
```
|
||||
Запятая после последнего элемента массива необязательна и может быть опущена.
|
||||
Обычно это делается для однострочных массивов, т.е. `[1, 2]` предпочтительней `[1, 2, ]`.
|
||||
Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
|
||||
|
||||
```smarty
|
||||
{set $array = [
|
||||
"foo" => "bar",
|
||||
"bar" => "foo",
|
||||
]}
|
||||
|
||||
```
|
||||
|
||||
`key` может быть либо целым числом, либо строкой. `value` может быть любого типа.
|
||||
|
||||
Дополнительно с ключом key будут сделаны следующие преобразования:
|
||||
|
||||
* Строки, содержащие целое число будут преобразованы к числу. Например, ключ со значением `"8"` будет в действительности сохранен со значением `8`. С другой стороны, значение `"08"` не будет преобразовано, так как оно не является корректным десятичным целым.
|
||||
* Числа с плавающей точкой также будут преобразованы к числу, т.е. дробная часть будет отброшена. Например, ключ со значением `8.7` будет в действительности сохранен со значением `8`.
|
||||
* Булев также преобразовываются к целому числу. Например, ключ со значением `true` будет сохранен со значением `1` и ключ со значением `false` будет сохранен со значением `0`.
|
||||
* NULL будет преобразован к пустой строке. Например, ключ со значением `null` будет в действительности сохранен со значением `""`.
|
||||
* Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).
|
||||
|
||||
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
|
||||
|
||||
Параметр `key` является необязательным. Если он не указан, Fenom будет использовать предыдущее наибольшее значение целочисленного ключа, увеличенное на 1.
|
||||
|
||||
Существующий массив может быть изменен явной установкой значений в нем.
|
||||
Это выполняется присвоением значений массиву с указанием в скобках ключа или после точки.
|
||||
Кроме того, используя скобки, вы можете опустить ключ.
|
||||
|
||||
```smarty
|
||||
{set $arr.key = value}
|
||||
{set $arr[] = value} {* будет взят максимальный целочисленый ключ, увеличенный на 1 *}
|
||||
```
|
||||
|
||||
Если массив `$arr` еще не существует, он будет создан. Таким образом, это еще один способ определить массив.
|
||||
Однако такой способ применять не рекомендуется, так как если переменная `$arr` уже содержит некоторое значение (например, строку),
|
||||
то это значение останется на месте и `[]` может на самом деле означать доступ к символу в строке. Лучше инициализировать переменную путем явного присваивания значения.
|
||||
|
||||
## Модификаторы
|
||||
|
||||
Модификаторы переменных могут быть прмменены к переменным, пользовательским функциям или строкам.
|
||||
@ -243,20 +293,28 @@ NULL - это отсутствие присутствия, а FALSE - прису
|
||||
|
||||
```smarty
|
||||
{var $foo="User"}
|
||||
{$foo|upper} outputs "USER"
|
||||
{$foo|lower} outputs "user"
|
||||
{"{$foo|lower}"} outputs "user"
|
||||
{"User"|lower}} outputs "user"
|
||||
{$looong_text|truncate:80:"..."} truncate the text to 80 symbols and append <continue> symbols, like "..."
|
||||
{$foo|upper} выведет "USER"
|
||||
{$foo|lower} выведет "user"
|
||||
{"{$foo|lower}"} выведет "user"
|
||||
{"User"|lower}} выведет "user"
|
||||
{$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит символы "..."
|
||||
{$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#Модификаторы)
|
||||
## Теги
|
||||
|
||||
## Функции
|
||||
Все сущности шаблона можно разжелить на две группы:
|
||||
|
||||
## Компиляторы
|
||||
* заполнитель (placeholder) — вывод переменной в шаблоне, например `{$name}`
|
||||
* тег — конструкция выполняющаяя некоторые действия, выглядит как именованный заполнитель (placeholder), например `{include $name}`
|
||||
|
||||
Теги так же можно разделить на две группы:
|
||||
|
||||
* Функии. Тег функции вызывает пользовательскую во время выполнения шаблона, результат функции будет выведен вместо тега.
|
||||
Пользовательские функции являются дополнительными и могут быть индивидуальными. Они могут быть изменены по вашему желанию, также вы можете создать новые.
|
||||
* Компиляторы. В отличии от функций компиляторы вызываются во время компиляции шаблона и возвращают PHP код, который описывает некоторое действие.
|
||||
Компиляторы и формируют основные конструкции типа `if`, `foreach` и т.д.
|
||||
|
||||
### Игнорирование кода
|
||||
|
||||
@ -303,7 +361,7 @@ Outputs
|
||||
</script>
|
||||
```
|
||||
|
||||
### Whitespaces
|
||||
### Пробелы
|
||||
|
||||
Шаблонизатор допускает любое количество пробелов или переносов строк в своём коде
|
||||
|
||||
@ -327,14 +385,14 @@ Outputs
|
||||
{/foreach}
|
||||
```
|
||||
|
||||
### Tag options
|
||||
### Параметры тегов
|
||||
|
||||
| name | code | type | description |
|
||||
| ------- | ---- | ----- | ------------ |
|
||||
| strip | s | block | enable `strip` option for a block of the template |
|
||||
| raw | a | any | ignore escape option |
|
||||
| escape | e | any | force escape |
|
||||
| ignore | i | block | ignore Fenom syntax |
|
||||
| имя | код | тип тега | описание |
|
||||
| ------- | ---- | --------- | ------------ |
|
||||
| strip | s | блокоый | активирует удаление лишних пробелов на подобии модфикатора `strip` |
|
||||
| ignore | i | блокоый | парсер будет игнорировать любой Fenom синтаксис на контент блокового тега |
|
||||
| raw | a | любой | отключает экранирование |
|
||||
| escape | e | любой | принудительно активирует экранирование |
|
||||
|
||||
```smarty
|
||||
{script:ignore} ... {/script}
|
||||
|
Loading…
Reference in New Issue
Block a user