4

カスタム小枝関数 templateName を作成したとしましょう。

$twig = new Twig_Environment($loader);
$twig->addFunction('templateName', new Twig_Function_Function('twig_template_name', array('needs_environment' => true)));

PHP で現在のテンプレートの名前を取得する方法はありますか。私は次のようなものを想像します:

function twig_template_name(Twig_Environment $env, $values = null) {
  return $env->getCurrentTemplateName();
}

前もって感謝します。

4

3 に答える 3

4

最初の質問への回答が必要なすべての人のために、twig 自体が Twig_Error クラスで使用している解決策を見つけました。

protected function guessTemplateInfo()
{
    $template = null;
    foreach (debug_backtrace() as $trace) {
        if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
            $template = $trace['object'];
        }
    }

    // update template filename
    if (null !== $template && null === $this->filename) {
        $this->filename = $template->getTemplateName();
    }

    /* ... */

よろしくお願いします!

于 2012-09-30T12:19:57.833 に答える
0
$twig = new Twig_Environment($loader);
$twig->addFunction(new Twig_SimpleFunction('twig_template_name', function() use ($twig) {

  $caller_template_name = $twig->getCompiler()->getFilename();

  echo "This function was called from {$caller_template_name}";

}));

更新: Letoで述べたように、このメソッドはキャッシュされた (コンパイルされた) テンプレート内からは機能しません。ただし、Twig のキャッシュの代わりに共有メモリ キャッシュ (APC、Memcache) を使用するか、トラフィックの少ない環境で実行されるアプリでこの機能を実行する場合 (スタッフ向けのバックエンド アプリやアプリのブランチを考えてみてください。アプリのコードベースに関する情報を収集するためにのみ使用されます)、Twig のキャッシュを無効にすることで機能させることができます (例: $twig = new Twig_Environment($loader, array('cache' => false));)。ただし、Twig のキャッシュを無効にしてこの方法を使用する前に、ユースケースを注意深く調べて、別のアプローチを使用してその問題を解決できるかどうかを確認してください。

于 2014-10-20T18:18:45.090 に答える