8

Volt でユーザー定義関数を設定するにはどうすればよいですか? たとえば、ビュー内の文字列を次のように変換する関数を呼び出したいとします。

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

trを関数にマップしたい\My\Locale::translate($key)

4

1 に答える 1

17

Volt 関数は文字列の置換として機能し、実際には基になる関数を呼び出しません。Volt は関数を関連する文字列に変換し、その文字列は PHP によって解釈されます。

次のようなメソッドLocaleを持つクラスがあるとします。translate

public static function translate()
{
    $return = '';

    if (isset(self::$_phrases[$key]))
    {
        $return = self::$_phrases[$key];
    }

    return $return;
}

このメソッドは、$_phrases内部配列を使用して、渡した関連キーを検索し、必要なフレーズのテキストを返します。見つからない場合は、空の文字列を返します。

次に、関数を Volt に登録する必要があります。

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

Volt の処理後は次のようになります。

<div class='page-header'>
    <h2><?php echo \My\Locale::translate('session_login_title') ?></h2>
</div>
于 2012-12-28T15:00:00.933 に答える