Foros del Web » Programando para Internet » Javascript »

Select dependientes con Java y Php

Estas en el tema de Select dependientes con Java y Php en el foro de Javascript en Foros del Web. Hola a todos, trabajando en un formulario me he encontrado con la necesidad de poder crear selects dependientes, es decir, que en función de la ...
  #1 (permalink)  
Antiguo 27/04/2010, 01:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 16 años, 5 meses
Puntos: 1
Select dependientes con Java y Php

Hola a todos, trabajando en un formulario me he encontrado con la necesidad de poder crear selects dependientes, es decir, que en función de la opción seleccionada en el primero aparezcan en el siguiente las opciones que dependen de la anterior.

Esto ya lo he conseguido ya que he seguido este ejemplo. Por si a alguien le fuera bien este tema dejo el enlace.

http://www.formatoweb.com.ar/ajax/se...pendientes.php

Bueno, aqui mi pregunta. No se si es relacionada al javascript o al php, asi que si creeis que debe cambiarse el post de lugar sin ningun problema.

La cuestion es que cuando selecciono el primer select, el siguiente se me cambia correctamente pero me 'limpia' el resto del formulario. Las páginas las tengo posicionadas de la manera index.php?page=pagina.php, así que supongo que puede ser algun problema de rutas en estas conexiones entre archivos.

Os dejo aqui los códigos. Gracias de antemano!

index.admin.php?page=add_content.php
Código:
<?php
function generateCategory()
{
    $consulta=mysql_query("SELECT id, name FROM section");
    mysql_close();
    
    // Voy imprimiendo el primer select compuesto por los paises
    echo "<select name='section' id='section' onChange='cargaContenido(this.id)'>";
    echo "<option value='0'>-- Elige una sección --</option>";
    while($registro=mysql_fetch_row($consulta))
    {
        echo "<option value='".$registro[0]."'>".$registro[1]."</option>";
    }
    echo "</select>";
}
?>

<div id="title">
    <img src="styles/images/news.icon.jpg" />
    <h2>Añadir un nuevo contenido</h2>
</div>
<div id="description_menu">
    <div id="description_menu-inner">
    <p>"Este módulo te permitirá crear contenido de forma rápida y sencilla. Podrás relacionar los 
    contenidos mediante las secciones y las categorias a las cuales pertenecen. Puedes incluir tanto
    textos como imágenes."</p>
    </div>
</div>
<div id="navform">
    
    <?php

    if($_POST['submit'])
    {
        $title = $_POST['title'];
        $body = $_POST['body'];
        $section = $_POST['section'];
        $category = $_POST['category'];
        $author = $_POST['author'];
        $date = date("j-n-Y, g:i a");
        
        if (isset($_POST['publish'])) {
        $publish = 1;
        }
        else{
        $publish = 0;
        }
            
        if (isset($_POST['review'])) {
        $review = 1;
        }
        else{
        $review = 0;
        } 
        
        if ($title && $body && $section && $category && $author) {
            echo "<p style='padding-left:20px;'>El formulario se ha enviado con éxito</p><br>";
            echo "Tus escritos son: <br>
              $title<br>$body<br>$section<br>$category<br>$author<br>$date<br>$publish<br>$review ";          
        }    
        else {
            echo "<p>No has rellenado todos los campos obligatorios</p>";
        }   
    }
    else
    {
    ?>
    
    <script type="text/javascript" src="pages/select_dependientes.js"></script>  
    
    <h1>Añade un nuevo contenido</h1>
    <div id="add-form">
        <p>Introduce los datos en el formulario siguiente:</p>
        <form action="index.admin.php?page=add_content" method="post" name="form">
                <label>Titulo:</label><br><input name="title" type="text" /><br> 
                <label>Cuerpo:</label><br><textarea name="body"></textarea><br>
                <label>Escoge la sección y la categoria al que pertenece el contenido:</label><br>
                <?php generateCategory(); ?>
                <select disabled="disabled" name="category" id="category">
                    <option selected value='0'>-- Escoge una categoria --</option>    
                </select><br>
                <label>Escrito por:</label><br><input name="author" type="text" value="usuario registrado" /><br>
                <label>Estado de publicación:</label><br>
                <input type="checkbox" name="publish" /> Publicar<br>
                <input type="checkbox" name="review" /> Marcar para revisión<br>
            <div style="clear:both"></div>
            <input name="submit" value="Añadir contenido" type="submit">
        </form>
    </div>
    <?php
    }
    ?>
    <div id="space"></div>
</div>
select_dependientes_proceso.php

Código:
<?php
// Array que vincula los IDs de los selects declarados en el HTML con el nombre de la tabla donde se encuentra su contenido
$listadoSelects=array(
"section"=>"section",
"category"=>"category"
);

function validaSelect($selectDestino)
{
	// Se valida que el select enviado via GET exista
	global $listadoSelects;
	if(isset($listadoSelects[$selectDestino])) return true;
	else return false;
}

function validaOpcion($opcionSeleccionada)
{
	// Se valida que la opcion seleccionada por el usuario en el select tenga un valor numerico
	if(is_numeric($opcionSeleccionada)) return true;
	else return false;
}

$selectDestino=$_GET["select"]; $opcionSeleccionada=$_GET["opcion"];

if(validaSelect($selectDestino) && validaOpcion($opcionSeleccionada))
{
	$tabla=$listadoSelects[$selectDestino];
	
    conectar_db();
        
	$consulta=mysql_query("SELECT id, name FROM $tabla WHERE id_section='$opcionSeleccionada'") or die(mysql_error());
	mysql_close();
    
	// Comienzo a imprimir el select
	echo "<select name='".$selectDestino."' id='".$selectDestino."' onChange='cargaContenido(this.id)'>";
	echo "<option value='0'>-- Elige una opción --</option>";
	while($registro=mysql_fetch_row($consulta))
	{
		// Convierto los caracteres conflictivos a sus entidades HTML correspondientes para su correcta visualizacion
		$registro[1]=htmlentities($registro[1]);
		// Imprimo las opciones del select
		echo "<option value='".$registro[0]."'>".$registro[1]."</option>";
	}			
	echo "</select>";
}
?>
select_dependientes.js

Código:
function nuevoAjax()
{ 
	/* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
	lo que se puede copiar tal como esta aqui */
	var xmlhttp=false;
	try
	{
		// Creacion del objeto AJAX para navegadores no IE
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e)
	{
		try
		{
			// Creacion del objet AJAX para IE
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(E)
		{
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') xmlhttp=new XMLHttpRequest();
		}
	}
	return xmlhttp; 
}

// Declaro los selects que componen el documento HTML. Su atributo ID debe figurar aqui.
var listadoSelects=new Array();
listadoSelects[0]="section";
listadoSelects[1]="category";

function buscarEnArray(array, dato)
{
	// Retorna el indice de la posicion donde se encuentra el elemento en el array o null si no se encuentra
	var x=0;
	while(array[x])
	{
		if(array[x]==dato) return x;
		x++;
	}
	return null;
}

function cargaContenido(idSelectOrigen)
{
	// Obtengo la posicion que ocupa el select que debe ser cargado en el array declarado mas arriba
	var posicionSelectDestino=buscarEnArray(listadoSelects, idSelectOrigen)+1;
	// Obtengo el select que el usuario modifico
	var selectOrigen=document.getElementById(idSelectOrigen);
	// Obtengo la opcion que el usuario selecciono
	var opcionSeleccionada=selectOrigen.options[selectOrigen.selectedIndex].value;
	// Si el usuario eligio la opcion "Elige", no voy al servidor y pongo los selects siguientes en estado "Selecciona opcion..."
	if(opcionSeleccionada==0)
	{
		var x=posicionSelectDestino, selectActual=null;
		// Busco todos los selects siguientes al que inicio el evento onChange y les cambio el estado y deshabilito
		while(listadoSelects[x])
		{
			selectActual=document.getElementById(listadoSelects[x]);
			selectActual.length=0;
			
			var nuevaOpcion=document.createElement("option"); nuevaOpcion.value=0; nuevaOpcion.innerHTML="Selecciona Opci&oacute;n...";
			selectActual.appendChild(nuevaOpcion);	selectActual.disabled=true;
			x++;
		}
	}
	// Compruebo que el select modificado no sea el ultimo de la cadena
	else if(idSelectOrigen!=listadoSelects[listadoSelects.length-1])
	{
		// Obtengo el elemento del select que debo cargar
		var idSelectDestino=listadoSelects[posicionSelectDestino];
		var selectDestino=document.getElementById(idSelectDestino);
		// Creo el nuevo objeto AJAX y envio al servidor el ID del select a cargar y la opcion seleccionada del select origen
		var ajax=nuevoAjax();
		ajax.open("GET", "pages/select_dependientes_proceso.php?select="+idSelectDestino+"&opcion="+opcionSeleccionada, true);
		ajax.onreadystatechange=function() 
		{ 
			if (ajax.readyState==1)
			{
				// Mientras carga elimino la opcion "Selecciona Opcion..." y pongo una que dice "Cargando..."
				selectDestino.length=0;
				var nuevaOpcion=document.createElement("option"); nuevaOpcion.value=0; nuevaOpcion.innerHTML="Cargando...";
				selectDestino.appendChild(nuevaOpcion); selectDestino.disabled=true;	
			}
			if (ajax.readyState==4)
			{
				selectDestino.parentNode.innerHTML=ajax.responseText;
			} 
		}
		ajax.send(null);
	}
}
  #2 (permalink)  
Antiguo 27/04/2010, 12:56
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: Select dependientes con Java y Php

Debes cambiar
Código Javascript:
Ver original
  1. if (ajax.readyState == 4) {
  2.     selectDestino.parentNode.innerHTML=ajax.responseText;
  3. }

por


Código Javascript:
Ver original
  1. if (ajax.readyState == 4) {
  2.     selectDestino.innerHTML=ajax.responseText;
  3. }

Suerte
  #3 (permalink)  
Antiguo 27/04/2010, 13:03
 
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Select dependientes con Java y Php

Hola compañero!

Esa es la solución que me estaba planteando hasta que he metido los selects dentro de un div como en el ejemplo y entonces se me refresca ese div y no todo el select, aunque tu respuesta seguro que es mucho mas apropiada.

Gracias por la ayuda!
  #4 (permalink)  
Antiguo 04/05/2010, 07:59
 
Fecha de Ingreso: febrero-2009
Mensajes: 50
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Select dependientes con Java y Php

BUenas señores, aprovechando este POST, que dicho sea de paso tambien estoy usando ese codigo. Quisiera hacerles una pregunta.
En el codigo de select_dependientes_proceso.php la parte de:
Código PHP:
Ver original
  1. $selectDestino=$_GET["select"]; $opcionSeleccionada=$_GET["opcion"];

Quiza sea un poco tonta la pregunta, pero $selectDestino que valor es el que esta tomando????
  #5 (permalink)  
Antiguo 04/05/2010, 10:41
 
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Select dependientes con Java y Php

Hola jose, por mi poca experiencia en el código creo que el selectDestino=$_GET['select'] lo que hace es recuperar el name del select para saber en cual se ha de ejecutar el script. Seguro que otro compañero te lo podrá confirmar mejor.

Un saludo!
  #6 (permalink)  
Antiguo 09/06/2011, 02:03
 
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Select dependientes con Java y Php

en realidad jose, esa parte toma el valor desde el html primario, en el que tienes tu etiqueta <select>
<select name='loquesea' id='UnID' onchange=cargarTucombo2(this.ID)
  #7 (permalink)  
Antiguo 02/05/2012, 04:21
 
Fecha de Ingreso: febrero-2012
Mensajes: 45
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Select dependientes con Java y Php

Buenas.

He seguido el tutorial que se indica aqui y me funciona perfecto, me cambia los valores y demas. Pero a la hora de enviar el formulario he comprobado poniendo el form en GET y solo me envia valores por el primer valor, mientras que yo quiero que lo envie en los 2 valores.

Esto como se haria??

Muchas gracias. Si necesitais el contenido de las paginas solo pedirmele.
Un Saludo!!

Etiquetas: dependientes, java, php, select
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.
Respuesta




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