Crear errores de validación desde el beforeSave

Situación: ¿Quiero generar errores de validación después de la ejecución del beforeValidation, por ejemplo en el beforeSave?

Sencillo, mediante el método invalidate generamos un error que se almacena en el array de errores del modelo y después desde el controlador podemos recuperar esos errores y actuar en función de ellos.

Modelo:


function beforeSave(){

    if( condiciones_que_nos_parezcan){
        $this->invalidate('nombre_del_error', 'texto del mensaje del error');
        return false;
    }
    return parent::beforeSave
}

Controlador:


function add(){
    if( $this->Modelo->save($this->data) ){

    } else {
        $errors = $this->Modelo->invalidFields();
        if( array_key_exists('nombre_del_error', $errors) ){
            die('Error especial')
        } else {
           die('Error al guardar');
        }
    }
}

Charla / Taller CakePHP (II)

Dos meses después del primer taller de iniciacióń a CakePHP, continuamos con una nueva “entrega” el día 15 de Mayo en la Casa Golferichs, donde trataremos de profundizar un poco más en este framework y hacer una primera aplicación paso a paso.

Trae tu ordenador y si quieres seguir el taller, trata de cumplir los siguientes requisitos técnicos:

  • Apache 2
  • MySQL 4 o 5 (recomendable 5)
  • PHP 4 o 5 (recomendable 5)
  • mod_rewrite
  • mod_vhost
  • Un VirtualHost creado y funcionando, con AllowOverride All.
  • PHPMyAdmin o similar
  • php-cli
  • CakePHP 1.3

Recordar que estos talleres, de libre acceso y gratuitos, forman parte de las jornadas mensuales que hacemos en la Web BCN.

CakePHP: Modificar el estilo de los flashMessage

En los parámetros que tiene el método Session->setFlash nos encontramos con lo siguiente:

setFlash( $message, $layout = 'default', $params = array ( ), $key = 'flash' )

Nos centraremos en el segundo parámetro, $layout. Por defecto a este parámetro se le asigna el layout, default (que aún no he visto que archivo relacionado utiliza para mostrarse).

Si a la llamado a Session->setFlash de nuestro controlador, cambiamos el parámetro layout por, por ejemplo, ‘flash_contacto_error’:

$this->Session->setFlash(__('Nada es lo mismo que el nihilismo', true), 'flash_contacto_error', null);

y generamos un archivo llamado ‘flash_contacto_error.ctp’ en la carpeta /app/views/layouts con, por ejemplo el siguiente contenido:

 <div class="claseMsgError" id="MsgFlash"><p><?php echo $content_for_layout; ?></p></div>

Al mostrarse ese mensaje, lo hará usando el layout que acabamos de crear. Pudiendo añadir todos los elementos HTML que necesitemos en cada ocasión.

Etiquetas:

Charla/Taller iniciación CakePHP

El próximo día 20 de Marzo del 2010 daré un pequeño taller de dos horas de duración de Iniciación a CakePHP, dentro de las charlas mensuales que hacemos en el WebBCN.

Lugar: Centre Civic Casa Golferichs

Hora: 18:00

Al ser un taller, será algo práctico, así que podéis traer ordenador  (habrá wifi).

En ese caso, mejor traer de casa el ordenador configurado con las siguientes especificaciones:

  1. Apache
  2. PHP 4 o 5 (5 mejor que mejor)
  3. mod_rewrite habilitado (CakePHP puede funcionar sin el, pero así ahorramos explicaciones y configuraciones al respecto)
  4. MySQL 4 o 5 (5 mejor que mejor)
  5. PHPMyAdmin o similar.
  6. Un virtualhost activado y funcionando con AllowOverride All

Se espera que el taller se grabe en video y se emita por streaming en directo. Ya anunciaré la URL dónde poder hacerlo.

Por último decir que no soy ningún experto y que mi intención es compartir lo que sé con quien quiera venir.

CakePHP: Cambio de funcionamiento de los themes en la versión 1.3

Hace un tiempo hablé de cómo usar temas en CakePHP. Para la nueva versión 1.3, ahora en beta,
hay un pequeño cambio que hace que una aplicación migrada de 1.2 a 1.3 no reconozca las css, los js e imágenes ubicadas en webroot.

La hasta ahora /app/webroot/themed/mi_tema/ cambia a /app/views/themed/mi_tema/webroot y dentro de esta las carpetas /css, /img y /js.

De esta manera CakePHP pretende que los temas sean más compactos y facilitar su distribución a terceras personas. No es mala idea, pero me gustaba el funcionamiento de la 1.2 con sus cosas separadas respetando la lógica de las carpetas.

Más información: Uso de Temas (Documentación oficial).

Etiquetas: ,

Creación de Mockups con Balsamiq

Necesitaba crear unos gráficos de funcionamiento de una web, lo se conoce como Mockups y tras probar con Open Office Draw, que no me acabó de convencer, busqué y encontré Balsamiq.

Lo que más me interesó de este software fue que se pudiera ejecutar sobre GNU/Linux y como está realizado con AIR sólo tuve que instalarme el runtime.

Su uso es bastante sencillo, sin menús complicados y bastante intuitivo.
El resultado final me gusta por que se parece bastante a lo que podría hacer con lápiz y papel (las herramientas que más me gustan para estas tareas pero que adolecen de la falta de “undo” y “copy/paste”).

Como aspectos no tan buenos diría que faltan elementos en la paleta de opciones y que por lo menos en mi máquina es un poco lento.

Por lo demás es una de las herramientas para este tipo de tareas que más me ha gustado si quieres un software enorme sencillo, sin multitud de extrañas opciones y barato.

Se puede probar online y descargar una demo bastante funcional. Pese que su coste es de 79$ (más que asequible para una empresa que lo necesite) puede obtenerse gratuitamente si se cumplen algunos de los requisitos.

Usar variables de URL en la paginación de las Vistas en CakePHP

En CakePHP, paginar u ordenar un listado en una vista son acciones que vienen ya hechas con el Helper Pagination y la generación desde consola de CRUD.

Pero hay veces que se nos puede quedar corta cuando estamos usando variables en la URL para filtrar los resultados del listado, ya que al usar la paginación u ordenación por defecto, veremos que esas variables desaparecen y nuestro listado deja de funcionar como desearíamos.

Para solucionar eso, no hay más que poner en nuestra vista:

$paginator->options(array('url' => $this->passedArgs));

Más en la documentación oficial sobre paginación en vistas.

Etiquetas: ,

CakePHP: Usar caché en el modelo

Podemos aprovecharnos del sistema de caché que viene por defecto en CakePHP, pensado sobre todo para las vistas, para almacenar de forma estática en un fichero información obtenida desde el modelo para tratar de minimizar los accesos a Base de Datos.

Trataré de explicarme mediante un ejemplo.

Pongamos un modelo News que tiene un método getLastNews que obtiene las últimas noticias creadas:


class News extends AppModel {
    var $name = 'News';

    function getLastNews(){
        $find_params = array('limit' => 5, 'order' => 'News.id DESC');
        $this->find('all', $find_params);
    }
}

El código anterior obtendría las últimas 5 noticias y cada vez que se llame a este método se genera una consulta a la Base de Datos.

Ahora haremos unas modificaciones para generar un caché con estas últimas 5 noticias:


class News extends AppModel {

    var $name = 'News';

    function getLastNews(){
        $data = $this->_getCache('ultimas-noticias');
        if ( empty( $data ) ){
            $find_params = array('limit' => 5, 'order' => 'News.id DESC');
            $data = $this->find('all', $find_params);
            $this->_toCache('ultimas-noticias', $data);
        }
        return $data;
    }

    function _toCache($cache_file_name = null, $data = null) {
        if(! $cache_file_name) return false;
        if(! $data) return false;

        Cache::config(null, array('engine' => 'File', 'path'=> CACHE . '/data/'));
        Cache::write($cache_file_name, $data, array('duration' => 7200, 'config' => null));

        return true;
    }

    function _getCache($cache_file_name = null){
        $data = null;
        if(! $cache_file_name) return $data;

        Cache::config(null, array('engine' => 'File', 'path' => CACHE . '/data/');
        $data = Cache::read($cache_file_name);

        return($data);
    }

}

El código es mejorable, como poner los métodos de acceso a caché en el app_model, pero éste nos sirve para ver de un vistazo el funcionamiento del caché.
Ahora el método getLastNews, para obtener la información comprueba si existe en el caché, usándolo si existe y en caso contrario, consultando a la Base de Datos y creándolo para el futuro.

Para profundizar en el concepto del caché, su uso y configuración lo mejor es darse una vuelta por la documentación oficial.

Esta “técnica” se complementa muy bien con la reescritura de la callback find.

Etiquetas: ,

Venta de Ukeleles, ukecosas.es

Este artículo está totalmente fuera de los temas que normalmente aquí se tratan (con mayor o mejor fortuna) pero cuando un amigo hace/emprende un proyecto en internet, lo mínimo que hay que hacer es felicitarle, desearle suerte y hacer una pequeña reseña.

Choan ha iniciado hace poquito el proyecto ukecosas.es, una web donde puedes comprar ukeleles y demás complementos relacionados con el ukelele (cuerdas, afinadores, etc).

Pese que no os interese comprar un ukelele, recomiendo visitar la web ya que la encuentro más que correcta estupenda y me gustaría recalcar que la sección de videos es interesantísima.

Etiquetas: ,

Conectarse a un WebService con CakePHP

Para un reciente proyecto he tenido que conectar una web hecha en CakePHP con un WebService del cliente en .NET. Tras mirar la documentación de CakePHP y teniendo en cuenta los requerimientos de conexión que imponía el WebService (envío mediante POST, retorno de información en XML) hice lo siguiente (quizás no sea la mejor manera), que espero que ayude a alguien:

App::import('Core', 'HttpSocket');
App::import('Core', 'Xml');
$HttpSocket = new HttpSocket();
$results = $HttpSocket->post('https://secure.xxx.xxx/ws/xxxx.asmx/xxxx', array('var1' => 'valor1', 'var2' => 'valor2'));
$xml = new Xml($results);
$data = Set::reverse($xml);
debug $data;

Justamente este código lo he puesto en un Component y creo que es suficiente autoexplicativo.

Dejo unos enlaces de referencia:

Etiquetas: , ,