Symfony 保持包含的细枝子模板的缩进级别
我正在使用Twig模板引擎,并希望在下面的示例中包含一个子模板链接:Symfony 保持包含的细枝子模板的缩进级别,symfony,twig,Symfony,Twig,我正在使用Twig模板引擎,并希望在下面的示例中包含一个子模板链接: <header> <div id="menu"> {% include 'menu.twig' %} </div> </header> {%include'菜单。细枝“%” 包含的文件包含以下代码: <ul> <li>item 1</li> <li>item 2</li> </ul&g
<header>
<div id="menu">
{% include 'menu.twig' %}
</div>
</header>
{%include'菜单。细枝“%”
包含的文件包含以下代码:
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
- 项目1
- 项目2
现在,Twig生成以下HTML代码:
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
- 项目1
- 项目2
正如您所看到的,缩进级别仅适用于包含文件的第一行,这导致上面的代码非常不整洁,维护起来也很糟糕
如何才能从具有正确缩进的细枝中获得正确的输出
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
- 项目1
- 项目2
我认为在包含模板时没有办法保持缩进。我能想到的唯一解决方案是在变量中传递缩进级别,并在包含的模板中使用循环来为每行中的空白量添加前缀。显然,这种“解决方案”将是疯狂的,而且是一场噩梦
关于这一评论:“[…]这导致上面的代码非常不整洁,维护起来也很糟糕。”我想说以下几点:
- HTML是否“不整洁”并不重要。浏览器不会抱怨,用户也不会看到
- 这是真的,这是不好的维持。幸运的是,您维护的是对齐良好的细枝模板,而不是生成的HTML代码
如果细枝模板生成的格式要求“完美对齐”,则上述所有内容都会有所不同。但是对于HTML,请不要浪费时间对齐标记。如果您只想保持所包含子模板的精确缩进,可以执行以下操作:
<header>
<div id="menu">
{% include 'menu.twig' %}
</div>
</header>
{%include'菜单。细枝“%”
i、 e.将所有“包含”指令放在行的开头。结果将是:
<header>
<div id="menu">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</header>
- 项目1
- 项目2
但不知怎的,我觉得这还不够好。
另一种解决方案是在子布局中添加缩进,即
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
- 项目1
- 项目2
但当然,只有当子布局始终包含在某个缩进级别时,它才会起作用
我建议您在生成响应后采用完全不同的路径并格式化响应,例如在kernel.response事件上使用侦听器。在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) }}
(小心使用带有{{}的include函数语法,不要使用包含标记语法{%})尽管大多数用户确实看不到它,但我经常会查看我欣赏的页面的HTML,看看我能从中收集到什么,用在我自己的网页中。如果HTML的格式不好(比如全部放在一行上或者缩进混乱),我很难从中找到任何东西。当我制作网页时,我希望它们格式良好,以便其他人可以从我的代码中学习。我不认为这是一种浪费。这就是为什么我也喜欢适当的缩进。我想知道为什么这对小树枝来说如此困难。它只需要为包含的文件中的所有行(不仅仅是第一行)保持缩进级别,一切都会很好。