24 de noviembre de 2008. De CakePHP 1.1 a CakePHP 1.2. El baile de los errores. Parte IV

4. Cambios en la validación de los datos

La validación de datos de CakePHP 1.2 es más poderosa que la de CakePHP 1.1. Ahora hay muchas más posibilidades, aunque también se pueden seguir usando las constantes de validación VALID_NOT_EMPTY, VALID_EMAIL, VALID_NUMBER y VALID_YEAR de CakePHP 1.1. En este post de Hospedaxes explican cómo definir reglas de validación en CakePHP 1.2. 

Mi modelo Categoria de CakePHP 1.1, que utilizaba la constante de validación VALID_NOT_EMPTY, era así:


class Categoria extends AppModel{

   var $name = 'Categoria';

   var $displayField = 'nombre';

   var $validate = array(  'nombre'=>VALID_NOT_EMPTY,
                           );

   var $hasMany = array('Empresa'=>array('className'=>'Empresa'));

}

Y en CakePHP 1.2 quedo así:


class Categoria extends AppModel{

   var $name = 'Categoria';

   var $displayField = 'nombre';

   var $validate = array(

                           'nombre' => array(

                                                'rule' => array('minLength', 1),

                                                'message' => 'El nombre es obligatorio'

                                             )

                     );

    var $hasMany = array('Empresa'=>array('className'=>'Empresa'));

}

Por otra parte, el uso del método validates de la clase Model, que comprueba si los campos de un registro satisfacen las reglas de validación que se definen en el modelo, también ha cambiado. Esto lo explican aquí

Por lo tanto, el método introducir_datos de mi controlador EmpresasController de CakePHP 1.1, que utilizaba el método validates, y era así:


if ($this->Empresa->validates($this->data)){

queda finalmente así en CakePHP 1.2:


$this->Empresa->set($this->data);         

if ($this->Empresa->validates()){

Anuncios

Geocodificación con PHP y el API Google Maps (1)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding

Introducción

Se llama geocodificación al proceso de encontrar la longitud y la latitud de una dirección o un lugar determinados. El servicio Google Maps proporciona un acceso libre a su geocodificador a los desarrolladores y a los propietarios de sitios web por medio del API JavaScript Google Maps y del servicio web. En este artículo explicaré cómo acceder al servicio web geocodificador con PHP para que puedas utilizarlo en tus propias aplicaciones.

Hay muchas aplicaciones que pueden hacer uso de un geocodficador; tener acceso a un geocodificador gratuito, fiable y frecuentemente actualizado es una ayuda enorme en el desarrollo de aplicaciones web. Algunos de los ejemplos en que un geocodificador puede ser útil son los siguientes:

– Determinar en un mapa la dirección que un usuario envía.

– Determinar la longitud y la latitud para hacer cálculos, como encontrar otro par de coordeandas a partir de una distancia dada.

– Verificar direcciones (por ejemplo, antes de enviar los pedidos de un almacén de comercio electrónico).

– Recuperar correctamente una dirección a partir de una ubicación determinada. Esto es muy útil si tenemos en cuenta las inconsistencias que puede llegar a tener la dirección que introduce un usuario.

Es sencillo acceder al geocodificador basado en JavaScript cuando utilizamos Google Maps para mostrar mapas en nuestros sitios web; sin embargo, esta no es la solución más adecuada, especialmente desde el punto de vista de la accesibilidad.

Por ejemplo, una aplicación puede recuperar las coordenadas geográficas con el geocodificador JavaScript, a partir de la dirección que el usuario introduce en un formulario, pero esta solución no funciona para los usuarios que tienen JavaScript deshabilitado. Esta barrera se puede derribar utilizando el servicio web; esto quiere decir que todas las peticiones al geocodificador se llevan a cabo en el lado del servidor.

En este artículo desarrollaremos varias clases PHP 5 que facilitan la consulta al geocodificador y el acceso a la respuesta.

Zona de artículos, la nueva categoría de www.tutorialcakephp.wordpress.com

Esta categoría tiene como objetivo exponer y compartir las características de CakePHP para que los programadores puedan utilizarlas en sus desarrollos. Contamos con la colaboración de algunos autores que escriben en español y con el visto bueno de otros, anglohablantes, que desean compartir sus artículos con la comunidad hispanohablante de CakePHP. Además, este apartado cuenta también con textos relacionados con PHP e Internet. Puedes exponer aquí tus ideas, compartir tus clases PHP, hablar de tu experiencia, etc. ¡Esperamos que toda esta información te sea útil!

21 de noviembre de 2008. De CakePHP 1.1 a CakePHP 1.2. El baile de los errores. Parte III

¿Sigues bailando conmigo? ¿Sí? Está bien, pues entonces dale al play y continúa -ponte unos auriculares, si es necesario-.

No te dejes engañar por lo extenso de este post, dividido en varias partes; me estoy manejando con los errores mejor de lo que esperaba y creo que este ejercicio es estupendo para ver las diferencias que hay entre las dos versiones.

3. Funciones que ya no se utilizan

Hay que cambiar las funciones de CakePHP 1.1 que ya no usa CakePHP 1.2. Por ejemplo, generateList por find.

En el programa que escribí en CakePHP 1.1 tenía la vista /empresas/editar.thtml, para editar las empresas y para que el usuario pudiera hacer cambios en los registros. En esta vista el usuario seleccionaba el nombre de la categoría de una empresa -y no su identificador- en una lista desplegable.

Como una empresa pertenece a una categoría y una categoría tiene muchas empresas, la acción editar() del controlador EmpresasController tenía la siguiente instrucción para poblar la variable $categoriaArray de la vista /empresas/editar.thtml


$this->set('categoriaArray',$this->Empresa->Categoria->generateList(''));

La clase Model de CakePHP 1.2 no implementa el método generateList y en esta versión hay que utilizar find para poblar la variable $categoriaArray de la vista /empresas/editar.ctp, como explican aquí.

Por lo tanto, la instrucción PHP del método editar() del controlador EmpresasController tiene que quedar así:


$this->set('categoriaArray',$this->Empresa->Categoria->find('list'));

20 de noviembre de 2008. De CakePHP 1.1 a CakePHP 1.2. El baile de los errores. Parte II

Sigue el baile de los errores, y también los cambios que estoy haciendo para que el programa escrito para CakePHP 1.1 funcione en CakePHP 1.2.

2. Cambios en la autenticación

Esta parte me ha llevado tiempo porque no estoy familiarizado con Auth, el nuevo componente que incorpora CakePHP 1.2 para gestionar la autenticación de los usuarios. En el controlador UsuariosController he hecho lo siguiente:

1. He cargado el controlador.


var $components = array('Auth');

2. He configurado el componente Auth en el método beforeFilter() del controlador.


   function beforeFilter(){

         /* Auth supone que hay un model User; nosotros le decimos que nuestro modelo es Usuario*/

         $this->Auth->userModel = 'Usuario';

         /* Auth supone que hay un modelo User con los campos username y password. La siguiente línea
            especifica qué campos de la tabla usuarios se utilizan como username y password. */

         $this->Auth->fields = array('username' => 'login', 'password' => 'password');

         /* Esta línea define la acción/vista correspondiente al login. Si un usuario no está
            autorizado a ver una página es redireccionado/a a esta acción/vista. */

         $this->Auth->loginAction = array('controller' => 'usuarios', 'action' => 'login');

         /* Por defecto, el componente de autenticación bloquea todas las acciones. La siguiente
            línea le dice al componente Auth qué acciones no necesitan autenticación.
            Sin esta línea, no podríamos ejecutar la acción login ni visualizar,
            por lo tanto, su vista asociada, login.ctp*/

         $this->Auth->allow('login');

         /* Decimos al comonente Auth donde tiene que redireccionar al usuario después de una
            autenticación exitosa.*/

         $this->Auth->loginRedirect = array('controller' => 'usuarios', 'action' => 'index');

         /* Especificamos el mensaje de error que aparece en la pantalla si la autenticación falla. */

         $this->Auth->loginError = 'El nombre de usuario o la contraseña no son correctos. Por favor, inténtalo otra vez.';

      }

Gracias a este enlace entendí para qué sirve cada uno de los atributos de la clase AuthComponent, y cómo se utilizan.

3. He implementado el método login(), dejándolo vacío. Finalmente, se tiene que crear la vista login.ctp -que yo escribí en el baile de los errores Parte I-.

19 de noviembre de 2008. De CakePHP 1.1 a CakePHP 1.2. El baile de los errores. Parte I

He migrado mi programa -hecho en CakePHP 1.1- a CakePHP 1.2 y salen errores por todas partes. Al principio me he asusté un poco, pero descubrí cómo resuelven estos errores aquí y no hay para tanto. Me he tranquilizado un poco. No sé si será la estrategia más acertada, pero intentaré corregir estos errores navegando en la web, sobre la marcha -puedes proponer otra forma de hacer esto, dejando algún comentario-.

Los errores aparecen porque lo primero que hago es entrar en la zona privada; bueno, también pienso que puede ser por las incompatibilidades, digámoslo así, entre los antiguos ayudantes HTML y el ayudante para formularios de CakePHP 1.2. En realidad, pobre ignorante, ¡qué se yo! Voy a ir corrigiendo estos errores uno a uno. Sí, voy a hacerlo así. Por cierto, me estoy acordando del CakePHP en dos días, ¿dónde leí eso? ¡Recórcholis! ¡Mira que feo es este!

Warning 512: Method HtmlHelper::input does not exist [CORE\cake\libs\view\helper.php, line 148]

¡Puaj! Este warning 512 es mi primer error y lo lanza esta instrucción PHP de la vista /usuarios/login.thtml

 echo $html->input('Usuario/login',array('size'=>20)); 

Cambios que hay que hacer en el programa

1. Formularios y ayudantes HTML

He empezado por el punto Changes to form and html helpers de este enlace. La clase HtmlHelper de CakePHP 1.2 no implementa el método input, que sí implementa la versión anterior. En el API puede uno ver las diferencias que hay entre las clases HtmlHelper de CakePHP 1.1 y HtmlHelper de CakePHP 1.2; hay muchos métodos que no implementa la clase HtmlHelper de la versión 1.2 porque los implementa ahora FormHelper.

La vista /usuarios/login.thtml que programé en CakePHP 1.1, que era esta:

<h2>Zona privada</h2>

 

<?php if ($error): ?>

 

<p>El nombre de usuario o la contraseña no son correctos. Inténtalo otra vez.</p>

 

<?php endif; ?>

 

<form action=”<?php echo $html->url(‘/usuarios/login’); ?>” method=”post”>

 

   <fieldset>

 

      <label for=”login”>Usuario:</label>

 

      <?php echo $html->input(‘Usuario/login’, array(‘size’ => 20)); ?>

 

      <label for=”password”>Contraseña:</label>

 

      <?php echo $html->password(‘Usuario/password’, array(‘size’ => 20)); ?>

 

      <?php echo $html->submit(‘Entrar’); ?>

 

   </fieldset>

 

</form>

 

la he tenido que cambiar por esta otra:

 

<?php

   if ($session->check(‘Message.auth’)) $session->flash(‘auth’);

  

   echo $form->create(‘Usuario’, array(‘action’ => ‘login’));

 

   echo $form->input(‘login’);

 

   echo $form->input(‘password’);

 

   echo $form->end(‘Entrar’);

 

?>

 

Y este cambio lo tengo que hacer en todas las vistas del programa.

18 de noviembre de 2008. Me paso a CakePHP 1.2

Me estaba peleando con el helper HTML selectTag -hasta hoy he trabajado con la versión 1.1- y he descubierto que este ayudante no se utiliza en la versión 1.2. Su equivalente en CakePHP 1.2 es el método select de la clase FormHelper. Estoy siguiendo el libro Beginning CakePHP de David Golding, y, aunque todavía no he probado CakePHP 1.2, durante estos días, trabajando con CakePHP 1.1, creo haber visto más claramente la diferencia que hay entre las dos versiones, y que explica Carlos Leopoldo aquí.