• 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.