PHP - cargar <select> dinamicamente

 
Vista:
Imágen de perfil de Eduardo
Val: 86
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por Eduardo (15 intervenciones) el 21/07/2020 18:17:11
Saludos expertos,

Tengo la siguiente página:

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
118
119
120
121
<?php
 
    session_start() ;
    require('funcion.php') ;
 
    $SMem = $_SESSION;
    if ( isset($SMem['mem_clicod']) ) {
 
      $clie_codigo = $_SESSION["mem_clicod"] ;
      $clie_data   = GetClieData($clie_codigo);
 
      if ( count($clie_data) > 0 ) {
 
         $clie_ruc    = $clie_data[1] ;
         $clie_nombre = $clie_data[2] ;
         $clie_cat    = $clie_data[3] ;
         $clie_gpo    = $clie_data[4] ;
         $clie_plan   = $clie_data[5] ;
         $clie_vend   = $clie_data[6] ;
         $clie_pp     = $clie_data[7] ;
         $clie_mail   = $clie_data[8] ;
         $clie_dias   = $clie_data[9] ;
         $clie_line   = $clie_data[10] ;
         $clie_cons   = $clie_data[11] ;
         $clie_esta   = $clie_data[12] ;
         $clie_canj   = $clie_data[13] ;
 
// Se cargan los productos
         $prod_csv   = 'lista.csv' ;
         $list_prod  = csv_to_array( $prod_csv ) ;
 
// Se cargan las marcas
         $mark_csv   = 'marcas.csv' ;
         $list_mark  = csv_to_array( $mark_csv ) ;
         foreach ( $list_mark as list($mrk_cod,$mrk_nom,$mrk_cnj) ) {
            if ( $mrk_cnj != 'SIN CANJE' ) {
            $cmb_mark .=" <option value='".$mrk_cod."'>".$mrk_nom." -> ".$mrk_cnj."</option>";
            }
         }
 
      }
 
    }else{
 
      header('Location: login.php');
 
    }
 
?>
 
<html lang="es">
<head>
 
	<meta charset="utf-8">
   <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
   <link rel="stylesheet" href="css/navega.css" />
   <link rel="stylesheet" href="css/lista.css" />
	<title>Solicitud de canje por vencimiento próximo.</title>
 
</head>
 
 
<body>
 
   <div class="contenido">
 
      <div class="cabecera">
         <img src="imagen/logo-largo.png" />
      </div>
 
      <div class="info">
         <?php
         $hoy = date("d-m-Y") ;
         echo "<H2>Bienvenido ".$clie_nombre." </br>" ;
         echo "Hoy es ".obtenerFechaEnLetra($hoy)."</H2>" ;
         ?>
      </div>
 
      <div class="navegador">
         <a href="noticias.php">Noticias</a>
         <a href="lista.php">Lista</a>
         <a href="pedido.php">Pedido</a>
         <a href="catalogo.php">Cat&aacute;logo</a>
         <a href="pendientes.php">Pendientes</a>
         <a href="transito.php">Tránsito</a>
         <a href="clave.php">Clave</a>
         <a href="observa.php">Observaciones</a>
         <a class="active" href="#">Canjes</a>
      </div>
 
      <form action='canjes_agregar.php' method='get'>
         <div class="buscador">
               <label for="marcas">Labo./Marca:</label>
               <?php
                  echo "<input type='hidden' name='get_clicod' value='".$clie_codigo."'>";
               ?>
               <select class="clidat" id="marcas" name="marcas" onchange="cargaProductos()">
                 <?php echo $cmb_mark; ?>
               </select>
               <select class="clidat" id="productos" name="productos">
               //
               </select>
               <input type='text' name='lote' placeholder='lote...'>
               <input type='number' name='unidades' size='8' maxlength='5' min='1' max='1000' value='1'>
               <input type='submit' value='Agregar'>
         </div>
      </form>
 
      <div class="listadeprecios">
         <?php include 'canjes_carga.php' ; ?>
      </div>
 
      <div class="piedepagina">
         <p><center>Derechos de copia reservados 2020</center></p>
      </div>
 
   </div>
 
</body>
 
</html>

En esta parte del código cargo dos arrays desde archivos CSV:

1
2
3
4
5
6
7
8
9
10
// Se cargan los productos
$prod_csv   = 'lista.csv' ;
$list_prod  = csv_to_array( $prod_csv ) ;
 
// Se cargan las marcas
$mark_csv   = 'marcas.csv' ;
$list_mark  = csv_to_array( $mark_csv ) ;
foreach ( $list_mark as list($mrk_cod,$mrk_nom,$mrk_cnj) ) {
    if ( $mrk_cnj != 'SIN CANJE' ) {
        $cmb_mark .=" <option value='".$mrk_cod."'>".$mrk_nom." -> ".$mrk_cnj."</option>";

Luego en la vista, lleno el <select> marcas y creo un <select> vacio para mostrar en el los productos:

1
2
3
4
5
6
<select class="clidat" id="marcas" name="marcas" onchange="cargaProductos()">
 <?php echo $cmb_mark; ?>
</select>
<select class="clidat" id="productos" name="productos">
//
</select>

La idea es que cada vez que el usuario seleccione una "marca", el <select> "productos" se llene con los productos SOLO de esa marca (la lista de productos esta contenida en el array $list_prod y uno de los campos tiene el código de la marca).

He buscado en la red la mejor manera de hacerlo y he visto bastante controversia, algunos dicen que solo con PHP no se puede, que se requiere JavaScript, pero JavaScript no puede recibir un array desde PHP asi que no tengo forma de pasar el array $list_prod a la función JavaScript, otros dicen que se debe usar AJAX, pero todos los ejemplos que he visto no usan un array, son datos tipos Json, por lo que estoy bastante confundido.

Alguien con experiencia me podría indicar por favor cual es la manera más optima de realizar esta funcionalidad.

Agradeciendo su atención y tiempo de antemano, reciban un cordial saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Eduardo
Val: 86
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por Eduardo (15 intervenciones) el 23/07/2020 02:40:15
Comunicarles que ya lo resolví con Jquery, con JavaScript no me funcionaba. Si alguien está interesado, escribirme a mi correo.

Cordiales saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 2.907
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por joel (916 intervenciones) el 23/07/2020 11:32:11
Hola Eduardo, puedes compartir como lo resolviste?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eduardo
Val: 86
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por Eduardo (15 intervenciones) el 26/07/2020 04:20:54
Hola Joel,

Ok , primero hay que incluir jQuery (si es necesario descargarlo desde su pagina oficial), luego colocar el código script en el <head>:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<head>
 
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
    <link rel="stylesheet" href="css/navega.css" />
    <link rel="stylesheet" href="bootstrap/css/bootstrap.css" />
	 <title>Solicitud de canje por vencimiento próximo.</title>
 
    <script languaje="javascript" src="js/jquery-3.5.1.min.js"></script>
 
   <script languaje="javascript">
      $(document).ready( function() {
         $("#marcas").change( function() {
            $("#marcas option:selected").each( function() {
               id_marca = $(this).val();
               $.post("canjes_cargaprods.php", { id_marca: id_marca }, function(data){ $("#productos").html(data);
               });
            });
         })
      });
   </script>
 
</head>

Luego hay que escribir el .php que llama la función, para mi caso en el que mi modelo son archivos .csv lo hago asi:

"canjes_cargaprods.php":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
   require('funcion.php') ;
 
   $ar_marca = explode( "|" , $_POST["id_marca"] );
   $id_marca = $ar_marca[0];
 
// Se cargan los productos
   $prod_csv   = 'canjes.csv' ;
   $list_prod  = csv_to_array( $prod_csv ) ;
   $html = "" ;
   foreach ( $list_prod as list($pro_cod,$pro_nom,$pro_mar) ) {
      if ($pro_mar == $id_marca) {
         $html .= " <option value='".$pro_cod."|".$pro_nom."'>".$pro_nom."</option>";
      }
   }
   echo $html;
?>

Si tu modelo es MySql deberás adaptarlo en este .php

Espero les sirva a los intersados. Esperando estén en salud todos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
Imágen de perfil de joel
Val: 2.907
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por joel (916 intervenciones) el 26/07/2020 12:02:56
Gracias Eduardo!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eyednet
Val: 136
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por Eyednet (1 intervención) el 26/07/2020 12:52:15
Es una excelente idea compartir los códigos de resolución, porque pueden ayudar a mucha gente por eso tienes mi valoración +1 también.
Aprender juntos es mejor que sólos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 623
Bronce
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

cargar <select> dinamicamente

Publicado por cosmito (999 intervenciones) el 26/07/2020 21:07:25
Hola amigo Eduardo, podrias enviar tu correo para presentarte un proyecto que tengo para trabajar con <<select> dianmicamente?

mi correo es andresmen2004@hotmail.com. y asi me ayudas con un codigo que no logro completar. Se te agradece de antemano. Si no es mucho exigir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar