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
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
Muchisimas gracias Javierpor tu ayuda! :D seguí tu consejo y me quedó funcionando como esperaba! :D
@MrXXX0323