Nueva pregunta

Pregunta:

Fecha: 06-05-2017 13:59:49 (En Español)

Helper para llenar campos de formulario con datos ingresados[No resuelta]

Hola a todos

En esta oportunidad estoy buscando colaboración para realizar un helper para rellenar los campos de un formulario con los datos que ha ingresado el usuario.

Por ejemplo el usuario ingresa algunos datos en el formulario y lo envía, se hace las validaciones correspondientes y en caso que falte algún dato vuelva al formulario para completarlo pero que los datos que ha introducido no se pierdan que se carguen en el formulario e informe al usuario que campos faltan completar que son obligatorios.

He encontrado unas funciones que permiten obtener los datos ingresados y volcarlos al formulario, sirve para algunos elementos del formulario del tipo input, textarea, select (simple, única selección).

Faltaría crear funciones para los elementos del tipo checkbox, radio, select multiple

Dejaré los códigos:
El formulario con las validaciones con php al ser enviado. Esta maqueteado con Bootstrap para darle un aspecto visual más amigable.

index.php

<?php
require_once("helper.php");
$mensaje = '';
if (isset($_POST["grabar"])) {
    if (filter_var(trim($_POST["nom"])) == false) {
        $mensaje .= 'El campo nombre es obligatorio<br />';
    }

    if (filter_var(trim($_POST["mensaje"])) == false) {
        $mensaje .= 'El campo mensaje es obligatorio<br />';
    }

    if (filter_var(trim($_POST["correo"])) == false) {
        $mensaje .= 'El campo E-Mail está vacío<br />';
    }
    if (filter_var(trim($_POST["correo"]), FILTER_VALIDATE_EMAIL) == false) {
        $mensaje .= 'El E-Mail ingresado no tiene un formato válido<br />';
    }

    //validar select

    if (filter_var($_POST["pais"], FILTER_CALLBACK, array("options" => "validaSelect")) == false) {
        $mensaje .= 'Debe seleccionar una opción en el campo país<br />';
    }
    if ($mensaje == '') {
        //acá proceso los campos porque ya han sido validados
        die("se pasaron todas las validaciones");
    }

}

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>..:: Validación de formularios con PHP ::..</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
    <div class="row">

        <form name="form" action="" method="post">


            <h1>Validación de formularios con PHP</h1>
            <?php
            if ($mensaje != '') {
                ?>
                <div class="alert alert-danger">
                    <button type="button" class="close" data-dismiss="alert">x</button>
                    <?php echo $mensaje ?></div>
                <?php
            }
            ?>
            <p>
                <label for="nom">Nombre:</label>
                <input type="text" name="nom" class="form-control" autofocus="true"
                       value="<?php echo set_value_input(array(), 'nom', 'nom') ?>"/>
            </p>

            <p>
                <label for="nom">E-Mail:</label>
                <input type="text" name="correo" class="form-control"
                       value="<?php echo set_value_input(array(), 'correo', 'correo') ?>"/>
            </p>

            <p>
                <label for="nom">Teléfono:</label>
                <input type="text" name="tel" class="form-control"
                       value="<?php echo set_value_input(array(), 'tel', 'tel') ?>"/>
            </p>

            <p>
                <label for="nom">Mensaje:</label>
                <textarea rows="4" name="mensaje"
                          class="form-control"><?php echo set_value_input(array(), 'mensaje', 'mensaje') ?></textarea>
            </p>

            <p>
                <label for="nom">País:</label>
                <select name="pais" class="form-control">
                    <option value="0" <?php echo set_value_select(array(), 'pais', 'pais', '0') ?>>Seleccione.....
                    </option>
                    <option value="1" <?php echo set_value_select(array(), 'pais', 'pais', '1') ?>>Argentina</option>
                    <option value="2" <?php echo set_value_select(array(), 'pais', 'pais', '2') ?>>Chile</option>
                    <option value="3" <?php echo set_value_select(array(), 'pais', 'pais', '3') ?>>Paraguay</option>
                    <option value="4" <?php echo set_value_select(array(), 'pais', 'pais', '4') ?>>Uruguay</option>
                    <option value="5" <?php echo set_value_select(array(), 'pais', 'pais', '5') ?>>Perú</option>
                </select>
            </p>


            <p>
                <label for="nom">Multiple Select:</label>
                <select name="multipleSelect" multiple class="form-control">
                    <option value="Opcion1">Opcion1</option>
                    <option value="Opcion2">Opcion2</option>
                    <option value="Opcion3">Opcion3</option>
                    <option value="Opcion4">Opcion4</option>
                </select>
            </p>

            <p>
                <label for="nom">Genero:</label>
                <label class="radio-inline"><input type="radio" name="genero">Hombre</label>
                <label class="radio-inline"><input type="radio" name="genero">Mujer</label>
            </p>

            <p>
                <label for="nom">Intereses:</label>
                <label class="checkbox-inline"><input type="checkbox" value="Interes 1">Interes 1</label>
                <label class="checkbox-inline"><input type="checkbox" value="Interes 2">Interes 2</label>
                <label class="checkbox-inline"><input type="checkbox" value="Interes 3">Interes 3</label>
            </p>
            <hr/>
            <input type="hidden" name="grabar" value="si"/>

            <input type="submit" class="btn btn-primary" value="Enviar">
        </form>

    </div>
</div>

</body>
</html>


helper.php Contiene las funciones para obtener los datos del formulario y seteralo en el formulario cuando faltan datos por ingresar.
<?php
function set_value_input($result = array(), $post, $campo)
{
    if (sizeof($result) == 0) {
        if (isset($_POST[$post])) {
            return $_POST[$post];
        } else {
            return '';
        }
    } else {
        if ($campo) {
            return $campo;
        } else {
            return '';
        }
    }
}

function set_value_select($result = array(), $post, $campo, $valor)
{
    if (sizeof($result) == 0) {
        if (isset($_POST[$post]) and $_POST[$post] == $valor) {
            return 'selected="true"';
        } else {
            return '';
        }
    } else {
        if ($campo == $valor) {
            return 'selected="true"';
        } else {
            return '';
        }
    }
}

function validaSelect($valor)
{
    if ($valor == 0) {
        return false;
    } else {
        return true;
    }
}




En el formulario creo que he puesto a todos los elementos de un formulario web que se utiliza.
Si alguien cree que falta alguno más lo agregamos.
Faltaría el helper para Multiple Select, radio, checkbox.

Por ahí faltaría el elemento para subir archivo.

Espero que puedan colaborar en este caso.

Creo que este tipo de helper es muy beneficio para muchos.

Muchas gracias

Que tengan un buen día.


Etiquetas: Formulario - PHP - Pregunta - Validaciones Votos: 4 - Respuestas: 12 - Vistas: 48 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 07-05-2017 10:33:09 Hola Walter,
    Ps en los Checkbox y select hay una propiedad que se obtiene que es el seleccionado que es check o algo así, con esta simplemente lo guardas en una session y le das un valor anidado y lo compruebas.

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 07-05-2017 10:35:03 Hola Walter, interesante tu pregunta, toca varios puntos que hacen al manejo de los datos y validaciones, aquí mi aporte / feedback.

    * Normalización de nombre: observa que para las funciones set_value_input y set_value_select utilizas una notación de guión bajo (underscores) y para la función validaSelect una notación camello (o camel case). No es más correcta una que otra, solo que este punto debe ser unificado, ya que no se considera buena práctica utilizar combinaciones, en lo personal me inclino por notación camello.

    * Utilizar clases: debo decirte que no estoy muy de acuerdo con utilizar funciones "sueltas", mejor sería agruparlas en una clase (por ejemplo HelperForm) y hacer que dichas funciones sean métodos estáticos (para no tener que andar instanciando un objeto, ya que para este caso no sería necesario).

    * Utilidad de los parámetros $campo y $result: tendrías que explicar la utilidad del parámetro $result, ya que si es solo para el condicional se podría obviar el array y la función sizeof, y usar en su lugar un boolean (true/false). Con respecto al parámetro $campo, no comprendo su utilidad en la función set_value_input.

    * Parámetros opcionales: los parámetros que pueden o no ser pasados a una función siempre deben estar al final de la lista de parámetros obligatorios, ya que si los pones antes de un parámetro obligatorio siempre estarás obligado a pasar el/los parámetros opcionales. Esto aplica para el parámetro $result = array() de la función set_value_input y set_value_select.

    * Inclusión del método GET: como estan planteadas las funciones, este helper solo sería valido para operar con el método POST, pero en muchos otros casos se utilizan formularios con método GET (como por ejemplo un formulario de búsqueda, como ser Google usa el método GET y un control input en su buscador). Aquí se podría utilizar el array superglobal $_SERVER, más precisamente el índice "REQUEST_METHOD", para verificar el método utilizado y operar con los arrays correctos.

    * Optimizar estructuras IF anidadas: nunca ha sido bien visto el anidamiento de estructuras IF, es valido y posible pero siempre será mejor (por legibilidad, orden, tamaño del código, mantenimiento, otras razones...) eliminar los anidamientos (de ser posible).

    * Cambio de lógica: otra opción para evitar tener que implementar un helper de este tipo podría ser validar con JavaScript del lado del cliente, realizar una falla temprana y evitar el POST o GET al servidor (ya que sin los datos correctos y/o incompletos es innecesario). Con esto no digo que nos podemos olvidar de validar del lado del servidor con PHP, eso siempre debe suceder porque las validaciones por JavaScript pueden ser facilmente saltadas/vulneradas, a lo que apunto con este cambio de lógica es a resolver de otra forma el resguardo de los datos ingresados por el usuario ante una validación de ingreso no válida.

    Saludos y buen código!
      Votos: 4 - Link respuesta
     
  • Fecha: 09-05-2017 17:08:20 Hola Walter,
    Por que no abres un proyecto en Gitlab/Github y as'i podemos colaborarte todos?

    Hay muchas cosas que pueden mejorarse (Como bien hizo notar Fernando).
      Votos: 3 - Link respuesta
     
  • Fecha: 10-05-2017 03:34:18 Hola, lo más fácil en ese caso es usar js.

    Puedes utilizar form.validator, entonces con esa librería podes filtrar el input según desees y no te deja avanzar a menos que esté todo correcto.

    La web es esta: http://www.formvalidator.net/

    Cualquier duda que tengas con la implementación, nos avisas.

    Un saludo
      Votos: 4 - Link respuesta
     
  • Fecha: 10-05-2017 16:59:30 Muchas gracias a todos por haber respondido.

    Las funciones no las he desarrollado, las he encontrado en la red, me ha parecido interesante para mejorar y muy practico, util para implementar.

    El helper que ando proponiendo no es de validacion de datos sino el de autollenar el formulario con los datos previamente ingresado por el usuario.

    En principio sería para el método POST más adelante se podría hacer otro para el método GET. O bien adoptar la sugerencia de Fernando validando el método utilizado sea POST o GET y hacer las operaciones correspondientes.

    Fernando ha indicado varios puntos muy valiosos a tener en cuenta para el desarrollo de buenas prácticas. Siguiendo los ítems mencionados nos podríamos basar para comenzar a programarlo.

    Tomando la sugerencia de Ernesto lso archivos los he dispuesto en Github aunque seria bueno publicar los códigos con sus avances aquí para que este disponible para todos y seguir un orden.

    Tomando una de las sugerencias de Fernando se deberia utilizar POO, creando una clase con métodos estáticos.

    Muchas gracias a todos por el interés en contribuir en esta propuesta.

    Que tengan un buen día.

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 11-05-2017 14:26:20 Hola Walter:

    ¿Probaste utilizar algún framework para esto? Symfony por ejemplo lo tiene bien resuelto.

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 11-05-2017 16:15:31 Hola Mauro
    La idea del helper es para ser utilizado en proyectos que no se utilice framework.
    Utilizando código propio
    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 16-07-2018 12:53:23 Walter
    Buenas noches
    Adhiero a lo que dice Gonzalo y agrego, que parte lo podes resolver con PDO y Ajax

    ]Opcion Nº 1 : php-helpers - GitHub

    Opcion Nº 2 : user-helper.php - GitHub

    Opcion Nº 3: Vario Helpers PHP en GitHub

    Opcion Nº 4: Select jQuery plugins - Otros mas

    Opcion 5: Video

    Un saludo
      Votos: 0 - Link respuesta
     
  • Fecha: 22-07-2019 10:41:27 Walter, hola, pienso que deberías enviar los datos del formulario y en el server validarlos, y de vuelta recoger la respuesta de la validación de los campos, ... pero ... no usando el submit, sino enviar con ajax de JQ en el front y recibir el resultado de la validación sin que se limpien los campos en el formulario, así conservas lo ingresado por el usuario en cada campo.
    Según la respuesta recibida por ajax, limpias los campos o das el mensaje de error de validación y destacas los campos con error de validación cambiándole la clase a una con algo destacado.
    De esta forma manejas el momento de limpieza de los campos.
    Para esto debes desactivar el default del clic en el botón submit, y crear la función que la reemplaza, que sería el envío por ajax, el que te permite recibir la respuesta de validación y modificar o no el contenido de los campos del formulario.
    Espero te ayude la idea.
    Suponiendo que el botón submit tiene id='enviar', desactivas el default del submit para que no envíe y limpie los campos
    $("#enviar").on("click",(e)=>{ e.preventDefault() })

    y envías con onClick='FuncionJSqueEnvíaPorAjax()' del botón submit.
    También puedes dejar fuera del Form el botón para enviar y con eso no funciona como submit, también puedes no colocar botón type='submit', sino type='button', y siempre usas ajax para actuar en consecuencia según el resultado recibido de la validación.
      Votos: 0 - Link respuesta
     
  • Fecha: 24-07-2019 14:28:20 Walter, tienes la logica de la validación del lado del server cuando deberias de tenerla del lado del cliene antes de hacer el post.

    Te recomiendo uses javascript, jquery y jquery validator más la librería jqueryform, que te permite validar cada campo que desees al submit si estan ok todos los campos realiza el post de lo contrario se activan labels de error justo al campo indicando lo que desees pues tambien estas etiquetas son personalizables.
      Votos: 0 - Link respuesta
     
  • Fecha: 24-07-2019 17:19:11 Walter, la validación la debes hacer en el servidor, aunque puedes hacer una validación "previa" en el lado del cliente como para enviar mensajes explicativos o dirigir las entradas del usuario, pero en ningún caso, jamás, debes saltarte la validación en el server.
    Es una buena práctica no confiar en el lado del cliente, ya que existe la posibilidad de alterar los elementos y sus valores con el simple uso del inspector de código de los navegadores y luego darle clic a ENVIAR.
    Siempre se debe realizar una validación en el lado cliente, apoyado por los distintos tipos de elementos input para hacerlo automático y antes de enviar, verificar los datos, pero definitivamente la "validación fuerte" de los valores que están llegando, debe hacerse en el lado del servidor.
    Como un ejemplo simple, en el lado del usuario puedes validar la estructura de un "email" que estás solicitando y para ello usas el input type="email", luego validas el campo email con jscript y expresiones regulares antes de enviar los datos, pero en el lado del servidor, tienes que asegurarte de usar la validación del email con la función (en PHP):
    filter_var($email_a, FILTER_VALIDATE_EMAIL)

    Y así te aseguras que es un correo válido.
    filter_var tiene varias opciones de validación y también puedes usar las exp. regulares, etc, en el servidor.
    Otro caso simple es cuando tú muestras desactivado o deshabilitado un dato porque está vencido, caducado o eliminado, pero puedes fácilmente ver inspector de código y en un momento darle las propiedades y valores que tendría si estuviera activo, mirando los elementos que están activos en el mismo código.
    Entonces, una vez manipulado el código, le das clic al que antes estaba deshabilitado y te mostrará lo que no debería mostrar. También puedes manipular el código de los js cargados y saltarte las validaciones.
    Luego, quien te va a salvar es la validación fuerte de los datos en el servidor. Y en este caso volver a preguntar en el servidor si este dato está activo es lo primero antes de mostrar los datos que debería mostrar.
    Ojo con la validación de datos sensibles en el front !!!
    Muchas veces puedes revelar demasiado del tratamiento que das a los datos cuando haces casi lo mismo en el lado del cliente, pues esa validación estará a la vista de los que deseen verla o estén buscándola.
      Votos: 0 - Link respuesta
     
  •  
      0  
     
    Fecha: 08-01-2020 06:18:05 Intenta esto:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>DEVOLVER DATOS</title>
    </head>
    <body>
    <form method="GET">
    <input type="text" name="dt1" id="dt1"><br>
    <input type="text" name="dt2" id="dt2"><br>
    <input type="text" name="dt3" id="dt3"><hr>
    <input type="submit" name="enviar" value="SEND">
    </form>
    <?php
    if(isset($_GET['enviar'])){
    $dt1 = @$_REQUEST['dt1'];
    $dt2 = @$_REQUEST['dt2'];
    $dt3 = @$_REQUEST['dt3'];
    if(!$dt1 || !$dt2 || !$dt3){
    echo "<script>
    alert('DATOS INCOMPLETOS');
    document.getElementById('dt1').value='".$dt1."';
    document.getElementById('dt2').value='".$dt2."';
    document.getElementById('dt3').value='".$dt3."';
    </script>";}
    else
    {echo "<script> alert('DATOS PURA VIDA') </script>;"; }
    }
    ?>
    </body>
    </html>
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com