保持包含Twig subtemplate的缩进级别

时间:2015-07-26 16:34:20

标签: symfony twig

我正在使用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>

3 个答案:

答案 0 :(得分:1)

我不认为在包含模板时有一种维持缩进的方法。我能想象的唯一解决方案是在变量中传递缩进级别,并在包含的模板中使用循环来为每行中的空白量添加前缀。显然,这种“解决方案”将是疯狂的,并且是维持的噩梦。

关于这个评论:“[...]导致上面的代码非常不整洁,维护起来很糟糕。”我想说以下内容:

  • HTML是否“不整洁”并不重要。浏览器不会抱怨,用户也不会看到它。
  • 确实维护起来很糟糕。幸运的是,您维护了精美对齐的Twig模板,而不是生成的HTML代码。

如果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) }}

(请谨慎使用{{}}包含函数语法,而不包含标签语法{%%})