Как я могу настроить пользовательскую функцию в Volt (Phalcon)
Как я могу настроить определяемую пользователем функцию в Volt? Например, я хочу вызвать функцию, которая переводила бы строки в моих представлениях как таковые:
<div class='page-header'>
<h2>{{ tr('session_login_title') }}</h2>
</div>
И я хочу, чтобы tr
отображалось в функцию \My\Locale::translate($key)
1 answers
Функции Volt действуют как замены строк и фактически не вызывают базовую функцию. Volt преобразует функцию в соответствующую строку, которая в свою очередь интерпретируется PHP.
Предположим, у вас есть класс Locale
, который имеет метод translate
как таковой:
public static function translate()
{
$return = '';
if (isset(self::$_phrases[$key]))
{
$return = self::$_phrases[$key];
}
return $return;
}
Этот метод использует внутренний массив $_phrases
для поиска соответствующего ключа, который вы передаете, и возвращает текст нужной фразы. Если он не найден, он возвращает пустую строку.
Теперь нам нужно зарегистрируйте функцию в вольтах.
$di->set(
'volt',
function($view, $di) use($config)
{
$volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
$volt->setOptions(
array(
'compiledPath' => $config->app_volt->path,
'compiledExtension' => $config->app_volt->extension,
'compiledSeparator' => $config->app_volt->separator,
'stat' => (bool) $config->app_volt->stat,
)
);
$volt->getCompiler()->addFunction(
'tr',
function($key)
{
return "\\My\\Locale::translate({$key})";
}
);
return $volt;
},
true
);
Обратите внимание, как зарегистрирована функция tr
. Он возвращает строку \My\Locale::translate({$key})
с переданным параметром $key
. Этот синтаксис Volt будет переведен в директивы PHP и выполнен PHP. Поэтому строка представления:
<div class='page-header'>
<h2>{{ tr('session_login_title') }}</h2>
</div>
После обработки Вольтом становится:
<div class='page-header'>
<h2><?php echo \My\Locale::translate('session_login_title') ?></h2>
</div>