Volt でユーザー定義関数を設定するにはどうすればよいですか? たとえば、ビュー内の文字列を次のように変換する関数を呼び出したいとします。
<div class='page-header'>
<h2>{{ tr('session_login_title') }}</h2>
</div>
tr
を関数にマップしたい\My\Locale::translate($key)
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>