Código de PHP - Combos anidados dinamicamente

Combos anidados dinamicamentegráfica de visualizaciones


PHP

estrellaestrellaestrellaestrellaestrella(15)
Publicado el 11 de Enero del 2005 por Francisco J.
64.376 visualizaciones desde el 11 de Enero del 2005. Una media de 105 por semana
ejemplo de combinación de HTML, PHP, Javascript y PostgreSQL para la ejecución de dos combos combinados dinámicamente (se puede hacer con más
pero al escribir el código javascript dinámicamente durante la carga de la página, retarda el proceso de carga y puede parecer que está colgado). Los valores del segundo combo se construyen dinámicamente para todos los valores del primer combo y dependen del valor seleccionado en el primero. Los valores del los combos están almacenados en dos tablas ('centros' y 'empleados'), relacionadas entre sí y alojadas en una base de datos PostgreSQL ('empresa').

Versión 1
estrellaestrellaestrellaestrellaestrella(15)

Publicado el 11 de Enero del 2005gráfica de visualizaciones de la versión: Versión 1
64.377 visualizaciones desde el 11 de Enero del 2005. Una media de 105 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

La tabla 'centros' dispone de un mínimo de dos campos:
* 'id' de tipo 'serial' -> 'primarykey'
* 'nombre' de tipo 'varchar' -> longitud 80 (o la que se necesite)

La tabla 'empleados' dispone de un mínimo de tres campos:
* 'id' de tipo 'serial' -> 'primarykey'
* 'id_centros' de tipo 'int4' (relacionado con el 'id' de la tabla
'centros')
* 'nombre' de tipo 'varchar' -> longitud 80 (o la que se necesite)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
//***** combos_combinados.php *****//
 
// CODIGO PHP.
 // Autor: Francisco J. Pedrero Ortega
 // Fecha: 25-05-2000.
 
 $db = @pg_connect("host=localhost user=postgres dbname=empresa") or die("No se ha podido conectar...");
?>
<html>
  <head>
...
...
...
    <script language="javascript">
      // Función que rellena el segundo combo según el valor seleccionado en el primero.
      // Se le pasa como parámetro el nombre del formulario desde el cuál se llama a la función,
      // de ésta manera podemos llamarlo desde combos con el mismo nombre en una misma página pero
      // desde distintos formularios.
      function rellenaCombo(formulario)
      {
        with (document.forms[formulario])  // Establecemos por defecto el nombre formulario pasado para toda la función.
        {
          var centro = id_centro[id_centro.selectedIndex].value; // Valor seleccionado en el primer combo.
          var n = id_empleado.length;  // Numero de líneas del segundo combo.
 
          id_empleado.disabled = false;  // Activamos el segundo combo.
 
          for (var i = 0; i < n; ++i)
            id_empleado.remove(id_empleado.options[i]); // Eliminamos todas las líneas del segundo combo.
 
          id_empleado[0] = new Option("Seleccione Empleado", 'null'); // Creamos la primera línea del segundo combo.
 
          if (centro != 'null')  // Si el valor del primer combo es distinto de 'null'.
          {
   <?php
   // CODIGO PHP
    // Para cada centro, construimos el segundo combo con los empleados del mismo.
    $cons_cen = @pg_exec($db, "SELECT * FROM centros;");
 
    for ($l = 0; $l < pg_numrows($cons_cen); ++$l)
    {
     $cen = @pg_fetch_object($cons_cen, $l);
   ?>
            if (centro == '<?php echo $cen->id;?>')
            {
    <?php
    // CODIGO PHP
      // Construimos los valores del segundo combo con los empleados del centro.
      $cons_emp = @pg_exec($db, "SELECT * FROM empleados WHERE id_centros = ".$cen->id." ORDER BY nombre;");
 
      for ($m = 0; $m < pg_numrows($cons_emp); ++$m)
      {
       $emp = @pg_fetch_object($cons_emp, $m);
    ?>
              id_empleado[id_empleado.length] = new Option("<?php echo $emp->nombre;?>", '<?php echo $emp->id;?>');
    <?php
    // CODIGO PHP
      }
    ?>
            }
   <?php
   // CODIGO PHP
    }
   ?>
            id_empleado.focus();  // Enviamos el foco al segundo combo.
          }
          else  // El valor del primer combo es 'null'.
          {
            id_empleado.disabled = true;  // Desactivamos el segundo combo (que estará vacío).
            id_centro.focus();  // Enviamos el foco al primer combo.
          }
 
          id_empleado.selectedIndex = 0;  // Seleccionamos el primer valor del segundo combo ('null').
        }
      }
    </script>
  </head>
  <body>
    <table>
      <tr>
        <td>
        <form name="datos" method="post" action="...">
...
...
...
            <select name="id_centro" onChange="rellenaCombo('datos');">
              <option value="null" selected>Seleccione Centro
<?php
// CODIGO PHP
 // Contruimos el primer combo con los valores de la tabla 'centros'.
 $cons_centros = @pg_exec($db, "SELECT * FROM centros;");
 
 for ($k = 0; $k < pg_numrows($cons_centros); ++$k)
 {
  $centro = @pg_fetch_object($cons_centros, $k);
  echo "              <option value=\"".$centro->id."\">".$centro->nombre."\n";
 }
?>
          </select>
        </td>
        <td>
          <select name="id_empleado" disabled>
            <option value="null">Seleccione Empleado
          </select>
        </td>
        </form>
...
...
...
      </tr>
...
...
...
    </table>
  </body>
</html>



Comentarios sobre la versión: Versión 1 (15)

Hector Barrera
28 de Enero del 2005
estrellaestrellaestrellaestrellaestrella
Un excelente trabajo, lo converti a Mysql y me funciono pefecto, les agradezco por que me han sacado de un super problema.

Gracias a Francisco por tan excelente colaboracion
Responder
diego arcila
19 de Marzo del 2005
estrellaestrellaestrellaestrellaestrella
Gracias por el codigo me funciono perfectamente en la base de datos que estoy realizando en Postgres
Responder
Juan David
20 de Septiembre del 2005
estrellaestrellaestrellaestrellaestrella
Tengo una duda, lo que pasa es que en mi aplicacion no funciona. Cuando escribo las etiquetas <?php y ?> aunque no tenga ninguna instruccion, el código javascript deja de funcionar. Ejemplo:

function rellenaCombo(formulario)
{
window.alert(\" seso mero\");
//...
if (primero != \'null\')
{
window.alert(\"Oigamenoigame\");
// CODIGO PHP

// <?php
// echo \"eso mero sioigame\";
// ?>

}

en el momento en que quito los comentarios de las etiquetas, ya no corre ni las ventanas de alert.

Como puedo hacer cosas asi?
gracias
Responder
Juan David
20 de Septiembre del 2005
estrellaestrellaestrellaestrellaestrella
Tengo una duda, lo que pasa es que en mi aplicacion no funciona. Cuando escribo las etiquetas <?php y ?> aunque no tenga ninguna instruccion, el código javascript deja de funcionar. Ejemplo:

function rellenaCombo(formulario)
{
window.alert(\" seso mero\");
//...
if (primero != \'null\')
{
window.alert(\"Oigamenoigame\");
// CODIGO PHP

// <?php
// echo \"eso mero sioigame\";
// ?>

}

en el momento en que quito los comentarios de las etiquetas, ya no corre ni las ventanas de alert.

Como puedo hacer cosas asi?
gracias
Responder
mauro ruiz
30 de Marzo del 2006
estrellaestrellaestrellaestrellaestrella
muy buen codigo yo estoy apenas aprendiendo a programar en php si depronto le queda facil ayudarme como se puede hacer la gestion de crear una factura en php con clases scrips y formularios de antemano gracias si me puede ayudar.
Responder
ma
30 de Marzo del 2006
estrellaestrellaestrellaestrellaestrella
aqui tengo algo de ejemplo pero no se porque no me corre lo que hice en este codigo:
<?php
class ClassVenta{
function ClassVenta(){

}

//El parámetro Cantidad es para saber cuantos productos y el Parámetro
//Calcular si es 1 entonces hay que calcular los subtotales de lo
//contrario si es 0 sólo se lista para la cantidad y el valor unitario
function GenerarTabla($Cantidad,$Calcular){
echo \'<table>\';
echo \'<tr><td colspan=\"4\" align=\"center\"><b>FACTURA Nro: \'.$_POST[\'texto1\'].\'</b></td></tr>\';
echo \'<tr><td>PRODUCTO</td><td>CANT</td><td>VALOR UNITARIO</td><td>SUBTOTAL</td></tr>\';
if ($Calcular == 0){
for($i=1;$i<=$Cantidad;$i++){
echo \'<tr>\';
echo \'<td align=\"center\"><b>\'.$i.\'</b></td>\';
echo \'<td>\';
echo \'<input type=\"text\" name=\"Pro\'.$i.\'\" value=\"\'.$_POST[\'Pro\'.$i].\'\" size=\"5\"/>\';
echo \'</td>\';
echo \'<td>\';
echo \'<input type=\"text\" name=\"Val\'.$i.\'\" value=\"\'.$_POST[\'Val\'.$i].\'\"/>\';
echo \'</td>\';
echo \'<td></td>\';
echo \'</tr>\';
}
echo \'<tr>\';
echo \'<td align=\"center\" colspan=\"3\"><b>T O T A L</b></td>\';
echo \'</tr>\';
echo \'<tr>\';
echo \'<td align=\"center\" colspan=\"4\">\';
echo \'<input type=\"button\" name=\"BtCalcular\" value=\"CALCULAR FACTURA\">\';
echo \'</td>\';
echo \'</tr>\';
echo \'</table>\';
}
else{

}
}
}
?>

<html>
<head><title>factura</title></head>
<script languaje=\"Java Script\">
function Crearfactura(){
var Men= \"\";
if (document.form1.texto1.value == \"\")
Men = Men + \"No ha ingresado el Número de Factura.\\n\";

if (document.form1.texto2.value == \"\")
Men = Men + \"No ha ingresado el Nombre del Cliente.\\n\";

if (document.form1.texto3.value == \"\")
Men = Men + \"No ha ingresado la Cantidad de Productos.\\n\";

if (Men == \"\"){
document.form1.GenerarFactura.value = 1;
document.form1.submit();
}
else
alert(Men);
}
</script>
<body>
<form name=\"form1\" action=\"\" method=\"post\">
<input type=\"hidden\" name=\"GenerarFactura\">
<?php

$Factura = new ClassVenta();

echo \'<table>\';
echo \'<tr><td>No. Factura </td>\';
echo \'<td><input type=\"text\" name=\"texto1\" value=\"\'.$_POST[\'texto1\'].\'\"></td></tr>\';
echo \'<tr><td>Cliente</td>\';
echo \'<td><input type=\"text\" name=\"texto2\" value=\"\'.$_POST[\'texto2\'].\'\"></td></tr>\';
echo \'<tr><td>Cantidad de Productos</td>\';
echo \'<td><input type=\"text\" name=\"texto3\" value=\"\'.$_POST[\'texto3\'].\'\"></td></tr>\';
echo \'<tr><td><input type=\"button\" name=\"btcrear\" value=\"CREAR FACTURA\"
onclick=\"Crearfactura()\"></td></tr>\';
echo \'</table>\';
if ($_POST[\'GenerarFactura\']){
echo \'<br><br>\';
$Factura->GenerarTabla($_POST[\'texto3\'],0);
}
?>
</form>
</body>
</html>

Responder
Francisco de Baskerville
11 de Enero del 2008
estrellaestrellaestrellaestrellaestrella
Muchas gracias por este codigo me ha sido de grandiosa ayuda
Responder
Lupe
30 de Enero del 2008
estrellaestrellaestrellaestrellaestrella
Muy buen ejemplo, yo pondría la etiqueta <form> antes del <td> para evitar problemas, por lo demás excelente.
Responder
Patricio Cortés
26 de Mayo del 2008
estrellaestrellaestrellaestrellaestrella
Excelente el código entiendo, más menos la idea general.
Yo llevo como un mes precticando PHP.
Me gustaría saber si alguien puede modificar el Código que envio Fco. Pedrero y cambiar la muestra de datos y conexiones a MYSQL
Yo no se nada PostgreSQL.
Una ayudita plis...
Responder
jorge
18 de Diciembre del 2008
estrellaestrellaestrellaestrellaestrella
bueno yo estoy recien conociendo PHP me gustaria que alguien me envie el codigo en PHP texto basico que ejecute y valore una factura con conexion a my SQL y los pasos como hacerlo factura sencilla gracias
Responder
liliana
13 de Diciembre del 2010
estrellaestrellaestrellaestrellaestrella
Hola! Yo probe el codigo con una tabla paises y otra provincias, consegui cargar los paises pero no asi las provincias. Cual podria ser el problema? Gracias
Responder
Enrique
13 de Abril del 2011
estrellaestrellaestrellaestrellaestrella
muy dificil de entender !!! soy programador de php y tu logica aunque no es mala, tiene ciertas desventajas, aqui dejo un link con la solucion :D es mucho mejor

--> http://www.megaupload.com/?d=OOWQGD0X
Responder
Enrique
17 de Abril del 2011
estrellaestrellaestrellaestrellaestrella
La verdad se ve algo complicado te pudieras ahorrar bastante tiempo usando un framework como prototype aqui dejo el link paraa que lo descargen y revisen

http://www.megaupload.com/?d=OOWQGD0X

CAPS -> http://img61.xooimage.com/files/1/9/f/anidados-278685e.jpg
Responder
Francisco J. Pedrero Ortega
25 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
Siento no poder contestar a todos los que lo solicitáis, pero no puedo acceder ni recuperar la contraseña. A los que proponéis otras soluciones más recientes, decirles que este código es de 2005 y posteriormente han salido tecnologías y métodos mucho más simplificados. Gracias a todos y cuando pueda acceder, podré recibir los avisos. Lo siento he contactado con el Administrador para ver si me puede recuperar la contraseña.
Responder
Oscar Heredia
16 de Febrero del 2016
estrellaestrellaestrellaestrellaestrella
Excelente ejemplo Francisco Pedrero, aunque sé que lo publicaste hace más de diez años, me fue muy útil, lo adapté a mi base de datos y funcionó perfecto. Agradecido!
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s1100