diff --git a/docs/ru/adapters.md b/docs/ru/adapters.md new file mode 100644 index 0000000..70e2f14 --- /dev/null +++ b/docs/ru/adapters.md @@ -0,0 +1,8 @@ +Adapters +======== + +* [Fenom + Yii](https://bitbucket.org/RSol/rfenomviewrender) +* [Fenom + Kohana](https://github.com/2bj/kofenom) — Kofenom +* Fenom + Symphony +* Fenom + Symphony2 +* Fenom + Zend Framework \ No newline at end of file diff --git a/docs/ru/articles.md b/docs/ru/articles.md new file mode 100644 index 0000000..c48700f --- /dev/null +++ b/docs/ru/articles.md @@ -0,0 +1,6 @@ +Articles +======== + +## 2013 + +[Fenom — yet another PHP template engine](http://habrahabr.ru/post/169525/) [RU] diff --git a/docs/ru/benchmark.md b/docs/ru/benchmark.md new file mode 100644 index 0000000..aa10f55 --- /dev/null +++ b/docs/ru/benchmark.md @@ -0,0 +1,63 @@ +Benchmark +========= + +To start benchmark use script `benchmark/run.php -h`. + +### Smarty3 vs Twig vs Fenom + +Smarty3 vs Twig vs Fenom + +Generate templates... Done + + Testing a lot output... + smarty3: !compiled and !loaded 3.9101 sec, 15.1 MiB + smarty3: compiled and !loaded 0.0235 sec, 9.3 MiB + smarty3: compiled and loaded 0.0015 sec, 9.3 MiB + + twig: !compiled and !loaded 1.8725 sec, 68.9 MiB + twig: compiled and !loaded 0.0337 sec, 17.0 MiB + twig: compiled and loaded 0.0013 sec, 17.0 MiB + + fenom: !compiled and !loaded 0.3157 sec, 8.9 MiB + fenom: compiled and !loaded 0.0159 sec, 6.6 MiB + fenom: compiled and loaded 0.0012 sec, 6.6 MiB + + + Testing 'foreach' of big array... + smarty3: !compiled and !loaded 0.0355 sec, 5.8 MiB + smarty3: compiled and !loaded 0.0032 sec, 3.1 MiB + smarty3: compiled and loaded 0.0024 sec, 3.1 MiB + + twig: !compiled and !loaded 0.0799 sec, 4.7 MiB + twig: compiled and !loaded 0.0065 sec, 3.2 MiB + twig: compiled and loaded 0.0054 sec, 3.5 MiB + + fenom: !compiled and !loaded 0.0459 sec, 3.1 MiB + fenom: compiled and !loaded 0.0024 sec, 2.5 MiB + fenom: compiled and loaded 0.0017 sec, 2.5 MiB + + + Testing deep 'inheritance'... + smarty3: !compiled and !loaded 0.3984 sec, 10.2 MiB + smarty3: compiled and !loaded 0.0009 sec, 3.1 MiB + smarty3: compiled and loaded 0.0001 sec, 3.1 MiB + + twig: !compiled and !loaded 0.2897 sec, 11.2 MiB + twig: compiled and !loaded 0.0197 sec, 6.5 MiB + twig: compiled and loaded 0.0019 sec, 6.5 MiB + + fenom: !compiled and !loaded 0.0546 sec, 3.2 MiB + fenom: compiled and !loaded 0.0005 sec, 2.5 MiB + fenom: compiled and loaded 0.0000 sec, 2.5 MiB + +* **!compiled and !loaded** - template engine object created but parsers not initialized and templates not compiled +* **compiled and !loaded** - template engine object created, template compiled but not loaded +* **compiled and loaded** - template engine object created, template compiled and loaded + +### Stats + +| Template Engine | Files | Classes | Lines | +| --------------- | ------:| --------:| ------:| +| Smarty3 (3.1.13)| 320 | 190 | 55095 | +| Twig (1.13.0) | 162 | 131 | 13908 | +| Fenom (1.0.1) | 9 | 16 | 3899 | diff --git a/docs/ru/callbacks.md b/docs/ru/callbacks.md new file mode 100644 index 0000000..9faaa8f --- /dev/null +++ b/docs/ru/callbacks.md @@ -0,0 +1,3 @@ +Callbacks +========= + diff --git a/docs/ru/configuration.md b/docs/ru/configuration.md new file mode 100644 index 0000000..83bed60 --- /dev/null +++ b/docs/ru/configuration.md @@ -0,0 +1,73 @@ +Setup +===== + +## Configure + +### Template cache + +```php +$fenom->setCompileDir($dir); +``` + +This method set the name of the directory where template caches are stored. By default this is `/tmp`. This directory must be writeable. + +### Template settings + +```php +// set options using factory +$fenom = Fenom::factory($tpl_dir, $compile_dir, $options); +// or inline using method setOptions +$fenom->setOptions($options); +``` + +Options may by associative array like `'option_name' => true` or bitwise mask. + +| Option name | Constant | Description | Affect | +| ---------------------- | ------------------------- | ------------ | ------- | +| *disable_methods* | `Fenom::DENY_METHODS` | disable calling methods of objects in templates. | | +| *disable_native_funcs* | `Fenom::DENY_NATIVE_FUNCS`| disable calling native function in templates, except allowed. | | +| *auto_reload* | `Fenom::AUTO_RELOAD` | reload template if source will be changed | decreases performance | +| *force_compile* | `Fenom::FORCE_COMPILE` | recompile template every time when the template renders | very decreases performance | +| *disable_cache* | `Fenom::DISABLE_CACHE` | disable compile cache | greatly decreases performance | +| *force_include* | `Fenom::FORCE_INCLUDE` | paste template body instead of include-tag | increases performance, increases cache size | +| *auto_escape* | `Fenom::AUTO_ESCAPE` | html-escape each variables outputs | decreases performance | +| *force_verify* | `Fenom::FORCE_VERIFY` | check existence every used variable | decreases performance | + +| *disable_statics* | `Fenom::DENY_STATICS` | disable calling static methods in templates. | | +| *strip* | `Fenom::AUTO_STRIP` | strip all whitespaces in templates. | decrease cache size | + +```php +$fenom->setOptions(array( + "compile_check" => true, + "force_include" => true +)); +// same +$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_INCLUDE); +``` + +**Note** +By default all options disabled + +## 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 + + diff --git a/docs/ru/ext/extend.md b/docs/ru/ext/extend.md new file mode 100644 index 0000000..14a86f5 --- /dev/null +++ b/docs/ru/ext/extend.md @@ -0,0 +1,164 @@ +Extends Fenom +============= + +*TODO* + +# Add tags + +В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_. +Compilers invokes during compilation template to PHP source and have to +Компиляторы вызываются во время преобразования кода шаблона в PHP код и возвращяю PHP код который будет вставлен вместо тега. +А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены. +Среди тегов как и в HTML есть строчные и блоковые теги. + +## Inline function + +Примитивное добавление функции можно осуществить следующим образом: + +```php +$fenom->addFunction(string $function_name, callable $callback[, callable $parser]); +``` + +В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML аттрибутов и отдаст их в функцию ассоциативным массивом: +```php +$fenom->addFunction("some_function", function (array $params) { /* ... */ }); +``` +При необходимости можно переопределить парсер на произвольный: +```php +$fenom->addFunction("some_function", $some_function, function (Fenom\Tokenizer $tokenizer, Fenom\Template $template) { /* parse tag */}); +``` +Существует более простой способ добавления произвольной функции: + +```php +$fenom->addFunctionSmarty(string $function_name, callable $callback); +``` + +В данном случае парсер сканирует список аргументов коллбека и попробует сопоставить с аргументами тега. + +```php +// ... class XYCalcs .. +public static function calc($x, $y = 5) { /* ... */} +// ... +$fenom->addFunctionSmart('calc', 'XYCalcs::calc'); +``` +then +```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) +``` +Таким образом вы успешно можете добавлять Ваши функции или методы. + +## Block function + +Добавление блоковой функции аналогичен добавлению строковой за исключением того что есть возможность указать парсер для закрывающего тега. + +```php +$fenom->addBlockFunction(string $function_name, callable $callback[, callable $parser_open[, callable $parser_close]]); +``` + +Сам коллбек принимает первым аргументом контент между открывающим и закрывающим тегом, а вторым аргументом - ассоциативный массив из аргуметов тега: +```php +$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */}); +``` + +## Inline compiler + +Добавление строчного компилятора осуществляеться очень просто: + +```php +$fenom->addCompiler(string $compiler, callable $parser); +``` + +Парсер должен принимать `Fenom\Tokenizer $tokenizer`, `Fenom\Template $template` и возвращать PHP код. +Компилятор так же можно импортировать из класса автоматически + +```php +$fenom->addCompilerSmart(string $compiler, $storage); +``` + +`$storage` может быть как классом так и объектом. В данном случае шаблонизатор будет искать метод `tag{$compiler}`, который будет взят в качестве парсера тега. + +## Block compiler + +Добавление блочного компилятора осуществяется двумя способами. Первый + +```php +$fenom->addBlockCompiler(string $compiler, array $parsers, array $tags); +``` + +где `$parser` ассоциативный массив `["open" => parser, "close" => parser]`, сождержащий парсер на открывающий и на закрывающий тег, а `$tags` содержит список внутренних тегов в формате `["tag_name"] => parser`, которые могут быть использованы только с этим компилятором. +Второй способ добавления парсера через импортирование из класса или объекта методов: + +```php +$fenom->addBlockCompilerSmart(string $compiler, $storage, array $tags, array $floats); +``` + +# Add modifiers + +``` +$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) { + // ... +}); +``` + +# Extends test operator + +```php +$fenom->addTest($name, $code); +?> +``` + +# Add template provider + +Бывает так что шаблны не хранятся на файловой сиситеме, а хранятся в некотором хранилище, например, в базе данных MySQL. +В этом случае шаблонизатору нужно описать как забирать шаблоны из хранилища, как проверять дату изменения шаблона и где хранить кеш шаблонов (опционально). +Эту задачу берут на себя Providers, это объекты реальзующие интерфейс `Fenom\ProviderInterface`. + +# Extends accessor + +# Extends cache + +Изначально Fenom не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе. +Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора. +Речь идет о своем протоколе, отличным от `file://`, который [можно определить](http://php.net/manual/en/class.streamwrapper.php) в 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) +* [CacheStreamWrapper::stream_write](http://www.php.net/manual/en/streamwrapper.stream-write.php) +* [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`: + +* [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 doesn't support custom protocols except `file://` and `phar://`. + +For example, + +```php +$this->setCacheDir("redis://hash/compiled/"); +``` + +* `$cache = fopen("redis://hash/compiled/XnsbfeDnrd.php", "w");` +* `fwrite($cache, "...