Mi primera aplicación CakePHP (1)

1 julio 2008 at 9:36 am 40 comentarios

Tras hacer una presentación y ver su instalación, empezaremos a realizar una aplicación de ejemplo utilizando CakePHP. Me he decidido a empezar un gestor de enlaces al estilo de delicious o mister wong.

No voy a utilizar algunas utilidades de CakePHP como la herramienta de línea de comando bake (a la que espero dedicar una entrada en el futuro).

Lo primero que hacemos es crear una tabla en la base de datos para nuestros enlace. Para ello entramos en phpMyAdmin con el usuario que creamos en el paso de instalación y creamos una tabla. Nos queda algo así:

Hay que destacar algunas características en la tabla creada:

  • El nombre de la tabla no es negociable. Es el plural (en inglés) del modelo al que representa.
  • La clave primaria id es obligatoria. El nombre tampoco es negociable.
  • El campo created también es de nombre fijo.

En general estas limitaciones son salvables, pero si seguimos el estándar de CakePHP será todo más sencillo y ahorraremos líneas de código.

Lo primero creamos el modelo (por convención lo guardamos en app/models como link.php):

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

	var $validate = array(
        'title' => array(
            'rule' => array('maxLength', '30'),
            'allowEmpty' => false,
            'message' => 'Titulo no valido'
		),
        'url' => array(
			'rule' => 'url',
            'required' => true,
            'message' => 'Debe introducir un email correcto'
		)
    );
}

Como podemos ver, un modelo en principio es bastante sencillo. La parte que más líneas acapara es la validación, una de las facilidades que nos aporta CakePHP. En este caso, al título le damos una longitud máxima y a la url le forzamos a que sea una url 🙂 .

Ahora vamos con el controlador (igualmente por convención lo guardamos en app/controllers como links_controller.php):

class LinksController extends AppController {

	var $name = 'Links';

	function add() {
		if (!empty($this->data)) {
			if ($this->Link->save($this->data)) {
				$this->flash('Enlace añadido.','/links');
			}
		}
	}

	function index() {
		$this->set('links', $this->Link->findAll());
	}
}

El controlador probablemente sea la parte más compleja de nuestra aplicación. En este caso hemos definido dos acciones, una que hemos llamado index (acción por defecto de ese controlador) que nos mostrará todos los enlaces y add que nos permitirá añadir un enlace. Destacamos los siguientes puntos:

  • Con !empty($this->data) comprobamos si hemos recibido el formulario de añadir enlace con información.
  • Cuando se hace referencia a $this->Link, estamos haciendo referencia al modelo, y utilizamos sus métodos, tanto para guardar un nuevo enlace (save) como para recuperar los enlaces existentes (find('all')).
  • Con $this->set() le pasamos información a la vista correspondiente.
  • $this->flash() es un método bastante utilizado en CakePHP para hacer una transición a otra página tras mostrar un mensaje.

Por último necesitaremos dos vistas, una por cada acción del controlador. Ambas las pondremos en app/views/links y serán add.thtml e index.thtml. Primero vemos el index:

<h1>Enlaces disponibles</h1>
<?php foreach ($links as $link): ?>

<a href="<?php echo $link&#91;'Link'&#93;&#91;'url'&#93;; ?>"><?php echo $link&#91;'Link'&#93;&#91;'title'&#93;; ?></a>

Añadido: <?php echo $link&#91;'Link'&#93;&#91;'created'&#93;; ?>
<?php endforeach; ?>

<?php echo $html->link('Añadir enlace', '/links/add');?>

Destacamos la utilización de $links suministrado por el controlador mediante el método set(). También la utilización del Helper html, en este caso para crear un enlace ($html->link()).

Y finalmente la vista de añadir:

Añadir
<?php
echo $form->create('Link');
echo $form->input('title');
echo $form->input('url');
echo $form->end('Agregar');
?>

Aquí destacamos la utilización del Helper de formularios, para la creación de todos los elementos del formulario.

Si ahora apuntamos nuestro navegador al proyecto CakePHP y añadimos /links/ al final de la ruta (en CakePHP una ruta /controller/action hace referencia al controlador controller método action) nos dirigimos a la acción por defecto del controlador links y obtenemos:

Destacamos algunas cosas:

  • El diseño de cabecera y pie nos lo ha colocado CakePHP. Esto lo modificaremos creando un layout en /app/views.
  • En la parte inferior nos aparece información sobre las querys ejecutadas. Esto se debe al nivel de debug que tenemos seleccionado. Mientras desarrollamos yo aconsejo no cambiarlo. Para un sitio en producción lógicamente pondremos el nivel a 0.
  • Tenemos un enlace que apunta a la acción add del controlador links (/links/add).
  • La lista de enlaces está vacía. Claro, ¡CakePHP tampoco hace magia!.

Si pinchamos en el enlace de añadir, vemos nuestro formulario de añadir:

Podemos hacer algunas pruebas de la validación que CakePHP nos aporta y que nosotros hemos indicado en el modelo (incluido el mensaje que aparece). Cuando finalmente introducimos unos valores válidos llegamos a:

Esta es la pantalla que nos ha generado el $this->flash() que vimos en el controlador. Su funcionamiento también depende del nivel de debug. En el nivel de desarrollo, el mensaje que aportamos es un enlace a la ruta también indicada en $this->flash().

Finalmente ya tenemos el listado de enlaces con contenido:

En la siguiente entrada de esta serie, continuaremos con nuestro gestor de favoritos: solucionaremos algunas pegas que han aparecido hasta ahora, añadiremos comentarios sobre los enlaces de la lista y alguna cosa más.

¡Manteneos en línea!

Actualización: Segunda parte

Anuncios

Entry filed under: PHP. Tags: , .

Blueprint: CSS sencillo Joda Time: rediseñando las librerías de fechas en Java

40 comentarios Add your own

  • 1. RubenijE  |  11 julio 2008 en 1:32 am

    Impresionante lo facil que puede ser hacer un administrador de contenido.

    Muy bueno el articulo.

  • 2. Miguel  |  11 julio 2008 en 9:16 am

    Gracias por tu comentario. Estoy preparando una segunda parte que espero que también te guste.

  • 3. La abuela  |  14 julio 2008 en 11:14 pm

    Buenas quisiera saber si pueden ayudarme.
    Siguiendo tu tutorial me da el siguiente error:
    http://localhost/cake_1.1.19.6305/links/add

    Añadir
    Notice: Undefined variable: form in /var/www/cake_1.1.19.6305/app/views/links/add.thtml on line 3

    Fatal error: Call to a member function create() on a non-object in /var/www/cake_1.1.19.6305/app/views/links/add.thtml on line 3

  • 4. Miguel  |  17 julio 2008 en 7:49 am

    Hola la abuela, perdona, pero hasta hoy no había visto tu comentario porque se había marcado como spam.

    El error se puede deber a que en esta entrada se ha utilizado la versión 1.2 de CakePHP (en el post de instalación también).

    Las diferencias entre ambas versiones son bastantes, y se recomienda la utilización de la versión 1.2 aunque siga marcada como Release Candidate.

    Prueba con la 1.2 y me cuentas.

    Por cierto, gracias por leerme. 🙂

  • […] Agosto 2008 Continuando con lo visto en la primera parte de la entrada, vamos a solucionar algunas pequeñas pegas de nuestra […]

  • 6. Jordi  |  23 octubre 2008 en 12:21 pm

    Hola,

    Estoy aprendiendo a utilizar el CakePHP y estoy investigando sitios en Internet que hablan de él. Encontré este sitio y he seguido este post para crear el ejemplo: ¡funciona!, y me mantendré en línea. Por cierto, estoy documentando, por decirlo así, mi proceso de aprendizaje en http://www.tutorialcakephp.wordpress.com.

    Tengo varias dudillas:

    1. ¿Alguien sabe cómo funciona “la magia” de la validación de los datos, en CakePHP? ¿Por qué, cuando se declara el atributo $validate, en la clase Link, todo funciona? ¿Quién se encarga de esto?

    2. En algunos sitios hablan más bien que en otros de CakePHP: ¿qué fama creéis que se merece este framework? Estaría bien contar con alguna comparación entre los disponibles…

    ¡Un saludo a todos! Nos leemos.

  • 7. Miguel  |  23 octubre 2008 en 1:17 pm

    Hola Jordi, gracias por tu comentario. Ya he visitado tu página y te digo lo mismo: me mantendré en línea.

    Respecto a tus dudas:

    1. La magia se lleva a cabo en la función invalidFields de Model. Se puede consultar fácilmente a través del API de CakePHP y siempre resulta instructivo.

    2. Mi opinión es que utilizar cualquier framework que nos facilite algo las tareas siempre tiene algo de coste en rendimiento. Si yo pienso hacer un sitio con cientos de miles de visitas, seguramente tendré que optimizar código, ya utilice CakePHP o PHP a secas. Eso siempre costará más si utilizo algo que no entiendo como funciona. Por ello cuanto más se usa CakePHP (o cualquiera) más se debe conocer sus tripas.

    Un saludo y nos leemos.

  • 8. Jordi  |  23 octubre 2008 en 5:08 pm

    Hola Miguel,

    Es la primera vez que entro en el API de CakePHP y acabo de ver el código del método invalidFields… Vaya tela. Por cierto, y hablando de APIs, me acabas de recordar que tengo que ver cómo se trabaja con la de Google Maps en Cake.

    Un saludo y nos leemos!

  • 9. Jordi  |  27 octubre 2008 en 3:41 pm

    Hola,

    Tengo una dudilla que está un poco fuera de este ejemplo (o no, no lo sé). Imaginaos que queremos grabar los datos de un usuario pero en varios pasos: en el primer paso, preguntamos al usuario por su nombre y apellido; en el segundo paso, preguntamos al usuario, en una pantalla nueva, su dirección de correo y su contraseña; finalmente, en una tercera pantalla, preguntamos al usuario por su dirección y teléfono.

    Pues bien: ¿cómo se hace esto?, jeje. La magia de Cake está hecha de tal forma que cada vista se asocia a una acción del controlador, pero, en este ejemplo, tenemos 3 vistas distintas para la acción añadir. ¿Cómo se arma esto?

    Muchas gracias y un saludo

  • 10. Miguel  |  27 octubre 2008 en 3:58 pm

    Buenas Jordi, pues como dices no se puede hacer de forma ultrasencilla. Se podría ir guardando en la sesión y sólo grabar en el último paso o alguna otra estrategia.

    De todas maneras he visto este componente para wizards que te puede ser útil (aunque yo no lo he probado).

  • 11. tutorialcakephp  |  29 octubre 2008 en 7:35 pm

    Buenas Miguel,

    De momento no me atrevo a probarlo; cuando tenga algo de tiempo a ver si lo hago y te cuento.

    Al final he ido guardando variables de sesión, y he definido varias vistas para varios métodos de un mismo controlador. Al final, cada método hace la siguiente llamada:

    $this->render(‘vista’,’layout’);

    Es decir, presenta su vista y su layout correspondiente. Yo lo he hecho así, vaya, con esta llamada al final de cada acción. ¿Sabes Miguel si esta es la forma correcta de hacer esto?

    Muchas gracias y estamos en línea!

  • […] vamos a servir de la aplicación que desarrollamos en “Mi primera aplicación CakePHP” (parte 1 y parte 2), que era un pequeño gestor de enlaces. Empezamos con el scaffolding, que podemos […]

  • 13. Emmanuel  |  19 febrero 2009 en 8:35 pm

    hola miguel! soy nuevo en cake, y necesito realizar un sistema de ABM, simple, solo 3 tablas relacionadas.
    Tendrias algun ejemplo de como hacerlo???
    Gracias!!

  • 14. Miguel  |  19 febrero 2009 en 8:51 pm

    Lo siento Emmanuel pero no tengo ningún ejemplo así. En principio dependería de cómo se relacionaran las tablas.

    Por cierto, ¿ABM es Agent Based Model?

    Gracias por leerme y si te puedo ayudar en algo (un poco más concreto si es posible 🙂 ) no dudes en preguntar.

  • 15. Emmanuel  |  21 febrero 2009 en 7:11 pm

    Miguel: Si, la verdad no fui muy claro. ABM es; Altas-Bajas-Modificaciones.
    Ya cree la base de datos, son 3 tablas (clientes-habitaciones – reservas)
    Los campos son; CLIENTES: Id – nombre – tel – numero_de_hab – fecha_ingr – fecha_salida
    HABITACIONES: id- tipo – precio – estado
    RESERVAS: id_clien – num_habitacion – fecha_ingr – fecha_salida

    Las relaciones serian: * 1 cliente puede tener muchas reservas
    * 1 Habitacion tiene 1 cliente
    * 1 Habitacion tiene estado libre, ocupada o reservada.

    Eso seria basicamente lo que tengo, de alli surgen mis dudas, de como realizar consultas a la Base de Datos, como asi tambien, agregar, eliminar o modificar registros de la misma.

    Espero ser un poco mas claro y me puedas dar una mano…
    Desde ya muchas gracias!

  • 16. Miguel  |  23 febrero 2009 en 4:10 pm

    Hola de nuevo Emmanuel.

    Entonces ABM es lo que se viene llamando en inglés CRUD (Create, Read, Update, Delete).

    Mi consejo sería que crearas tu BBDD siguiendo las convenciones CakePHP.

    Después puedes crear los modelos usando bake y crear un prototipo usando scaffolding.

    Para realizar todas las consultas a BBDD ten en cuenta que si los modelos y tablas están correctamente relacionados CakePHP te devolverá el resultado esperado, es decir, que si haces un find de reservas tendrás automáticamente todos los datos del cliente y la habitación.

    Espero que te ayude. No dudes en seguir preguntando tus dudas.

  • 17. Guille  |  21 abril 2009 en 12:02 pm

    Muy bueno el blog, felicitaciones!
    consulta:
    En la clase “LinksController” con la funcion flash() puedo hacer que luego de unos segundos despues de mostrar el mensaje “Enlace Añadido” se redireccione a la pagina principal “/links”?

    muchas gracias.

  • 18. Miguel  |  21 abril 2009 en 1:19 pm

    Hola Guille muchas gracias por tu comentario.

    Flash hace exactamente lo que dices si el nivel debug está en cero (lo modificas en config/core.php en tu aplicación). Digamos que es el funcionamiento en producción.

    Le puedes pasar un tercer parámetro que es el tiempo en segundos que muestra el mensaje antes de redirigir (1 segundo por defecto).

    $this->flash('Enlace añadido.','/links');

    También le podrías modificar el layout del mensaje modificando flash.ctp.

  • 19. walter  |  2 mayo 2009 en 12:39 am

    Hice todos los pasos y cree todos los archivos que describiste pero cuando voy a la dirección

    http://localhost/cake/links/add

    me sale el error: HTTP 404 No encontrado

  • 20. Miguel  |  4 mayo 2009 en 9:24 am

    Hola Walter,

    ¿la parte de instalación de CakePHP también la has hecho?.

    Ten en cuenta también que la parte “cake” de la url es el directorio de apache en el que tengo yo instalada mi aplicación. No sé si tú lo tendrás igual.

    Saludos y gracias por leerme.

  • 21. Billy Camacho  |  23 junio 2009 en 5:50 am

    Hi Miguel Ingresando al mundo de cakephp, me sale error Missing Controller
    Error: LinksController could not be found.
    Error: Create the class LinksController below in file: app\controllers\links_controller.php

    Que puede esta fallado??
    Gracias por la ayuda

  • 22. Billy Camacho  |  23 junio 2009 en 5:58 am

    Miguel, la perseverancia es una virtud, gracias de todos modos ya esta operativo
    Gracias

  • 23. Miguel  |  23 junio 2009 en 8:30 am

    Hoila Billy, ¡no me has dado tiempo ni a mirarlo!.

    Me alegro que te funcione. Gracias por tu comentario.

  • 24. Adlonie  |  4 septiembre 2009 en 2:59 pm

    Hola Miguel,
    Queria hacerte una pregunta general sobre frameworks, puesto que salta a la vista que entiendes bastante del tema.

    Es la primera vez que hago un portal Web comercial, pero si tengo experiencia en Ingenieria del software. He creado mi marco de trabajo siguiendo el patron MVC; las clases html llaman a ajax (prototype), y estas a scripts php que utilizan PHP OO (clases del modelo) Por otra parte tengo acceso a BD con el patron de acceso a datos y el factoria

    Me han recomendado utilizar cake php. Le he estado echando un vistazo y me resulta muy pero que muy tedioso. ¿Merece la pena aprenderlo? ¿Se puede hacer aplicaciones de calidad sin utilizar frameworks? ¿Tu que opinas?

  • 25. Miguel  |  5 septiembre 2009 en 6:15 pm

    Muchas gracias por tu comentario Adlonie.

    Mi opinión es que por supuesto que se pueden realizar aplicaciones de calidad sin utilizar ningún frameworks. De hecho parece que tu aplicación está bien pensada.

    Un framework te aporta un diseño bien pensado (como Cake PHP) y una implementación que sabes que prueba mucha gente y que está en revisión constante.

    Pero también te ata en algunos aspectos y realizar algunas tareas “sencillas” se puede complicar bastante al relizarlas dentro del framework.

    Si tienes ya la base de tu aplicación yo seguiría sin utilizar Cake, pero mirar un poco Cake te puede ayudar con ideas de diseño e implementación y a lo mejor te animas a utilizarlo en tu próxima aplicación.

    Un saludo y espero que te sirva de ayuda.

  • 26. Juan  |  1 febrero 2010 en 6:39 pm

    Hola soy nuevo en esto.. hice lo que explicas pero me sale este error:

    The view for LinksController::index() was not found.

  • 27. Miguel  |  2 febrero 2010 en 12:07 am

    Hola Juan,

    lo que no te está encontrando es la vista index de links. En principio si tienes el index.thtml en app/views/links debería encontrarla. Asegúrate de la ruta.

    Otra cosa que se me ocurre es que en las últimas versiones de Cake la extensión de las páginas ha pasado a ser ctp (por Cake Template). Puedes probar a modificarlo o utilizar una versión anterior de Cake.

    Saludos y espero que lo soluciones.

  • 28. [dude]  |  5 febrero 2010 en 5:49 pm

    Muy util el post, para los que necesitan algun empujon para aprender cake….
    Al realizar la prueba tengan cuidado con la codificacion de los archivos, si lo cargas en modo ANSI, funciona todo menos la generacion del link ($html->link). cosa rara…en realidad la “ñ” de añadido generaba el problema, claro por la codificacion de los archivos…en fin…
    muy buen aporte
    saludos

  • 29. Leandro Falanga  |  27 mayo 2010 en 11:50 pm

    Muy bueno el post, conciso y claro. Aunque todavia no lo pude hacer andar. Tenes alguna sugerencia para este error?

    Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘findAll’ at line 1 [CORE/cake/libs/model/datasources/dbo_source.php, line 666]

    Tenia otro error referente al “index.ctp” pero creando el archivo pude resolverlo. Pero con el otro no encuentro nada.

    Te agradezco si podes ayudarme.

    Saludos!

  • 30. Miguel  |  28 mayo 2010 en 8:40 am

    Pues tiene pinta de ser debido a la versión de CakePHP que usas (el ejemplo se hizo con CakePHP 1.2)).

    En la versión 1.3 la llamada sería: find('all')

    Espero que te ayude y gracias por tu comentario.

  • 31. Leandro Falanga  |  28 mayo 2010 en 8:21 pm

    Gracias Miguel.

    Cambie el codigo y fue como por un tubo!

    Muchas gracias.

  • 32. guille  |  30 mayo 2010 en 12:09 am

    hola a todos! se me desactivaron los carteles de session flash.. que puede ser? alguna pista?? probe con el core en 0 y 2 pero nada.. help!

  • 33. RicardoCanarias  |  13 octubre 2010 en 7:35 pm

    Hola, esta mal explicado y hay errores en el código. Hombre tiene su merito escribir un manual, eso no te lo quita nadie, pero al comenzar es muy dificil entender como funciona… Gracias de todas maneras

  • 34. Miguel  |  14 octubre 2010 en 8:21 am

    Bueno Ricardo lo de que está mal explicado no te puedo rebatir, para gustos los colores.

    El código en su día era completamente funcional, pero puede ir quedando obsoleto (en los comentarios 29 a 31 puedes ver que en versiones más recientes de CakePHP había que cambiar alguna llamada).

    Algún día puede que vuelva a escribir la entrada con la última versión de CakePHP, pero me temo que la forma de contarlo será muy parecida.

    De nada y gracias por comentar.

  • 35. Alfredo  |  18 enero 2011 en 5:19 am

    Hola, estoy tratando de aprender cake, encontre tu tutorial pero no logro hacerlo funcionar, al abrir el index.thtml me sale esto:

    Enlaces disponibles
    Añadido: link(‘Añadir enlace’, ‘/links/add’);?>

    Y al abrir el add.thtml me sale el codigo:

    Añadir
    create(‘Link’);
    echo $form->input(‘title’);
    echo $form->input(‘url’);
    echo $form->end(‘Agregar’);
    ?>

    Para abrir los enlaces navego hasta:
    http://localhost/html/cake_1_3/app/views/links/

    ¿Que puedo estar haciendo mal? Por cierto uso cake 1.3

    Gracias
    Que puedo estar haciendo mal?

  • 36. Miguel  |  18 enero 2011 en 9:28 am

    Pues Alfredo, siento no poder ayudarte en este momento.

    Lo que estoy pensando es en reescribir esta entrada utilizando CakePHP 1.3 ya que hay algunos cambios de sintaxis que dejan a este tutorial algo obsoleto.

    Un saludo y gracias por leerme.

  • 37. freddy  |  21 febrero 2012 en 1:04 am

    No me funciona!!

  • 38. Gastón Gutiérrez  |  13 junio 2012 en 5:08 am

    vaya que hay cambios, definitivamente el add no funciona y no se como hacerlo andar… me está pareciendo una soberana perdida de tiempo este cake…

  • 39. celeste  |  18 enero 2016 en 12:58 am

    Que versión utiliza en este tutorial? estoy usando la 1.3.19 y me salen algunos errores a la hora de hacer el findAll. Hice todo como en el tutorial la tabla y copie el cogido y no se donde esta mal. Saludos!

  • 40. celeste  |  18 enero 2016 en 1:03 am

    Si era la versión por lo que no fallaba, ahora continuo con la segunda parte :D. Muy buen aporte apenas voy conociendo Cake!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Mi perfil

View Miguel Orbegozo's profile on LinkedIn

Feedjit

Feeds

Otros…

BlogESfera Directorio de Blogs Hispanos - Agrega tu Blog

Bitacoras.com

Add to Technorati Favorites


A %d blogueros les gusta esto: