Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

viernes, 24 de junio de 2016

Trabajo con jquery.validation (jQuery)

 1280px-JQuery_logo.svg

Como desarrollador web y sistemas de gestión, validar formularios es un paso obligatorio y de cierta forma repetitivo.

En este artículo veremos cómo trabajar con jquery.validation como una potente herramienta para las validaciones de formularios.

Para comenzar a utilizar jquery.validation, simplemente debemos agregar una referencia a las librerías jQuery y jquery.validation en nuestra página.

[sourcecode language='php'  padlinenumbers='true']
<script src="jquery-x-x/jquery-x.x.x.js" type="text/javascript"></script> 
<script src=" jquery-x-x /jquery.validate.js" type="text/javascript"></script>
[/sourcecode]

Conceptos básicos

Si trabajamos con jquery.validation hay que tener claros que son los métodos de validación y las reglas de validación.

Los métodos de validación implementan el código necesario para validar un elemento.

De serie contamos con un número considerable de métodos de validación para las comprobaciones más habituales, pero siempre es posible agregar a jquery.validation nuestras propias validaciones personalizadas.

Por ejemplo, un método de validación sería el código necesario para validar que la entrada es numérica o un e-mail, y las reglas de validación permiten asociar un elemento de nuestro formulario a uno o más métodos de validación.

A continuación se muestran las distintas formas de cómo se pueden asociar a un elemento las reglas de validación:

1- A través de nombres de clases css en atributo class. Por ejemplo class=”required” especifica que nuestro elemento será requerido, si se desea asociar a más de una regla se hace seguido de un espacio: class=”required number”, especifica que será requirido y solo aceptará números. Estos nombres de clases no tienen por qué existir en tu hoja de estilos, son clases que utilizará sólo jquery.validation.

2- Con atributos personalizados que requieren parámetros. Por ejemplo <input type=”text” minlength=”3”>, especifica que el contenido de nuestra caja de texto no debería ser menor a 3 caracteres

3- A través de código javascript y añadiendo las reglas a través del objeto rules.

Un primer ejemplo

[sourcecode language='php' ]
<form method="post" id="ejForm">
    <p>
        Nombre
        <input type="text" id="nombre" name="nombre" class="required" />
    </p>
    <p>
        Edad
        <input type="text" id="edad" name="edad" class="required digits" />
    </p>
    <p>
        <input type="submit" value="Enviar" />
    </p>
    </form>

    <script type="text/javascript">
        $().ready(function () {
$("#ejForm").validate();
        });
    </script>
[/sourcecode]

Estas reglas no son excluyentes y pueden combinarse según nuestras necesidades.

En este formulario:

Se han especificado las reglas de validación a través de nombres de clases.

Se ha llamado al método validate() para el elemento ejForm, que configura el formulario para que sea validado.

A partir de este momento, el formulario no podrá ser enviado si no cumple con las reglas impuestas.

Si ampliamos el ejemplo anterior para que el nombre tenga al menos 3 caracteres y la edad esté comprendida entre 18 y 99 años, tendremos que especificar estas reglas de validación a través de atributos con parámetros:

[sourcecode language='php' ]
<form method="post" id=" ejForm ">
<p>
    Nombre
    <input type="text" id="nombre" name="nombre" class="required" minlength="3" />
</p>
<p>
    Edad
    <input type="text" id="edad" name="edad" class="required digits" min="18" max="99" />
</p>
<p>
    <input type="submit" value="Enviar" />
</p>
</form>

[/sourcecode]

Otra forma de especificar las reglas es utilizar javascript para acceder al objeto rules y declararlas por código:

 

[sourcecode language='php' ]
  <form method="post" id=" ejForm ">
    <p>
        Nombre
        <input type="text" id="nombre" name="nombre" />
    </p>
    <p>
        Edad
        <input type="text" id="edad" name="edad" />
    </p>
    <p>
      <input type="submit" value="Enviar" />
   </p>
    </form>
    <script type="text/javascript">
        $().ready(function () {
            $("# ejForm ").validate({
                rules: {
                    nombre: {
                        required: true,
                        minlength: 3
                    },
                    edad: {
                        required: true,
                        digits: true,
                        min: 18,
                        max: 99
                    }
                }
            });
        });
    </script>

[/sourcecode]

Mensajes de error

Algo importante cuando validamos, es cómo y dónde se muestran los mensajes de error.

Cuando sucede un error durante la validación, por defecto jquery.validation agrega dinámicamente una etiqueta label a continuación del campo validado. Además, el mensaje de esta etiqueta es igualmente predefinido y está en inglés.

Referente al nuevo elemento label creado, es posible especificar el tipo de elemento que queremos crear para mostrar un error, en qué lugar del documento queremos que aparezca, mostrar resúmenes de errores para agrupar los mensajes, etc.

Más adelante se mostraran unas breves indicaciones de cómo personalizar estos mensaje.

Algo muy importante es la traducción del mensaje y la forma más sencilla de traducir los mensajes es bajarse la traducción de los mismos al lenguaje que necesites. Por defecto, jquery.validation está traducido a más de 41 idiomas, pero si aun así tu idioma no está disponible te resultará bastante sencillo traducirlo.

En la misma descarga del plugin hay una carpeta localization donde están todos los ficheros de idioma.

Si por ejemplo, queremos los mensajes en español bastaría con incluir la siguiente referencia a nuestra página, siempre después de la referencia a jquery.validation.

 

[sourcecode language='php' ]
<script src=" jquery-x-x /messages_es.js" type="text/javascript"></script>

[/sourcecode]

Una vez hemos traducido los mensajes predefinidos, podríamos querer mostrar mensajes personalizados o simplemente un mensaje especial para un campo concreto.

jquery.validation resuelve la búsqueda del mensaje a mostrar de la siguiente forma:

1- Primero busca si se ha especificado un mensaje para el elemento a través de javascript. Si lo encuentra, este será siempre el mensaje mostrado. Con javascript podemos especificar un único mensaje para todos los errores de validación o mostrar un mensaje por cada tipo de error de validación.

2- Segundo busca si nuestro elemento tiene definido el atributo title. Si lo encuentra, el valor del mismo será mostrado.

3- Por último, si no encuentra mensajes desde javascript ni el atributo title, buscará en los mensajes predefinidos.

Un ejemplo de personalización a través de javascript:

[sourcecode language='php' ]
$().ready(function () {
            $("#ejForm").validate({
                rules: {
                    nombre: {
                        required: true,
                        minlength: 3
                    },
                    edad: {
                        required: true,
                        digits: true,
                        min: 18,
                        max: 99
                    }
                },
                messages: {
                    nombre: {
                        required: "Nombre es obligatorio",
                        minlength: function (p, element) {
                            return "Nombre tiene que ser igual o mayor que " + p;
                        }
                    },
                    edad: "Este será el único mensaje para edad"
                }
            });
        });

[/sourcecode]

Reglas y métodos de validación personalizados

Es posible también implementar nuestras propias reglas de validación si no nos sirven las incluidas en jquery.validation.

Por ejemplo, crearemos una regla que validará si el nombre suministrado cumple con ciertas condiciones.

La regla de validación se llamara valid_nombre y al método de validación le llamaremos esNombreValido. En la práctica, el método de validación suele llamarse igual que la regla de validación, pero en este ejemplo las he llamado distintas para que veas que no es necesario asociar una regla y su método por nombre.

1. Definir método de validación personalizado

[sourcecode language='php' ]
function esNombreValido (value, element, param) {
    //value es el valor actual del elemento que se está validando
    //element es el elemento DOM que se está validando
    //param son los parámetros especificados por el método
    //  p. ej. en el caso de minlength="3", param será 3
    //  en caso de que el método no tenga parámetros, param será true

    if (value == ‘Pedro”) {
        return true; //supera la validación
    }
    else {
        return false; //error de validación
    }
}

[/sourcecode]

2. Registrar regla de validación, método de validación y mensaje por defecto

[sourcecode language='php' ]
$.validator.addMethod("valid_nombre ", esNombreValido, "No eres Pedro");

[/sourcecode]

3. Utilizar nueva regla de validación

[sourcecode language='php' ]
$().ready(function () {
    $("#ejForm").validate({
        rules: {
            nombre: {
                valid_nombre: true
            }
        }
    });
});

[/sourcecode]

Remote

Remote es muy sencillo de entender. Simplemente se delega la validación del elemento en una llamada a una url que validará el valor en el servidor y tiene que devolver en formato JSON un true si la validación ha tenido éxito o false (o cualquier otro valor distinto de true) en caso contrario.

En codeIgniter podríamos agregar por ejemplo una función p llevar a cabo la tarea de validación en el servidor.

[sourcecode language='php' ]
function nombre_funcion_ajax() {
        $nombre = $this->input->post(‘nombre’);
//se hace la comprobación de que el valor cumpla las condiciones deseadas
        if ($this->nombre_model->value_exist($nombre)) {
            echo 'false';
        } else
            echo 'true';
    }
[/sourcecode]

Y el código javascript necesario para utilizarlo sería:

[sourcecode language='php' ]
$("# ejForm ").validate({
            rules: {
                nombre: {
                required: true,
                remote:{
                    url:"<?php echo base_url(); ?>mi_controlador/ nombre_funcion_ajax ",
                    type:"post",
                    data:{
                        nombre: function(){
                            return $('# nombre ').val();
                        }
                    }
                }
                }},
            messages: {
                nombre: {
                    required: “El valor es requerido”,
                    remote: "el valor no cumple con la condición x"
                }
            }
        });

[/sourcecode]

Por defecto, remote hace una petición GET con los parámetros nombre=valor.

En cualquier caso, remote permite configurar todo lo que queremos la petición AJAX a través de su parámetro options.

En el ejemplo mostrado se envía por el método post y se adjunta como dato el nombre esto no es necesario ya que por defecto se envía el parámetro validado, pero se utiliza en caso de querer enviar algún otro dato junto con el validado.

Además de todas las funcionalidades mencionadas posee muchas más, todas estas configurables que nos permiten enriquecer el trabajo de los datos en el lado del cliente.

Espero les haya servido de ayuda.

Saludos

{ Leer Más }


martes, 5 de enero de 2016

Descargando ficheros desde una web con PHP

 
En este artículo mostraré con un ejemplo muy sencillo cómo copiar un fichero desde un sitio hacia otro, es decir, tenemos un fichero en una dirección http://sitio_externo/path/file.ext y queremos compartirlo en nuestro sitio http://mi_sitio/downloads/file.ext, o sencillamente queremos copiarlo hacia nuestro sitio servidor no se desee publicar.
Partimos de que el código PHP se ejecuta en nuestro sitio “mi_sitio”, por lo que tendríamos que descargar el fichero desde la web externa y copiarlo hacia la carpeta downloads en la raíz de nuestro sitio.
Para esto no copiaremos el fichero completamente, sino que utilizaremos las funciones de PHP de trabajo con ficheros (abrir ficheros, crear ficheros, copiar con fwrite…). Veamos el siguiente código:
   1: //capturar fuente por input o por cualquier vía, ejemplo http://sitio_externo/path/file.ext

   2: $http_path = …; 

   3:  

   4: //carpeta destino en nuestro servidor

   5: $upload_path = './downloads/';

   6:  

   7: //estableciendo un timeout límite para copiar

   8: set_time_limit (24 * 60 * 60);

   9:  

  10: //fichero destino incluyendo el path

  11: $newfname = $upload_path.basename($http_path);

  12:  

  13: //si se puede abrir el fichero fuente en modo lectura, se copia el contenido al fichero destino en modo escritura, por pedazos

  14: $source_file = fopen ($http_path, "rb");

  15: if ($file)

  16: {

  17:     $target_file = fopen ($newfname, "wb");

  18:  

  19:     if ($target_file)

  20:     {

  21:         while(!feof($source_file))

  22:             fwrite($target_file, fread($file, 1024 * 8 ), 1024 * 8 );

  23:          }

  24:      }

  25:  

  26: if ($source_file) fclose($source_file);

  27: if ($target_file) fclose($target_file);
Este método permite pasar el contenido de un fichero al otro por pedazos, lo que garantiza que no haya un límite de tamaño por el servidor. El límite de tiempo lo ponemos por seguridad.
Espero sea de utilidad este artículo.



{ Leer Más }


martes, 1 de diciembre de 2015

Alternando bases de datos sobre CodeIgniter

En este artículo mostraré como conectar manualmente a una base de datos, lo que resulta útil por ejemplo cuando se desea alternar entre dos o más bases de datos en una misma aplicación web.

Como es conocido, en el fichero application/config/database.php se especifica el nombre de la BD a la que nos conectaremos y la conexión se hará automáticamente. Pero hay situaciones en las que es posible desear manipular más de una base de datos, por ejemplo supongamos que se tienen dos sitios, uno de administración y otro con el contenido público, y que en determinado momento se desea consultar la BD de administración para mostrar algo en el sitio público.

En este caso lo primero sería modificar el fichero database.php de configuración y adicionar un nuevo grupo (o tantos como se desee), de la siguiente manera:

   1: $active_group = 'public';
   2: $active_record = TRUE;
   3:  
   4: $db['public']['hostname'] = 'localhost';
   5: $db['public']['username'] = 'root';
   6: $db['public']['password'] = '';
   7: $db['public']['database'] = 'my_public_db';
   8: $db['public']['dbdriver'] = 'mysql';
   9: $db['public']['dbprefix'] = '';
  10: $db['public']['pconnect'] = TRUE;
  11: $db['public']['db_debug'] = TRUE;
  12: $db['public']['cache_on'] = FALSE;
  13: $db['public']['cachedir'] = '';
  14: $db['public']['char_set'] = 'utf8';
  15: $db['public']['dbcollat'] = 'utf8_general_ci';
  16: $db['public']['swap_pre'] = '';
  17: $db['public']['autoinit'] = TRUE;
  18: $db['public']['stricton'] = FALSE;
  19:  
  20:  
  21: $db['admin']['hostname'] = 'localhost';
  22: $db['admin']['username'] = 'root';
  23: $db['admin']['password'] = '';
  24: $db['admin']['database'] = 'my_admin_db';
  25: $db['admin']['dbdriver'] = 'mysql';
  26: $db['admin']['dbprefix'] = '';
  27: $db['admin']['pconnect'] = TRUE;
  28: $db['admin']['db_debug'] = TRUE;
  29: $db['admin']['cache_on'] = FALSE;
  30: $db['admin']['cachedir'] = '';
  31: $db['admin']['char_set'] = 'utf8';
  32: $db['admin']['dbcollat'] = 'utf8_general_ci';
  33: $db['admin']['swap_pre'] = '';
  34: $db['admin']['autoinit'] = TRUE;
  35: $db['admin']['stricton'] = FALSE;

Nótese que se tienen dos grupos donde la primera llave especifica el nombre del grupo y la segunda el parámetro (por ejemplo $db['public']['database']… especifica el parámetro “nombre de base de datos” del grupo “public”). En el ejemplo de arriba he creado dos grupos, “admin” y “public”, y al inicio del código he declarado como grupo activo el public.

Automáticamente todas las consultas que se hagan en el modelo se harán sobre la BD “my_public_db” que es la activa por defecto, y se buscarán aquí las tablas, relaciones y consultas especificadas.

Ahora, la forma de cargar una BD determinada es usando la sentencia:



   1: $this->load->database('nombre_de_grupo');


Pero se puede usar de la siguiente forma:



   1: $this->db = $this->load->database(' nombre_de_grupo ', TRUE);


Donde el parámetro TRUE permite devolver el objeto DATABASE, que en este caso lo estamos guardando sobre la misma variable $this->db de CodeIgniter, así en los modelos podremos seguir utilizando esta variable transparentemente sin importar a cuál base de datos estemos conectados.

Sabiendo esto, para alternar momentáneamente entre bases de datos basta con poner a nivel de controladores algo como esto:



   1: $this->db = $this->load->database('admin', TRUE);
   2: $records = $this->my_admin_model->get_example_data();
   3: $this->db = $this->load->database('public', TRUE);
   4: //usar $records

En la primera línea se carga la configuración del grupo “admin” y por tanto la base de datos “my_admin_db”; en la segunda línea se consulta la misma; y en la tercera línea se restablece la configuración del grupo “public” con la base de datos “my_public_db”.

Como alternativa, se pueden conectar simultáneamente varias bases de datos, como ilustra el siguiente ejemplo de la documentación de CodeIgniter:



   1: $DB1 = $this->load->database('grupo_uno', TRUE);
   2: $DB2 = $this->load->database('grupo_dos', TRUE);

Y en lugar de usar el objeto $this->db se usarían los objetos $DB1 y $DB2:

   1: $DB1->query();
   2: $DB1->result();
   3: etc...


Es todo, espera les sea de utilidad e interés el tema.

{ Leer Más }


martes, 17 de noviembre de 2015

Trabajo con elementos select multiples (jQuery)

En este artículo quiero tratar el tema sobre cómo trabajar con los componentes html select multiple.

image

Supón que, en tu sitio tienes un la necesidad de cargar en una vista similar a la que se muestra encima en la que cargas todas las posibles opciones en el componente origen y necesitas que el usuario tenga la capacidad de seleccionar varias de ellas agregándolas al componente destino para luego hacer un tratamiento con las seleccionadas.

Para hacer lo antes comentado se crea la vista con dichos componentes y cargando en el origen los valores deseados. Debajo un ejemplo de cómo quedaría el origen:

   1: <h4>Origen</h4>
   2: <select name="data_source" id="data_source" size="5" multiple>
   3:  <option value="1">opcion 1</option>
   4:
   5:  <option value="n">opcion n</option>
   6: </select>
   7: <input type="button" id="asc" value="asc"/>
   8: <input type="button" id="desc" value="desc"/>


Ahora veremos cómo desarrollar las diferentes funcionalidades para los botones, el primer seria el agregar todos (>>):



   1: //se realiza la función en el evento click del botón
   2: $('#all_plus').click(function(e) {
   3:    //se separan del origen y se guardan en una variable los elementos                                                                                             option 
   4:    var $option = $('#data_source option').detach();
   5:    //luego se le agregan al componente destino con la función append
   6:    $('#data_destiny').append($option);
   7: });


La funcionalidad eliminar todos (<<) seria igual solamente habría que intercambiar el origen y el destino en este caso llamados por los id (data_source y data_destiny).

Para las funcionalidades de agregar (>) y eliminar (<), es algo muy parecido solo que hay que tener en cuenta el elemento option seleccionado y no todos los hijos del select, algo como esto es lo que haría falta:



   1: //se realiza la función en el evento click del botón
   2: $('#minus').click(function(e) {
   3:   //en separa del elemento select la opción seleccionada y se guarda en una variable
   4:   var $option = $('#data_destiny :selected').detach();
   5:   //luego se le agrega el otro componente select con la función append
   6:   $('#data_source').append($option);
   7: });


En el ejemplo anterior se mostró el eliminar (<), como se dijo anteriormente solo es cuestión de intercambiar los id para lograr obtener el agregar.

Espero les haya servido de ayuda.

{ Leer Más }


martes, 27 de octubre de 2015

Cargar varios archivos usando CodeIgniter con JQuery 2

En el presente artículo continuaremos hablando del método para cargar múltiples ficheros usando CodeIgniter con JQuery.

En el articulo pasado, hablamos de como crear de manera dinámica múltiples componentes visuales en tiempo real usando JQuery.

Ahora pasaremos al trabajo con CodeIgniter. Lo primero que tienes que tener en cuenta es que el formulario que creaste en la vista tienes que declararlo multipart.

   1: form_open_multipart()


Esta función es absolutamente idéntica a form_open(), excepto que agrega un atributo multipart que es necesario si quisiera usar el formulario para subir archivos.

Una vez tenido esto claro. En nuestro controlador realizamos una función para cargar por un post la información de los componentes visuales que creamos anteriormente en nuestra vista.

Para esto empleamos la clase de subir ficheros de CodeIgniter. En el siguiente ejemplo especifico la carpeta hacia la que voy a subir el fichero, el tipo de fichero que quiero recibir (* para cualquier tipo), el tamaño máximo de fichero. El overwrite permite sobrescribir los ficheros en el servidor. He cargado la clase upload que trae CodeIgniter en una de sus bibliotecas, y al cargarla le he pasado mi configuración. Y por último la cantidad de ficheros que voy a cargar. Como en otros artículos referentes a este tema, no tratare lo de la validación de carga de ficheros ya que por ahora no es el objetivo aunque no deja de ser necesario e importante.



   1: function nomre_de_la_funcion()
   2: {
   3:     $config['upload_path']   = './uploads/';
   4:     $config['allowed_types'] = 'gif|jpg|png|doc|rar|zip|xls';
   5:     $config['overwrite']     = TRUE;
   6:       $config['max_size']     = '100';
   7:     $file_number = $this->input->post('file-number');
   8:         
   9:       $this->load->library('upload', $config);
  10:     
  11:  
  12:  
  13:      for($i = 0; $i< $file_number; $i++)
  14:             $this->upload->do_upload('file_name'.$i)}  


Si resultó positivo puedes acceder al nombre del fichero, que ya está en el servidor, a través del mismo $_FILES ['file_name]['name'], y guardar el nombre en la base de datos.

Otra vía para subir varios ficheros desde un mismo formulario, puedes ponerle a todos los input files el mismo nombre con corchete (ej. file_name[]), y accedes a ellos a través de:



   1:  
   2: $_FILES['filename']['name'][0];
   3: $_FILES['filename']['name'][1];
   4:
   5:       


Como habrás podido ver, esta es una vía muy sencilla para la carga de múltiples ficheros, y a mí, en lo particular me funcionó. Espero que sea de ayuda para futuras soluciones a problemas de este tipo.

{ Leer Más }


IconIconIcon