Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Herencia de Twig dentro de bloques hijos duplica el contenido

5 de agosto de 2015

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

#1

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

5 agosto 2015, 23:33
#2

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

6 agosto 2015, 0:41
#3

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

6 agosto 2015, 9:15
#4

Muchas gracias, esa era la solución.

@nonio_87

7 agosto 2015, 20:05