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 no quieres un software enorme con infinidad de 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: , ,

Mejoras y añadidos en el MeioUpload Behavior

Hace unas semanas hablé del MeioUpload Behavior y ahora me gustaría comentar la aparición de una mejora a este behavior realizada por José González y de otra con unos añadidos extra de mano de flipflops.

Etiquetas: ,

Conectarse a una Base de Datos externa desde WordPress

Hace mucho que no toco las tripas de WordPress, pero recientemente me he visto en la necesidad de instalar uno y hacer que dentro se obtengan información de una Base de Datos externa. Mirando la documentación que a primera vista parece completa, pero que luego te das cuenta que le haría falta una reestructuración, pensé que tendría que hacer la conexión “a pelo” con su mysql_connect y demás.

Por suerte existe Nicolás Fantino y a más de existir, sabe de WordPress. Y me dio la solución usando la propia clase de conexión a DDBB de WordPress.

Seguidamente cómo conectarse y ejecutar una consulta:

define('DDBB_USER', 'root');
define('DDBB_PASSWORD', '');
define('DDBB_NAME', 'newoysho');
define('DDBB_HOST', 'localhost');

$gestordb = new wpdb(DDBB_USER, DDBB_PASSWORD, DDBB_NAME, DDBB_HOST);
$gestordb->get_results('SELECT * ....'');

Dos cosas. La primera, podemos utilizar todos los otros métodos que nos proporciona la clase wpdb y segunda, ojo al definir constantes para usarlas en la conexión, no se os ocurra usar de nombre DB_USER, DB_PASSWORD, DB_NAME ni DB_HOST, son las que usa el propio WordPress.

Etiquetas:

Usar XML con PHP

Desde la versión 5 de PHP el uso de XML se ha vuelto más sencillo y si venimos de PHP4 y el uso de librerías de terceros para el uso de XML, no nos irá nada mal la serie de artículos sobre el uso de XML desde PHP5 que tiene IBM:

Etiquetas:

Generar cadenas con carácteres aleatorios con PHP

Justamente el otro día pensé que necesitaba hacer una función que generara cadenas con un tamaño específico de carácteres aleatorios y mira tu por dónde, leyendo un artículo me he encontrado con una hecha:

function __randomString($minlength = 20, $maxlength = 20, $useupper = true, $usespecial = false, $usenumbers = true){
        $charset = "abcdefghijklmnopqrstuvwxyz";
        if ($useupper) $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        if ($usenumbers) $charset .= "0123456789";
        if ($usespecial) $charset .= "~@#$%^*()_+-={}|][";
        if ($minlength > $maxlength) $length = mt_rand ($maxlength, $minlength);
        else $length = mt_rand ($minlength, $maxlength);
        $key = '';
        for ($i=0; $i<$length; $i++){
            $key .= $charset[(mt_rand(0,(strlen($charset)-1)))];
        }
        return $key;
    }

Me gusta bastante, excepto la parte que determina el tamaño de la cadena devuelta. De un primer vistazo no se entiende (claro que yo soy un poco tonto).

De paso también nos invita a dar una vuelta por la función mt_rand.

Etiquetas: ,

Creando un Wiki con CakePHP

Seguimos con la recopilación de documentación que aporte ayuda a la hora de ver qué y cómo se puede desarrollar con CakePHP.

Esta vez  con la serie de artículos realizados desde IBM para la creación de un wiki con CakePHP:

  1. Introduction & Scaffolding
  2. Developing the basic wiki code
  3. Users and Permissions
  4. Task management
  5. The open blog

Etiquetas: