Buenas, Tengo el cerebro un tanto quemado y quisiera saber si me pueden dar un norte.
Les explico: Tengo una página diseñada para emitir facturación, y como primer paso cuenta con un form en el que se presenta Info básica del cliente. Desde ésta página se invoca a un formulario modal que sirve de búsqueda y selección de cliente.
Este modal además de la capacidad de buscar tiene funciones para agregar y modificar cliente para hacer entradas rápidas y no tener que pasar por el propio módulo de ABM de clientes. En el caso de buscar y aceptar este cliente "seleccionado" se presenta en la página y listo para iniciar la facturación.
Cuando se trata de editar, habilita controles para hacer los cambios, y de forma similar para permitir el alta.
Todo funciona bien... hasta que nos han pedido que este formulario trabaje con más info. Para el caso que me complica, y yendo más al problema, se trata de información sobre el domicilio. Esta consiste en seleccionar de una serie de combos relacionados la provincia, ciudad y por último el barrio.
Inicialmente esto estaba planteado de modo tal que sólo tenía provincia y ciudad. El contenido de los combos se hace de forma dinámica por medio de AJAX.
De funcionar, funciona. Pero hay cosas que necesitan mejorarse.
Concretamente el problema es que una vez que se carga el contenido de los combos, cuando se está en una edición no encontré forma de hacer que esté pre-seleccionado los valores que tenie el cliente. Y a su vez, en un caso de alta, necesito indicarle que esté pre-seleccionado una privincia y una ciudad por defecto. El código inicial, y como fue planteado, es que se cargan los combos y chau. No había nada de item por defecto y ahora es una exigencia del cliente.
En un gran script .JS que contiene un buen par de rutinas para trabajar con el modal tengo esto:
function cargar_ciudades() { var dataString = 'provincia_id=' + $('#f_clie_provincia').val(); $.ajax({ type: "GET", url: "admin/cargar_provincia_ciudades.php", data: dataString, cache: false, beforeSend: function() {}, complete: function() { }, success: function(data) { var newOptions = jQuery.parseJSON(data); var select = $('#f_clie_ciudad'); if (select.prop) { var options = select.prop('options'); } else { var options = select.attr('options'); } $('option', select).remove(); $.each(newOptions, function(val, text) { options[options.length] = new Option(text, val); }); } }); };
Este cargar_ciudades() se invoca desde otras funciones/eventos.
Como pueden apreciar se invoca a una página. El script php contiene lo siguiente:
if($_GET['provincia_id']!='0'){ $recciudades="SELECT ciudad_id, ciudad_nombre FROM ciudades WHERE ciudad_estado='1' AND provincia_id='$_GET[provincia_id]' ORDER BY ciudad_orden ASC, ciudad_nombre"; $opciones[$row_recciudades['ciudad_id']]=utf8_encode(strtoupper($row_recciudades['ciudad_nombre'])); } } else{ $opciones['0']='Seleccione una...'; } }
Lo que he intentado hacer, es cuando se trata de una edición, intentar recuperar previamente el valor seleccionado de los combos, para volver a reasignarlos. Algo así:
$('#formcliente #modal_editar_clie').click(function() { //limpiar_form_cliente(); // guardamos temporalmente los values (ids) de provincia, ciudad, y barrio var prov = $('#f_clie_provincia').val(); var ciud = $('#f_clie_ciudad').val(); var barr = $('#f_clie_barrio').val(); datos_editables(); $('#op_clie').val('editar'); $('#f_cliente_lab').removeClass('inp-form-jac-error').addClass('inpsinborde'); $('#f_cliente_lab').hide(); document.getElementById('div_nvo_clie').style.display = ""; document.getElementById('div_buscar_clie').style.display = ""; document.getElementById('div_editar_clie').style.display = "none"; //cargar las ciudades y barrios cargar_ciudades(); cargar_barrios(); // volvemos a seleccionar por defecto ciudades y barrios establecidos antes de cargar los combos $('#f_clie_provincia option[value="' + prov + '"]').prop('selected', 'selected'); $('#f_clie_ciudad option[value="' + ciud + '"]').prop('selected', 'selected'); $('#f_clie_barrio option[value="' + barr + '"]').prop('selected', 'selected'); });
Pero esto no funciona. Mi intento anterior fue hacer el típico:
$('#Elcombo').val(elvalor);
Pero tampoco tuvo buenos resultados.
Datos_editables() simplemente se encarga de hacer visible los inputs y combos. Ya que por defecto la info se muestra sin posibilidad de edición.
Cargar_barrrios() es la versión análoga diseñada para trabajar con los barrios.
Para el caso de un alta vendría a ser algo así:
$('#formcliente #modal_nuevo_clie').click(function() { limpiar_form_cliente(); datos_editables(); $('#op_clie').val('nuevo'); $('#f_cliente_lab').removeClass('inp-form-jac-error').addClass('inpsinborde'); $('#f_cliente_lab').hide(); document.getElementById('div_nvo_clie').style.display = "none"; document.getElementById('div_buscar_clie').style.display = ""; document.getElementById('div_editar_clie').style.display = "none"; $('#f_clie_provincia').val(1834); // SALTA por defecto $('#f_clie_ciudad').val(571774); //SALTA CAPITAL por defecto });
Gran parte del código lo he heredado. Yo simplemente estoy realizando los "ajustes".
Como resulta ser AJAX, y esto se ejecuta de forma asíncrona, me digo que quizá no es posible asingar un valor por defecto seleccionado desde el lado cliente mientras se está ejecutando en el server. Entonces me he preguntado si es posible desde ese script PHP devolver el contenido ya con el item que debe estar seleccionado en cuestión. Pero no doy con la tecla. ¿Es posible? ¿Cómo? Todavía no tengo bien firme mis conocimientos.
Naturalmente que debería pasar más parámetros al script. Mínimo para indicar el tipo de operación y otro para indicar cual item (por medio del value/id) debe estar seleccionado para el caso. Por eso no me preocupa, lo puedo hacer... Lo que no le capto es como introducir en ese $opciones[] que tal item va a ser el seleccionado.
Yo he cargado combos y establecido seleciones por defecto, pero de la forma cruda, dentro de un PHP "puro". Con el típico while y armado el option e indicando selected=selected cuando sea el caso. Algo como esto:
<select id="f_provincia_id_1" name="f_provincia_id[]" class="inp-form-jac-error searchprovincia" style="width: 250px; " > <option value="0">SELECCIONE UNA..</option> <? $recprovincias="SELECT provincia_id, provincia_nombre FROM provincias WHERE provincia_estado='1' AND pais_id='5' ORDER BY provincia_orden ASC, provincia_nombre"; ?> <option value="<?echo$row_recprovincias['provincia_id'];?>" <?if($row_domfis['provincia_id']==$row_recprovincias['provincia_id']){?>selected="selected"<?}?>><?echo utf8_encode($row_recprovincias['provincia_nombre']);?></option> <? } ?> </select>
Ese código anterior, es de muestra que tenemos para el script de ABM de clientes.
Pero no de forma indirecta parseando por JSON, devolverlo a un JS, y demás pasos... Ahí ya me pierdo...
¿Alguien me podría dar un norte?
Desde ya muchas gracias. Espero que se me entienda.
Saludos,