sfDependentSelectPlugin ordenado por texto

sfDependentSelectPlugin ordenado por texto

Utilicé este interesante plugin para mostrar select box dependientes. En concreto para mostrar un select box de «Sector» y «Puesto», siendo los puestos dependientes del sector elegido.

El plugin funciona bien, pero tiene un problema y es que los valores de los selects, tanto del padre como del dependiente, no muestra los valores ordenados por el texto, sino por el ID del registro al que se refiere.  Ni siquiera poniendo la opción «order_by» al declarar el widget:

 

this->widgetSchema[«puesto_id»] = new sfWidgetFormDoctrineDependentSelect(array(‘model’ => ‘Puesto’,
                                                                                                                                                                          ‘depends’ => ‘Sector’,
                                                                                                                                                                          ‘add_empty’ => true,
                                                                                                                                                                          ‘ajax’ => true,
                                                                                                                                                                          ‘ref_method’ => ‘getSectorId’,
                                                                                                                                                                          ‘url’ => sfContext::getInstance()->getController()->genUrl(‘sfDependentSelectAuto/_ajax’),
                                                                                                                                                                          ‘cache’ => true,
                                                                                                                                                                          // the same of sfWidgetForm{Doctrine|Propel}Choice are available ¿?
                                                                                                                                                                          ‘order_by’ => array(‘nombre’, ‘asc’),
                                                                                                                                                                          ‘method’ => ‘__toString’,
                                                                                                                                                                          ‘key_method’ => ‘getId’,
                                                                                                                                                         ) );

 

Para solventar este problema, he modificado el código del archivo SelectDependiente.js, dentro del método mostrar, sustituyendo

this.agregarOpcion(valor, this.opciones[this.grupo][valor]);

por:

var ordered = new Array();

// Ordenamos array
for (var valor in this.opciones[this.grupo]){
     var elemento = new Array();
      elemento[«id»] = valor;
     elemento[«text»] = this.opciones[this.grupo][valor];
     var found = false;
     for (var valor2 in ordered){
          if (elemento[«text»] < ordered[valor2][«text»]){
               ordered.splice(valor2, 0, elemento);
               found = true;
               break;
          }
     }
     if (!found)
          ordered.push(elemento);
} // Fin orden

// Agregamos los elementos ordenados
for (var i in ordered)
     this.agregarOpcion(ordered[i][«id»], ordered[i][«text»]);

 

El cambio es válido para cualquier proyecto que utilice SelectDependiente.js, sin ser estrictamente necesario que se utilice bajo el framework de Symfony.

Espero que este post ayude a aquellos usuarios que se hayan encontrado con este problema al utilizar este útil javascript.

Leave a Reply