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

Leer campos de un formulario con Twig

5 de julio de 2015

Hola, ¿qué tal? Quisiera saber si me pueden explicar por qué no puedo obtener los checkbox que se cargan dinamicamente en mi formulario?

Acá el formuario:

{{ form_start(form, {'action': path('permiso_rol_grabar_permisos'), 'method': 'POST', 'attr': {'novalidate': 'novalidate'}} ) }}
    <div class="row box-header">
        <div class="col-sm-12">
            <button class="btn btn-primary" type="submit">
                <i class="fa fa-save"></i>
                Guardar Cambios
            </button>
        </div>
    </div>
 
    <div class="box-body">
        <div id="example1_wrapper" class="dataTables_wrapper form-inline dt-bootstrap">
            <div class="row">
                <div class="col-sm-6"></div>
                <div class="col-sm-6"></div>
            </div>
            <div class="row">
                <div class="col-sm-12">
                    <table id="example1" class="table table-bordered table-hover dataTable" data-order='[[ 1, "asc" ]]' role="grid" aria-describedby="example1_info">
                        <thead>
                            <tr role="row">
                                <th></th>
                                {% for rol in form.rol %}
                                    <th style="text-align: center;" tabindex="0" aria-controls="example1" rowspan="1" colspan="1" aria-label="Rendering engine: activate to sort column ascending">
                                        {{ form_label(rol) }}
                                    </th>
                                {% endfor %}
                            </tr>
                        </thead>
                        <tbody>
                            {% set n = 0 %}
                            {% set i = -1 %}
                            {% for child in form.permiso %}
                                {% set i = i + 1 %}
                                {% set n= n + 1%}
                                {%  if n%2 == 0  %}
                                    {% set class="odd" %}
                                {% else %}
                                    {% set class="even" %}
                                {% endif %}
                                <tr role="row" class="{{ class }}">
                                    <td class="noMostrar">{{ form_widget(child) }}</td>
                                    <td style="width: 30px;" title="{{ permisos[i].descripcion }}">{{ form_label(child) }}</td>
                                    {% set j = -1 %}
                                    {% for item in form.rol %}
                                        {% set j = j +1 %}
                                       <td class="noMostrar">{{ form_widget(item) }}</td>
                                        <td style="width: 30px; text-align: center ">
                                            <input type="checkbox" id="r_{{ roles[j].id }}-p_{{ permisos[j].id }}" />
                                        </td>
                                    {% endfor %}
                                </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
{{ form_end(form) }}

Cuando desde mi controlador hago:

var_dump($request);

En paatalla obtengo:

object(Symfony\Component\HttpFoundation\ParameterBag)[9]
      protected 'parameters' => 
        array (size=3)
          '_controller' => string 'EM\AdministracionBundle\Controller\PermisoPorRolController::grabarPermisosPorRolAction' (length=86)
          '_route' => string 'permiso_rol_grabar_permisos' (length=27)
          '_route_params' => 
            array (size=0)
              ...

es decir no me trae ningún input de los que aparecen en pantalla.

Rol_1       Rol_2       Rol_3       Rol_4
Permiso_1    checkbox    checkbox    checkbox    checkbox
Permiso_2    checkbox    checkbox    checkbox    checkbox
Permiso_3    checkbox    checkbox    checkbox    checkbox
Permiso_4    checkbox    checkbox    checkbox    checkbox
 
Guardar!

El objetivo es el de permitirle al usuario asignar permisos por rol. Todo estos datos una vez pueda leeros los voy a guardar en una tabla de la BD, pero no consigo leerlos! :(


Respuestas

#1

Lo primero que me gustaría decirte es que tu plantilla Twig es mucho más complicada de lo que podría ser. Las variables i, n y j no te hacen falta, ya que Twig te da esas variables automáticamente. Además, tampoco hace falta la lógica que decide la clase CSS que debe aplicarse, ya que para eso tienes la función cycle().

Código Twig original:

{% set n = 0 %}
{% set i = -1 %}
{% for child in form.permiso %}
    {% set i = i + 1 %}
    {% set n= n + 1%}
    {%  if n%2 == 0  %}
        {% set class="odd" %}
    {% else %}
        {% set class="even" %}
    {% endif %}
    <tr role="row" class="{{ class }}">
        <td class="noMostrar">{{ form_widget(child) }}</td>
        <td style="width: 30px;" title="{{ permisos[i].descripcion }}">{{ form_label(child) }}</td>
        {% set j = -1 %}
        {% for item in form.rol %}
            {% set j = j +1 %}
           <td class="noMostrar">{{ form_widget(item) }}</td>
            <td style="width: 30px; text-align: center ">
                <input type="checkbox" id="r_{{ roles[j].id }}-p_{{ permisos[j].id }}" />
            </td>
        {% endfor %}
    </tr>
{% endfor %}

Código Twig equivalente:

{% for child in form.permiso %}
    <tr role="row" class="{{ cycle(['odd', 'even'], loop.index0) }}">
        <td class="noMostrar">{{ form_widget(child) }}</td>
        <td style="width: 30px;" title="{{ permisos[loop.index0].descripcion }}">{{ form_label(child) }}</td>
 
        {% for item in form.rol %}
           <td class="noMostrar">{{ form_widget(item) }}</td>
            <td style="width: 30px; text-align: center ">
                <input type="checkbox" id="r_{{ roles[loop.index0].id }}-p_{{ permisos[loop.index0].id }}" />
            </td>
        {% endfor %}
    </tr>
{% endfor %}

Respecto al error que comentas, el problema que veo es que estás usando los formularios de Symfony pero a la vez estás intentando crear los campos del formulario a mano. Deberías usar los propios métodos que ofrece el componente de formularios.

@javiereguiluz

5 julio 2015, 13:43
#2

Muchisimas gracias Javierpor tu ayuda! :D seguí tu consejo y me quedó funcionando como esperaba! :D

@MrXXX0323

7 julio 2015, 12:20