Ver Mensaje Individual
  #27 (permalink)  
Antiguo 05/08/2011, 21:54
iovan
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Evitar envio de formulario con checkbox marcado con otro campo input vacio

Amigo, es que hay mucha redundancia en el código.

La solucion es tan sencilla, algunos ya se han acostumbrado a usar un monton de condicionales a mi en lo personal no me gusta.

Por ejemplo, En este caso el resultado lo podrias obtener en 200 lineas o mas utilizando un manojo de condicionales o en menos de 60 lineas, eso depende de tí.

A mi me gustaría ayudarte, lo único que yo quiero saber es a que le quieres dar control. Es todo.

Porque el código que te puse controla todo, y con una modificacion en 1 linea controlarias hasta el comportamiento de todos los checkbox.

Bueno, un saludo.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Edito.

Que tal ésto:

formulario html
Código HTML:
Ver original
  1. <form action="" method="post">
  2.     <p>check1: <input type="checkbox" name="check1" value="" /> importe-rotura:  
  3.         <input type="text" name="importe-rotura" value="Incompleto"/></p>
  4.  
  5.     <p>check2: <input type="checkbox" name="check2" value="" />  importe-daños
  6.         <input type="text" name="importe-daños" value="Incompleto"/></p>
  7.  
  8.     <p>check3: <input type="checkbox" name="check3" value="" />  importe-derrumbe
  9.         <input type="text" name="importe-derrumbe" value="Incompleto"/></p>
  10.  
  11.     <p>check4: <input type="checkbox" name="check4" value="" /> importe-todo-riesgo
  12.         <input type="text" name="importe-todo-riesgo" value="Incompleto"/></p>
  13.  
  14.     <input type="submit" name="submit">
  15. </form>

El funcionamiento es, si bien entiendo es lo que buscas:

4 checkbox cada uno corresponde a una textfield. Es decir si se marca un checkbox se debe colocar un valor correcto en la textfield correspondiente, y si se coloca un valor correcto en la textfield se debe marcar el checkbox correspondiente.

Nota: el numero de checkbox y texfield pueden aumentar o disminuir tanto se necesite.
script PHP
Código PHP:
Ver original
  1. <?php
  2. $cheakboxes = array("check1", "check2", "check3", "check4");
  3. $textfields = array("importe-rotura", "importe-daños", "importe-derrumbe", "importe-todo-riesgo");
  4.  
  5. $error = $cont_cheakbox = $cont_textfields = 0;
  6.  
  7. function enviarForm() {
  8.     echo "Mando el formulario";
  9. }
  10.  
  11. foreach ($cheakboxes as $key => $valor) {
  12.     if (isset($_POST[$valor]))
  13.         $cont_cheakbox++;
  14. }
  15. foreach ($textfields as $key => $valor) {
  16.     if (!empty($_POST[$valor]) && $_POST[$valor] != "Incompleto")
  17.         $cont_textfields++;
  18. }
  19.  
  20. if (isset($_POST['submit'])) {
  21. //Todos los cheakbox estan marcados por lo tanto todos los textfield tambien deben estarlo, (validar)
  22.     if ($cont_cheakbox == count($cheakboxes)) {
  23.         //Valido que todas las textfield esten correctas, en caso de que haya una que no lo este muestro cual
  24.         if ($cont_textfields == count($textfields)) {
  25.             enviarForm();
  26.         } else if ($cont_textfields > 0) {
  27.             foreach ($textfields as $key => $value) {
  28.                 if(isset($_POST[$cheakboxes[$key]]) && (empty($_POST[$textfields[$key]]) || $_POST[$textfields[$key]] == "Incompleto"))
  29.                     echo "<p>Has seleccionado el checkbox " . $cheakboxes[$key] . " por lo tanto tienes que escribir algo en " . $textfields[$key] . "</p>";
  30.             }
  31.         } else {
  32.             echo "<p>Debes corregir todos los textfields</p>";
  33.         }
  34.     } else if ($cont_cheakbox == 0) {
  35.         //Si ningun checkbox se ha seleccionado,
  36.         if($cont_textfields == 0){
  37.             echo "<p>Debe llenar el formulario</p>";
  38.         }
  39.         else if ($cont_textfields > 0) {
  40.             //1.- Valido si se hay una textfield correcta cuyo checkbox no haya sido marcado
  41.             foreach ($textfields as $key => $value) {
  42.                 if( !isset($_POST[$cheakboxes[$key]]) && (!empty($_POST[$textfields[$key]]) && $_POST[$textfields[$key]] != "Incompleto"))
  43.                     echo "<p>Has escrito algo en " . $textfields[$key] . " por lo tanto debes marcar el checkbox " . $cheakboxes[$key]."</p>";
  44.             }
  45.         }
  46.     } else {
  47.         //Ahora si se selecciona por lo menos 1 checkbox
  48.         //Valido cual checkbox se ha seleccionado y verifico que su textfield tambien este correcto
  49.         foreach ($cheakboxes as $key => $value){
  50.             if(isset($_POST[$cheakboxes[$key]]) && (empty($_POST[$textfields[$key]]) || $_POST[$textfields[$key]] == "Incompleto")){
  51.                 echo "<p>Has seleccionado el checkbox " . $cheakboxes[$key] . " por lo tanto tienes que escribir algo en " . $textfields[$key] . "</p>";
  52.                 $error++;
  53.             }
  54.             //Verifico ahora si lo que no esta correcto es que se haya puesto correcto el textfield pero no se haya seleccionado el checkbox
  55.             else if( !isset($_POST[$cheakboxes[$key]]) && (!empty($_POST[$textfields[$key]]) && $_POST[$textfields[$key]] != "Incompleto")){
  56.                 echo "Has escrito algo en " . $textfields[$key] . " por lo tanto debes marcar el checkbox " . $cheakboxes[$key];
  57.                 $error++;
  58.             }
  59.         }
  60.        
  61.         if($error==0){
  62.             enviarForm();
  63.         }
  64.     }
  65. }
  66. ?>

Las primeras 2 lineas tenemos

Código PHP:
Ver original
  1. $cheakboxes = array("check1", "check2", "check3", "check4");
  2. $textfields = array("importe-rotura", "importe-daños", "importe-derrumbe", "importe-todo-riesgo");

Se tratan de 2 arreglos, uno para los nombres de los checkbox y el otro para guardar los nombres de las textfields

Aqui puedes aumentar o disminuir el numero de campos a validar, siempre y cuando se respete que cualquiera de los 2 arreglos es directamente proporcional al otro en tamaño.

Esta duda ya te ha tomado bastante tiempo y es muy sencilla como para que nosotros no la podamos resolver en una sentada haha. Yo me he tardado al rededor de 15 minutos espero esta vez si te haya ayudado por que si no, entonces me despido del tema ya hice todo lo que pude.

Te prometí menos de 60 lineas (por decir un número) pero te he dado 66. Supongo que no hay problema.

P.D: Si le quitamos las 7 de comentarios serian 59 lineas de codigo, curiosamente he cumplido con lo dicho

haha Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.

Última edición por iovan; 06/08/2011 a las 01:03