Foros del Web » Programando para Internet » PHP »

problema con botones de formulario

Estas en el tema de problema con botones de formulario en el foro de PHP en Foros del Web. Hola a todos. Mi duda es la siguiente: Tengo una pagina en php y un formulario donde tengo un campo hidden (oculto) que sirve para ...
  #1 (permalink)  
Antiguo 15/07/2004, 04:55
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 13 años, 9 meses
Puntos: 5
Sonrisa problema con botones de formulario

Hola a todos. Mi duda es la siguiente:

Tengo una pagina en php y un formulario donde tengo un campo hidden (oculto) que sirve para saber si tengo que procesar el formulario o no.
Antes utilizaba el típico boton submit para procesar el formulario pero cambie ese boton por una imagen que al hacer click me hacer:

javascript:formulario.submit()

Hasta aqui parecería que es un problema de javascript pero no. El problema esta en que al principio de mi pagina php tengo:

<?
if ($tratarFormulario==1){
tratarTarea();
?>

siendo $tratarFormulario mi campo hidden del formulario.

No se porque estraña razon cuando recargo la pagina con location.reload() me vuelve a tratar el formulario como si hubiera pulsado el boton que tengo (mejor dicho la imagen) que se encarga de ejecutarlo.


Antes no me pasaba esto cuando tenia el tipico boton submit pero ahora cuando recargo la pagina me trata el formulario SI ANTES HABIA DADO A LA IMAGEN DE TRATAR FORMULARIO.

Es decir, si doy al boton recargar sin haber dado antes a la imagen de tratar formulario me lo hace bien (solo recarga la pagina) pero si doy a la imagen de tratar formulario, luego cuando doy a el boton de recargar página me trata el formulario como si le hubiera dado a la imagen de tratar formulario.

No se si el problema esta en esa variable de formulario tratarFormulario que al parecer cuando recargo esta siempre a 1 y por eso cumple la condicion que puse a arriba pero ¿cuando se recarga una pagina esas variables de formulario no desaparecerían? (porque es un reload no un submit de formulario)

Espero que alguien sepa donde esta el problema.

Un saludo
  #2 (permalink)  
Antiguo 15/07/2004, 08:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El navegador (cliente) al recargar la página reenvia toda variabel que hubiera recibido. Ya sea por GET (por el URL) o por POST (según el método de envio de tu formulario). Para el caso de "post" el nevagador suele pedir confirmación para reenviar los datos.

Podrías poner el código completo de tu formulario+proceso PHP .. pero al parecer lo que NO haces es redirecciona automáticamente a donde corresponda al terminar tu proceso PHP. Eso hace que para una recarga de página (ya sea con tu navegador "F5" o tecla que sea para recargar tu página) o vía javascript se reenvien los datos en su estado anterior.

Deberias hacer algo tipo:
Código PHP:
<?
//proceso PHP al terminar tu proceso .. 
header ("Location: nose.php");
?>
Si tienes un script que hace varias cosas: ejemplo; tiene el formulario + el proceso de esos datos + tal vez muestra esos datos de donde quedarón (alguna BD .. etc). Tendrás que usar una variable de control para indicar que proceso ha de hacer tu script en el redireccionamiento automático que haces vía header() .. es decir .. algo tipo: nose.php?accion=listado .. y controla eso en tu script con un swith() o con if() o cualquier otra estructura de control (condicional).

Un saludo,
  #3 (permalink)  
Antiguo 16/07/2004, 06:25
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 13 años, 9 meses
Puntos: 5
Gracias por respondr Cluster. No consigo solucionar el problema. Te pongo el codigo de la pagina que es muy corta para ver si tu sabes donde esta el problema:


?
if($proceder==1)
tratarFormulario();
?>


<html>
<head>
<title>Formulario</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">


<FORM name="formulario" ACTION="<?php echo $PHP_SELF;?>" METHOD=GET>
<p>Nombre:
<input type="text" name="texto">
</p>
<p>
<input type="button" name="procesar" value="Procesar" onclick="formulario.submit()">
<input type="button" name="refrescar" value="Refrescar" onclick="cambiar()">
</p>
<INPUT TYPE=hidden NAME="proceder" VALUE=1>
</form>

<?
function tratarFormulario(){
?>
<script>
alert('hola')
</script>
<?

}
?>

<script>
function cambiar(){

document.formulario.proceder.value=0
document.formulario.texto.value='hola'
location.reload();

}
</script>

</body>
</html>


Esta página lo que debería hacer es que cuando pulso el boton de Procesar me debería ejecutar la funcion php tratarFormulario() que lo unico que hace es sacar por pantalla el mensaje 'hola'.

El problema esta en que una vez dado al boton de procesar, cuando doy al boton de recargar pagina me vuelve a procesar el formulario cuando lo unico que debería hacer es recargar la pagina. Incluso he modificado el valor del campo oculto del formulario a cero cuando pulso el boton de recargar para que no se cumpla la condicion de arriba de
if($proceder==1) pero me sigue procesando el formulario y por tanto sacandome el mensaje de 'hola'.


Espero que me puedan ayudar.

Un saludo
  #4 (permalink)  
Antiguo 16/07/2004, 08:32
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,
Cita:
cuando doy al boton de recargar pagina me vuelve a procesar el formulario cuando lo unico que debería hacer es recargar la pagina
Es que es precisamente recargar la pagina lo que esta haciendo.

En HTTP ese "recargar" es repetir la ultima peticion al servidor. Asi que recargar la pagina es equivalente a volver a enviar el formulario con los datos de la vez anterior. Asi que vuelves a enviar proceder=1.

Es lo que te explicaba Cluster.

Ahora es cuestion de que definas bien que es lo que quieres que haga el boton "refrescar". Con ese cambio de valores que haces ahora, en lugar del reload() lo que tendrias que hacer es un submit() del formulario. Si quieres que con procesar haga una accion y con refrescar otra, puedes hacer un:
Código PHP:
if (isset($_POST['procesar'])) {
  
// aqui el codigo de procesar
} elseif (isset($_POST['refrescar'])) {
  
// aqui el codigo de refrescar

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 16/07/2004, 08:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No entiendo muy bien el juego que haces con javascript y tu "procesar" variable. En principio no deberías guiarte por la existencia/valor de esa variable sino de otra de tu formulario: por ejemplo de "texto" si existe o no .. por qué si existe será que has hecho el submit y si no existe es que no se ha hecho el submit.

Si tienes un script X que puede hacer N determinadas acciones:
1) un formulario
2) proceso del formulario
3) mostrar resultado

debes separar los procesos como si fuera en "scripts a parte" pero en tu caso al usarlos bajo uno mismo debes tener una variable de control que dedida en que proceso se está y que es lo que debe hacer el script.


Código PHP:
<?php

cabecera
(){
?>
<html>
<head>
</head>
</body>
<?
}

pie(){
?>
</body>
</html>
<?
}

formulario (){
// el formulario HTML
?>
<form action="<? echo $_SERVER['PHP_SELF']."?accion=procesar" ?>" method="GET">
<input type="text" name="texto">
<input type="submit" name="procesar" value="Procesar">
</form>
<?
}

swith($_GET['accion']){

case 
"procesar":
// tal vez guardarias los datos de tu formulario en una BD .. etc
header ("Location: ".$_SERVER['PHP_SELF']."?accion=resultado");
break;

case 
"resultado":
   
cabecera();
   echo 
"Esto es el resultado (aquí podrías poner tu javascript de alert()";
   
// y si quieres .. muestras el formulario
   
formulario();
   
pie();
break;

default:
   
cabecer();
   
formulario();
   
pie();

}
?>
Fijate bien el proceso y como se componen las diferentes acciones que hace el script.

Uso tres funciones para definir la "cabecera" de la página HTML y su "pie" ademas de mi formulario. Los llamo -sólo- cuando son realmente necesarios (cuando voy a mostrar alguna salida al navegador) .. si te das cuenta NO llamo ni a cabecera(), pie() .cuando estamos en el caso de "proceso" del formulario. Así mismo cuando termino el proceso "PHP" (que en tu caso no haces nada pero ya lo haras ..) redirecciono a la misma página (script) pero en otro "estado" .. en ese caso al "resultado" que es donde muestro el mensajito .. o listado .. o lo que corresponda. Con ese redireccionamiento .. si recargas la página de "resultado" que se muestra (que es el mensaje+ tu formulario ..) se han "perdido" las variables ya .. y si recargas la página sólo recargaras ese "resultado".

Esto sería el procedimiento básico de trabajo con un scritp que hace várias cosas: procesos y entradas/salidas desde/hacia el cliente.

PD: usa método POST en tus formualarios a ser posible.

Un saludo,
  #6 (permalink)  
Antiguo 01/10/2004, 15:02
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
Ayudenme..!!!!!

se que hace mucho fue contestado este mensaje, pero a lo mejor uds me pueden ayudar..!
-------------------------------

Código PHP:
<form action="enviar.php" name="formulario" id="enviar"

<input name="enviar" type='submit' id="enviar" value="Enviar">
<
input name="borrar" type='reset' id="borrar" value="Borrar">
<
input name="previa" type='reset' id="borrar" value="Previa">

</
form
que es lo que quiero hacer..??? bueno, quiero que el usuario tenga la opcion de mandar el formulario a cualquiera de 2 paginas, no a las dos al mismo tiempo, sino, tener la opcion de mandarla a enviar.php o previa.php.
intente con esto, pero no me salio

Código PHP:
<form action="<?php 
        
if $enviar {
echo 
"enviar.php";
}
else{
echo 
"previa.php"
}              
?>" name="formulario" id="enviar"

<input name="enviar" type='submit' id="enviar" value="Enviar">
<input name="borrar" type='reset' id="borrar" value="Borrar">
<input name="previa" type='reset' id="borrar" value="Previa">

</form>
A VER SI ALGUIEN PUEDE AYUDARME..!
  #7 (permalink)  
Antiguo 01/10/2004, 16:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Lo que pretendes hacer se suele solventar con javascript .. donde ante un evento (onClick) de tu botón .. se cambia dinámicamente el action del formulario ..

Ejemplo (aunque esto te lo deberían explicar mejor en el foro de javascript):

Código PHP:
<form name="formulario" action="" method="post">

<
input name="accion1" type='button' id="enviar" value="Enviar1" onClick="document.formulario.action='accion1.php';document.formulario.submit()">
<
input name="accion1" type='button' id="enviar" value="Enviar2" onClick="document.formulario.action='accion2.php';document.formulario.submit()"
Si no funciona .. pregunta en el foro de Javascript .. la técnica es esa: cambiar el action dinámicamente para que apunte a un sitio u otro y hacer el submit del formulario ..

Un saludo,
  #8 (permalink)  
Antiguo 01/10/2004, 16:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
chechun no repitas las preguntas ..

http://www.forosdelweb.com/f18/form-action-segun-usuario-235804/

Un saludo,
  #9 (permalink)  
Antiguo 04/10/2004, 08:30
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
gracias, perdon, por repetir la pregunta.! funciono, bien
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 16:04.