在Twig布局块中附加内联脚本

时间:2015-06-19 18:31:14

标签: php symfony templates twig fosuserbundle

我有一个如下所示的布局:

<html>
<body>

  <!-- Omitted -->

  <div class="content">
    {% block body %}{% endblock %}
  </div>

  <script src="js/vendor.js"></script>
  {% block javascripts %}
    <!-- I want to be able to inject inline scripts from sub-templates here -->
  {% endblock %}
 </body>
 </html>

然后我从FOSUserBundle覆盖了register_content.html.twig模板,在其中我试图将脚本注入“javascripts”块,如下所示:

{% block javascripts %}
  <script>
    // Some inline JS
  </script>
{% endblock %}

我遇到的问题是内联脚本似乎是在“body”块的末尾注入而不是在“scripts”块中注入。

这是我得到的输出:

      <!-- This should be below js/vendor.js scripts -->      
      <script>
        // Some inline JS
      </script>
    </div>
</div>

<script src="js/vendor.js"></script>

我做错了什么?我的问题在于FOSU​​serBundle和它自己继承的模板(它仍然使用我的布局和我拥有的所有内容;不是它自己的布局)。我在这里很困惑。

P.S。我是Symfony / Twig的新手,所以请对我很轻松。

编辑:这些是我覆盖的FOSUserBundle布局和模板:

应用程序/资源/ FOSUserBundle /视图/ layout.html.twig:

{% extends 'AcmeWebBundle::layout.html.twig' %}

{% block title %}Acme Demo Application{% endblock %}

{% block body %}
    {% block fos_user_content %}{% endblock %}
{% endblock %}

{% block javascripts %}
    {{ parent() }}
{% endblock %}

应用程序/资源/ FOSUserBundle /视图/注册/ register.html.twig:

{% extends "FOSUserBundle::layout.html.twig" %}

{% block body %}
    {% block fos_user_content %}
        {% include "FOSUserBundle:Registration:register_content.html.twig" %}        
    {% endblock fos_user_content %}
{% endblock %}

{% block javascripts %}
    {% parent() %}
{% endblock %}

应用程序/资源/ FOSUserBundle /视图/注册/ register_content.html.twig:

<div class="page-header">
    <h2>Register</h2>
</div>

<form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register form-horizontal">
    <!-- HTML Omitted --> 
</form>

{% block javascripts %}
    {% javascripts '@AcmeWebBundle/Resources/public/js/app.js' %}
    <script>
        // jQuery is undefined because it gets defined below the 'javascripts' block in the parent layout
        console.dir(window.jQuery);
    </script>
    {% endjavascripts %}
{% endblock %}

1 个答案:

答案 0 :(得分:1)

编辑后情况更加清晰。

您期望的行为仅适用于模板继承;它不会像include一样使用app/Resources/FOSUserBundle/views/Registration/register.html.twig

要执行您想要的操作,请执行以下操作之一:

  • 将来自javascript app/Resources/FOSUserBundle/views/Registration/register_content.html.twig javascript app/Resources/FOSUserBundle/views/Registration/register.html.twigapp/Resources/FOSUserBundle/views/Registration/register.html.twig块中的内联JavaScript代码放入app/Resources/FOSUserBundle/views/Registration/register_content.html.twig

  • 让模板register_content.html.twig继承layout.html.twig并根据需要覆盖其块(@Override public Object instantiateItem(ViewGroup container, int position) { Object value = super.instantiateItem(container, position); if (position == 0) { someFragment = (SomeFragment) value; } else if (position == 1) { anotherFragment = (AnotherFragment) value; } return value; } 不会延伸{{1}},所以这没有多大意义)< / p>