Add dynamic modifier support

This commit is contained in:
bzick 2013-06-20 10:36:35 +04:00
parent f6512fccfc
commit 2e4ce13c10
3 changed files with 20 additions and 16 deletions

View File

@ -135,21 +135,18 @@ but if use single quote any template expressions will be on display as it is
### Modifiers ### Modifiers
* Модификаторы позволяют изменить значение переменной перед выводом или использованием в выражении * Модификаторы позволяют изменить значение переменной перед выводом или использованием в выражении
* Модификаторы записываются после переменной через символ вертикальной черты "|" * To apply a modifier, specify the value followed by a | (pipe) and the modifier name.
* Модификаторы могут иметь параметры, которые записываются через символ двоеточие ":" после имени модификатора * A modifier may accept additional parameters that affect its behavior. These parameters follow the modifier name and are separated by a : (colon).
* Параметры модификаторов друг от друга также разделяются символом двоеточие ":"
* В качестве параметров могут использоваться переменные.
* Модификаторы могут составлять цепочки. В этом случае они применяются к переменной последовательно слева направо
```smarty ```smarty
{var $foo="User"} {var $foo="User"}
{$foo|upper} выведет "USER" {$foo|upper} outputs "USER"
{$foo|lower} выведет "user" {$foo|lower} outputs "user"
{"{$foo|lower}"} выведет "user" {"{$foo|lower}"} outputs "user"
{"User"|lower}} выведет "user" {"User"|lower}} outputs "user"
{$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит "..." в конец текста {$looong_text|truncate:80:"..."} truncate the text to 80 symbols and append <continue> symbols, like "..."
{$looong_text|lower|truncate:$settings.count:$settings.etc} {$looong_text|lower|truncate:$settings.count:$settings.etc}
{var $foo="Ivan"|upper} переменная $foo будет содержать "USER" {var $foo="Ivan"|upper} sets $foo value "USER"
``` ```
[List of modifiers](./main.md#modifiers) [List of modifiers](./main.md#modifiers)

View File

@ -571,7 +571,7 @@ class Compiler {
* Standard function parser * Standard function parser
* *
* @static * @static
* @param $function * @param mixed $function
* @param Tokenizer $tokens * @param Tokenizer $tokens
* @param Template $tpl * @param Template $tpl
* @return string * @return string

View File

@ -844,7 +844,8 @@ class Template extends Render {
*/ */
public function parseModifier(Tokenizer $tokens, $value) { public function parseModifier(Tokenizer $tokens, $value) {
while($tokens->is("|")) { while($tokens->is("|")) {
$mods = $this->_cytro->getModifier( $tokens->getNext(Tokenizer::MACRO_STRING) ); $mods = $this->_cytro->getModifier( $modifier_name = $tokens->getNext(Tokenizer::MACRO_STRING) );
$tokens->next(); $tokens->next();
$args = array(); $args = array();
@ -870,12 +871,18 @@ class Template extends Render {
} }
if($args) { if(is_string($mods)) { // dynamic modifier
$value = $mods.'('.$value.', '.implode(", ", $args).')'; $mods = 'call_user_func($tpl->getStorage()->getModifier("'.$modifier_name.'"), ';
} else { } else {
$value = $mods.'('.$value.')'; $mods .= "(";
}
if($args) {
$value = $mods.$value.', '.implode(", ", $args).')';
} else {
$value = $mods.$value.')';
} }
} }
// var_dump($value); exit;
return $value; return $value;
} }