Как я могу настроить пользовательскую функцию в Volt (Phalcon)


Как я могу настроить определяемую пользователем функцию в Volt? Например, я хочу вызвать функцию, которая переводила бы строки в моих представлениях как таковые:

<div class='page-header'>
    <h2>{{ tr('session_login_title') }}</h2>
</div>

И я хочу, чтобы tr отображалось в функцию \My\Locale::translate($key)

Author: Nikolaos Dimopoulos, 2012-12-28

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>
 15
Author: Nikolaos Dimopoulos, 2013-03-02 19:29:41