2016-02-02 3 views
1

Я использую Twig в последнее время, и мне было интересно, можно ли выводить имена шаблонов, которые загружаются на страницу. Лучший способ, о котором я могу думать, - показать имя над самим шаблоном как комментарий html.Twig - отображать имена шаблонов, если включен режим отладки

<!-- start @default/_components/_wrapper/form-wrapper.html.twig --> 
    <form> 
     ... 
    </form> 
<!-- end @default/_components/_wrapper/form-wrapper.html.twig --> 

Я знаю, что я могу получить имя шаблона, вставляя {{ _self.templateName }}, но я не хотел, чтобы добавить его к каждому шаблону или частично.

Решение должно работать на {% include %}, {% use %} и т. Д., И было бы неплохо, если бы это произошло, только когда включен режим отладки.

Я попытался написать расширение, но как бы я ни выразился, мне нужно сделать какой-то звонок в каждом шаблоне.

Причина этого заключается в том, что я пытаюсь сократить время поиска шаблонов, которые кто-то еще реализовал с тех пор, как проект становится все больше и больше.

Примечание: Я НЕ используя Symfony.

Заранее благодарю за любую помощь!

ответ

0

Благодаря @DarkBee я указал на правую сторону и в конечном итоге с помощью это: я создал debug-template.class.php со следующим содержанием:

<?php 

abstract class DebugTemplate extends Twig_Template { 

    public function display(array $context, array $blocks = array()) 
    { 
     // workaround - only add the html comment when the partial is loaded with @ 
     if(substr($this->getTemplateName(),0,1) == '@') { 
      echo '<!-- START: ' . $this->getTemplateName() . ' -->'; 
     } 

     $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks)); 

     if(substr($this->getTemplateName(),0,1) == '@') { 
      echo '<!-- END: ' . $this->getTemplateName() . ' -->'; 
     } 

    } 
} 
?> 

Тогда я взял index.php и добавил

require_once 'vendor/twig/twig/lib/Twig/TemplateInterface.php'; 
require_once 'vendor/twig/twig/lib/Twig/Template.php'; 

и добавил класс DebugTemplate

$twig = new Twig_Environment($loader, array(
    'cache' => false, 
    'base_template_class' => 'DebugTemplate' 
)); 

В результате то, что я хочу, и выглядит следующим образом

<!-- START: @default/_components/panel.html.twig --> 
     <div class="panel panel-default"> 
<!-- END: @default/_components/panel.html.twig --> 
+0

Точно то же самое можно сделать в Symfony, его можно найти здесь (https://gist.github.com/kunicmarko20/9b986b822e3b3f8f97d93906558d6b54). – kunicmarko20

1

Самый простой способ для достижения этой цели использует свой собственный класс Template

<?php 
    namespace My\ProjectName\Here; 

    abstract class Template extends \Twig_Template { 

     public function render(array $context) { 
      $level = ob_get_level(); 
      ob_start(); 
      try { 
       $this->display($context); 
      } catch (Exception $e) { 
       while (ob_get_level() > $level) { 
        ob_end_clean(); 
       } 
       throw $e; 
      } 
      $content = ob_get_clean(); 
      return '<!-- Template start : ' . $this->getTemplateName() . ' -->'. $content.'<!-- Template end : ' . $this->getTemplateName() . ' -->';  
     } 

и зарегистрировать его в Twig

<?php 
    $loader = new Twig_Loader_Filesystem(__DIR__ . '/../CMS4U/Views'); 
    $twig = new Twig_Environment($loader, array(
     'base_template_class' => '\My\ProjectName\Here\Template', 
    )); 
+0

Спасибо @DarkBee! Я попробовал это, и это сработало, но только весь шаблон страницы предоставил комментарий html. Вместо этого я использовал функцию 'display' Twig_Template, которая работает как шарм. Единственным «недостатком» этого является то, что имя шаблона страницы повторяется вместе с включенными/встроенными шаблонами каждый раз. –