Twig - 如果启用调试模式则显示模板名称
Twig - display template names if debug mode is enabled
我最近在使用 Twig,我想知道是否可以输出页面上加载的模板名称。我能想到的最好方法是在模板本身上方显示名称作为 html 评论。
<!-- start @default/_components/_wrapper/form-wrapper.html.twig -->
<form>
...
</form>
<!-- end @default/_components/_wrapper/form-wrapper.html.twig -->
我知道我可以通过插入 {{ _self.templateName }}
来获取模板名称,但我不想将它添加到每个模板或部分模板中。
该解决方案应该适用于 {% include %}
、{% use %}
等,如果它只是在启用调试模式时发生,那也很好。
我尝试编写一个扩展,但无论我怎么说,我都必须在每个模板中进行某种调用。
这背后的原因是我试图减少搜索其他人实施的模板的时间,因为项目越来越大。
注意:我没有使用 Symfony。
提前致谢,如有任何帮助,我们将不胜感激!
最简单的方法是使用您自己的 Template
class
<?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',
));
感谢@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 class
$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 -->
谢谢 Frank Hofmann 还有一个有用的功能是在模板中渲染现有块 begin/end。请注意,并非所有的树枝模板都是纯粹的 HTML。 HTML 注释会破坏 CSS 或 JS 代码。这可以通过使用命名约定来避免...
<?php
abstract class App_Twig_DebugTemplate extends Twig_Template
{
public function display(array $context, array $blocks = [])
{
$this->_renderComment('BEGIN TEMPLATE: ' . $this->getTemplateName());
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
$this->_renderComment('END TEMPLATE: ' . $this->getTemplateName());
}
public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true)
{
$this->_renderComment('BEGIN BLOCK: ' . $name);
parent::displayBlock($name, $context, $blocks, $useBlocks);
$this->_renderComment('END BLOCK: ' . $name);
}
/**
* @param string $comment
*/
private function _renderComment($comment)
{
$extension = pathinfo($this->getTemplateName(), PATHINFO_EXTENSION);
if (in_array($extension, [
'css',
'js',
])) {
echo '/* ' . $comment . ' */';
} else {
echo '<!-- ' . $comment . ' -->';
}
}
}
我最近在使用 Twig,我想知道是否可以输出页面上加载的模板名称。我能想到的最好方法是在模板本身上方显示名称作为 html 评论。
<!-- start @default/_components/_wrapper/form-wrapper.html.twig -->
<form>
...
</form>
<!-- end @default/_components/_wrapper/form-wrapper.html.twig -->
我知道我可以通过插入 {{ _self.templateName }}
来获取模板名称,但我不想将它添加到每个模板或部分模板中。
该解决方案应该适用于 {% include %}
、{% use %}
等,如果它只是在启用调试模式时发生,那也很好。
我尝试编写一个扩展,但无论我怎么说,我都必须在每个模板中进行某种调用。
这背后的原因是我试图减少搜索其他人实施的模板的时间,因为项目越来越大。
注意:我没有使用 Symfony。
提前致谢,如有任何帮助,我们将不胜感激!
最简单的方法是使用您自己的 Template
class
<?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',
));
感谢@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 class
$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 -->
谢谢 Frank Hofmann 还有一个有用的功能是在模板中渲染现有块 begin/end。请注意,并非所有的树枝模板都是纯粹的 HTML。 HTML 注释会破坏 CSS 或 JS 代码。这可以通过使用命名约定来避免...
<?php
abstract class App_Twig_DebugTemplate extends Twig_Template
{
public function display(array $context, array $blocks = [])
{
$this->_renderComment('BEGIN TEMPLATE: ' . $this->getTemplateName());
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
$this->_renderComment('END TEMPLATE: ' . $this->getTemplateName());
}
public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true)
{
$this->_renderComment('BEGIN BLOCK: ' . $name);
parent::displayBlock($name, $context, $blocks, $useBlocks);
$this->_renderComment('END BLOCK: ' . $name);
}
/**
* @param string $comment
*/
private function _renderComment($comment)
{
$extension = pathinfo($this->getTemplateName(), PATHINFO_EXTENSION);
if (in_array($extension, [
'css',
'js',
])) {
echo '/* ' . $comment . ' */';
} else {
echo '<!-- ' . $comment . ' -->';
}
}
}