PDA

Ver la Versión Completa : Obtener lista de elementos de un form


aom
23-05-2003, 13:48:04
Hola foro,
necesito obtener la lista de los elementos de un formulario (el "document.forms[x].elements" de javacript), pero no encuentro la forma de hacerlo en php. Es posible?

Gracias

JavierB
23-05-2003, 14:24:19
Hola, aom.

En este ejemplo se añade el nombre de todos los componentes en un ListBox:

for I:=0 to ComponentCount-1 do
ListBox1.Items.Add(TComponent(Components[I]).Name);

Saludos,

__hector
23-05-2003, 14:44:36
Ese ejemplo no aplica para PHP :D

Mira a ver si te sirve la funcion each (en ASP, se hacia facil con un for each item in request.form), asi que debe ser equivalente.

JavierB
23-05-2003, 19:17:04
¡Oops! :(

Siempre miro los mensajes desde la opción "mensajes nuevos" y no me di cuenta que este era del Foro de PHP. Siento no poder ayudar en esto, yo en PHP estoy muy escasito.

Saludos,

aom
26-05-2003, 09:43:04
Hola,
gracias por contestar (a los 2 ;) )
La función each en php no funciona igual que en asp. He estado revisando la documentación en Internet pero sigo sin ver la forma de hacerlo. Se le ocurre a alguien?

Gracias

kayetano
26-05-2003, 11:27:21
Hola

Depende del metodo que utilices para mandar el formulario (POST o GET) debes consultar los Arrays:
- $PHP_POST_VARS (o $_POST ) para el metodo POST.
- $PHP_GET_VARS ( o $_GET ) para el metodo GET.

Como indice del array tienes el nombre del campo del formulario y como valor el valor del mismo campo.

Con el siguiente codigo obtendrias el nombre del campo y su valor en el caso del metodo POST:
<?
...
foreach( $PHP_POST_VARS AS $k => $v ) {
echo "$k => $v<br>";
}
...
?>

aom
26-05-2003, 16:17:15
Hola Kayetano, gracias por responder.
Tu solución no me sirve para lo que necesito hacer. Te explico:

Estoy haciendo un formulario donde el cliente indica un nº de serie de una máquina. Lo que quiero hacer es simular un campo calculado de Delphi, y cuando indique el número de serie rellenar una serie de campos con información sobre este equipo. Si abro una segunda ventana si que se devolver unos valores a unos campos mediante JavaScript (docuent.forms[x].elements[NombreCampo]), pero aquí de momento no lo quiero hacer así.

Espero haberme explicado bien,
gracias por la ayuda

kayetano
26-05-2003, 16:29:49
Hola

Vayamos por partes.

El PHP se ejecuta en el servidor y no en el cliente por lo que para que puedas tratar cualquier formulario en PHP hay que mandarlo al servidor y que este lo interprete.

Por lo tanto lo que tu pides se hace algo complicado.

Yo te plantearia varias soluciones:

- Recargar la pagina: Si cada vez que seleccionas un articulo recargas la pagina podras dar las caracteristicas del articulo. Este sistema hace que la pagina se haga muy lenta y empachosa.

- Usar frames: en uno muestras el formulario y en otro (que se debe recargar cuando se selecciona un producto) muestras las especificaciones del producto.
En mi opinion la mas facil de programar pero no de diseñar, no me gustan los diseños con frames :(

- Usar iframes: Lo mismo que el caso anterior pero con IFRAME. IFRAME es incompatible con NETSCAPE ( usa ILAYER).

- Trabajar con la propiedad innerHTML de cualquier objeto. Con este metodo te puedes quedar con la peña esta muy bien pero solo es compatible con Explorer. Ademas es un poco rollo ( a menos como yo lo hago )

El orden de las opciones es el que te aconsejo, de mas facil a mas dificil. Si te interesa la tercera opcion me lo haces saber y te lo explico.

aom
26-05-2003, 17:41:36
Hola Kayetano,
me puedes explicar que es el innerHTML?

Otra opción es abrir una ventana (¿puede ser invisible?) donde ejecute la sentencia sql para el nº de serie que me den, cerrarla automáticamente y devolver los valores, pero creo q es un poco chapuza y de momento busco otras soluciones.

Gracias

Emilio
26-05-2003, 23:06:38
Hola, he leido un par de veces tu pregunta y creo entender que lo que pretendes es que al introducir un valor (número de serie) en
uno de los campos de tu formulario se muestre en la celda de al lado el nombre de la máquina que corresponde a ese número de serie.

Si lo he entendido bien, yo eso lo hago abriendo una ventana que contiene un formulario de búsqueda, seleccionando el registro
que y devolviendo los valores, pero como parece ser que no quieres abrir ventanas, pudes hacerlo, aprovechando el evento OnChange
de los INPUT, OnBlur también te serviría pero tenemos que quedarnos con alguno :)

Lo primero es crear tu formulario.

//formulario.php

<form name="bla bla.....>
<input onChange="vertexto(this.name,this.value)" type="text" name="serie" value="<? echo trim($objeto->num_serie); ?>>
<input onChange="vertexto(this.name,this.value)" type="text" name="otro_campo" value="<? echo trim($objeto->otro_campo); ?>>
<input onChange="vertexto(this.name,this.value)" type="text" name="otro_mas" value="<? echo trim($objeto->otro_mas); ?>>

<table width="100%" border="0"><tr>
<td width="33%"><span id="span_serie"><? echo trim($objeto->num_serie); ?></span></td>
<td width="33%"><span id="span_otro_campo"><? echo trim($objeto->otro_campo); ?></span></td>
<td width="34%"><span id="span_otro_mas"><? echo trim($objeto->otro_mas); ?></span></td>
</tr></table>

Aquí un botón tipo submit, a mi no me gusta usarlos para intranet, en su lugar capturo la tecla enter haciéndola pasar por
una función a la cual seteo las variables que necesite y por ultimo hago un form.submit();

Nota: que no te confunda $objeto->num_serie con el resultado de una query, $objeto se supone que previamente lo hemos creado
con $objeto New MiClase(); si no usas clases cambia $objeto->num_serie por $num_serie a pelo.

</form>

A continuación metemos un IFRAME, (ya te comentan por ahí que el IFRAME sólo funciona con IE, pero si es para Intranet no
creo que eso sea un problema.

<IFRAME SCROLLING="NO" leftmargin="0" topmargin="0" marginwidth="0"
style="visibility: visible" name="idFrame"
width="100%" height="0" src="chivato.php">
</IFRAME>

como ves le damos una altura de cero y así no se verá en el formulario.

<script>
function vertexto(campo,valor) {
switch (campo) {
case "serie": idFrame.location.href="chivato.php?serie="+valor; break;
case "otro_campo": idFrame.location.href="chivato.php?otro_campo="+valor; break;
case "otro_mas": idFrame.location.href="chivato.php?otro_mas="+valor; break;
}
}
</script>

Por último hacemos esta pequeña función en JavaScript que llamará al fichero chivato.php pasando una variable con un determinado valor,
que a su vez es llamada por el IFRAME.

// Fin formulario.php


// Inicio chivato.php

Este fichero será el que escribirá en en innerText de tus span.

<?
if ( isset($HTTP_GET_VARS["serie"] ) { $SQL="SELECT * FROM tabla WHERE serie=$serie"; $span="span_serie"; }
if ( isset($HTTP_GET_VARS["otro_campo"] ) { $SQL="SELECT * FROM tabla WHERE otro_campo=$otro_campo"; $span="span_otro_campo"; }
if ( isset($HTTP_GET_VARS["otro_mas"] ) { $SQL="SELECT * FROM tabla WHERE otro_mas=$otro_mas"; $span="span_otro_mas"; }
Esto se puede hacer de forma más elegante pero ya me estoy alargando en la respuesta.

$result = mysql_query($SQL);
$registro = mysql_fetch_array($result);

?>
<SCRIPT>
parent.<? echo $span; ?>.innerText='<? echo $registro["NOMBRE"]; ?>';
</SCRIPT>

Y por último este miniscript es el que escribe el texto correspondiente a la máquina del número de serie introducido.

// Fin chivato.php

Espero que te sirva.

Saludos
Emilio.

aom
27-05-2003, 10:36:10
Hola Emilio,
de hecho si que estoy utilizando ventanas de búsqueda, pero cuando el usuario pulsa un botón. Si ya conoce el número de serie quiero que haga el efecto de un campo calculado.
Probaré tu solución, aunque parece que es perfecto para lo que quiero.

Muchas gracias por la ayuda

kayetano
27-05-2003, 11:02:03
Hola

Aqui va un pequeño ejemplo de como puedes utilizar el innerHTML


//-----------------------------------------
// contendio.html
//-----------------------------------------
<html>
<head>
<title>Untitled</title>

<script language="JavaScript1.2" id="script"></script>

</head>
<body>
<span id="tabla"><p>&nbsp;</p></span> <!-- ZONA DINAMICA -->
<input type="button" value="Prueba" onclick="script.src = 'include_script_js.php';"
</body>
</html>
//------------------------------------------



//-----------------------------------------
// include_script_js.php
//-----------------------------------------
var str = "";
str += "<p>Esto se ejecuta en el servidor y puedes hacer lo que quieras</p>";

tabla.innerHTML = str;


En include_script_js.php puedes hacer lo que quieras, pero lo importante es que al final lo guardes todo como una cadena de texto "str" y se la asignes a la propiedad innerHTML de nuestra zona dinamica.

aom
27-05-2003, 16:49:48
Hola Kayetano,
tu solución del innerHTML es perfecta, pero necesito pasarle como parámetro el valor del nº de serie. Es posible?

Gracias

kayetano
27-05-2003, 17:09:06
Hola

No problem.

Con javascript obtienes el valor del desplegable, donde seleccionas el articulo, con el evento "onchange" y lo pasa como GET.

<select onchange="valor=this.value">
...
</select>

La variable "valor" debe estar inicializada al principio y como global.


<input type="button" value="Prueba" onclick="script.src = 'include_script_js.php?id='+valor;"


Si quieres puedes crear una funcion que llame el evento onclick del boton y capture el valor del desplegable y carge el "script", creo que sera mas claro el codigo resultante.
¡¡ ESTE CODIGO NO ESTA PROBADO !! Simplemente es un pequeño ejemplo orientativo.

aom
27-05-2003, 17:47:31
Hola Kayetano,
he estado probando el código y funciona perfectamente.

Muchas gracias por todo :)

Emilio
27-05-2003, 21:28:44
Hola

Kayetano, en esta ocasión debo decir que me parece realmente ingenioso el tema de tu include_script_js.php si no tiene copyright by Kayetano igual hasta lo uso para alguna que otra cosilla :)

Saludos
Emilio

kayetano
28-05-2003, 09:52:49
Gracias, y por supuesto puedes usarlo cuando quieras.

¡¡ IMPORTANTE !!
Este script es compatible con EXPLORER y a partir de su version 5.