Solución:
base.twig
<title>{{ title|default('example.com') }} - My cool site</title>
niño.twig
{% set title="ChildTitle" %}
Si no quiere usar el default()
filter (es decir, cuando desee usar la variable varias veces en sus plantillas principal y secundaria), puede definir un bloque que contenga toda su página en la plantilla principal y luego anidar sus otros bloques dentro de eso:
{# base.twig #}
{# Default page properties. You can override these in the `page` block of your child templates. #}
{% set page = page | default({}) | merge({
"title" : "My Default Title",
"description" : "Default description"
}) %}
{% block page %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="{{ page.description }}">
<title>{{ page.title }}</title>
...
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
{% endblock %}
A continuación, puede anular el page
variable en el page
bloquear en su plantilla secundaria, estableciendo el valor y luego vocación parent()
:
{# child.twig #}
{% extends "base.twig" %}
{% block page %}
{# By putting this in a special block, we ensure that it will be set AFTER the default values are set in the parent template,
but BEFORE the page itself is rendered. #}
{% set page = page | merge({
"title" : "Child Page",
"description" : "Welcome to the child page!"
}) %}
{{ parent() }}
{% endblock %}
{% block content %}
...
{% endblock %}
Tenga en cuenta que en la plantilla principal, definimos el page
variable fuera de la page
block, mientras que en la plantilla secundaria lo definimos dentro los page
cuadra.
Entonces, Twig hará lo siguiente:
- Cuando rinde
child.twig
, comenzará desde la parte superior debase.twig
, estableciendo los valores predeterminados parapage
variable. - Cuando se trata de
page
cuadra, verá quechild.twig
anula ese bloque. Entonces, ejecutará elpage
bosquejarchild.twig
en lugar de. - Dentro de
page
bosquejarchild.twig
, establecerá los nuevos valores para elpage
variable. Entonces llamaráparent()
, que le dice que vuelva abase.twig
y renderizar al padrepage
cuadra. - Luego continuará renderizando la página, sustituyendo cualquier bloque adicional como se define en
child.twig
(en mi ejemplo, representará elcontent
cuadra).
Vea un ejemplo de trabajo aquí. Tenga en cuenta que esto puede volverse más complicado cuando comience a agregar múltiples capas de herencia (por ejemplo, plantillas de nietos).
@ n3xus dio una buena respuesta, en realidad también me ayudó (gracias), pero es posible que también desee echar un vistazo a esta página de la documentación: Twig docs
Una característica particularmente buena es la capacidad de establecer una parte de texto / html:
{% set title %}
<i class="icon-user"></i>
{{ user.username | capitalize }}
<small>{{ user.email | lower }}</small>
{% endset %}
Facilita la generación de fragmentos de contenido muy específicos a partir de las plantillas secundarias.