Русскоязычная документация по Twig - PHP шаблонизатору. Руководство по Твиг на русском языке
Наследование шаблонов является одним из мощных инструметов Twig, но оно огранично. Шаблон может быть унаследован только из другого шаблона. Это ограничение делает наследование шаблонов простым для понимания и легким для отслеживания:
{% extends "base.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
Горизонтальное наследование, это способ достижения той же цели, как множественное наследование, но без соответствующей сложности:
{% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
use говорит Twig импортировать блоки, определенные в blocks.html в текущий шаблон (это как макросы, но для блоков):
# blocks.html
{% block sidebar %}{% endblock %}
В этом примере, use импортирует боковую панели в основном шаблоне. Этот код эквивалентен следующему:
{% extends "base.html" %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
Тег use импортирует шаблон, если оно не наследуется другим шаблоном, если он не определяет макросы, и если он не пустой. Но он может использовать другие шаблоны.
Главный шаблон также можете переопределить любой импортируемый блок. Если шаблон уже определяет блок sidebar , то sidebar в blocks.html игнорируется. Для того чтобы избежать конфликтов, можно переименовать импортируемые блоки:
{% extends "base.html" %}
{% use "blocks.html" with sidebar as base_sidebar %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
Функция parent() автоматически определяет правильное дерево наследования, поэтому она может быть использована для переопределении блока в импортированных шаблонах:
{% extends "base.html" %}
{% use "blocks.html" %}
{% block sidebar %}
{{ parent() }}
{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
В этом примере parent() будет правильно наследовать блок sidebar от шаблона blocks.html.
Если два импортируемых шаблона содержат один и тот же блок, последний из подключеных имеет больший приоритет