domingo, 17 de noviembre de 2013

Symfony doble lista no guarda

Al crear una lista doble en symfony para romper una relación muchos a muchos, estas listas se crean y funciona correctamente el parecer, pero al tratar de guardar, no sale ningún error pero los datos no son almacenados.

Lo primero que hay que tener en cuenta es que ningún dato adicional a las llaves foráneas se guardan por la lista doble. Al parecer no se ejecuta el método save en el archivo tablarelacion.class.php del model.

De todas maneras mi problema era otro, al usar bootstrap se agrega a todos los campos la clase form-control. al revisar el script de la lista doble en la linea 43 se consulta si el nombre de la clase del elemento termina en -selected, al aplicar bootstrap la clase del elemento queda 'miclase-selected form-control' por lo tanto esta condición nunca se cumple y los datos seleccionados no son enviados con el formulario al realizar el submit.

#.../plugins/sfFormExtraPlugin/web/js/double_list.js
.
.
  submit: function(form, className)
  {
    var element;
    for (var i = 0; i < form.elements.length; i++)
    {
      element = form.elements[i];
      if (element.type == 'select-multiple')
      {
        if (element.className == className + '-selected')
        {
          for (var j = 0; j < element.options.length; j++)
          {
            element.options[j].selected = true;
          }
        }
      }
    }
  },
.
.

La solución (temporal) es no agregar una nueva clase al control en el widget así:

        $this->widgetSchema['campo_list']->setOption('renderer_class', 'sfWidgetFormSelectDoubleList');
        $this->widgetSchema['ccampo_list']->setOption('renderer_options', array('label_unassociated' => 'No asignadas:',
            'label_associated' => 'Asignadas:',
            'associated_first' => false,
            'class_select' => 'miclase')); 

En cambio solo se coloca el form-control de bootstrap, obviamente esto solo funciona si en el formulario solo ahí un campo de doble lista, si hay 2 deben tener nombres de clase diferentes.

La segunda opcion es modificar el double_list.js asi:

if (element.className == className + '-selected form-control')

Esto es muy poco flexible, cuando tenga la solución definitiva actualizare esta entrada.