Saludos colegas...
Estoy tratando de optimizar un script para PHP que tengo en ASP el cual carga una lista dependiente sin recargar la pagina, pero no me carga la 2da. lista, A ver nos ayudamos entre todos y lo ponemos en el FAQ una vez lo terminemos, ya que no encontre ninguna solución definitiva o completa en PHP, para listado sin recarga ...
Ahora este es el codigo en PHP desde un script de ASP --->
La primera lista funciona y se trae los datos desde la BD...
<select name="escenario" size="1" onchange="Listar (document.forms.Listas.escenario[selectedIndex].value);">
<? $cuenta = 1; while($sqlrow = mssql_fetch_array($sql_esc)){ ?>
<option value="<?=$sqlrow['cod_esc']?>"<?if ($cuenta == 1) {?>selected<?}?>><?=$sqlrow['desc_esc']?></option>
<? $cuenta = $cuenta+1; }?>
</select>
En la segunda lista escribi el script directamente....
<select name="grupos" size="1">
<?
//Se instancia la clase de conexión y se inicia session para enviar error...
//include_once 'src_cnn_cont.php';
//$sql_cnn = new cnn();
//$cnn_sql = $sql_cnn->mssqlcnn();
?>
<SCRIPT LANGUAGE="Javascript">
<!--
function Tupla ( campo1, campo2 )
{
this.campo1 = campo1;
this.campo2 = campo2;
}
<?
//Realiza una consulta para listar grupos...
$sqlgrupo= ("SELECT GRUPOS.COD_GRUP, GRUPOS.DESC_GRUP FROM GRUPOS INNER JOIN rel_esc_grup ON GRUPOS.COD_GRUP = rel_esc_grup.COD_GRUP INNER JOIN ESCENARIO ON rel_esc_grup.COD_ESC = ESCENARIO.COD_ESC");
$sql_grupo=mssql_query($sqlgrupo, $cnn_sql);
$cuenta=0;
$marc='basura';
while($sqlrow = mssql_fetch_array($sql_grupo)) {
if ($marc !== $sqlrow['COD_GRUP']) {
//cambio de categoria, empiezo a contar en 0
$cuenta = 0;
$marc = $sqlrow['gru'];
//además tengo que crear un nuevo array para la categoría
?>
var opciones<?=$marc;?> = new Array();
<?
}
?>
opciones<?=$marc; ?>[<?=$cuenta; ?>]=new Tupla("<?=$sqlrow['DESC_GRUP']; ?>","<?=$sqlrow['COD_GRUP']; ?>");
<?
$cuenta = cuenta+1;
}
?>
<?
//Limpiamos objetos
//mssql_free_result($sql_grupo);
?>
var contador;
function Listar ( array ) {
// Compone la lista dependiente a partir del valor de la opcion escogida en la lista "padre"
BorrarLista();
array = eval("opciones" + array);
for (contador=0; contador<array.length; contador++)
{
// añade elementos nuestro combobox
var optionObj = new Option( array[contador].campo1, array[contador].campo2 );
Listas.grupos.options[contador] = optionObj;
} // for
} // ComponerLista
function BorrarLista() {
Listas.grupos.length=0;
}
//Inicializamos
Listar (1);
</SCRIPT>
Como podran notar, creo que ambos tienen la misma carcateristicas pero en PHP no logro cargar la segunda lista, la primera si se carga...
Este es el original en ASP Este es el codigo original en ASP...
<form name="Listas"....
La primera lista tiene...
<select name="gerencia" size="1" tabindex="2" onchange="Listar (document.forms.Listas.gerencia[selectedIndex].value);">
<%
cuenta = 1
WHILE not rsgcia.EOF
%>
<option value="<%=rsgcia.Fields("centro_gestor")%>"<%IF cuenta=1 THEN%>selected<%END IF%>><%=rsgcia.Fields("descripcion")%></option>
<%
rsgcia.MoveNext
cuenta=cuenta+1
WEND
rsgcia.Close
%> </select>
La segunda lista tiene...
<!-- #INCLUDE FILE="lista_ofic.asp" -->
Este es el script escrito en lista_ofic......
<!-- #INCLUDE FILE="../../conexiones/conex_per_inf.asp" -->
<SCRIPT LANGUAGE="Javascript">
<!--
function Tupla ( campo1, campo2 )
{
this.campo1 = campo1;
this.campo2 = campo2;
}
<%
'Vamos a crear nuestros arrays de modelos desde ASP
'El primer if detecta un cambio en la categoría para crear un nuevo array en Javascript
sqlger = "SELECT centro_gestor [ 1, 5 ], centro_gestor AS gestor, descripcion FROM estructura_sap WHERE (clasificacion = 1 OR clasificacion = 2) ORDER BY gestor "
SET rsger = cnn.Execute(sqlger)
cuenta=0
marc="basura"
WHILE NOT rsger.EOF
IF marc<>rsger.Fields("centro_gestor") THEN
'cambio de categoria, empiezo a contar en 0
cuenta=0
marc=rsger.Fields("centro_gestor")
'además tengo que crear un nuevo array para la categoría
%>
var opciones<%=marc%> = new Array();
<%
END IF
%>
opciones<%=marc%>[<%=cuenta%>]=new Tupla("<%=rsger.Fields("descripcion")%>","<%=rsger .Fields("gestor")%>");
<%
cuenta=cuenta+1
rsger.MoveNext
WEND
%>
<%
'Limpiamos objetos
rsger.Close
set rsger=nothing
%>
var contador;
function Listar ( array ) {
// Compone la lista dependiente a partir del valor de la opcion escogida en la lista "padre"
BorrarLista();
array = eval("opciones" + array);
for (contador=0; contador<array.length; contador++)
{
// añade elementos nuestro combobox
var optionObj = new Option( array[contador].campo1, array[contador].campo2 );
Listas.Oficina.options[contador] = optionObj;
} // for
} // ComponerLista
function BorrarLista() {
Listas.Oficina.length=0;
}
//Inicializamos
Listar (1);
-->
</SCRIPT>
Este script funciona....