Autor Tema: (SOLUCIONADO) Capturar input type button en php  (Leído 19360 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado remizero

  • Usuario Junior
  • **
  • Mensajes: 70
  • Puntuación: 6
  • Sexo: Masculino
    • Ver Perfil
    • Un mundo abierto... Un mundo libre
(SOLUCIONADO) Capturar input type button en php
« : 10 de septiembre de 2011, 02:21:13 am »
Buenas amigos, he estado revisando ya varias horas por la web y no he dado con la solución a mi problema, espero me puedan ayudar con este problema que se me ha presentado.

Tengo un formulario tal como este:

Código: [Seleccionar]
<form id="form" name="form" method="post" action="<?php procesar (); ?>" enctype="multipart/form-data" >
      <input type="text" name="txt_rif" id="txt_rif" />
      <input type="button" name="btn_insertar" id="btn_insertar" value="Insertar" onclick="validar ( this.form )" />
</form>

Mi código js es el siguiente:

Código: [Seleccionar]
function validar ( form ) {

      if ( form.txt_rif.value == "" ) {
            error_form ( form.txt_rif, "el RIF" );//función que ejecuta un alert con el error
            return false;
      } else
            form.submit ();
}

Y mi controlador php es este:

Código: [Seleccionar]
function procesar () {
      $obj_proveedor_ctrl = new proveedor_ctrl ();
      if ( isset ( $_REQUEST [ 'btn_insertar' ] ) ) {
            if ( $obj_proveedor_ctrl->insertar ( $_POST [ 'txt_rif' ] ) ) {
                  header ( "Location:proveedor.php" );
                  exit();
            } else {
                  exit();
            }
      }
}

Explico un momento; obviamente y como ya sabrán el formulario primeramente llama a la función validar del archivo js, hace lo que tiene que hacer y si todo sale bien, manda a ejecutar el submit del formulario, el cual es una función en php que procesa lo que se requiere en este caso, insertar. Hasta aquí todo bien, pero cuando chequea cual botón ha sido presionado, no logra capturar el botón btn_insertar ( este es el problema ).

El por qué de utilizar una función y no la pagina.php en el action del formulario viene dado por conflictos con las direcciones de los archivos, pues otras páginas también hacen uso de ese controlador php.

Lo curioso es que si le quito la validación ( onclick="validar ( this.form )" ), me funciona perfectamente, claro también tengo que colocar el botón de tipo submit y no button como lo tengo en estos momentos.

¿Por qué lo tengo button y no submit?, para evitar que se ejecute la función procesar sin haber validado el formulario primero, pues si hago la validación estando el botón en submit, si bien me ejecuta la función ( onclick="validar ( this.form )" ), también me ejecuta la función procesar y eso no es lo que quiero ( esto en el caso de que falle la validación ).

Mi pregunta es la siguiente:

¿Existe alguna otra forma de capturar ese botón "btn_insertar" siendo este de tipo button?
o
¿Existe alguna forma de evitar el submit del formulario, si la validación javascript falla?

De antemano muchas gracias por las respuestas y la ayuda prestada.
« Última Modificación: 24 de septiembre de 2011, 06:29:07 pm por remizero »
Si quieres ver realmente cambios, comienza por cambiar tu primero.

Desconectado el_santo

  • Usuario Dedicado
  • ***
  • Mensajes: 225
  • Puntuación: 9
  • Sexo: Masculino
    • Ver Perfil
Re:Capturar input type button en php
« Respuesta #1 : 10 de septiembre de 2011, 08:12:50 am »
Código: [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin t&iacute;tulo</title>
<script>function mi_funcion(f){ if(confirm('mi funcion validando')){ document.getElementById(f).submit();} else{ return false; } }</script>
</head>

<body>
<form id="form1" name="form1" method="post" action="" onsubmit=" javascript:mi_funcion(this.id); return false;">
  <label>
  <input type="text" name="textfield" />
  </label>
  <label>
  <input type="submit" name="Submit" value="Enviar" />
  </label>
  <input name="s" type="hidden" id="s" value="s" />
</form>
</body>
</html>
<?php if( $_POST[&#39;s&#39;] == &#39;s&#39;){ echo "posteo"; }?>

En el ejemplo veras ke uso un boton tipo submit me mas ke un boton es un "input" ya ke "su valor es enviado al formulario" al igual ke los otros inputs select etc etc....

al darle submit al for vera ke aparecera una ventana si le das aceptar le hace submit al form, si cancelas no hara el submit. (la ventanita simula la validacion cabe destacar)
« Última Modificación: 10 de septiembre de 2011, 08:14:36 am por el_santo »
Yo hablo php........!!!

Desconectado siryox

  • Novato
  • *
  • Mensajes: 31
  • Puntuación: 1
    • Ver Perfil
Re:Capturar input type button en php
« Respuesta #2 : 12 de septiembre de 2011, 09:21:37 am »
1) podrias pasar un parametro que te permita determinar el objeto que lo desencadena
2) podrias validarlo con js antes de llamar la funcion. no te enrrolles

Desconectado remizero

  • Usuario Junior
  • **
  • Mensajes: 70
  • Puntuación: 6
  • Sexo: Masculino
    • Ver Perfil
    • Un mundo abierto... Un mundo libre
Re:Capturar input type button en php
« Respuesta #3 : 12 de septiembre de 2011, 12:05:30 pm »
Gracias por las respuestas, aunque no me han ayudado en mucho :(.

el_santo : de la forma que propones me sigue dando el mismo problema, el detalle es que aun si mi función de validacion me retorna false de igual forma se ejecuta el codigo php que no debe suceder obviamente.

siryox : comienzo por el final.
             2.- Si lees bien el post original eso es lo que hago.
             1.- Esta la tendré como ultima instancia, pues no es necesario hacerlo :S
Si quieres ver realmente cambios, comienza por cambiar tu primero.

Desconectado dels

  • Usuario Dedicado
  • ***
  • Mensajes: 123
  • Puntuación: 2
  • Sexo: Masculino
  • Desarrollador de software
    • Ver Perfil
    • Dels
Re:Capturar input type button en php
« Respuesta #4 : 12 de septiembre de 2011, 02:40:11 pm »
Hola remizero,

Viendo tu código, en el inicio de este post, veo que tienes algunos fallos es en la lógica:

-En php, la función "procesar ()", siempre lo va a llamar (el que está dentro del atributo "action=" ), por lo tanto, siempre lo ejecuta.

-La función
Código: [Seleccionar]
function procesar() {... lo veo un poco raro, no te aconsejaría usarlo de esa manera... Luego te explico por que.

Creo que siryox dice: deberías validar primero en js y luego si quieres en php, estas disparando la función procesar() siempre cuando entres a esa página, le des o no le des al botón siempre se ejecuta.

En conclusión: puedes rehacer y reorganizar de nuevo tu código, basándote en lo que hizo el_santo.

Yo tengo una, es un poco complejo pero te puede servir para todas las validaciones de formulario en JS.
Si deseas te lo adjunto.

Saludos.
Desarrollador de Software

Móvil: 00584123967062
E-Mail: kevin@dels.co.ve
Gnu/Linux User: #529556
Ubuntu User number: #33551
User identica.ca: k3v1nd315
Wikipedia ID: 1821960
Wikimedia-ve ID: KDels
flickr: http://www.flickr.com/photos/k3v1nd315/
Twitter: http://twitter.com/#!/k3v1ndels
IRC freenode

Desconectado siryox

  • Novato
  • *
  • Mensajes: 31
  • Puntuación: 1
    • Ver Perfil
Re:Capturar input type button en php
« Respuesta #5 : 12 de septiembre de 2011, 03:48:19 pm »
para agregar algo mas a mi comentario y reforzar lo antes expuesto, no utilices un submit ya que va a enviar al formulario, ya que para eso es ese control, utiliza un button de esa forma el formulario no se envia al hacer click.
debes estar conciente que si estas situado en un control de entrada y precionas enter el formulario se envia (comportamiento por defecto del formulario), algo que deberas controlar si deseas siguir llamando la funcion desde el action del formulario.
   

Desconectado remizero

  • Usuario Junior
  • **
  • Mensajes: 70
  • Puntuación: 6
  • Sexo: Masculino
    • Ver Perfil
    • Un mundo abierto... Un mundo libre
Re:Capturar input type button en php
« Respuesta #6 : 24 de septiembre de 2011, 06:28:37 pm »
Hola amigos, he solucionado el problema.

El detalle estaba en la forma como capturaba los datos en la función

forma original
Código: [Seleccionar]
function validar ( form ) {

      if ( form.txt_rif.value == "" ) {
            error_form ( form.txt_rif, "el RIF" );//función que ejecuta un alert con el error
            return false;
      } else
            form.submit ();
}

nueva forma
Código: [Seleccionar]
function validar () {

      if ( document.getElementById ( "txt_rif" ).value == "" ) {
            error_form ( document.getElementById ( "txt_rif" ).value, "el RIF" );
            return false;
      } else
            document.getElementById ( "mi_formulario" ).submit ();
}

y como recibía el valor devuelto, pues debia colocarlo de esta forma

forma original
Código: [Seleccionar]
onclick="validar ( this.form )"

nueva forma
Código: [Seleccionar]
onclick="return validar ()"

ahora si funciona a la perfección.

Muchas gracias por los comentarios que fueron de gran ayuda para determinar la forma que quería que trabajara el formulario.

Hasta una próxima
Si quieres ver realmente cambios, comienza por cambiar tu primero.

Desconectado tierrarara

  • Usuario Junior
  • **
  • Mensajes: 87
  • Puntuación: 3
    • Ver Perfil
    • Rare Earth
Re:(SOLUCIONADO) Capturar input type button en php
« Respuesta #7 : 03 de octubre de 2011, 05:50:04 pm »
por curiosidad,

si le colocas un value al boton el boton la que hagas click creo que es el que se envia en el POST o en el GET

Desconectado dels

  • Usuario Dedicado
  • ***
  • Mensajes: 123
  • Puntuación: 2
  • Sexo: Masculino
  • Desarrollador de software
    • Ver Perfil
    • Dels
Re:(SOLUCIONADO) Capturar input type button en php
« Respuesta #8 : 04 de octubre de 2011, 10:34:14 am »
por curiosidad,

si le colocas un value al boton el boton la que hagas click creo que es el que se envia en el POST o en el GET

El método de envío del formulario POST y GET lo defines en el atributo de la etiqueta "<form .../>" el atributo method="METODO"

METODO es donde le pasarás la manera POST o GET.

ejemplo:

Código: [Seleccionar]
<form id="form1" name="form1" method="POST" action="">o
Código: [Seleccionar]
<form id="form1" name="form1" method="GET" action="">
Desarrollador de Software

Móvil: 00584123967062
E-Mail: kevin@dels.co.ve
Gnu/Linux User: #529556
Ubuntu User number: #33551
User identica.ca: k3v1nd315
Wikipedia ID: 1821960
Wikimedia-ve ID: KDels
flickr: http://www.flickr.com/photos/k3v1nd315/
Twitter: http://twitter.com/#!/k3v1ndels
IRC freenode

Desconectado ashrey

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 471
  • Puntuación: 7
  • Sexo: Masculino
  • Wombat Team
    • Ver Perfil
    • Blog de ABerroteran
Re:(SOLUCIONADO) Capturar input type button en php
« Respuesta #9 : 04 de octubre de 2011, 11:37:31 pm »
Viendo un poco las respuesta, la solución esta bien chapucera, funciona pero devolver false en una función que maneja eventos está errado, por la siguiente cuestion, un return false frena la propagación de eventos, cosa que puede dar problemas luego, te explico. Debes usar button  tipo submit porque es para enviar un formulario, segundo, si no valida debes hacer un preventDefault que es lo que evita que el formulario se envie (con el return false la puedes liar parda si luego intentas agregar otros eventos).
Código: [Seleccionar]
function validar (e) {

      if ( document.getElementById ( "txt_rif" ).value == "" ) {
            error_form ( document.getElementById ( "txt_rif" ).value, "el RIF" );
           e.preventDefault();
      }
}


document.getElementById('envia').addEventListener('submit',validar,false );


Y el formulario


<form method="post" action="metodophp" >
  <label>
  <input type="text" name="textfield" />
  </label>
  <label>
  <button type="submit" id="envia">Enviar</button>
  </label>
  <input name="s" type="hidden" id="s" value="s" />
</form>

Desconectado remizero

  • Usuario Junior
  • **
  • Mensajes: 70
  • Puntuación: 6
  • Sexo: Masculino
    • Ver Perfil
    • Un mundo abierto... Un mundo libre
Re:(SOLUCIONADO) Capturar input type button en php
« Respuesta #10 : 10 de octubre de 2011, 03:47:55 pm »
Buenas amigos, por lo visto el tema ha generado polémica.

No quiero crear un flame dentro de mi propio post, pero debo aclarar ciertos detalles.

Pues bien, dels, tienes razón en lo que comentas.

por curiosidad,

si le colocas un value al boton el boton la que hagas click creo que es el que se envia en el POST o en el GET


Como puedes ver en el código que he colocado en el primer comentario, tiene el value='Insertar', pero eso no hace que se envíe por POST o GET, eso se define en la etiqueta <form...> del formulario tal como comenta dels.

Por otro lado, ashrey, no le veo nada de chapucero a devolver false en la función dado que en efecto ese es el comportamiento que debe tener esa función, si no se valida el componente, debe dar por teminado ese fragmento de código y retornar el control a la página web.

Esas cosas se le dejan a jquery, mootools y esas otras librerias que por razones obvias y que no vienen al caso deben hacer porque ellas si no deben bloquear eventos, adicional a eso, no existen eventos por defecto para ese formulario, por lo que la propagación de eventos no se ve afectada, que ademas eso le queda mejor a las páginas pornos que bien saben hacer eso jejeje, por otro lado así se tiene un mejor control de las acciones dentro un sistema.
Si quieres ver realmente cambios, comienza por cambiar tu primero.

Desconectado ashrey

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 471
  • Puntuación: 7
  • Sexo: Masculino
  • Wombat Team
    • Ver Perfil
    • Blog de ABerroteran
Re:(SOLUCIONADO) Capturar input type button en php
« Respuesta #11 : 10 de octubre de 2011, 05:22:05 pm »

Por otro lado, ashrey, no le veo nada de chapucero a devolver false en la función dado que en efecto ese es el comportamiento que debe tener esa función, si no se valida el componente, debe dar por teminado ese fragmento de código y retornar el control a la página web.

Esas cosas se le dejan a jquery, mootools y esas otras librerias que por razones obvias y que no vienen al caso deben hacer porque ellas si no deben bloquear eventos, adicional a eso, no existen eventos por defecto para ese formulario, por lo que la propagación de eventos no se ve afectada, que ademas eso le queda mejor a las páginas pornos que bien saben hacer eso jejeje, por otro lado así se tiene un mejor control de las acciones dentro un sistema.

Es exactamente lo que digo, el comportamiento por defecto de un submit es enviar el formulario, es decir si no valida debo cancelar el comportamiento por defecto, (un preventDefault). Devilver un false significa, no se necesita seguir propagando este evento; un preventDefault significa cancela el evento asociado por defecto en el navegador.

 En este caso no hay problema porque solo hay una acción, pero ¿y si luego debes agragar otra? Lo que quiero aclarar es que es mejor hacer las cosas bien desde el principio, ya que todo software que se piense usar por algun tiempo, necesita de mantenimiento y ajustes.  Solo es una critica para que se tome para bien, que sea funcional no implica que esté bien programado  ;)