Buenas noches, estoy desarrollando una aplicación de prueba y tengo un problema con la herencia de Twig: me duplica el contenido cuando aplico la herencia. Copio algo de código para verlo más claro.
Plantilla original, así tenía el código originalmente y funcionaba, pero la estructura del panel la quiero utilizar en muchas plantillas y quiero colocarla en la plantilla base.
{% extends 'layout.html.twig' %} {% block panel %} {% block panel_title %} <div class="container col-md-10 col-md-offset-1"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">Clientes</h3> </div> {% endblock %} {% block panel_body %} <div class="panel-body"> <div class="container-fluid"> <div class="widget-content"> <table id="contacts" class="table table-striped table-bordered table-hover"> <thead> <tr> <th>Nombre</th> <th>Apellidos</th> <th>Teléfono</th> <th>Móvil</th> <th>Email</th> <th>Empresa</th> <th>Perfíl</th> </tr> </thead> <tbody> <tr> {% for contacts in contacts %} <td>{{ contacts.name }}</td> <td>{{ contacts.lastname }}</td> <td>{{ contacts.phone }}</td> <td>{{ contacts.mobilephone }}</td> <td>{{ contacts.email }}</td> <td>{{ contacts.company }}</td> <td> <a href={{ path('contactProfile', {'id': contacts.id}) }}> <button width="auto" type="button" class="btn btn-success btn-xs"> <i class="glyphicon glyphicon-user"> </button></a></td> </tr> {% endfor %} </tbody> </table> </div> {{ knp_pagination_render(contacts) }} </div> </div> </div> </div> {% endblock %} {% endblock %}
En la plantilla base voy colocando el código que no cambia.
En la plantila XXX.html.twig
iría el siguiente código
{% extends 'layout.html.twig' %} {% block panel %} {{ parent() }} {% block panel_title %} ..... {% endblock %} {% block panel_body %} ..... {% endblock % {% endblock %}
¿Qué estoy haciendo mal?, no consigo encontrar el problema. Al usar parent con bloques hijos el contenido se duplica.
Gracias.
Respuestas
No entiendo por qué usas {{ parent() }}
ya que al tener el {% extends 'layout.html.twig' %}
la plantilla que estás definiendo hereda todo el contenido de su plantilla padre layout, o "master page".
@MrXXX0323
Buenas noches y gracias por responder.
Según tengo entendido, con extends
como dices heredas todo el contenido de la plantilla padre, pero si escribes algo dentro de un bloque que ya tiene código, prevalece el código de la plantilla hija sobre la plantilla padre.
#layout.html.twig {% block content %} hola {% endblock%}
#list.html.twig {% extends 'layout.html.twig' %} {% block content%} adios {% endblock %}
El resultado sería adios
, pero si escribimos {{ parent() }}
antes de adios el resultado sería:
hola adios
Mi idea es tener en la plantilla un bloque con código fijo que sería la estructura del panel en bootstrap y bloques dentro de este usándolos como titulo, contenido o footer que rellenaré en otra plantilla.
Si hay otra manera más fácil estoy abierto a sugerencias jejeje.
@nonio_87
El problema es que los bloques que quieres redefinir están definidos dentro de otro bloque general llamado panel
. En la plantilla hija, lo que estás haciendo es primero traerte todo el contenido de panel
gracias al {{ parent() }}
y después estás redefiniendo sus nuevos contenidos, por lo que al final se duplican los contenidos de esos bloques.
Lo que tienes que hacer es llamar al parent()
dentro de cada bloque que redefines:
{% extends 'layout.html.twig' %} {% block panel_title %} {{ parent() }} ... {% endblock %} {% block panel_body %} {{ parent() }} ... {% endblock %}
@javiereguiluz
Muchas gracias, esa era la solución.
@nonio_87