Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   HTML, Javascript y otros (https://www.clubdelphi.com/foros/forumdisplay.php?f=38)
-   -   Combos dependientes (https://www.clubdelphi.com/foros/showthread.php?t=39653)

Caray 26-01-2007 05:17:24

Combos dependientes
 
Tengo el sig. codigo para combos dependientes pero no funciona, ayudenme pork no encuentro el error, o si saben de otro más fácil pues diganmelo

Código PHP:

<?php 
//conexión a mysql 
$servidor 'localhost'
$usuario 'root'
$contrasena =''
$datos 'docencia'
mysql_connect($servidor,$usuario,$contrasena); 
mysql_select_db($datos) or die("No se pudo establecer la Conexión"); 
?>
<?php
//seleccionamos las opciones del select principal 
$sql "SELECT c_unidad,nom_unidad FROM uni_academica ORDER BY nom_unidad"
$res mysql_query($sql); 
//obtenemos el número de registros 
$num mysql_num_rows($res); 
?> 
<FORM name="form1" method="POST"> 
<!--Combo principal--> 
<select name="marca" onChange="redirect(this.options.selectedIndex)" style='width:160'> 
<option selected value=0>Unidad Académica</option> 
<? 
for($i=0;$i<$num;$i++) { 
$id_marca[$i] = mysql_result($res,$i,0); 
$marca[$i] = mysql_result($res,$i,1); 
echo 
"<option value='$id_marca[$i]'>$marca[$i]</option>"

?> 
</select> 
<!--Combo dinámico--> 
<select name="modelo" style='width:160'> 
<option selected value=0>Docente</option> 
</select> 
</FORM> 
<? 
echo "<script><!--"
echo 
"var groups=".$num
echo 
"var group=new Array(groups)"
//Crea tantos arrays como valores hay en el combo principal 
echo "for (i=0; i<groups; i++) group[i]=new Array()"
//Opciones cuando no se ha hecho ninguna selección en el combo principal--> 
echo "group[0][0]=new Option('Docente','0');"
for(
$i=0;$i<$num;$i++) { 
$sql "SELECT c_profesor, nom_profesor FROM profesor WHERE c_unidad = $id_marca[$i]"
$res mysql_query($sql); 
//Obtenemos el número de modelos para esa marca 
$num2 mysql_num_rows($res); 
for(
$j=0;$j<$num2;$j++) { 
$id_modelo mysql_result($res,$j,0); 
$modelo mysql_result($res,$j,1); 
//Opciones para la opción $i del combo principal 
echo "group[$num][$j]=new Option('$modelo','$id_modelo')"


?> 
var temp=document.form1.modelo 
function redirect(x){ 
for (m=temp.options.length-1;m>0;m--) 
temp.options[m]=null 
for (i=0;i<group[x].length;i++){ 
temp.options[i]=new Option(group[x][i].text,group[x][i].value) 

temp.options[0].selected=true 

//--> 
</script>

Las Tablas son:
Uni_academica(c_unidad(pk),nom_unidad)
Profesor(c_profesor(pk),c_unidad(fk),nom_profesor)

kayetano 26-01-2007 10:05:33

Hola

A primera vista tu código no me parece muy claro, me da la sensación que estas confundiendo variables PHP con variables JAVASCRITP. Igualmente realizas procesos algo liados.

Yo he realizado este proceso de vez en cuando para relacionar poblaciones y provincias, te pongo un ejemplo:
FORMULARIO
Código PHP:

Provincia<br> 
<select name="idprovincia" onchange="cambiaPoblacion(this.value, this.form.F_idpoblacion )">
    <option value="0">- Seleccione -</option>
<?
    $qProvincia 
mysql_query "SELECT * FROM poblacion WHERE idprovincia = 0 ORDER BY nombre" ) or die (mysql_error());
    while ( 
$rProvincia mysql_fetch_array $qProvincia ) ) {
?>
        <option value="<?=$rProvincia["id"]?>"><?=$rProvincia["nombre"]?></option>
<?        }    ?>
</select>

Poblaci&oacute;n<br>
<select name="F_idpoblacion" disabled>
    <option value="0">- Seleccione -</option>
</select>

Utilizo la misma tabla para guardar las poblaciones y las provincias, la estructura sería algo asin:
id - Clave primaria
nombre - nombre de la poblacion o provincia
idprovincia - clave ajena que apunta a la misma tabla, una provincia simpre tendra este campo a 0, una población tendrá el id de la provincia.

Más cosas, con la estructura del while(... mysql_fetch_array() ) te ahorras mucho código.

Ahora nos queda el código javascript:
CODIGO JAVASCRIPT
Código PHP:

<script language="javascript" type="text/javascript">
    var arrayPoblacion = Array();
<?
    $poblacionActiva 
"";
    
$qPoblacion mysql_query"SELECT * FROM poblacion WHERE idprovincia > 0 ORDER BY idprovincia, nombre" );
    while( 
$rPoblacion mysql_fetch_array$qPoblacion ) ) {
        if( 
$poblacionActiva !=  $rPoblacion["idprovincia"] ) {
            
$poblacionActiva $rPoblacion["idprovincia"];
            echo 
"\tarrayPoblacion[$poblacionActiva] = Array();\n";
            
$x 1;
        }
        echo 
"\tarrayPoblacion[$poblacionActiva][".$x++."] = new Option('".$rPoblacion["nombre"]."', "$rPoblacion["id"] ." );\n";
    }
    
?>

    function cambiaPoblacion(provincia, poblacion ) {
       if( provincia > 0 ) {
          poblacion.disabled = false;
          poblacion.length = 1;
          for ( x in arrayPoblacion[provincia] )
              poblacion.options[x] = arrayPoblacion[provincia][x];
       } else {
          poblacion.length = 1;
          poblacion.disabled = true;
       }
    }
</script>

Lo que hago es generar un array con todos los posibles valores relacionando provincias y poblaciones, cuando el primer desplegable cambia pues simplemente borro el secundo desplegable y lo recargo con los nuevos valores asociados.

Hoy por hoy te dirán que lo hagas con AJAX, todo se arregla con AJAX, pero yo he utilizado este script durante mucho tiempo y me a funcionado muy bien.

Eso si no te aconsejo este script en caso de tener que asociar grandes cantidades de datos (miles o millones), en esos casos no respondo de su funcionamiento ni de los requisitos de memoria.

gulurulu 07-03-2007 00:35:54

Help Cayetano xD
 
Buenas Kayetano,

me ha parecido muy interesante el codi que as posteado mas que nada por que a mi no me interesa hacerlo con AJAX ya que me da mas trabajo y no me importa el refresco.

Lo unico que al intentar adaptar tu codigo a lo que quiero que me salga por pantalla no me sale bien

Tengo el primer combo marca y segun marca escoje modelos.

Estan dentro de la misma tabla "cars"

Código PHP:

<?PHP
include 'conexion.php';
conectar();
?>
<form action="" method="post" name="form">
  Marca:
    <select name="idmarca" onchange="cambiaModel(this.value, this.form.F_idmodel )">
    <option value="0">- Seleccione -</option>
<?PHP
    $qMarca 
mysql_query "SELECT DISTINCT marca FROM cars" ) or die (mysql_error());
    while ( 
$rMarca mysql_fetch_array($qMarca ) ) {
?>
        <option value="<?=$rMarca["marca"]?>"><?=$rMarca["marca"]?></option>
<?PHP     }    ?>
</select>
  <br>
Model: 
<select name="F_idmodel" disabled>
    <option value="0">- Seleccione -</option>
</select>
</form>
<script language="javascript" type="text/javascript">
    var arrayModel = Array();
<?PHP
    $modelActiva 
"";
    
$qmodel mysql_query"SELECT DISTINCT model FROM car WHERE marca = '$marca'");
    while( 
$rModel mysql_fetch_array$qmodel )) {
        if( 
$modelActiva !=  $rMoldel["model"] ) {
            
$modelActiva $rModel["model"];
            echo 
"\tarrayMoldel[$modelActiva] = Array();\n";
            
$x 1;
        }
        echo 
"\tarrayModel[$modelActiva][".$x++."] = new Option('".$rModel["model"]."', "$rModel[""] ." );\n";
    }  
?>
    function cambiaModel(marca, model) {
       if(marca > 0) {
          model.disabled = false;
          model.length = 1;
          for ( x in arrayModel[marca] )
              model.options[x] = arrayModel[marca][x];
       } else {
          model.length = 1;
          model.disabled = true;
       }
    }
</script>

LLevo 3 dias con esto y no me salgo... una ayudita please?

El error (mirando el codigo fuente de la pag) que me sale es:

Código PHP:

Warning</b>:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource on... line 28 


gulurulu 07-03-2007 01:21:27

Ya esta... He arreglado lo de antes... era una maldita 's' lo que pasa es que ahora no se me activa el segundo combo...

Código PHP:

<?PHP
include 'conexion.php';
conectar();
?>
<form action="" method="post" name="form">
  Marca:
    <select name="idmarca" onchange="cambiaModel(this.value, this.form.F_idmodel )">
    <option value="0">- Seleccione -</option>
<?PHP
    $qMarca 
mysql_query "SELECT DISTINCT marca FROM cars" ) or die (mysql_error());
    while ( 
$rMarca mysql_fetch_array($qMarca ) ) {
?>
        <option value="<?=$rMarca["marca"]?>"><?=$rMarca["marca"]?></option>
<?PHP     }    ?>
</select>
  <br>
Model: 
<select name="F_idmodel" disabled>
    <option value="0">- Seleccione -</option>
</select>
</form>

<script language="javascript" type="text/javascript">
    var arrayModel = Array();
<?
    $modelActiva 
"";
    
$qmodel mysql_query"SELECT * FROM cars");
    while( 
$rModel mysql_fetch_array$qmodel )) {
        if( 
$modelActiva !=  $rMoldel["marca"] ) {
            
$modelActiva $rModel["marca"];
            echo 
"\tarrayMoldel[$modelActiva] = Array();\n";
            
$x 1;
        }
        echo 
"\tarrayModel[$modelActiva][".$x++."] = new Option('".$rModel["model"]."', "$rModel["marca"] ." );\n";
    }  
?>
    function cambiaModel(marca, model) {
       if(marca > 0) {
          model.disabled = false;
          model.length = 1;
          for ( x in arrayModel[marca] )
              model.options[x] = arrayModel[marca][x];
       } else {
          model.length = 1;
          model.disabled = true;
       }
    }
</script>

Codigo fuente de la pag:
Código PHP:

<form action="" method="post" name="form">
  
Marca:
    <
select name="idmarca" onchange="cambiaModel(this.value, this.form.F_idmodel )">
    <
option value="0">- Seleccione -</option>
        <
option value="OPEL">OPEL</option>
        <
option value="AUDI">AUDI</option>
        <
option value="PEUGEOT">PEUGEOT</option>
</
select>

  <
br>
Model
<
select name="F_idmodel" disabled>
    <
option value="0">- Seleccione -</option>
</
select>
</
form>

<
script language="javascript" type="text/javascript">
    var 
arrayModel = Array();
    
arrayModel[][] = new Option('CORSA'OPEL );
    
arrayModel[][1] = new Option('A3'AUDI );
    
arrayModel[][2] = new Option('A2'AUDI );
    
arrayModel[][3] = new Option('A3'AUDI );
    
arrayModel[][4] = new Option('CORSA'OPEL );
    
arrayModel[][5] = new Option('103SX'PEUGEOT );
    function 
cambiaModel(marcamodel) {
       if(
marca 0) {
          
model.disabled false;
          
model.length 1;
          for ( 
x in arrayModel[marca] )
              
model.options[x] = arrayModel[marca][x];
       } else {
          
model.length 1;
          
model.disabled true;
       }
    }
</script> 


kayetano 07-03-2007 10:19:48

Hola

¿Es posible ver el código en funcionamiento? La verdad es que me tienes un poco confuso con el código que has enviado.
Asin a bote pronto veo unos cuantos errores:
1. arrayModel no está bien definido, debería de quedar algo tal que asín
Código:

  arrayPoblacion['AUDI'] = Array();
  arrayPoblacion['AUDI'][1] = new Option('A3', 1 ); // Guardo el nombre y la clave primaria de cada coche
  arrayPoblacion['AUDI'][1] = new Option('A2', 2 );
  arrayPoblacion['OPEL'] = Array();
  arrayPoblacion['OPEL'][1] = new Option('CORSA', 3 );

yo pondría como primer indice del array una número (la clave primaria de la tabla MARCAS) ya que no tengo muy claro si una cadena de texto como indice funcionará bien en todos los navegadores.
2. Es posible que el problema anterior venga dado por un error en el código:
Código PHP:

        if( $modelActiva !=  $rMoldel["marca"] ) {  // SOBRA UN "l" es $rModel y no $rMoldel
            
$modelActiva $rModel["marca"]; 

3. El script puedes ponerlo sin problemas dentro de la cabecera.

Y por último, me hace gracia que has hecho un copia a lo bestia del código, veo que has utilizado hasta basura que deje en el código como la marca "F_" que utilizo para identificar una serie de objetos.
Espero que te sirva de ayuda.

gulurulu 07-03-2007 11:20:22

Buenas Kayetano,

Ahora modificare lo que me as comentado para ver si logro que funcione, y te comento.

El codigo en funcionamiento lo puedes ver en http://ocasio.maam.es/cercam.php

Y he copiado a saco el codigo si xD mas que nada para ver si lograva hacelo funcionar y despues depurar-lo jajajaja

gulurulu 07-03-2007 12:05:07

A medias... te explico

Cita:

Empezado por kayetano
arrayPoblacion['AUDI'][1] = new Option('A3', 1 ); // Guardo el nombre y la clave primaria de cada coche

Tengo un problema, mas que nada supongo que de concepto, la clave primaria para cada coche es matricula.

Digamos que la tabla cars que tego definida es:

cars(matricula, marca, modelo, color, km, fecha, ...)
matricula: char(7) idprimaria
marca: char(15)
modelo: char(15)
color: int
km: char(10)
...

Cita:

Empezado por kayetano
2. Es posible que el problema anterior venga dado por un error en el código:
Código PHP:

        if( $modelActiva !=  $rMoldel["marca"] ) {  // SOBRA UN "l" es $rModel y no $rMoldel
            
$modelActiva $rModel["marca"]; 


al kitar la "l" gracias por el detalle, ya se activa el combo pero no selecciona...

Tienes la pag en http://ocasio.maam.es/cercam.php ;) para ver el funcionamiento, aunk la voy modificando pk voy haciendo pruevas.

Gracias por kualkier ayudita xD

kayetano 07-03-2007 12:44:32

Hola

Una solución sería crear dos tablas nuevas:
MARCAS( id, nombre )
MODELOS( id, idmarca, modelo )
Con lo que te ahorrarás muchos disgustos y problemas ya que si cada vez que metes un vehiculo tienes que escribir la marca y el modelo puede ocurrir que pongas "A4" o "A 4" o "A-4" y en el desplegable se verían 3 modelos diferentes cuando en realidad es el mismo.
Una vez creadas estas dos tablas ya no tendrías problemas con el javascript.

Si quieres seguir con tu sistema pues pienso que deberás utilizar el nombre de la marca como indice del array.

mariocase84 07-03-2007 17:02:27

Hola, no se si es muy tarde para responder, pero yo te recomiendo que visites este sitio es el JavaScript Tool Box lo que tenes que hacer es revisar los ejemplos bajarte los archivos js, incluir los archivos en tu proyecto, donar un poco de dinero (si sos altruista) y listo.

Espero te sirva.

Saludos,

Mario Antonio


La franja horaria es GMT +2. Ahora son las 13:01:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi