En este post voy a explicar como hacer una función que bloquea ips de robots o simples usuarios spammers. Para esto mezclaremos la utilización de archivos de configuración donde iremos registrando en un array las ips que queremos bloquear. Lo primero es crear un archivo de configuración que podrá ser utilizado desde cualquier parte de la aplicación. En este archivo de configuración crearemos una variable que contendrá un array con registros de ips. /app/config/ip_block.php <?php $config['Ip']['block'] = array(‘xxx.xxx.xxx.xxx’); ?> Esta funcionalidad es ideal para ir insertando las ips manualmente, previo análisis. A continuación la función con la lógica que procesa la ip y las busca en el array de ips bloqueadas que hemos definido anteriormente en el archivo de configuración. lo ideal será colocarla en /app/controllers/app_controller.php <? class AppController extends Controller { function __construct() { parent::__construct(); } /** * funcion para bloquear ips. * Esta funcion se puede llamar desde cualquier funcion/controlador para comprobar si una ip está bloqueada. * Las ips bloqueadas se guardan en un array en /app/config/ip_block.php * La funcion simplemente carga el archivo de configuración y le las ips que hay registradas y las comprueba con la ip que enviamos * Si la ip coincide redirigimos [...]
Para poder recortar una imagen mediante una seleccion se consigue con imgAreaSelect que es un plugin de JQuery para seleccionar un area de una imagen. El publin se puede configurar y permite diferentes funcionalidades que nos ayudará y nos enriquecerá la tarea de recortar una imagen, ya sea a nosotros a los usuarios cuando por ejemplo quieren subir un avatar y recortar la zona que quieran de la foto previamente subida. El plugin permite trabajar escalando imágenes o recortando unas dimesiones asignadas. Por ejemplo. 1.- Selecciona y recorta una imagen con unas dimensiones determinadas. $(document).ready(function () { $(‘#avatar’).imgAreaSelect({ maxWidth: 200, maxHeight: 150, handles: true }); }); 2.- Selecciona y recorta la foto manteniendo un porcentaje escalado previamente asignado. $(document).ready(function () { $(‘#avatar’).imgAreaSelect({ aspectRatio: ’4:3′, handles: true }); }); Esto es muy sencillo de integrar en php y jquery pero bueno como ya sabemos en Cakephp se complica un poquito mas debiado a que hay que seguir el patrón de diseño MVC. Como siempre habrá que crear un componente que interactue con el controlador o controladores, un helper para incluir en la vista las funciones de javascript y la implementación de la vista. Para esta receta necesitaremos 1.- El componente /app/controllers/components/jq_imgcrop.php [...]
Generar logs de datos en CakePHP es muy simple y útil con la función log() que es parte de la clase Object que es común para la mayoria de las clases de Cakephp. Esta función log se puede usar en el contexto de una clase de cake ya sea un Modelo, un Controlador, un componente, prácticamente lo que sea, y podrás generar logs con los datos que se desea. La función log() toma dos parámetros. El primero es el mensaje que se desea escribir en el archivo de log. Por defecto, este mensaje de error es escrito en el log de errores ubicado en app/tmp/logs/error.log //Ejecutando esto dentro de una clase CakePHP: $this->log("Registro de datos"); //El resultado de esto se agrega a app/tmp/logs/error.log 2010-13-07 10:22:02 Error: Registro de datos El segundo parámetro es usado para definir el tipo de log con el se quiere escribir el mensaje. Si no se suministra, el valor por defecto es LOG_ERROR, el cual escribe en el log de errores previamente mencionado. Como alternativa, Se puede establecer este segundo parámetro a LOG_DEBUG, para escribir su mensaje en el log de depuración ubicado en app/tmp/logs/debug.log: ///Ejecutando esto dentro de una clase CakePHP: $this->log(‘Un mensaje de depuración.’, [...]
Cuando tenéis una aplicación en cakephp y todo está en utf8 es muy importante especificar en la configuración de base de datos que se conecte en utf8 porque en cakephp se pueden generar problemas de codificación a pesar de que todo esté en utf8 (mysql, apache, php, código y html). Para ello hay que añadir la siguiente línea en nuestra configuración de bases de datos /app/config/database.php ‘encoding’ => ‘utf8′ un ejemplo completo estableciendo la codificación en utf8 var $local = array( ‘driver’ => ‘mysql’, ‘persistent’ => false, ‘host’ => ‘localhost’, ‘login’ => ‘root’, ‘password’ => ”, ‘database’ => ‘cake’, ‘prefix’ => ”, ‘encoding’ => ‘utf8′ ); Esto no es un milagro, si hay problemas graves de codificación en una aplicación en cakephp hay que revisar primero todos los elementos que pueden estar generando la inestabilidad en la codificación. Hay muchos elementos a tener en cuenta para que una web esté toda en utf8, como he dicho antes.
Memcached es un sistema distribuido de cache de objetos está especialmente indicado para webs dinámicas con gran carga a la base de datos. Memcache es una cache en memoria ram, al contrario que la mayoria de los tipos de cache que son mediante ficheros físicos en disco duro. Se puede almacenar fragmentos arbitrarios de datos, ya sean un cadena, un array, un objeto un trozo de html o una página entera. Considero que memcached es un elemento obligatorio a usar en las aplicaciones con cakephp ya que éstas realizan una gran carga a la base de datos cuando hay muchas relaciones entre modelos. Ejemplo por defecto de una configuración de cache con memcache en /app/config/core.php Cache::config(‘default’, array( ‘engine’ => ‘Memcache’, //[required] ‘duration’=> 3600, //[optional] ‘probability’=> 100, //[optional] ‘prefix’ => Inflector::slug(APP_DIR) . ‘_’, //[optional] prefix every cache file with this string ‘servers’ => array( ’127.0.0.1:11211′ // localhost, default port 11211 ), //[optional] ‘compress’ => false, // [optional] compress data in Memcache (slower, but uses less memory) )); Un ejemplo real: Cache::config(‘memcache_ram’, array(‘engine’ => ‘Memcache’,'duration’=> 3600,’probability’=> 100,’servers’ => array(’127.0.0.1:11211′ ), ‘compress’ => false)); Ejemplo de uso en un controlador function leer_post($id) { $resultado = Cache::read(‘post_’.$id,’memcache_ram’); if(empty($resultado)) { $resultado = $this->Cake->findById($id); $resultado = [...]