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
* Модификаторы позволяют изменить значение переменной перед выводом или использованием в выражении
* Модификаторы записываются после переменной через символ вертикальной черты "|"
* Модификаторы могут иметь параметры, которые записываются через символ двоеточие ":" после имени модификатора
* Параметры модификаторов друг от друга также разделяются символом двоеточие ":"
* В качестве параметров могут использоваться переменные.
* Модификаторы могут составлять цепочки. В этом случае они применяются к переменной последовательно слева направо
* 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
{var $foo="User"}
{$foo|upper} выведет "USER"
{$foo|lower} выведет "user"
{"{$foo|lower}"} выведет "user"
{"User"|lower}} выведет "user"
{$looong_text|truncate:80:"..."} обрежет текст до 80 символов и добавит "..." в конец текста
{$foo|upper} outputs "USER"
{$foo|lower} outputs "user"
{"{$foo|lower}"} outputs "user"
{"User"|lower}} outputs "user"
{$looong_text|truncate:80:"..."} truncate the text to 80 symbols and append <continue> symbols, like "..."
{$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)

View File

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

View File

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