mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Update extend.md
This commit is contained in:
parent
8e2d64f4a6
commit
8a9ff7fb2b
@ -6,61 +6,72 @@
|
|||||||
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
|
||||||
Компиляторы вызываются во время преобразования кода шаблона в PHP код и возвращяют PHP код который будет вставлен вместо тега.
|
Компиляторы вызываются во время преобразования кода шаблона в PHP код и возвращяют PHP код который будет вставлен вместо тега.
|
||||||
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
|
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
|
||||||
Среди тегов как и в HTML есть строчные и блоковые теги.
|
Среди тегов, как и в HTML, есть строчные и блоковые теги.
|
||||||
|
|
||||||
## Линейные функции
|
## Линейные функции
|
||||||
|
|
||||||
Примитивное добавление функции можно осуществить следующим образом:
|
Добавление функции можно осуществить следующим образом:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addFunction(string $function_name, callable $callback[, callable $parser]);
|
$fenom->addFunction(string $function_name, callable $callback[, callable $parser]);
|
||||||
```
|
```
|
||||||
|
|
||||||
В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML атрибутов и отдаст их в функцию ассоциативным массивом:
|
В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега (которые должны быть в формате HTML атрибутов) и отдаст их в функцию ассоциативным массивом:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addFunction("some_function", function (array $params) { /* ... */ });
|
$fenom->addFunction("some_function", function (array $params) { /* ... */ });
|
||||||
```
|
```
|
||||||
При необходимости можно переопределить парсер на произвольный:
|
|
||||||
|
При необходимости можно переопределить парсер:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addFunction("some_function", $some_function, function (Fenom\Tokenizer $tokenizer, Fenom\Template $template) { /* parse tag */});
|
$fenom->addFunction("some_function", $some_function, function (Fenom\Tokenizer $tokenizer, Fenom\Template $template) { /* parse tag */});
|
||||||
```
|
```
|
||||||
|
|
||||||
Существует более простой способ добавления произвольной функции:
|
Существует более простой способ добавления произвольной функции:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addFunctionSmarty(string $function_name, callable $callback);
|
$fenom->addFunctionSmart(string $function_name, callable $callback);
|
||||||
```
|
```
|
||||||
|
|
||||||
В данном случае парсер сканирует список аргументов коллбека и попробует сопоставить с аргументами тега.
|
В данном случае парсер сканирует список аргументов коллбека и попробует сопоставить с аргументами тега.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// ... class XYCalcs ..
|
class XYCalcs {
|
||||||
public static function calc($x, $y = 5) { /* ... */}
|
public static function calc($x, $y = 5) {
|
||||||
|
return $x + $y;
|
||||||
|
}
|
||||||
|
}
|
||||||
// ...
|
// ...
|
||||||
$fenom->addFunctionSmart('calc', 'XYCalcs::calc');
|
$fenom->addFunctionSmart('calc', 'XYCalcs::calc');
|
||||||
```
|
```
|
||||||
пример выше позволяет объявить тег `{calc}` и спользовать его:
|
|
||||||
|
пример выше позволяет объявить тег `{calc}` и использовать его:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{calc x=$top y=50} или {calc y=50 x=$top} вызовет XYCalcs::calc($top, 50)
|
{calc x=$top y=50} или {calc y=50 x=$top} вызовет XYCalcs::calc($top, 50)
|
||||||
{calc x=$top} или {calc $top} вызовет XYCalcs::calc($top)
|
{calc x=$top} или {calc $top} вызовет XYCalcs::calc($top)
|
||||||
```
|
```
|
||||||
Таким образом вы успешно можете добавлять Ваши функции или методы.
|
|
||||||
|
Таким образом Вы легко можете добавлять свои функции или методы.
|
||||||
|
|
||||||
## Блоковые функции
|
## Блоковые функции
|
||||||
|
|
||||||
Добавление блоковой функции аналогичен добавлению строковой за исключением того что есть возможность указать парсер для закрывающего тега.
|
Добавление блоковой функции аналогично добавлению строковой, за исключением того, что есть возможность указать парсер для закрывающего тега.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addBlockFunction(string $function_name, callable $callback[, callable $parser_open[, callable $parser_close]]);
|
$fenom->addBlockFunction(string $function_name, callable $callback[, callable $parser_open[, callable $parser_close]]);
|
||||||
```
|
```
|
||||||
|
|
||||||
Сам коллбек принимает первым аргументом контент между открывающим и закрывающим тегом, а вторым аргументом - ассоциативный массив из аргуметов тега:
|
Сам коллбек принимает первым аргументом контент между открывающим и закрывающим тегом, а вторым аргументом - ассоциативный массив из аргуметов тега:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addBlockFunction('some_block_function', function (array $params, $content) { /* ... */});
|
$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */ });
|
||||||
```
|
```
|
||||||
|
|
||||||
## Линейный компилятор
|
## Линейный компилятор
|
||||||
|
|
||||||
Добавление строчного компилятора осуществляеться очень просто:
|
Добавление строчного компилятора осуществляется очень просто:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addCompiler(string $compiler, callable $parser);
|
$fenom->addCompiler(string $compiler, callable $parser);
|
||||||
@ -73,17 +84,18 @@ $fenom->addCompiler(string $compiler, callable $parser);
|
|||||||
$fenom->addCompilerSmart(string $compiler, $storage);
|
$fenom->addCompilerSmart(string $compiler, $storage);
|
||||||
```
|
```
|
||||||
|
|
||||||
`$storage` может быть как классом так и объектом. В данном случае шаблонизатор будет искать метод `tag{$compiler}`, который будет взят в качестве парсера тега.
|
`$storage` может быть как именем класса, так и объектом. В данном случае шаблонизатор будет искать метод `tag{$compiler}` и взят в качестве парсера тега.
|
||||||
|
|
||||||
## Блоковый компилятор
|
## Блоковый компилятор
|
||||||
|
|
||||||
Добавление блочного компилятора осуществяется двумя способами. Первый
|
Добавление блочного компилятора осуществяется двумя способами. Первый:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addBlockCompiler(string $compiler, array $parsers, array $tags);
|
$fenom->addBlockCompiler(string $compiler, array $parsers, array $tags);
|
||||||
```
|
```
|
||||||
|
|
||||||
где `$parser` ассоциативный массив `["open" => parser, "close" => parser]`, сождержащий парсер на открывающий и на закрывающий тег, а `$tags` содержит список внутренних тегов в формате `["tag_name"] => parser`, которые могут быть использованы только с этим компилятором.
|
где `$parser` ассоциативный массив `["open" => parser, "close" => parser]`, сождержащий парсер на открывающий и на закрывающий тег, а `$tags` содержит список внутренних тегов в формате `["tag_name"] => parser`, которые могут быть использованы только с этим компилятором.
|
||||||
|
|
||||||
Второй способ добавления парсера через импортирование из класса или объекта методов:
|
Второй способ добавления парсера через импортирование из класса или объекта методов:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@ -107,7 +119,8 @@ $fenom->addModifier(string $modifier, callable $callback);
|
|||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
$fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
||||||
// ...
|
// изменение $variable
|
||||||
|
return $variable;
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -116,19 +129,20 @@ $fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
|||||||
```php
|
```php
|
||||||
$fenom->addTest(string $name, string $code);
|
$fenom->addTest(string $name, string $code);
|
||||||
```
|
```
|
||||||
`$code` - PHP код для условия, с маркером для замены на значение или переменную.
|
|
||||||
|
`$code` - PHP код для условия с маркером для замены на значение или переменную.
|
||||||
Например, тест на целое число `is int` можно добавить как `$fenom->addTest('int', 'is_int(%s)')`.
|
Например, тест на целое число `is int` можно добавить как `$fenom->addTest('int', 'is_int(%s)')`.
|
||||||
В шаблоне тесты выглядит как `{$a is int}`, а после компиляции выглядит приблизительно так - `is_int($a)`.
|
В шаблоне тест выглядит как `{$a is int}`, а после компиляции - `is_int($a)`.
|
||||||
|
|
||||||
# Расширение глобальной переменной
|
# Расширение глобальной переменной
|
||||||
|
|
||||||
Fenom обладает определенным [набором глобальных переменных](../syntax.md#Системная-переменная).
|
Fenom обладает определенным [набором глобальных переменных](../syntax.md#Системная-переменная).
|
||||||
Однако их может не хватать для удобной работы и в этом случае потребуется добавить свои или переопределить/удалить существующие.
|
Однако, их может не хватать для удобной работы и в этом случае потребуется добавить свои или переопределить/удалить существующие.
|
||||||
Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик-парсер `$parser`,
|
Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик-парсер `$parser`,
|
||||||
который будет вызван при встрече с глобальной переменной `$name` **во время компиляции шаблона**.
|
который будет вызван при встрече с глобальной переменной `$name` **во время компиляции шаблона**.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ });
|
$fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* ... */ });
|
||||||
```
|
```
|
||||||
|
|
||||||
Указанный вторым аргументом, парсер будет вызван при встречи компилятором конструкции `$.project`.
|
Указанный вторым аргументом, парсер будет вызван при встречи компилятором конструкции `$.project`.
|
||||||
@ -158,30 +172,38 @@ $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }
|
|||||||
"support" => 'support@example.ru'
|
"support" => 'support@example.ru'
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
В шаблоне появится глобальная переменная `$.site`:
|
В шаблоне появится глобальная переменная `$.site`:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
<div class="copyright">© <a href="//{$.site.domain}">{$.site.domain}</a></div>
|
<div class="copyright">© <a href="//{$.site.domain}">{$.site.domain}</a></div>
|
||||||
<div class="support">Support <a href="mailto:{$.site.support}">{$.site.support}</a></div>
|
<div class="support">Support <a href="mailto:{$.site.support}">{$.site.support}</a></div>
|
||||||
```
|
```
|
||||||
|
|
||||||
Свойством может быть любое значение — масиив, объект и т.д.
|
Свойством может быть любое значение — масиив, объект и т.д.
|
||||||
|
|
||||||
### Доступ к методу
|
### Доступ к методу
|
||||||
|
|
||||||
Парсер `Fenom::ACCESSOR_METHOD` позволит обратится к указанному методу шаблонизатора из шаблона.
|
Парсер `Fenom::ACCESSOR_METHOD` позволит обратится к указанному методу шаблонизатора из шаблона.
|
||||||
Параметр `$accessor` выступает как **имя метода**:
|
Параметр `$accessor` выступает как **имя метода**:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addAccessorSmart("fetch", "fetch", Fenom::ACCESSOR_METHOD);
|
$fenom->addAccessorSmart("fetch", "fetch", Fenom::ACCESSOR_METHOD);
|
||||||
```
|
```
|
||||||
|
|
||||||
В шаблоне появится глобальная функция `$.fetch`:
|
В шаблоне появится глобальная функция `$.fetch`:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{set $menu = $.fetch("site/menu.tpl")} {* $menu = $fenom->fetch("site/menu.tpl") *}
|
{set $menu = $.fetch("site/menu.tpl")} {* $menu = $fenom->fetch("site/menu.tpl") *}
|
||||||
```
|
```
|
||||||
|
|
||||||
Шаблонизатор не проверят количество и тип параметров которые передает в метод.
|
Шаблонизатор не проверят количество и тип параметров которые передает в метод.
|
||||||
|
|
||||||
### Доступ к значению
|
### Доступ к значению
|
||||||
|
|
||||||
Парсер `Fenom::ACCESSOR_VAR` позволит обратится к указанному значению из шаблона.
|
Парсер `Fenom::ACCESSOR_VAR` позволит обратится к указанному значению из шаблона.
|
||||||
Параметр `$accessor` выступает как **PHP выражение**, описывающее значение:
|
Параметр `$accessor` выступает как **PHP выражение**, описывающее значение:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addAccessorSmart("storage", "App::getInstance()->storage", Fenom::ACCESSOR_VAR);
|
$fenom->addAccessorSmart("storage", "App::getInstance()->storage", Fenom::ACCESSOR_VAR);
|
||||||
```
|
```
|
||||||
@ -194,17 +216,23 @@ $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }
|
|||||||
|
|
||||||
Парсер `Fenom::ACCESSOR_CALL` позволит вызвать указанную финкцию или метод из шаблона.
|
Парсер `Fenom::ACCESSOR_CALL` позволит вызвать указанную финкцию или метод из шаблона.
|
||||||
Параметр `$accessor` выступает как **PHP выражение**, описывающее название функции или метод:
|
Параметр `$accessor` выступает как **PHP выражение**, описывающее название функции или метод:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->addAccessorSmart("di", "App::getInstance()->di->get", Fenom::ACCESSOR_CALL);
|
$fenom->addAccessorSmart("di", "App::getInstance()->di->get", Fenom::ACCESSOR_CALL);
|
||||||
```
|
```
|
||||||
`App::getInstance()->di->get` доллжно быть callable, то есть
|
|
||||||
|
`App::getInstance()->di->get` должно быть callable, то есть:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
is_callable([App::getInstance()->di, "get"]) === true;
|
is_callable([App::getInstance()->di, "get"]) === true;
|
||||||
```
|
```
|
||||||
|
|
||||||
В шаблоне появится глобальная переменная `$.di`:
|
В шаблоне появится глобальная переменная `$.di`:
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{set $st = $.di("stamp")} {* $st = App::getInstance()->di->get("stamp") *}
|
{set $st = $.di("stamp")} {* $st = App::getInstance()->di->get("stamp") *}
|
||||||
```
|
```
|
||||||
|
|
||||||
Шаблонизатор не проверят количество и тип параметров которые передает в метод или функцию.
|
Шаблонизатор не проверят количество и тип параметров которые передает в метод или функцию.
|
||||||
|
|
||||||
# Источники шаблонов
|
# Источники шаблонов
|
||||||
@ -231,12 +259,11 @@ class DbProvider implements Fenom\ProviderInterface {
|
|||||||
Добавляем источник, указав удобное имя.
|
Добавляем источник, указав удобное имя.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
|
||||||
$provider = new DbProvider();
|
$provider = new DbProvider();
|
||||||
$fenom->setProvider("db", $provider, "/tmp/cached/db");
|
$fenom->setProvider("db", $provider, "/tmp/cached/db");
|
||||||
```
|
```
|
||||||
|
|
||||||
Теперь источник можно использовать.
|
Теперь источник можно использовать:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$fenom->display("db:index.tpl", $vars);
|
$fenom->display("db:index.tpl", $vars);
|
||||||
@ -269,7 +296,7 @@ $fenom->display("db:index.tpl", $vars);
|
|||||||
**Note**
|
**Note**
|
||||||
(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддерживает другие протоколы.
|
(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддерживает другие протоколы.
|
||||||
|
|
||||||
Пример работы кеша
|
Пример работы кеша:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$this->setCacheDir("redis://hash/compiled/");
|
$this->setCacheDir("redis://hash/compiled/");
|
||||||
|
Loading…
Reference in New Issue
Block a user