mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
++Docs
This commit is contained in:
parent
1c439fedb7
commit
7e8598ae3b
@ -36,7 +36,8 @@ $fenom->setOptions($options);
|
||||
| *force_include* | `Fenom::FORCE_INCLUDE` | стараться по возможности вставить код дочернего шаблона в родительский при подключении шаблона | повышает производительность, увеличивает размер файлов в кеше, уменьшает количество файлов в кеше |
|
||||
| *auto_escape* | `Fenom::AUTO_ESCAPE` | автоматически экранировать HTML сущности при выводе переменных в шаблон | понижает производительность |
|
||||
| *force_verify* | `Fenom::FORCE_VERIFY` | автоматически проверять существование переменной перед использованием в шаблоне | понижает производительность |
|
||||
| *disable_statics* | `Fenom::DENY_STATICS` | отключает воззможность вызова статических методов в шаблоне | |
|
||||
| *disable_php_calls* | `Fenom::DENY_PHP_CALLS` | отключает возможность вызова статических методов и функций в шаблоне | |
|
||||
| *disable_statics* | `Fenom::DENY_STATICS` | устаревшее название disable_php_calls | |
|
||||
| *strip* | `Fenom::AUTO_STRIP` | удаляет лишиние пробелы в шаблоне | уменьшает размер кеша |
|
||||
|
||||
```php
|
||||
|
@ -115,15 +115,17 @@ $fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
|
||||
# Расширение тестовго оператора
|
||||
|
||||
```php
|
||||
$fenom->addTest($name, $code);
|
||||
?>
|
||||
$fenom->addTest(string $name, string $code);
|
||||
```
|
||||
`$code` - PHP код для условия, с маркером для замены на значение или переменную.
|
||||
Например, тест на целое число `is int` можно добавить как `$fenom->addTest('int', 'is_int(%s)')`.
|
||||
В шаблоне тесты выглядит как `{$a is int}`, а после компиляции выглядит приблизительно так - `is_int($a)`.
|
||||
|
||||
# Расширение глобальной переменной или функции
|
||||
|
||||
Fenom обладает определенным набором глобальных переменных и функций. Однако их может не хватать для удобной работы с шаблонами.
|
||||
В этом случае потребуется добавить, переопределить или удалить существующие глобальные переменные или функции.
|
||||
Метод `Fenom::addAccessor($name, $parser)` позволяет добавить свой обработчик на не известную глобальную переменную или функцию.
|
||||
Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик на не известную глобальную переменную или функцию.
|
||||
|
||||
```php
|
||||
$fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ });
|
||||
|
@ -1,19 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Ts {
|
||||
class Math {
|
||||
public static function multi($x, $y) {
|
||||
return $x * $y;
|
||||
}
|
||||
}
|
||||
}
|
||||
require_once __DIR__.'/../src/Fenom.php';
|
||||
|
||||
namespace {
|
||||
require_once __DIR__.'/../src/Fenom.php';
|
||||
\Fenom::registerAutoload();
|
||||
|
||||
\Fenom::registerAutoload();
|
||||
|
||||
$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled', Fenom::FORCE_COMPILE);
|
||||
|
||||
var_dump($fenom->compile("concat-bug.tpl", false)->getBody());
|
||||
}
|
||||
$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled');
|
||||
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::AUTO_STRIP);
|
||||
echo($fenom->compile("problem.tpl", false)->getBody());
|
||||
// $fenom->getTemplate("problem.tpl");
|
@ -36,8 +36,13 @@ class Fenom
|
||||
const DISABLE_CACHE = 0x400;
|
||||
const FORCE_VERIFY = 0x800;
|
||||
const AUTO_TRIM = 0x1000; // reserved
|
||||
const DENY_STATICS = 0x2000;
|
||||
const DENY_PHP_CALLS = 0x2000;
|
||||
const AUTO_STRIP = 0x4000;
|
||||
/**
|
||||
* Use DENY_PHP_CALLS
|
||||
* @deprecated
|
||||
*/
|
||||
const DENY_STATICS = 0x2000;
|
||||
|
||||
/* Default parsers */
|
||||
const DEFAULT_CLOSE_COMPILER = 'Fenom\Compiler::stdClose';
|
||||
@ -63,6 +68,7 @@ class Fenom
|
||||
"auto_escape" => self::AUTO_ESCAPE,
|
||||
"force_verify" => self::FORCE_VERIFY,
|
||||
"auto_trim" => self::AUTO_TRIM,
|
||||
"disable_php_calls" => self::DENY_PHP_CALLS,
|
||||
"disable_statics" => self::DENY_STATICS,
|
||||
"strip" => self::AUTO_STRIP,
|
||||
);
|
||||
@ -399,6 +405,9 @@ class Fenom
|
||||
$this->_provider = $provider;
|
||||
}
|
||||
|
||||
public function setCachePerms() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set compile directory
|
||||
*
|
||||
|
@ -663,10 +663,6 @@ class Template extends Render
|
||||
// parse term
|
||||
$term = $this->parseTerm($tokens, $var); // term of the expression
|
||||
if ($term !== false) {
|
||||
if ($var && ($this->_options & Fenom::FORCE_VERIFY)) {
|
||||
$term = '(isset(' . $term . ') ? ' . $term . ' : null)';
|
||||
$var = false;
|
||||
}
|
||||
if ($tokens->is('|')) {
|
||||
$term = $this->parseModifier($tokens, $term);
|
||||
$var = false;
|
||||
@ -780,24 +776,37 @@ class Template extends Render
|
||||
}
|
||||
return $this->parseScalar($tokens, true);
|
||||
} elseif ($tokens->is(T_VARIABLE)) {
|
||||
$code = $unary . $this->parseVariable($tokens);
|
||||
$code = $this->parseVariable($tokens);
|
||||
if ($tokens->is("(") && $tokens->hasBackList(T_STRING, T_OBJECT_OPERATOR)) {
|
||||
if ($this->_options & Fenom::DENY_METHODS) {
|
||||
throw new \LogicException("Forbidden to call methods");
|
||||
}
|
||||
$code = $this->parseChain($tokens, $code);
|
||||
return $this->parseChain($tokens, $code);
|
||||
} elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) {
|
||||
$code .= $tokens->getAndNext();
|
||||
if($this->_options & Fenom::FORCE_VERIFY) {
|
||||
return $unary . '(isset(' . $code . ') ? ' . $code . $tokens->getAndNext() . ' : null)';
|
||||
} else {
|
||||
return $unary . $code . $tokens->getAndNext();
|
||||
}
|
||||
} else {
|
||||
$is_var = true;
|
||||
if($this->_options & Fenom::FORCE_VERIFY) {
|
||||
return $unary . '(isset(' . $code . ') ? ' . $code . ' : null)';
|
||||
} else {
|
||||
$is_var = true;
|
||||
return $unary . $code;
|
||||
}
|
||||
}
|
||||
return $code;
|
||||
} elseif ($tokens->is('$')) {
|
||||
$is_var = false;
|
||||
$var = $this->parseAccessor($tokens);
|
||||
return $unary . $var;
|
||||
} elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) {
|
||||
return $unary . $tokens->getAndNext() . $this->parseVariable($tokens);
|
||||
if($this->_options & Fenom::FORCE_VERIFY) {
|
||||
$var = $this->parseVariable($tokens);
|
||||
return $unary . '(isset(' . $var . ') ? ' . $tokens->getAndNext() . $this->parseVariable($tokens).' : null)';
|
||||
} else {
|
||||
return $unary . $tokens->getAndNext() . $this->parseVariable($tokens);
|
||||
}
|
||||
} elseif ($tokens->is("(")) {
|
||||
$tokens->next();
|
||||
$code = $unary . "(" . $this->parseExpr($tokens) . ")";
|
||||
|
@ -433,6 +433,7 @@ class TemplateTest extends TestCase
|
||||
'if: block1 end'
|
||||
),
|
||||
array('if: {if $unexist} block1 {else} block2 {/if} end', $a, 'if: block2 end', Fenom::FORCE_VERIFY),
|
||||
array('if: {if !$unexist} block1 {else} block2 {/if} end', $a, 'if: block1 end', Fenom::FORCE_VERIFY),
|
||||
);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user