Symfony / Twig:停止渲染模板的其余部分

时间:2016-09-23 18:08:41

标签: twig

我一直在网上搜索这个,但我找不到任何相关的内容。

我正在创建一个简单的树枝模板,它将用于多个位置,但需要一些变量。

我希望能够做到这样的事情:

{% if some_variable is not defined %}
    <h1>Some variable was not defined.<h1>
    -- stop rendering the rest of the template --
{% endif %}

{{ some_variable }} is defined here.

我问这个的原因很简单。 我不希望我的整个模板在一个或多个if语句中缩进,因为它会使整个文件变得非常简单。

我知道解决方法是创建多个模板,但是对于一个简单条件的多个文件听起来有点过分。

如果这本身不存在,我可以为此创建一个扩展,如果有人可以告诉我如何 - 以及是否可以实现。

提前致谢!

P.S。不要回答{% else %},这正是我在这里要避免的事情......

1 个答案:

答案 0 :(得分:3)

您要求的内容不受本机支持。
为了达到这样的目的,你需要经历很多麻烦。

将Twig模板编译成PHP,由Twig的基本模板进行扩展。在基本模板中查看时,您将看到最终将调用函数// If current n is greater then the best case for n - 1 int k = startingValue(n - 1); if (largestHailstoneLength(n) > largestHailstoneLength(k)) { // n is greater } else // startingValue(n - 1) is greater 。该函数内容的一个例子如下

doDisplay

正如您所看到的那样,输出会立即发送到浏览器(并由基本模板中的 protected function doDisplay(array $context, array $blocks = array()) { // line 1 echo "\t<div id=\"null_wrapper\"> \t\t<div class=\"invoice_price\">\t\t\t \t\t\t<div> \t\t\t\t"; // line 4 echo twig_escape_filter($this->env, $this->getAttribute((isset($context["forms"]) ? $context["forms"] : $this->getContext($context, "forms")), "getTextfield", array(0 => "#label_Quantity#", 1 => "txt_new_quantity", 2 => ((array_key_exists("txt_quantity", $context)) ? (_twig_default_filter((isset($context["txt_quantity"]) ? $context["txt_quantity"] : $this->getContext($context, "txt_quantity")), 1)) : (1)), 3 => ((array_key_exists("errors", $context)) ? (_twig_default_filter((isset($context["errors"]) ? $context["errors"] : $this->getContext($context, "errors")), "")) : ("")), 4 => "", 5 => "smallinput"), "method"), "html", null, true); echo " \t\t\t</div> \t\t\t<div class=\"clear\"></div> \t\t\t<div> \t\t\t\t"; // line 8 echo twig_escape_filter($this->env, $this->getAttribute((isset($context["forms"]) ? $context["forms"] : $this->getContext($context, "forms")), "getTextfield", array(0 => "#label_Unit_price#", 1 => "txt_new_price_excl", 2 => ((array_key_exists("txt_new_price_excl", $context)) ? (_twig_default_filter((isset($context["txt_new_price_excl"]) ? $context["txt_new_price_excl"] : $this->getContext($context, "txt_new_price_excl")), "")) : ("")), 3 => ((array_key_exists("errors", $context)) ? (_twig_default_filter((isset($context["errors"]) ? $context["errors"] : $this->getContext($context, "errors")), "")) : ("")), 4 => "", 5 => "smallinput"), "method"), "html", null, true); echo "<span>"; echo twig_escape_filter($this->env, getSiteConfigValue("CURRENCY"), "html", null, true); echo "</span> \t\t\t</div> \t\t\t<div class=\"clear\"></div> \t\t\t<div> \t\t\t\t"; 捕获),所以即使您可以退出模板,也可能存在最终的结果。破解HTML。

ob_start实现此类目标的唯一方法是覆盖TL:DR的编译器,将twig模板编译为twig,也许您可​​以自己编写节点,因为这也呈现/编译