скажем, я создал пользовательскую функцию твига: 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(); }
Заранее спасибо.
Для каждого, кто нуждается в ответе на начальный вопрос, я нашел решение, которое сама ветка использует в классе 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(); } /* ... */
с наилучшими пожеланиями!
$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}"; }));
ОБНОВЛЕНИЕ: как упоминалось Лето , этот метод НЕ будет работать из кэшированных (скомпилированных) шаблонов. Если, однако, вы используете кэширование общей памяти (APC, Memcache) вместо кэширования Twig или запускаете эту функцию в приложении, которая работает в среде, которая не имеет большого трафика (подумайте о вспомогательном приложении для персонала или отделения приложения, которое используется только для сбора информации о кодовой базе приложения), вы можете заставить ее работать, отключив кэширование Twig (например, $twig = new Twig_Environment($loader, array('cache' => false));
). Обязательно внимательно изучите свой вариант использования, прежде чем отключать кеш Twig и использовать этот метод и посмотреть, сможете ли вы решить эту проблему, используя другой подход.
Решение, предложенное Mario A, не сработало для меня, но использование debug_backtrace () – отличная идея, и небольшая модификация заставила его работать с недавней версией Twig:
private function getTwigTemplateName() { foreach (debug_backtrace() as $trace) { if (isset($trace['object']) && (strpos($trace['class'], 'TwigTemplate') !== false) && 'Twig_Template' !== get_class($trace['object']) ) { return $trace['object']->getTemplateName() . "({$trace['line']})"; } } return ''; }