La majoria de formularis tenen "desplegables" en el desenvolupament web, o "combos" o "select", depenent del programador es dóna un nom o un altra, jo els dic de qualsevol de les opcions, segons el dia. Però tots volen dir el mateix. Ja he explicat que en la part client que els "select" no tenen els valors carregats en el HTML (a menys que siguin un Sí/No, o Blanc/Negre...), que és posteriorment que es carreguen les dades. És durant la creació dels controls que es posen els valors. Quan hi ha "selects" dels que s'anomenen en cascada (el valor d'un primer "select" determina les opcions d'un segon) també hi ha crides a aquesta funció. En la part servidora hi ha un ASHX que es dedica només a carregar els "selects", el comboloader.ashx. És lògic doncs que a la part client, al Javascript hi hagi una funció homònima que s'encarregui d'enviar peticions i rebre les respostes posant als "select" les seves opcions corresponents. La funció es diu LoadCombos, i té un munt de paràmetres, va començar amb pocs i a mesura que ha passat per projectes s'han anat afegint.
- pFrm: Identificador del formulari on estan els combos.
- pCombos: Identificadors dels "select" que s'han de carregar. Aquests noms han de coincidir amb els que tingui el comboloader.ashx. Si hi ha més d'un van separats per guions.
- pURLExtra: Alguns combos han de tenir els seus valors restringits per algun valor, es posa aquí en el format "&nom=valor" (pot ser més llarga "&nom1=valor1&nom2=valor2..., important el detall del "&" inicial).
- pAsync: indica si es poden carregar els combos de forma asíncrona. Això passa en la funció CrearteNNNNEvents, que a vegades s'han de carregar els combos per diferents formularis, aleshores si no es vol que les crides es solapin (lleig) s'ha de posar a false.
- pValorDefecte: Es un JSON que indica els valors per defecte de diferents combos, té un aspecte com {"filtre_Comunitat":"3"} i es poden posar els diferents valors per defecte dels diferents combos.
- pPostLoadFunction: funció que s'executa després de carregar els combos. Posar "undefined" si no es vol.
- pOptionBuit: booleà que indica si als combos s'ha de posar una primera opció que estigui buida.
- pValorOptionBuit: valor que té l'opció buida, normalment ''
Com sempre el codi:
var lastFrm = "";
var lastCombos = "";
var lastValorsDefecte = null;
function LoadCombos(pFrm, pCombos, pURLExtra, pAsync, pValorDefecte, pPostLoadFunction, pOptionBuit, pValorOptionBuit) {
if (pURLExtra === undefined) pURLExtra = "";
if (pAsync === undefined) pAsync = true;
if (pOptionBuit === undefined) pOptionBuit = false;
lastFrm = pFrm;
lastCombos = pCombos;
if (pValorDefecte !== undefined) lastValorsDefecte = eval('(' + pValorDefecte + ')');
else lastValorsDefecte = null;
$.ajax({
type: "GET",
async: pAsync,
dataType: 'json',
url: "comboloader.ashx?combos=" + pCombos + pURLExtra,
success: function(data, textStatus) {
if (!data.ERROR) {
var ComboID = '';
var options = '';
var ComboOBJ = null;
jQuery.each(data, function(i, val) {
ComboID = val.ComboID;
options = '';
if (val.Items) {
if (pOptionBuit) options = '<option value="' + pValorOptionBuit + '"></option>';
jQuery.each(val.Items, function(j, ItemVal) {
options += '<option value="' + ItemVal.Val + '">' + ItemVal.Disp + '</option>';
});
$("#" + lastFrm).find("#" + ComboID).html(options);
if (lastValorsDefecte != null) {
for (var member in lastValorsDefecte) {
if (member == ComboID) $("#" + lastFrm).find("#" + ComboID).val(lastValorsDefecte[member]);
}
}
}
else {
$("#" + lastFrm).find("#" + ComboID).html('');
}
});
if (pPostLoadFunction !== undefined) pPostLoadFunction(data);
}
else {
$("#ui-dialog-title-dialogErr").html("Error carregant combos");
$("#errmsg").html(data.ERROR);
$("#dialogErr").dialog("open");
}
}
});
}
Unes invocacions d'exemple podrien ser, aquesta primera és complicada, carrega un munt de combos al formulari filtre, i el combo de les comarques es filtra per la comunitat 3, i clar el combo comunitats ha de tenir aquest valor per defecte:
LoadCombos("frmFiltre",
"servei-filtre_DXT-filtre_LA-filtre_CANAL-filtre_VEGUERIA-filtre_COMARCA-filtre_Comunitat-filtre_ID_PROJECTE",
"&idcomunitat=3",
true,
'{"filtre_Comunitat":"3"}', undefined, false, undefined);
O un de més senzill, aqui amb l'opció buida parametritzada:
LoadCombos("frmDetall", "afegirTAAD", "", true, undefined, undefined, true, '');
Un exemple de combos encadenats pot ser com la següent, s'assigna a l'event "canvi" del combo origen i estaria a la funció "createNNNNNEvents" corresponent:
$("#frmFiltre #FK_Arxiu").change(function() {
var FK_Arxiu = $("#frmFiltre #FK_Arxiu").val();
if (FK_Arxiu == null || FK_Arxiu == undefined || FK_Arxiu == '') {
LoadCombos("frmFiltre", "FK_LlocDiposit", "&tots=1", false, undefined, undefined, true, "");
}
else {
LoadCombos("frmFiltre", "FK_LlocDiposit", "&tots=1&FK_Arxiu=" + FK_Arxiu, false, undefined, undefined, true, "");
}
});
|