This commit is contained in:
bzick 2014-11-05 16:07:50 +03:00
parent 1c439fedb7
commit 7e8598ae3b
6 changed files with 43 additions and 30 deletions

View File

@ -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

View File

@ -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 */ });

View File

@ -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");

View File

@ -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
*

View File

@ -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) . ")";

View File

@ -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),
);
}