Archive for mayo, 2009
¡¡Cumplimos un añito!!
Pues hoy hace un año de la primera entrada que puse en mi blog, mi pequeña presentación.
Hoy un año después hago un pequeño análisis de este primer año de Tus ceros y Mis Unos.
En primer lugar, decir que estoy bastante satisfecho del camino recorrido. Me propuse crear el blog para obligarme a seguir aprendiendo, para mejorar mi visibilidad como profesional y para devolver a la comunidad parte de lo aprendido de ella. En general creo que mis expectativas al respecto se han cumplido.
En su día pensaba mantener un ritmo de una o dos entradas semanales, lo que evidentemente no he cumplido. Sin embargo he publicado 37 entradas en total (aunque 3 ó 4 de avisos o generalistas) todas de factura propia que siempre tienen más trabajo que traducir o enlazar a entradas en inglés (en si día contaba con traducir de vez en cuando).
En cuanto a datos de acceso, pues también estoy contento, ya que parece que mi esfuerzo le es útil a otras personas. Tengo un promedio entre 60 y 80 visitas diarias con un record de 161 visitas en un día y 12.987 visitas totales. No tengo ni idea sobre los datos de otros blogs de temática similar, pero para mí cumple mis expectativas.
En cuanto a temas, CakePHP y OSGi se han llevado la palma.
Para el futuro intentaré seguir el ritmo de una entrada semanal. Los temas seguirán en la línea de lo ya publicado, seguiremos ampliando algunos temas y descubriremos cosas nuevas (según se me vaya presentando).
Por último daros las gracias a todos los que visitáis tus Ceros y Mis Unos, ¡permaneced a la escucha!.
Formulario AJAX en CakePHP
En esta nueva entrada dedicada a CakePHP voy a explicar cómo utilizar un poco de AJAX en nuestra aplicación. AJAX realiza peticiones al servidor en segundo plano, por lo que partes de la página se pueden ir refrescando sin tener que recargar la página entera.
Voy a utilizar el ejemplo del gestor de enlaces que ya tenía en marcha en anteriores entradas de CakePHP en Tus Ceros Y Mis Unos. En concreto voy a facilitar el agregar nuevos enlaces pasando el formulario de añadir enlace a la página principal, de forma que al completar dicho formulario se refresque en el listado sin recargar la página completa.
El ayudante («helper») de AJAX en CakePHP utiliza las librerías JavaScript script.aculo.us y Prototype. Nos descargamos la última versión estable de script.aculo.us (la 1.8.2 en el momento de escribir esta entrada) ya que incluye Prototype. Copiamos tanto el fichero de Prototype (en lib dentro de la carpeta de script.aculo.us) como todos los ficheros propios de script.aculo.us (en src) a la carpeta de JavaScript de nuestra aplicación CakePHP: /app/webroot/js
.
Insertamos en la plantilla por defecto de nuestro sitio web (/app/views/layouts/default.thtml
) una línea para que CakePHP sepa dónde insertar los scripts posteriormente. La línea es <?php echo $scripts_for_layout ?>
al igual que teníamos <?php echo $content_for_layout ?>
que indicaba dónde insertar el contenido:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>TCYMU CakePHP Gestión de Enlaces</title> <?php echo $scripts_for_layout ?> </head> <body> <h1>Tus ceros y mis unos</h1> <h2>Gestión de enlaces</h2> <?php echo $content_for_layout ?> <h3>TCYMU por Miguel Orbegozo</h3> </body> </html>
Ahora es el momento de modificar el controlador de nuestra aplicación. Primero enumero los cambios y luego muestro el código completo. Las modificaciones son las siguientes:
- Definimos la variable
helpers
con los ayudantes que se utilizan. Si no sobrescribimos la variable se incluyen el de HTML y el de formularios. Además queremos añadir el de JavaScript y el de AJAX.
var $helpers = array('Html', 'Form', 'Javascript', 'Ajax');
- Modificamos la función
add
, ya que ahora responderá a una petición AJAX. Lo que hacemos tras insertar el contenido del formulario (exactamente igual que antes) es obtener la lista de enlaces (igual que en la funciónindex
) y mostrar la vistaindex
, con la particularidad de que le pasamos el parámetro'ajax'
para que sepa que es una respuesta a una petición AJAX.
<?php class LinksController extends AppController { var $name = 'Links'; var $helpers = array('Html', 'Form', 'Javascript', 'Ajax'); function add() { if (!empty($this->data)) { if ($this->Link->save($this->data)) { //$this->flash('Enlace añadido.','/links',3); } } $this->set('links', $this->Link->findAll()); $this->render('index', 'ajax'); } function index() { $this->set('links', $this->Link->findAll()); } } ?>
Ahora modificaremos la vista de nuestra página de inicio (/app/views/links/index.thtml
). Como antes primero se enumeran los cambios para después ver el código en su totalidad.
- Añado las librerías JavaScript mediante el método de AjaxHelper
link
.
<?php
echo $javascript->link('prototype.js',false);
echo $javascript->link('scriptaculous.js?load=effects',false);
?>
Dos pequeños detalles. El segundo parámetro hace que se añadan en la cabecera (en$scripts_for_layout
que definimos antes). Al ponerscriptaculous.js?load=effects
hacemos que sólo se carguen los scripts de efectos, ya que si sólo hubiéramos puestoscriptaculous
carga todos los ficheros de script.aculo.us - La lista de enlaces la vamos a situar en un
div
con un identificador determinado, ya que esta será la parte que se refresque tras la petición AJAX. Lo creamos mediante el ayudante de AJAX y sus métodosdiv
ydivEnd
.
<?php echo $ajax->div('links'); ?>
...
<?php echo $ajax->divEnd('links'); ?> - Sustituimos el enlace que nos llevaba a la página de añadir enlace por el formulario que aparecía en esta página.
- Sustituimos la creación del formulario. En lugar de utilizar el método
form
del ayudante de formularios utilizaremos el métodoform
pero del ayudante de AJAX. A este método se le pasa la función del controlador, el tipo de envío («get» o «post») y un array de opciones en el que enupdate
le indicamos eldiv
que debe refrescar.
echo $ajax->form('/add', 'post', array('update' => 'links'));
<?php echo $javascript->link('prototype.js',false); echo $javascript->link('scriptaculous.js?load=effects',false); ?> <h1>Enlaces disponibles</h1> <?php echo $ajax->div('links'); ?> <?php foreach ($links as $link): ?> <p> <a href="<?php echo $link['Link']['url']; ?>"><?php echo $link['Link']['title']; ?></a></p> <p>Añadido: <?php echo $link['Link']['created']; ?></p> <ul> <?php foreach ($link['Comment'] as $comment): ?> <li><?php echo $comment['comment'] . ' (' . $comment['created'] . ')'; ?></li> <?php endforeach; ?> <li><?php echo $html->link('Añadir comentario', '/comments/add/' . $link['Link']['id']);?></li> </ul> <?php endforeach; ?> <?php echo $ajax->divEnd('links'); ?> <h2>Añadir enlace</h2> <?php echo $ajax->form('/add', 'post', array('update' => 'links')); echo $form->input('title', array('label' => 'Nombre', 'error' => __('Titulo no valido', true))); echo $form->input('url'); echo $form->submit('Añadir',array('escape'=>false)); echo $form->end(); ?>
Con estos cambios ya se actualizará nuestra lista de enlaces tras rellenar el formulario y sin recargar la página. Misión cumplida.
Comentarios recientes