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.

jueves, 14 de noviembre de 2013

Symfony 1.4 Misterioso error Parse error: syntax error, unexpected ''id'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in ...

Luego de una sincronización un proyecto en symfony 1.4 basado en el admin generator empezó a escribir un caracter extraño en algunos archivos base Base...GeneratorConfiguration.class para mi caso una "y".

Nunca encontré el caracter en ninguna parte del código, ni borrar cache, ni cambiar permisos ayudó. La única solución fue comentar en el archivo Base...calss.php correspondiente el metodo setUp(), ejecutar el módulo y descomentarlo nuevamente, esto repara el archivo de la cache que presenta el error.

Actualización:
Finalmente esta fué una solucion temporal, revisando el proyecto, tenia ese caracter extraño en una de las clases del modelo, no tengo idea de como se propagaba a los otros modulos y no afectaba a ese donde estaba la letra "y".

...class.php
y<?php