From 5c86d2d6ae9d49e3e901088a5ed69ddae0d23733 Mon Sep 17 00:00:00 2001 From: bzick Date: Thu, 13 Aug 2015 14:55:00 +0300 Subject: [PATCH] Docs --- docs/ru/ext/extend.md | 85 +++++++++++++++++++++++++++++++++++++++---- docs/ru/readme.md | 2 +- docs/ru/syntax.md | 5 +-- sandbox/fenom.php | 7 ++-- 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/docs/ru/ext/extend.md b/docs/ru/ext/extend.md index 8db6fc3..9457d02 100644 --- a/docs/ru/ext/extend.md +++ b/docs/ru/ext/extend.md @@ -120,22 +120,93 @@ $fenom->addTest(string $name, string $code); Например, тест на целое число `is int` можно добавить как `$fenom->addTest('int', 'is_int(%s)')`. В шаблоне тесты выглядит как `{$a is int}`, а после компиляции выглядит приблизительно так - `is_int($a)`. -# Расширение глобальной переменной или функции +# Расширение глобальной переменной -Fenom обладает определенным набором глобальных переменных и функций. Однако их может не хватать для удобной работы с шаблонами. -В этом случае потребуется добавить, переопределить или удалить существующие глобальные переменные или функции. -Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик на не известную глобальную переменную или функцию. +Fenom обладает определенным [набором глобальных переменных](../syntax.md#Системная-переменная). +Однако их может не хватать для удобной работы и в этом случае потребуется добавить свои или переопределить/удалить существующие. +Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик-парсер `$parser`, +который будет вызван при встрече с глобальной переменной `$name` **во время компиляции шаблона**. ```php $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }); ``` -Указанный вторым аргументом, парсер будет вызван при встречи компилятором конструкции `{$.project}`. -Парсеры вызываются только на момент сборки шаблона, а не во время его выполенения. +Указанный вторым аргументом, парсер будет вызван при встречи компилятором конструкции `$.project`. +Парсер сам должен разобрать все токены из набора токенов `$tokens` до того момента пока не посчитает что ему их хватит для +интерпретации. Возвращает парсер PHP код, который должен представлять значение восле выполенения, то есть его можно втавить в `if()`. -Через метод `Fenom::addAccessor($name, $parser)` можно переопределить уже любую другую существующую глобальную переменную или функцию. +Через метод `Fenom::addAccessor($name, $parser)` можно переопределить уже любую другую существующую глобальную переменную. Метод `Fenom::removeAccessor($name)` позволяет удалить любую определенную глобальную переменную или функцию по ее имени. +## Готовые решения + +Орпеделить парсер для глобальной переменной весьма трудозатратно и требует полного понимания как работают парсеры в Fenom. +Это не удобно. Поэтому есть несколько предзаготовленных (умных) парсеоров, которые берут рутину на себя, а пользоватею остается указать ключевые параметры. + +Умные парсеты добавляются через метод `Fenom::addAccessorSmart(string $name, string $accessor, string $parser)`, +где `$name` имя глобальной переменной, `$accessor` — параметр к парсеру, `$parser` — предопределенный парсер. + +### Доступ к свойству + +Парсер `Fenom::ACCESSOR_PROPERTY` позволит обратится к указанному свойству шаблонизатора из шаблона. +Параметр `$accessor` выступает как **имя свойства**: + +```php + $fenom->addAccessorSmart("site", "data", Fenom::ACCESSOR_PROPERTY); + $fenom->data = [ + "domain" => 'example.ru', + "support" => 'support@example.ru' + ]; +``` +В шаблоне появится глобальная переменная `$.site`: +```smarty + +
Support {$.site.support}
+``` +Свойством может быть любое значение — масиив, объект и т.д. + +### Доступ к методу + +Парсер `Fenom::ACCESSOR_METHOD` позволит обратится к указанному методу шаблонизатора из шаблона. +Параметр `$accessor` выступает как **имя метода**: +```php + $fenom->addAccessorSmart("fetch", "fetch", Fenom::ACCESSOR_METHOD); +``` +В шаблоне появится глобальная функция `$.fetch`: +```smarty +{set $menu = $.fetch("site/menu.tpl")} {* $menu = $fenom->fetch("site/menu.tpl") *} +``` +Шаблонизатор не проверят количество и тип параметров которые передает в метод. + +### Доступ к значению + +Парсер `Fenom::ACCESSOR_VAR` позволит обратится к указанному значению из шаблона. +Параметр `$accessor` выступает как **PHP выражение**, описывающее значение: +```php + $fenom->addAccessorSmart("storage", "App::getInstance()->storage", Fenom::ACCESSOR_VAR); +``` +В шаблоне появится глобальная переменная `$.storage`: +```smarty +{set $st = $.storage.di.stamp} {* $st = App::getInstance()->storage['di']['stamp'] *} +``` + +### Доступ к callable + +Парсер `Fenom::ACCESSOR_CALL` позволит вызвать указанную финкцию или метод из шаблона. +Параметр `$accessor` выступает как **PHP выражение**, описывающее название функции или метод: +```php + $fenom->addAccessorSmart("di", "App::getInstance()->di->get", Fenom::ACCESSOR_CALL); +``` +`App::getInstance()->di->get` доллжно быть callable, то есть +```php +is_callable([App::getInstance()->di, "get"]) === true; +``` +В шаблоне появится глобальная переменная `$.di`: +```smarty +{set $st = $.di("stamp")} {* $st = App::getInstance()->di->get("stamp") *} +``` +Шаблонизатор не проверят количество и тип параметров которые передает в метод или функцию. + # Источники шаблонов Шаблоны можно получать из самых разных источников. diff --git a/docs/ru/readme.md b/docs/ru/readme.md index b7b743a..aefd343 100644 --- a/docs/ru/readme.md +++ b/docs/ru/readme.md @@ -1,7 +1,7 @@ Документация ============= -grammar nazi required +grammar nazi required **Внимание! Документация в режиме беты, тексты могут содержать опечатки** diff --git a/docs/ru/syntax.md b/docs/ru/syntax.md index c496fb1..42b5789 100644 --- a/docs/ru/syntax.md +++ b/docs/ru/syntax.md @@ -102,10 +102,7 @@ если такой констатнты нет будет взята константа `Storage\FS\DIR_SEPARATOR`. * `$.php` обращение к статическомому методу. `$.php.Storage.FS::put($filename, $data)` обращение к методу `Storage\FS::put($filename, $data)`. `$.php.Storage.FS.put($filename, $data)` `Storage\FS\put($filename, $data)` -* Системная функция `$.fetch($name, $values)` реализует метод Fenom::fetch() в шаблоне. `$name` — имя шаблона, - `$values` — дополнительные переменные, которые будут добавлены к существующим. - Функция позволяет получить резуьтат работы шаблона в переменную. -* так же вы можете [добавить](./ext/extend.md#Расширение-глобальной-переменной-или-функции) свои системные переменные и функции +* так же вы можете [добавить](./ext/extend.md#Расширение-глобальной-переменной) свои системные переменные и функции ## Скалярные значения diff --git a/sandbox/fenom.php b/sandbox/fenom.php index 3d7a218..8554dce 100644 --- a/sandbox/fenom.php +++ b/sandbox/fenom.php @@ -5,10 +5,9 @@ require_once __DIR__.'/../tests/tools.php'; \Fenom::registerAutoload(); -$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled'); -$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_COMPILE); -$fenom->addAccessorSmart('fetch', 'fetch', Fenom::ACCESSOR_METHOD); -var_dump($fenom->compileCode('{$.fetch("template.tpl")}')->getBody()); +$fenom = Fenom::factory(__DIR__.'/../tests/resources/provider', __DIR__.'/../tests/resources/compile'); +$fenom->setOptions(Fenom::AUTO_RELOAD); +var_dump($fenom->fetch('extends/auto/parent.tpl')); //var_dump($fenom->compile("bug158/main.tpl", [])->getTemplateCode()); //var_dump($fenom->display("bug158/main.tpl", [])); // $fenom->getTemplate("problem.tpl"); \ No newline at end of file