我正在使用Twig模板引擎,并希望在以下示例中包含子模板:
<header>
<div id="menu">
{% include 'menu.twig' %}
</div>
</header>
包含的文件包含以下代码:
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
现在Twig生成以下HTML代码:
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
正如您所看到的,缩进级别仅适用于所包含文件的第一行,这导致上面的代码非常不整洁且难以维护。
如何通过这样正确的缩进从Twig获得正确的输出?
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
答案 0 :(得分:1)
我不认为在包含模板时有一种维持缩进的方法。我能想象的唯一解决方案是在变量中传递缩进级别,并在包含的模板中使用循环来为每行中的空白量添加前缀。显然,这种“解决方案”将是疯狂的,并且是维持的噩梦。
关于这个评论:“[...]导致上面的代码非常不整洁,维护起来很糟糕。”我想说以下内容:
如果Twig模板生成的格式必须“完美对齐”,则以上所有内容都会有所不同。但就HTML而言,请不要浪费时间对齐标签。
答案 1 :(得分:1)
如果您只想维护所包含的子模板的确切缩进,您可以这样做:
<header>
<div id="menu">
{% include 'menu.twig' %}
</div>
</header>
即。把所有&#34;包括&#34;该行开头的指令。结果将是:
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
但不知怎的,我觉得这还不够好。 另一种解决方案是在子布局中添加缩进,即
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
但当然只有在子布局总是包含在某个缩进级别时才有效。
我建议您采用完全不同的路线并格式化生成后的响应,例如在kernel.response事件上有一个监听器。
答案 2 :(得分:0)
在php中创建树枝环境后,您可以像这样添加树枝过滤器:
$filter = new Twig_Filter('ident', function ($string, $number) {
$spaces = str_repeat(' ', $number);
return rtrim(preg_replace('#^(.+)$#m', sprintf('%1$s$1', $spaces), $string));
}, array('is_safe' => array('all')));
$Your_Twig_Environment->addFilter($filter);
在此之后,您可以像这样使用它:
{{ include('menu.twig')|ident(4) }}
(请谨慎使用{{}}包含函数语法,而不包含标签语法{%%})