Foros del Web » Programando para Internet » PHP »

Combobox Dinamico

Estas en el tema de Combobox Dinamico en el foro de PHP en Foros del Web. Hola, tengo el siguiente problema, tengo un cuadro de lista que selecciona una serie de opciones, cuando alguien selecciona algo se activa un segundo cuadro ...
  #1 (permalink)  
Antiguo 14/08/2005, 12:13
Avatar de don_fransisco  
Fecha de Ingreso: junio-2004
Mensajes: 193
Antigüedad: 19 años, 10 meses
Puntos: 1
Combobox Dinamico

Hola, tengo el siguiente problema, tengo un cuadro de lista que selecciona una serie de opciones, cuando alguien selecciona algo se activa un segundo cuadro de lista con diversas opciones relacionadas con el primer cuadro de lista, he visto un ejemplo

http://www.ashleyit.com/rs/jsrs/select/php/select.php

Pero cuando veo el codigo me parece muy complicado y no es facil de entender ya que soy un principiant, existe alguna manera "facil" de poder hacer este mismo ejemplo, pero para que lo podamos entender los que recien los inicamos en esto.

Saludos
  #2 (permalink)  
Antiguo 14/08/2005, 12:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
El problemas que tienes con ese ejemplo es que usa várias cosas (lenguajes) bajo una "técnica" denominada "RSS: Remote Scripting" ... También tienes otras técnicas para hacer lo mismo como "Ajax". En definitiva, estas dos técnicas usan mucho Javascript/DHTML más que PHP .. además que se basan en conceptos como "cliente-servidor" que .. si no se tienen claros se hace complicado seguir un ejemplo así.

Si quieres un ejemplo de "combobox dinámico" pero con la mínima cantidad de javascript (con sus pro's y sus contras) .. fijate en esta FAQ:

Ahí se "recarga" la página cada vez que mueves una opción del combo "padre" para cambiar los valores del "hijo" .. (cosa que con RSS o Ajax no sucede "visualmente").

http://www.forosdelweb.com/f18/faqs-php-530600-post664999/

PD: a todo esto suponemos que trabajas con datos obtenidos de Base de datos .. no de datos "fijos" (para eso usa sólo javascript nada de PHP por médio).

Un saludo,
  #3 (permalink)  
Antiguo 14/08/2005, 19:42
Avatar de don_fransisco  
Fecha de Ingreso: junio-2004
Mensajes: 193
Antigüedad: 19 años, 10 meses
Puntos: 1
Hola Cluster Gracias por responder y por la explicación en realidad lo vi y quede algo "colgado", sin embargo he revisado el ejemplo de la Faq encuentro que tienes toda la razón tiene sus pro´s y sus contras aun asi me parece mas facil y mas entendible que el ejemplo anterior.

sin embargo encontre otro ejemplo que no recuerdo quien posteo para solucionar el mismo problema de los combo dinamicos y lo adapte a la tabla que aparecian en la FAQ, aqui lo dejo por si acaso alguien lo necesita:

Código PHP:
<?
$server
="localhost";
$user="";
$pass="";
$coneccion=mysql_connect($server,$user,$pass);
mysql_select_db("tubasededatos",$coneccion);
$sql_padre="select* from tabla_padre order by item_texto asc";
$sql_hija="select* from tabla_hija order by id_padre asc";
?>
<form method="post" name="main" action="">
Nombre :<input type="text" name="nombre">
Edad :<input type="text" name="nombre">
    <select name="cat" onchange="incluir(this.form.cat[selectedIndex].value);">
        <?
            $query
=mysql_query($sql_padre,$coneccion);
            while(
$row=mysql_fetch_array($query)){
                echo 
"<option value=".$row["id"].">".$row["item_texto"]."</option>";
            }            
        
?>
    </select>
    <select name="sub">
    </select>
    <input type="submit" name="send" value="Enviar">
</form>
<script lang="jscript">
function valores(campo1,campo2){
    this.campo1=campo1;
    this.campo2=campo2;
}
<?
$query_s
=mysql_query($sql_hija,$coneccion);
$indice=0;
$cat=0;
while(
$row=mysql_fetch_array($query_s)){
    if(
$cat!=$row["id_padre"]){
        
$indice=0;
        
$cat=$row["id_padre"];
        echo 
"var mimatriz".$cat."= new Array();\n";
    }
    echo 
"mimatriz".$cat."[".$indice."]=new valores('".$row["item_texto"]."','".$row["id"]."');\n";
}
?>
var i;
function incluir(array){
    clear();
    array=eval("mimatriz" + array);
    for(i=0; i<array.length; i++){
        var objeto=new Option(array[i].campo1, array[i].campo2);
        main.sub.options[i]=objeto;
    }
    main.sub.disabled=false;
    main.sub.focus();
}
function clear(){
    main.sub.length=0;
}
main.sub.disabled=true;
</script>

por cierto en este ejemplo cuando selecciono los valores en los cuadro de lista no me borrar el contenido de los otros text.

Saludos
  #4 (permalink)  
Antiguo 15/08/2005, 14:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. el ejemplo que expones en última instancia es un combinado de PHP+Javascript donde vía PHP generas todo el javascript para operar con ese par de combox anidados.

De hecho lo que haces es generar arrays en javascript.

Cualquier problema con el código .. para resolverlo te recomiendo que tomes el código que has generado vía PHP (en tu navegador -> ver código fuente) toma dicho código y expón tu duda en el foro de Javascript .. por qué realmente eso es lo que queda tras pasar por PHP su "pre-proceso" y generar ese código javascript.

Un saludo,
  #5 (permalink)  
Antiguo 22/02/2006, 09:39
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 18 años, 7 meses
Puntos: 49
hey man solo me arroja un solo registro en el segundo combo algien sabe por que les pongo mi codigo .....

<!--

<html>
<head>
</head>
<body>
<?
$server="localhost";
$user="root";
$pass="";
$coneccion=mysql_connect($server,$user,$pass);
mysql_select_db("langer",$coneccion);
$sql_padre="select* from la_ciudad";
$sql_hija="select* from la_comuna order by NOME_COM ASC";
?>
<form method="post" name="main" action="">
Nombre :<input type="text" name="nombre">
Edad :<input type="text" name="nombre">
<select name="cat" onchange="incluir(this.form.cat[selectedIndex].value);">
<option value="">Seleccione una opcion...</option>
<?
$query=mysql_query($sql_padre,$coneccion);
while($row=mysql_fetch_array($query)){
echo "<option value=".$row["COD_CIU"].">".$row["NOM_CIU"]."</option>";
}
?>
</select>
<select name="sub">
</select>
<input type="submit" name="send" value="Enviar">
</form>
<script lang="jscript">
function valores(campo1,campo2){
this.campo1=campo1;
this.campo2=campo2;
}
<?
$query_s=mysql_query($sql_hija,$coneccion);
$indice=0;
$cat=0;
while($row=mysql_fetch_array($query_s)){
if($cat!=$row["COD_CIU"]){
$indice=0;
$cat=$row["COD_CIU"];
echo "var mimatriz".$cat."= new Array();\n";
}
echo "mimatriz".$cat."[".$indice."]=new valores('".$row["NOME_COM"]."','".$row["COD_COM"]."');\n";
}
?>
var i;
function incluir(array){
clear();
array=eval("mimatriz" + array);
for(i=0; i<array.length; i++){
var objeto=new Option(array[i].campo1, array[i].campo2);
main.sub.options[i]=objeto;
}
main.sub.disabled=false;
main.sub.focus();
}
function clear(){
main.sub.length=0;
}
main.sub.disabled=true;
</script>
</body>
</html>
-->
  #6 (permalink)  
Antiguo 28/02/2006, 10:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 1
Antigüedad: 18 años, 1 mes
Puntos: 0
Solucion al problema de mostrar un solo registro

Solo se debe incrementar la variable $indice luego de llenar un registro de la matriz

}
echo "mimatriz".$cat."[".$indice."]=new valores('".$row["NOME_COM"]."','".$row["COD_COM"]."');\n";
$indice++;
}
  #7 (permalink)  
Antiguo 28/04/2006, 09:19
 
Fecha de Ingreso: abril-2006
Ubicación: Bogotá
Mensajes: 1
Antigüedad: 18 años
Puntos: 0
El código que dejaste funciona a la perfección, excepto por un detallito:

En esta parte del código:
Código PHP:
...
<?
$query_s
=mysql_query($sql_hija,$coneccion);
$indice=0;
$cat=0;
while(
$row=mysql_fetch_array($query_s)){
    if(
$cat!=$row["id_padre"]){
        
$indice=0;
        
$cat=$row["id_padre"];
        echo 
"var mimatriz".$cat."= new Array();\n";
    }
    echo 
"mimatriz".$cat."[".$indice."]=new valores('".$row["item_texto"]."','".$row["id"]."');\n";
}
?>
var i;
function incluir(array){
...
Hace falta aumentar $indice para cada ejecución del código dentro del while, así:

Código PHP:
...
<?
$query_s
=mysql_query($sql_hija,$coneccion);
$indice=0;
$cat=0;
while(
$row=mysql_fetch_array($query_s)){
    if(
$cat!=$row["id_padre"]){
        
$indice=0;
        
$cat=$row["id_padre"];
        echo 
"var mimatriz".$cat."= new Array();\n";
    }
    echo 
"mimatriz".$cat."[".$indice."]=new valores('".$row["item_texto"]."','".$row["id"]."');\n";
    
$indice++;
}
?>
var i;
function incluir(array){
...
Y pues no sobra aclarar a los desprevenidos que el código se deja tal cual en el BODY, porque se llama cuando la página carga (se genera el listado de posibles opciones para la tabla hija), mientras que la función se llama cuando cambia el select de la tabla padre

Gracias, y saludos!
  #8 (permalink)  
Antiguo 28/04/2006, 09:29
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 2 meses
Puntos: 5
No es exactamente lo que andas buscando, pero creo que podria ayudar mucho :
Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #9 (permalink)  
Antiguo 27/05/2006, 04:40
 
Fecha de Ingreso: mayo-2006
Mensajes: 19
Antigüedad: 17 años, 10 meses
Puntos: 0
No me reconoce el form!!

Hola a todos. Estoy desarrollando un módulo para un portal de e-learning llamado Moodle. Tengo que enseñar unos combos dinámicos para seleccionar al final una versión de la página de una wiki, pero esto no importa jeje, vamos que el problema reside en el momento en que se llama al f_wiki.field.... (que es el nombre del form). Mi fichero .html es llamado dentro de la aplicación, xq carga una información cm las cabeceras y tal. Ahoa mismo creo el primer cmbo cn info de la BD y todo bien, pero al llamar a la func insertar si pongo simplemete un alert dl valor ok, pero al poner el resto del código para insertar el objeto y tal...pues como q no sabe lo q es main :,(. Os pego el código. El código es algo diferente que el expuesto por don_francisco, mayormete en la forma de sellcinar los valores q van en el segundo combo, ya que tengo q ordnarlos, y alguna otra historia. Eso es correcto.


<script lang="jscript">
function valores(campo1){
this.campo1=campo1;
}
<?php
global $course;
$wiki_course=get_records('dfwiki', 'course', $course->id);

$combo_wiki= "<select name=\"cb_wikis\" onchange=\"incluir(this.form.cb_wikis[selectedIndex].value)\";>\n";
foreach($wiki_course as $wiki){
$combo_wiki.= " <option value='".$wiki->name."_".$wiki->id;
$combo_wiki.= "'>".$wiki->name."</option>\n";

$indice=0;
$wiki_course_pagenames = get_records_sql('SELECT * FROM ' . $CFG->prefix.'dfwiki_pages WHERE dfwiki='.$wiki->id.' ORDER BY id ASC');
$nom_pages = array();
$nom_pages_aux = array();
$num_pages = 0;
foreach($wiki_course_pagenames as $wiki_ver){//tenemos los nombres de las páginas
$trobat = 0;
for($i=0;$i<$num_pages;$i++){
if ($nom_pages_aux[$i] == $wiki_ver->pagename){
$trobat = 1;
break;
}
}
if ($trobat == 0 ){
$nom_pages[$num_pages] = $wiki_ver->pagename;
$nom_pages_aux [$num_pages] = $wiki_ver->pagename;
$num_pages++;
}
}
echo "v_".$wiki->name."_".$wiki->id."= new Array();\n";
for($index = 0; $index < $num_pages; $index++ ){
echo "v_".$wiki->name."_".$wiki->id."[".$index."] = new valores('".$nom_pages[$index]."');\n";
}
}


?>
</script>
<?php
echo "<form name=\"f_wiki\"><BR>";
echo $combo_wiki;
echo "<select name=\"cb_pagenames\"></select>";
?>
<select name="cat" onchange="incluir(this.form.cat[selectedIndex].value);">
<option value =\"5 lines\"> 5 lines</option>
<option value =\"10 lines\"> 10 lines</option>
<option value =\"15 lines\"> 15 lines</option>
<option value =\"all lines\"> all lines</option>

</select>
</form>

<script lang="jscript">
var i;
function incluir(array){
//clear();
//array=eval("mimatriz" + array);
array = "v_"+array;
for(i=0; i<array.length; i++){
var objeto=new Option(array[i].campo1);
f_wiki.cb_pagenames.options[i]=objeto;
}
f_wiki.cb_pagenames.disabled=false;
f_wiki.cb_pagenames.focus();
alert(array);
}

function clear(){
f_wiki.cb_pagenames.length=0;
}


f_wiki.cb_pagenames.disabled=true;
</script>
  #10 (permalink)  
Antiguo 08/03/2007, 12:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 14
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Combobox Dinamico

Tengo una duda con respecto al codigo que sale en el ejemplo de don francisco, en una parte veo que habre javascript y despues coloca php, sin cerrar el javascript, se puede hacer eso...


y lo pruebo y pruebo y me indica un error en el arreglo

plop alguien tiene algo que funcione respecto a este tema estare muy agradezcido-.
  #11 (permalink)  
Antiguo 03/09/2007, 04:17
LKS
 
Fecha de Ingreso: septiembre-2007
Mensajes: 1
Antigüedad: 16 años, 7 meses
Puntos: 0
Problema combobox dinámico en firefox

Buenas.
Tengo un problema con un combobox en el que deseo cargar los municipios según la provincia que se ha escogido en otro combobox. El caso es que en Internet Explorer 6 me funciona perfectamente, pero al ejecutarlo en firefox, éste se cierra y no tengo ni idea de porqué.

Les dejo el código PHP y javascript que genera el combobox de los municipios.


Código PHP:
<?php

/*
 Esta funcion puede ser llamada desde distintos formularios, por eso se le pasa
 el nombre del formulario y el objeto que llama a esta función
 nuevo_anunc es el formulario que corresponde a la inserción de un nuevo
 anuncio. En este caso me funciona perfectamente. El problema reside en un
 anuncio ya creado, que queremos modificar.
 A partir de $sql = "select id_anuncio from anuncios limit $from,$max_results";.....
 es donde debe estar el fallo
*/
echo ("
function mostrarMunicipios(selObj,nombre_form)
{
    
"
);
    
    
$tablaprovincias mysql_query("SELECT id,prov FROM provincias ORDER BY prov ASC",$link);
    
$numProvincias 0;
    
$arrayProvincias = array();
    
$arrayMunicipios = array();
    
$numMunicipios 0;

echo (
"
    
    switch (nombre_form)
    {
        case 'nuevo_anunc':
            switch(selObj.options[selObj.selectedIndex].value)
            {
                case '-1': document.forms.nuevo_anunc.selectmunicipio.options.length=1; break;
                
                "
);

                while (
$registroprovincia mysql_fetch_array($tablaprovincias)) {
                    
                   
$arrayProvincias[$numProvincias++] = $registroprovincia;
                   echo (
"case '".$registroprovincia['id']."': ");
                   
$tablamunicipios mysql_query("SELECT id,municipio FROM municipios WHERE id_provincia = ".$registroprovincia['id']." ORDER BY municipio ASC",$link);
                   
$municipios=1;
                   echo (
"document.forms.nuevo_anunc.selectmunicipio.options.length=0;            document.forms.nuevo_anunc.selectmunicipio.options[0] = new Option('Seleccione un municipio',-1); ");
                   while (
$registromunicipio mysql_fetch_array($tablamunicipios)) {
                       echo 
"document.forms.nuevo_anunc.selectmunicipio.options[".$municipios++."] = new Option('".pon_barra($registromunicipio['municipio'])."','".$registromunicipio['id']."'); ";
                       
//echo ('document.forms.nuevo_anunc.selectmunicipio.options['.$municipios++.'] = new Option("'.pon_barra($registromunicipio['municipio']).'","'.$registromunicipio['id'].'");');
                    
// termina la zona de repeticion
                    
                    
echo (" break; ");
                } 
// termina la zona de repeticion
            
echo ("
            } break;
        "
);
        
        
$sql "select id_anuncio from anuncios limit $from,$max_results";
        
$result mysql_query($sql,$link);
        while (
$row mysql_fetch_array($result))
        {
            echo (
"case 'id_".$row['id_anuncio']."': switch(selObj.options[selObj.selectedIndex].value){    case '-1': document.forms.id_".$row['id_anuncio'].".selectmunicipio.options.length=1; break; ");
                    
                    
                    foreach(
$arrayProvincias as $registroprovincia) {
                        
//echo ("alert('entra');");
                        
echo ("    case '".$registroprovincia['id']."': ");
                        
// Recuperamos subcategorías
                        //echo (" alert('entra while'); ");
                        
$tablamunicipios mysql_query("SELECT id,municipio FROM municipios WHERE id_provincia = ".$registroprovincia['id']." ORDER BY municipio ASC",$link);
                        
$municipios=1// para subcategoria todas
                        // Para limpiar las subcategorías que haya en el select
                        
echo ("document.forms.id_".$row['id_anuncio'].".selectmunicipio.options.length=0; document.forms.id_".$row['id_anuncio'].".selectmunicipio.options[0] = new Option('Seleccione su municipio',-1); ");
                        while (
$registromunicipio mysql_fetch_array($tablamunicipios)) {
                            
// Cambiar nombre para cada formulario
                            
echo ("document.forms.id_".$row['id_anuncio'].".selectmunicipio.options[".$municipios++."] = new Option('".pon_barra($registromunicipio['municipio'])."','".$registromunicipio['id']."'); ");
                        } 
// termina la zona de repeticion
                        
                        
echo (" break; ");
                    } 
// termina la zona de repeticion
                    
            
echo (" } break; ");    
        } 
        
//$cadena = "entra default";
        //echo ("default: alert('".$entra."')");
        
echo ("    } ");

mysql_free_result($tablamunicipios); // se libera la memoria usada por la tabla
mysql_free_result($tablaprovincias); // se libera la memoria usada por la tabla
echo (" } ");
?>
Espero que puedan ayudarme. Si descubro donde estaba el error lo publicaré. Muchas gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 19:41.