Saltar al contenido

Establecer variable en el ámbito principal en Twig

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:

  1. Cuando rinde child.twig, comenzará desde la parte superior de base.twig, estableciendo los valores predeterminados para page variable.
  2. Cuando se trata de page cuadra, verá que child.twig anula ese bloque. Entonces, ejecutará el page bosquejar child.twig en lugar de.
  3. Dentro de page bosquejar child.twig, establecerá los nuevos valores para el page variable. Entonces llamará parent(), que le dice que vuelva a base.twig y renderizar al padre page cuadra.
  4. Luego continuará renderizando la página, sustituyendo cualquier bloque adicional como se define en child.twig (en mi ejemplo, representará el content 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *