2013-08-07 4 views
0

Я использую веточку и имеющ проблему с include и extends.Включает и расширяет один и тот же файл?

У меня есть файл header.html.twig, который я включаю в index.html.twig. Это прекрасно работает.

Однако я также пытаюсь перезаписать часть файла header.html.twig с помощью extends на index.html.twig. Код, который я придумал это:

<!-- index.html.twig --> 
{% include '::header.html.twig' %} 
    {% extends '::header.html.twig' %} 
    {% block head %} 
     <li class="active"><a href="#login">Login</a></li> 
    {% endblock %} 

Однако этот код генерирует исключение «Шаблон, который расширяет другой не может иметь тело ....»

Как я могу это исправить?

+0

Можете вдавить детали? Как выглядит 'header.html.twig'? Что вы пытаетесь переписать? – SirDerpington

ответ

2

В шаблоне могут быть только теги {% block... %} {% endblock %}, что расширяет еще один.

В вашем случае, если я правильно, что вы пытаетесь достичь, вы можете определить пустой блок в header.html.twig (в начале), и переопределить блок в index.html.twig с

{% block foo %} 
    {% include "header.html.twig" %} 
{% endblock %} 
1

Если вы занимаетесь вещами вне любого блока, эти вещи считаются телом вашего файла ветви. И, как ясно говорится об исключении, если вы расширяете шаблон ветви, вам нужно перезаписать некоторые блоки, содержащиеся в расширенном файле, без какого-либо тела.

Вы должны использовать тег {% extends %} без каких-либо ограничений, так как расширения уже содержат содержимое. Файл упакован «base.html.twig» является хорошим примером: вы помещаете код, который будет использоваться везде в вашем приложении в файле base.html.twig:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>{% block title %}Welcome!{% endblock %}</title> 
     {% block stylesheets %}{% endblock %} 
     <link rel="shortcut icon" href="{{ asset('favicon.ico') }}" /> 
    </head> 
    <body> 
     {% block body %}{% endblock %} 
     {% block javascripts %}{% endblock %} 
    </body> 
</html> 

В вашем случае, вы можете добавить a {% block head %}{% endblock %} над блоком тела, а затем в вашем файле index.html.twig вы перезапишите этот блок, чтобы выполнить его.

{% extends '::base.html.twig' %} 
{% block head %} 
    <li class="active"><a href="#login">Login</a></li> 
{% endblock %} 

Это будет в конечном итоге выводимые:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Welcome!</title> 
     <link rel="shortcut icon" href="/favicon.ico" /> 
    </head> 
    <body> 
     <li class="active"><a href="#login">Login</a></li> 
    </body> 
</html> 

Заключение

Разница между extends и include является то, что вы можете переопределить блоки из расширенного файла, где вы можете» t, включая его, используя include.

Смежные вопросы