La clase App en CakePHP
La calse App es utilizada en CakePHP para importar librerias externas a las aplicaciónes que estemos desarrollando de forma que, a partir de esa importación, podamos utilizarlas en cualquier momento del desarrollo de éstas. Es una clase que nos ayuda a añadir de forma cómoda y sencilla nuevas clases a nuestras aplicaciones.
El método de la clase App empleado para llevar a cabo esta importación es App::import().
App::import($type, $name, $parent, $search, $file, $return);
Así pues, la importación de las clases pertenecientes a las distintas librerías existentes se llevará a cabo de la siguiente forma:
// Importación de librerías del Core: .../cake/libs/
App::import('Core', 'Error');
App::import('Core', 'Xml');
App::import('Core', 'File');
// Importación de Controladores.
/* Equivale a require('controllers/nuestro_controlador_controller.php'); */
App::import('Controller', 'NuestroControlador');
/* Necesitamos cargar la clase importada */
$Users = new NuestroControladorController();
/* Si queremos cargar los modelos, componentes, ... asociados a la clase */
$Users->constructClasses();
// Importación de Modelos.
App::import('Model', 'NuestroModelo');
// Importación de Ayudantes.
App::import('Helper', 'Html');
// Importación de Comportamientos.
App::import('Behavior', 'Tree');
// Importación de Componentes.
App::import('Component', 'Auth');
// Importación de clases de terceras personas.
/* .../vendors/geshi.php */
App::import('Vendor', 'geshi');
/* .../vendors/flickr/flickr.php */
App::import('Vendor', 'flickr/flickr');
/* .../vendors/un.nombre.php */
App::import('Vendor', 'UnNombre', array('file' => 'un.nombre.php'));
/* .../vendors/services/otro.nombre.php */
App::import('Vendor', 'OtroNombre', array('file' => 'services'.DS.'otro.nombre.php'));
La importación de plugins es algo diferente al resto de importaciones debido a que debemos indicar el nombre del plugin en el que se encuentra la clase a cargar:
// Importación de Plugins.
App::import('Modelo', 'NuestroPlugin.Comentario');
Esta es la fomra de importar/cargar las clases que necesitemos para desallorar las aplicaciones en las que estemos trabajando.
Instalación básica (producción) de CakePHP
Para llevar a cabo la instalación de CakePHP lo primero que deberemos hacer es descargar desde la página oficial del proyecto la última versión del framework (en nuestro caso la 1.2.4.8284).
Antes de continuar, debemos ser conscientes de que existen tres tipos de instalación:
- Desarrollo: Fácil para comenzar a programar en CakePHP. Las URL de nuestra aplicación final incluirán el nombre de los directorios (poco seguro).
- Producción: Requiere la capacidad de configurar el servidor web para definir el document root (muy seguro).
- Avanzado: Con cierta configuración, permite ubicar los directorios clave de CakePHP en diferentes partes del sistema de archivos, para compartir una misma instalación de CakePHP entre varias aplicaciones.
Nosotros hemos optado por llevar a cabo una instalación en producción, permitiendo que un dominio completo se comporte como una única aplicación CakePHP.
Una vez dispongamos de ella la descomprimiremos y colocaremos todos los ficheros obtenidos en nuestro directorio de trabajo dentro del directorio htdocs. En nuestro caso, trabajando con MAMP, los colocaremos en el directorio …/htdocs/CakePHP/. De esta forma, sólo tendremos que arrancar la aplicación MAMP y escribir en nuestro navegador la dirección http://localhost/CakePHP para poder acceder a las páginas desarrolladas en CakePHP.
Una vez llevados a cabo los pasos anteriores, si no hemos trasteado anteriormente, obtendremos una serie de avisos como los mostrados en la siguiente imagen:
El primer aviso nos indica que debemos dirigirnos al fichero app/config/core.php, que contiene una serie de variables y constantes que determinan el comportamiento de nuestra instalación de CakePHP, para cambiar la siguiente línea:
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
por esta otra:
Configure::write('Security.salt', 'SecuritySalt');
NOTA: El valor de la variable que hemos modificado almacena la “semilla” para los procesos de encriptación que realice CakePHP (login, guardar, etc.). Este nuevo valor puede ser cualquier valor que se nos ocurra.
El último aviso es muy fácil de solucionar. Lo que nos está indicando es que no existe fichero de configuración alguno. Esto no es del todo cierto, ya que el fichero de configuración en app/config/database.php.default es un fichero que debemos renombrar a config/database.php y rellenar con la información de nuestra base de datos. Para ello nos dirigiremos al directorio …/htdocs/CakePHP/app/config y llevaremos a cabo el renombrado mencionado. Si en este momento recargamos la página inicial de nuestro proyecto obtendremos dos nuevos mensajes; uno de ellos indicándonos que el fichero de configuración de la base de datos está presente y un aviso indicando que CakePHP no es capaz de conectar con la base de datos. Pues bie, para solucionar este problema nos dirigiremos al fichero de configuración de la base de datos y, en el código existente, buscaremos y rellenaremos la información de las siguientes líneas:
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql', /* El nombre del controlador de base de datos que
se desea utilizar. Ejemplo: mysql, postgres,
sqlite, pear-nombrededriver,
adodb-nombrededriver, mssql, oracle, odbc. */
'persistent' => false, /* Si se debe usar o no una conexión persistente
a la base de datos. */
'host' => 'localhost', /* El nombre de servidor de la base de datos (o
dirección IP). */
'login' => 'user', /* El nombre de usuario para la cuenta. */
'password' => 'password', /* La contraseña para la cuenta. */
'database' => 'database_name', /* Nombre de la base de datos a usar para la
conexión. */
'prefix' => '', /* Opcional: El texto que prefija cada nombre de
tabla en la base de datos. Útil si se comparte
la base de datos con varias aplicaciones.
Dejar vacío si no se desea ninguno. */
);
var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'test_database_name',
'prefix' => '',
);
}
como mostramos a continuación:
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'nomeaclaro',
'password' => 'nomeaclaro',
'database' => 'CakePHP',
'prefix' => '',
);
var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'test_database_name',
'prefix' => '',
);
}
A partir de este momento podemos refrescar la página y comprobar que todo funciona correctamente, así que ya podremos dedicarnos a desarrollar código con CakePHP.
Cambio dinámico de las opciones de los formularios
¿Cuantas veces hemos rellenado un formulario web en el que, dependiendo de la información seleccionada en ciertos campos, cambia la información del resto. Ahora trataremos de explicar la forma de llevar a cabo esta técnica utilizando JavaScript.
en el sigueinte ejemplo vamos a ver cómo, tras seleccionar un mes del año, se cargarán el número de días de ese mes. Así que, lo primero que debemos hacer es crear el siguiente formulario HTML:
<html>
<head>
<title>Menús dinámicos conJavaScript</title>
<script language="javascript" type="text/javascript" src="ScriptJS.js"></script>
</head>
<body>
<form action="#">
<select id="meses">
<option value="">Mes</option>
<option value="01">Enero</option>
<option value="02">Febrero</option>
<option value="03">Marzo</option>
<option value="04">Abril</option>
<option value="05">Mayo</option>
<option value="06">Junio</option>
<option value="07">Julio</option>
<option value="08">Agosto</option>
<option value="09">Septiembre</option>
<option value="10">Octubre</option>
<option value="11">Noviembre</option>
<option value="12">Diciembre</option>
</select>
<br />
<select id="dias">
<option">Dia</option>
</select>
</form>
</body>
</html>
El fichero ScriptJS.js contendrá el siguiente código:
window.onload = InitForm;
function InitForm() {
document.getElementById("meses").selectedIndex = 0;
document.getElementById("meses").onChange = MostrarDias;
}
function MostrarDias() {
// Array que contiene el número de días que contiene cada mes.
var numDiasMes = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
// Valor indicado en la etiqueta "option" del mes seleccionado.
var mesStr = this.options[this.selectedIndex].value;
if (mesStr != "") {
var mesNum = parseInt(mesStr);
/* Reseteamos cualquier valor existente en las opciones
del elemento cuyo id es "dias". */
document.getElementById("dias").options.length = 0;
// Establecemos el número de días del mes seleccionado.
for (var i = 0; i < numDiasMes[mesNum]; i++) {
document.getElementById("dias").options[i] = new Option(i+1);
}
}
}
Evidentemente, para que este código sea funcional deberemos tener en cuenta ciertos aspectos que no hemos tenido en cuenta para explicarlo, como por ejemplo, que el número de días del mes de Febrero cambie dependiendo del año, etc.
Introducción a CakePHP
Introducción
Las aplicaciones CakePHP bien escritas siguen el patrón de diseño de software MVC (Modelo-Vista-Controlador). Programar utilizando MVC consiste en separar la aplicación en tres partes principales. El modelo representa los datos de la aplicación, la vista hace una presentación del modelo de datos, y el controlador maneja y enruta las peticiones [requests] hechas por los usuarios.
CakePHP incluye las clases Controlador [Controller], Modelo [Model] y Vista [View], pero también incluye otras clases y objetos que hacen que el desarrollo en MVC sea un poco más rápido y agradable. Los Componentes [Components], Comportamientos [Behaviors], y Ayudantes [Helpers] son clases que proporcionan extensibilidad y reusabilidad; agregan rápidamente funcionalidad a las clases base MVC de las aplicaciones.
Su modo de funcionamiento es el siguiente:
- El usuario hace clic en http://nomeaclaro.wordpress.com/tasks/index
- Con ello, se buscará un controlador cuyo nombre de fichero será tasks_controller.php (sabemos que será ese controlador por la parte de la URL http://nomeaclaro.wordpress.com/tasks/index), y se llamará a la función index() definida en ese controlador (sabemos que es esa función por la parte de la URL http://nomeaclaro.wordpress.com/tasks/index).
- La función index() llamará al modelo Task, que hará una consulta a la Base de Datos.
- El resultado de esa consulta será devuelto al controlador cuyo nombre de fichero será tasks_controller.php
- El controlador pasará los datos a la vista, concluyendo su trabajo, para que ésta los integre en el layout HTML, generando así el código funete HTML final, que será mostrado en el navegador.
Esta forma de trabajar puede parecer complicada al principio, pero teniendo claros los conceptos principales sólo será cuestión de tiempo el llegar a la conclusión de que este sitema de trabajo nos facilitará la tarea de llevar a cabo una programacaión modular, ordenada, robusta y coherente.
El objeto form en JavaScript. Validación simple
Los formularios son la forma más utilizada para recoger información los usuarios en una página web. Éstos se construyen a partir de etiquetas HTML, aunque éste sólo proporciona la forma para crearlo, no la funcionalidad. Así que deberemos escribir una aplicación que procese el envío de información desde el ordenador cliente (usuario) al servidor.
<html>
<body>
<form>
<input type="text" name="nombre">
<input type="password" name="password">
<input type="submit" value="Conectar">
</form>
</body>
</html>
Lo que haremos ahora será desarrollar un script para validar la información introducida por los usuarios antes de que ésta sea enviada al servidor.
La información puede validarse de dos formas:
- A nivel de formulario: Cuando el usuario envíe la información (haga clic en “Enviar”).
- A nivel de elemento: Cuando un campo del formulario cambie su contenido.
A nivel de formulario
<html>
<head>
<script>
function validarFormulario(f) {
if (f.nombre.value == '') {
alert('Inserta tu nombre de usuario');
f.nombre.focus();
return false;
}
if (f.password.value == '') {
alert('Inserta tu contraseña');
f.password.focus();
return false;
}
return true;
}
</script>
</head>
<body>
<form onsubmit="return validarFormulario(this)">
<input type="text" name="nombre">
<input type="password" name="password">
<input type="submit" value="Conectar">
</form>
</body>
</html>
A nivel de elemento
<html>
<head>
<script language="javacript">
function ValidarNombreUsuario(elem) {
if (elem.value == "") {
alert("Inserta tu nombre de usuario");
elem.focus();
return false;
}
}
function ValidarPassword(elem) {
if (elem.value == "") {
alert('Inserta tu password');
elem.focus();
return false;
}
}
</script>
</head>
<body>
<form>
<input type="text" name="nombre" onchange="return ValidarNombreUsuario(this)">
<input type="password" name="password" onchange="return ValidarPassword(this)">
<input type="submit" value="Conectar">
</form>
</body>
</html>


