Twig:无法覆盖宏中定义的块

时间:2014-10-29 15:48:22

标签: symfony twig

我从布局文件导入宏,在该宏内部我定义了几个树枝块。

当我扩展我的基地时,新视图中的布局文件'文件,我不能覆盖我在宏中定义的块的内容。

这是我的用例的一个非常简化的最小版本。

结构:

base.twig

{% import 'macros' as macros %}
<section>
    {{ macros.render_sections() }}

    {% block working %}
       content1-default
    {% endblock %}
</section>

macro.twig

{% macro render_sections() %}
    <section>
      {% block notworking %}
         content2-default
      {% endblock %}
    </section>
{% endmacro %}

view.twig

{% extends "base" %}

{% block working %}
   content1-override
{% endblock %}

{% block notworking %}
    content2-override
{% endblock %}

预期行为: 我希望看到&#34; content1-override content2-override&#34;在我的HTML中。

实际发生的事情: 我看到&#39; content1-override content2-default&#39;

有没有办法将块范围传递给宏?

我已经尝试在base.twig文件中定义宏,以排除导入功能,但这没有帮助。 显然其他一切都有效,因为我可以看到被覆盖的块。

1 个答案:

答案 0 :(得分:8)

你应该了解Twig的内部结构:

  • 所有Twig文件都转换为PHP类

  • {% extends %}等同于PHP extends(用于继承)。

  • {% import %}将您的上下文属性指定给“您正在导入的twig文件”类型的对象

  • 块只不过是php方法,而本机的php继承让你可以甜蜜地覆盖Twig块。

因此,考虑到这一点,您转换的树枝代码将如下所示:

class base {

   public function display() {
      $context['macros'] = new macros();
      $context['macros']->render_sections();
      echo '<section>';
      echo $this->blockWorking();
      echo '</section>';
   }

   public function blockWorking() {
     echo "content1-default";
   }

}

class macros {

  public function render_sections() {
     echo '<section>';
     echo $this->blockNotWorking();
     echo '</section>';
  }

  public function blockNotWorking() {
     echo "content2-defualt";
  }

}

class view extends base {

   public function blockWorking() {
     echo "content1-override";
   }

   public function blockNotWorking() {
     echo "content2-override";
   }

}

$view = new view();
$view->display();

您可以在此清楚地看到视图类的blockNotWorking()方法不能永远不会覆盖宏的方法。