mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Merge branch 'master' into develop
Conflicts: docs/ru/syntax.md sandbox/fenom.php
This commit is contained in:
@ -1,5 +0,0 @@
|
||||
Git conversation
|
||||
================
|
||||
|
||||
Ветка `master` содержит стабильную последнюю версию проекта. В ветку `master` может сливаться новая версия проекта из `develop` или исправления.
|
||||
Ветка `develop`, для разработки, содержит не стабильную версию проекта. Принимает все новшевства, изменения и исправления.
|
@ -1,12 +1,15 @@
|
||||
Develop
|
||||
=======
|
||||
|
||||
If you want to discuss the enhancement of the Fenom, create an issue on Github or submit a pull request.
|
||||
If you want to contribute to Fenom please feel free to create an issue or submit a pull request on Github.
|
||||
|
||||
There tho branches — master and develop.
|
||||
The branch master for stable releases and hotfixes; the branch develop for development of features. Each tag names by rule `major.minor.fix` (1.4.9, 1.1.2 etc) and creates from master. Version changes by the rule of [semantic versioning](http://semver.org/).
|
||||
There are two branches:
|
||||
|
||||
* `master` branch is for stable releases and hotfixes
|
||||
* `develop` branch is for development of features
|
||||
|
||||
Each tag names by rule `major.minor.fix` (1.4.9, 1.1.2, etc.) and creates from master. Version changes by the rule of [semantic versioning](http://semver.org/).
|
||||
|
||||
For questions: a.cobest@gmail.com (English, Russian languages)
|
||||
|
||||
|
||||
* the [scheme of work](schema.md)
|
||||
* the [scheme of work](schema.md)
|
@ -37,7 +37,7 @@ How it work
|
||||
## Процесс работы
|
||||
|
||||
При вызове метода `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#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).
|
||||
|
||||
### Компиляция шаблонов
|
||||
|
||||
@ -64,7 +64,7 @@ How it work
|
||||
|
||||
### Как работает токенайзер
|
||||
|
||||
Объек токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
|
||||
Объект токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
|
||||
|
||||
* Код токена. Это либо число либо один символ.
|
||||
* Тело токена. Содержимое токена.
|
||||
|
@ -4,7 +4,6 @@
|
||||
# Добавление тегов
|
||||
|
||||
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
||||
Compilers invokes during compilation template to PHP source and have to
|
||||
Компиляторы вызываются во время преобразования кода шаблона в PHP код и возвращяю PHP код который будет вставлен вместо тега.
|
||||
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
|
||||
Среди тегов как и в HTML есть строчные и блоковые теги.
|
||||
@ -17,7 +16,7 @@ Compilers invokes during compilation template to PHP source and have to
|
||||
$fenom->addFunction(string $function_name, callable $callback[, callable $parser]);
|
||||
```
|
||||
|
||||
В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML аттрибутов и отдаст их в функцию ассоциативным массивом:
|
||||
В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML атрибутов и отдаст их в функцию ассоциативным массивом:
|
||||
```php
|
||||
$fenom->addFunction("some_function", function (array $params) { /* ... */ });
|
||||
```
|
||||
@ -39,10 +38,10 @@ public static function calc($x, $y = 5) { /* ... */}
|
||||
// ...
|
||||
$fenom->addFunctionSmart('calc', 'XYCalcs::calc');
|
||||
```
|
||||
then
|
||||
пример выше позволяет объявить тег `{calc}` и спользовать его:
|
||||
```smarty
|
||||
{calc x=$top y=50} or {calc y=50 x=$top} is XYCalcs::calc($top, 50)
|
||||
{calc x=$top} or {calc $top} is XYCalcs::calc($top)
|
||||
{calc x=$top y=50} или {calc y=50 x=$top} вызовет XYCalcs::calc($top, 50)
|
||||
{calc x=$top} или {calc $top} вызовет XYCalcs::calc($top)
|
||||
```
|
||||
Таким образом вы успешно можете добавлять Ваши функции или методы.
|
||||
|
||||
@ -56,7 +55,7 @@ $fenom->addBlockFunction(string $function_name, callable $callback[, callable $p
|
||||
|
||||
Сам коллбек принимает первым аргументом контент между открывающим и закрывающим тегом, а вторым аргументом - ассоциативный массив из аргуметов тега:
|
||||
```php
|
||||
$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */});
|
||||
$fenom->addBlockFunction('some_block_function', function (array $params, $content) { /* ... */});
|
||||
```
|
||||
|
||||
## Линейный компилятор
|
||||
@ -100,7 +99,7 @@ $fenom->addModifier(string $modifier, callable $callback);
|
||||
* `$modifier` - название модификатора, которое будет использоваться в шаблоне
|
||||
* `$callback` - коллбек, который будет вызван для изменения данных
|
||||
|
||||
For example:
|
||||
Например:
|
||||
|
||||
```smarty
|
||||
{$variable|my_modifier:$param1:$param2}
|
||||
@ -145,8 +144,8 @@ $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }
|
||||
который считывает шаблоны из указанной директории.
|
||||
|
||||
Источник шаблонов должен реализовать интерфейс `Fenom\ProviderInterface`.
|
||||
Используйте метод `$fenom->setProvider(...)` что бы добавить источник в шаблонизатор, указав навание источника и, если есть необходимость,
|
||||
задать директорию кеша для шаблонов из этого источника. Рассмотрим на примере, реализуем источик шаблонов из базы данных.
|
||||
Используйте метод `$fenom->setProvider(...)` что бы добавить источник в шаблонизатор, указав название источника и, если есть необходимость,
|
||||
задать директорию кеша для шаблонов из этого источника. Рассмотрим на примере, реализуем источник шаблонов из базы данных.
|
||||
|
||||
Создадим источник:
|
||||
|
||||
@ -178,11 +177,11 @@ $fenom->display("db:index.tpl", $vars);
|
||||
|
||||
# Расширение кеша (эксперементальное)
|
||||
|
||||
Изначально Fenom не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
|
||||
Изначально Fenom не рассчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
|
||||
Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора.
|
||||
Речь идет о своем протоколе, отличным от `file://`, который [можно определить](http://php.net/manual/en/class.streamwrapper.php) в PHP.
|
||||
|
||||
Ваш протол должени иметь класс реализации протокола как указан в документации [Stream Wrapper](http://www.php.net/manual/en/class.streamwrapper.php).
|
||||
Ваш протокол должен иметь класс реализации как указано в документации [Stream Wrapper](http://www.php.net/manual/en/class.streamwrapper.php).
|
||||
Класс протокола может иметь не все указанные в документации методы. Вот список методов, необходимых шаблонизатору:
|
||||
|
||||
* [CacheStreamWrapper::stream_open](http://www.php.net/manual/en/streamwrapper.stream-open.php)
|
||||
@ -190,14 +189,14 @@ $fenom->display("db:index.tpl", $vars);
|
||||
* [CacheStreamWrapper::stream_close](http://www.php.net/manual/en/streamwrapper.stream-close.php)
|
||||
* [CacheStreamWrapper::rename](http://www.php.net/manual/en/streamwrapper.rename.php)
|
||||
|
||||
For `include`:
|
||||
Для работы через `include`:
|
||||
|
||||
* [CacheStreamWrapper::stream_stat](http://www.php.net/manual/en/streamwrapper.stream-stat.php)
|
||||
* [CacheStreamWrapper::stream_read](http://www.php.net/manual/en/streamwrapper.stream-read.php)
|
||||
* [CacheStreamWrapper::stream_eof](http://www.php.net/manual/en/streamwrapper.stream-eof.php)
|
||||
|
||||
**Note**
|
||||
(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддеривает другие протоколы.
|
||||
(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддерживает другие протоколы.
|
||||
|
||||
Пример работы кеша
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
Наследование шаблонов
|
||||
=====================
|
||||
|
||||
Документации пока нет, почитайте на хабре пока
|
||||
Документации пока нет, [почитайте на хабре](http://habrahabr.ru/post/169525/) пока
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
* `-$a` - отрицание знака, смена знака `$a`.
|
||||
* `$a + $b` - сложение, сумма `$a` и `$b`.
|
||||
* `$a - $b` - вычитаение, разность `$a` и `$b`.
|
||||
* `$a - $b` - вычитание, разность `$a` и `$b`.
|
||||
* `$a * $b` - умножение, произведение `$a` и `$b`.
|
||||
* `$a / $b` - деление, частное от деления `$a` на `$b`.
|
||||
* `$a % $b` - деление по модулю, целочисленный остаток от деления `$a` на `$b`.
|
||||
@ -64,13 +64,13 @@
|
||||
|
||||
| Тип операнда 1 | Тип операнда 2 | Результат |
|
||||
|-------------------|-------------------|-----------|
|
||||
| null или string | string | NULL преобразуется в "", числовое или лексическое сравнение |
|
||||
| bool или null | что угодно | Преобразуется в bool, FALSE < TRUE |
|
||||
| object | object | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
|
||||
| string или number | string или number | Строки переводятся в числа, обычная математика |
|
||||
| array | array | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
|
||||
| object | что угодно | object всегда больше |
|
||||
| array | что угодно | array всегда больше |
|
||||
| null или строка | строка | NULL преобразуется в "", числовое или лексическое сравнение |
|
||||
| булев или null | что угодно | Преобразуется в bool, FALSE < TRUE |
|
||||
| объект | объект | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
|
||||
| строка или число | строка или число | Строки переводятся в числа, обычная математика |
|
||||
| массив | массив | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
|
||||
| объект | что угодно | object всегда больше |
|
||||
| массим | что угодно | array всегда больше |
|
||||
|
||||
|
||||
### Побитовые операторы
|
||||
@ -129,7 +129,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
|
||||
### Строковые операторы
|
||||
|
||||
Оператор конкатенации `~` возвращает строку, представляющую собой соединение левого и правого аргумента.
|
||||
Оператор объединения `~` возвращает строку, представляющую собой соединение левого и правого аргумента.
|
||||
|
||||
* `$a ~ $b` - возвращает результат объединения сток `$a` и `$b`
|
||||
* `$a ~~ $b` - возвращает результат объединения сток `$a` и `$b` через пробел
|
||||
@ -177,7 +177,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
{$request.action !: 'default'}
|
||||
```
|
||||
|
||||
Как видно, оператор `:?` более расширенный чем `:!` и включает в себя функциональность опертора `!:`.
|
||||
Как видно, оператор `:?` более расширенный чем `:!` и включает в себя функциональность оператора `!:`.
|
||||
|
||||
Для упрощения понимания можно подвести итог:
|
||||
|
||||
@ -196,7 +196,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
### Операторы проверки
|
||||
|
||||
Оператор проверки это упрощенный тернарный оператор от которого осталась только часть проверки без возвращаемых вариантов.
|
||||
Суть операторов — быстро произвести проверку на не пустое занчение и существование пременной.
|
||||
Суть операторов — быстро произвести проверку на не пустое значение и существование пременной.
|
||||
|
||||
* `$a?` - вернет `TRUE` если `$a` не пустое
|
||||
* `$a!` - вернет `TRUE` если `$a` существует
|
||||
@ -208,7 +208,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
|
||||
### Оператор тестирования
|
||||
|
||||
Оператор `is` производит тесты над перменными или выражением. Левый операнд считается тестируемым, а правый операнд — название теста:
|
||||
Оператор `is` производит тесты над переменными или выражением. Левый операнд считается тестируемым, а правый операнд — название теста:
|
||||
|
||||
```smarty
|
||||
{* проверка переменной на не четность *}
|
||||
@ -219,7 +219,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
Результат тестирования может быть инвертирован с помощью `is not` оператора:
|
||||
|
||||
```smarty
|
||||
{* проверяем переменную что ее значение не явдяется числом *}
|
||||
{* проверяем переменную что ее значение не является числом *}
|
||||
|
||||
{$a is not integer}
|
||||
```
|
||||
@ -236,7 +236,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
* `string` — строка
|
||||
* `callback`, `callable` — функция
|
||||
* `number`, `numeric` — число, в общем понимании
|
||||
* `$a is iterable` - тестирует переменную на возможность итеративного обхода.
|
||||
* `$a is iterable` - тестирует переменную на возможность итеративного обхода (для `foreach`).
|
||||
* `$a is template` - переменная `$a` содержит название существующего шаблона.
|
||||
* `$a is empty` - переменная пустая.
|
||||
* `$a is set` - переменная существует.
|
||||
@ -247,7 +247,7 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
|
||||
### Оператор присутствия
|
||||
|
||||
Оператор `in` проверяет присутвие скалярного значения слева в массиве или строке справа.
|
||||
Оператор `in` проверяет присутствие скалярного значения слева в массиве или строке справа.
|
||||
Результат тестирования может быть инвертирован с помощью `not ni` оператора.
|
||||
|
||||
* `$a in list $b` - значение `$a` содержится в массиве значений `$b`
|
||||
@ -255,10 +255,10 @@ Fenom поддерживает префиксные и постфиксные о
|
||||
* `$a in string $b` - значение `$a` содержится в `$b` как подстрока.
|
||||
* `$a in $b` - значение `$a` содержится в `$b`, где `$b` может быть строкой, обычным или ассоциативным массивом.
|
||||
Этот вариант долгий так как требуется проверить типы переменной `$b`.
|
||||
Однако если вместо $b явно задан массив иили строка то оператор сам адаптируется для быстрого поиска.
|
||||
Однако если вместо $b явно задан массив или строка то оператор сам адаптируется для быстрого поиска.
|
||||
|
||||
```smarty
|
||||
{'df' in 'abcdefg'}
|
||||
{5 in [1, 5, 25, 125]}
|
||||
{99 in keys [1, 5, 25, 99 => 125]}
|
||||
```
|
||||
```
|
||||
|
@ -1,6 +1,10 @@
|
||||
Документация
|
||||
=============
|
||||
|
||||
<img style="float:right" src="http://aco.oml.ru/thumb/2Tdrgd9_ttbaBvqKcsSKIA/100r100/188321/gif-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-grammar-nazi-412594.jpg" alt="grammar nazi required">
|
||||
|
||||
**Внимание! Документация в режиме беты, тексты могут содержать опечатки**
|
||||
|
||||
### Fenom
|
||||
|
||||
* [Быстрый старт](./start.md)
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
### Composer
|
||||
|
||||
Fenom зарегестирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom).
|
||||
Fenom зарегистрирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom).
|
||||
Что бы установить Fenom через composer пропишите в `composer.json` списке пакетов:
|
||||
```json
|
||||
{
|
||||
@ -16,15 +16,15 @@ Fenom зарегестирован на [packagist.org](https://packagist.org/)
|
||||
```
|
||||
и обновите зависимости: `composer update`.
|
||||
|
||||
### Custom loader
|
||||
### Произвольная подгрузка
|
||||
|
||||
Склонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию.
|
||||
Клонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию.
|
||||
Для загрузки классов Fenom использует [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) стандарт.
|
||||
Таким образом вы можете:
|
||||
* использовать Ваш загрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`.
|
||||
* или использовать строенный загрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя.
|
||||
* использовать Ваш автозагрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`.
|
||||
* или использовать встроенный автозагрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя.
|
||||
|
||||
Так же вы можете использовать встроенный в Fenom загрузчик для загрузки других классов в `psr-0` формате наименования класса и файла:
|
||||
Так же вы можете использовать встроенный в Fenom автозагрузчик для загрузки других классов в `psr-0` формате:
|
||||
```php
|
||||
Fenom::registerAutoload(PROJECT_DIR."/classes");
|
||||
```
|
||||
@ -66,7 +66,7 @@ $fenom->display("template/name.tpl", $vars);
|
||||
$result = $fenom->fetch("template/name.tpl", $vars);
|
||||
```
|
||||
|
||||
Для отрисовки большого количества данных можно использовать поток
|
||||
Для вывода большого количества данных можно использовать поток
|
||||
|
||||
```php
|
||||
// $fenom->pipe(string $template, array $variables, callable $callback, int $chunk_size) : void
|
||||
@ -82,3 +82,29 @@ $fenom->pipe(
|
||||
Поток позволяет обрабатывать большой результат по кускам, размер куска указывается в байтах аргументом `$chunk_size`.
|
||||
Каждый кусок передается в `$callback` для обработки или вывода.
|
||||
|
||||
<!--
|
||||
## Пример простого приложения
|
||||
|
||||
```
|
||||
App/ (ROOT_DIR)
|
||||
┠─ configs/ (файлы конфигурации приложения)
|
||||
┠─ src/ (классы приложения)
|
||||
┠─ templates/ (шаблоны приложения)
|
||||
┠─ public/ (DOCUMENT_ROOT)
|
||||
┃ ┠─ static/ (папка со статикой)
|
||||
┃ ┖─ index.php (скрипт обработки всех динамических запросов)
|
||||
┠─ tmp/ (папка доступная для записи web-серверу для хранения временных файлов)
|
||||
┃ ┖─ compiled/ (кеша шаблонов)
|
||||
┠─ vendor/ (строронние бибилиотеки)
|
||||
┖─ composer.json (описание зависимостей для composer)
|
||||
```
|
||||
|
||||
`index.php`:
|
||||
```php
|
||||
define('ROOT_DIR', dirname(__DIR__));
|
||||
|
||||
$fenom = Fenom::factory(ROOT_DIR.'/templates', ROOT_DIR.'/cache', Fenom::FORCE_VERIFY | Fenom::AUTO_RELOAD);
|
||||
|
||||
|
||||
```
|
||||
-->
|
||||
|
@ -49,20 +49,20 @@
|
||||
```smarty
|
||||
{set $v}
|
||||
Some long {$text|trim}
|
||||
{/var}
|
||||
{/set}
|
||||
```
|
||||
|
||||
Такой вариант создания позволяет применить модификаторы к данным переде тем как они будут сохранены в переменную:
|
||||
Такой вариант создания позволяет применить модификаторы к данным перед тем как они будут сохранены в переменную:
|
||||
|
||||
```smarty
|
||||
{set $v|escape} {* применение можификатора к значению *}
|
||||
Some long {$text|trim}
|
||||
{/var}
|
||||
{/set}
|
||||
```
|
||||
|
||||
### {add}
|
||||
|
||||
Тег {add} делает тоже самое что и тег {set} за исключением того что сначало проверяет наличие переменной и если переменной нет — задет новое значение.
|
||||
Тег {add} делает тоже самое что и тег {set} за исключением того что сначала проверяет наличие переменной и если переменной нет — задет новое значение.
|
||||
|
||||
```smarty
|
||||
{add $var = 'value'}
|
||||
@ -78,4 +78,3 @@
|
||||
|
||||
Тег {var} старое название тега {set}, сейчас это одно и тоже.
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user