Aprende a recuperar el contenido de un bloque principal en twig para volver a representarlo en una vista heredada.

Si estás intentando agregar contenido en un bloque que ya existe en la vista principal con twig y observa que el contenido solo se reemplaza y el contenido original desaparece, y es posible que se haya preguntado cómo incluir el contenido original también. Cuando una plantilla usa herencia, es posible renderizar el contenido del bloque padre cuando se reemplaza un bloque usando la función padre en twig. Pero, ¿qué diablos significa eso? vamos a explicarlo con código:

Bloque padre

Para este ejemplo tendremos una barra de herramientas, esta barra de herramientas será un div simple que tiene el siguiente contenido (ubicado en el archivo base.html.twig):

<!DOCTYPE>
<html>
  <head>
    <!-- Archivos CSS y otras cosas aquí -->
  </head>
  <body>
    {%block content -%}
    {% endblock %}

    {%block toolbar -%}
       <a href="path_to_something">
          Acción normal del usuario 1
       </a>
        <a href="path_to_something">
          Acción normal del usuario 2
       </a>
    {%endblock%}
  </body>
</html>

En este caso, nuestro bloque padre será la barra de herramientas , porque ampliaremos este bloque en las vistas sin eliminar su contenido.

Vista heredada

Si su vista heredada no usa un bloque con un nombre existente (por ejemplo, no usa el bloque de la barra de herramientas nuevamente), notará que la barra de herramientas del bloque se renderizará completamente como aparece en el archivo base.html.twig:

{% extends '::base.html.twig' %}

{% block content -%}
I'll only change the content of the template but not the toolbar block !
{% endblock content%}

Pero si decide incluir la pestaña de la barra de herramientas en la vista heredada, el contenido de esta vista reemplazará el contenido del archivo base.html.twig :

{% extends '::base.html.twig' %}

{% block content -%}
I'll change the content
{% endblock content%}

{% block toolbar -%}
 The actions links will be removed and this will appear instead ! :(
{% endblock toolbar %}

Y lo que quiero tener tanto (el contenido del bloque de la barra de herramientas base.html.twig y el nuevo contenido), sin escribir todo en cada vista que necesitamos, usaremos la función principal para incluir el contenido del bloque original sin reemplazar todo.

parent()

Esta función twig obtendrá el contenido del bloque existente para que podamos imprimirlo nuevamente en nuestra vista heredada. Entonces, tendremos los enlaces de acción y agregaremos 2 botones nuevos sin eliminar los enlaces:

{% extends '::base.html.twig' %}

{% block content -%}
I'll change the content
{% endblock content%}

{% block toolbar -%}
{{parent()}} {# El contenido de base.html.twig también se recuperará e imprimirá en esta vista heredada #}
 <button type="button">User normal action 3 only in this view</button>
 <button type="button">User normal action 4 only in this view</button>
{% endblock toolbar %}

Tenga en cuenta que la función principal debe ejecutarse en la vista heredada (no en la principal).


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores