martes, 31 de agosto de 2010

Feliz día del blog!


Sí, hoy es el día internacional del blog. Es un día especial, en el que no hablaré de cuestiones técnicas, es día de celebración.

El día del blog se celebra cada 31 de agosto, desde el año 2005, y se debe a la similitud de la fecha "3108" y la palabra blog. La ocurrencia se la debemos al blogger israelí Nir Ofir, que por supuesto hoy tiene twitter, y lo pueden seguir por: @nirofir.

Existe un sitio oficial para la celebración de este día: www.blogday.org. En español, podemos visitar www.diadelblog.com.

¿Qué se supone que hagamos los blogueros el día de hoy? Compartir, difundir. La idea es hacer llegar a quienes los leen, los blogs que nosotros leemos y que creemos que todo el mundo debe leer. Pues bien, es lo que haré ahora. Voy a recomendar algunos de los blogs que sigo con mayor atención.



El primer blog que voy a recomendar es uno muy muy famoso, de la gente de hipertextual, se trata de alt1040. Como ellos mismos se definen, son "la guía del geek". Seguro que alguna vez hemos visto alguna de sus entradas. Una redacción simple e impecable, muy agradable de leer.



Mi segunda recomendación va para kirai, otro de los infaltables en mis feeds. Un blog obligado para los amantes de la cultura japonesa. Excelente redacción y grandiosas imágenes.



Recomiendo también a la gran bloggera Yoani Sánchez y su Generación Y. Quienes la leemos (también por twitter: @YoaniSanchez) sabemos todo el esfuerzo que signifca para ella publicar una simple entrada, en un país donde la libertad de expresión básicamente no existe. Valiente mujer que narra día a día su vida en la verdadera Cuba.



Otro imperdible es el blog Google Operating System. Simplemente genial. En un solo blog tenemos todo lo que tenga que ver con la gente de Google. Como ellos mismos lo aclaran, es un blog no oficial, pero siempre actualizado con el mejor contenido.



Por último, recomiendo seguir a Blog de Series. Para los amantes de las series (como yo) es una excelente fuente de información, nos mantienen al día con todo lo que acontece con nuestras series favoritas. Un excelente blog, con información de calidad.


No me queda más que desearles a todos FELIZ DÍA DEL BLOG


martes, 24 de agosto de 2010

Botón oficial de Twitter


Bueno, hoy voy a apartarme un poco de lo que hemos venido haciendo con twitter y kumbia, para hablar acerca de los recientemente lanzados botones oficiales de twitter. Seguramente si estás en esto de twitter y desarrollar aplicaciones para twitter al menos te habrás enterado de su existencia (si no, es momento de que revises tus feeds).

Para qué sirven?

Sirven para compartir enlaces a través de twitter. Digamos que tenemos un blog interesante, con entradas interesantes, que presumimos que nuestros lectores les gustaría compartir con el mundo a través de twitter. Bien, el lector interesado podría copiar la URL, pasarla por un acortador de direcciones, copiar la dirección corta, pegarla en twitter, copiar el título de la página web, pegarlo en twitter, eventualmente añadir algún comentario y finalmente twittear.

Twitter ahora le ahorra a esos lectores todo este proceso, al permitirnos a nosotros colocar un botón, que con sólo presionarlo, twitteará el enlace por el lector. Simple.

Cómo lo coloco en mis páginas web?

Es muy muy simple. Twitter habilitó esta url donde podemos personalizar como queremos que se vea nuestro botón y nos da el código HTML para que lo insertemos en donde queramos. El sitio nos permite personalizar el botón y (opcionalmente) especificar uno o dos usuarios de twitter que recomendamos para seguir (básicamente, en nuestro tweet se verán como un mention 'via').

Es así de sencillo. Una vez colocado el código HTML en nuestra página, cuando un lector lo oprima, se levantará un pop-up donde nos saldrá el texto que se va a twittear (el cual podremos editar) y el botón para enviarlo.


JavaScript?

Sí, el botón trabaja sobre JavaScript, por lo que si lo que queremos es insertarlo en un foro o cualquier plataforma que bloquee scripts, simplemente NO servirá. Qué podemos hacer entonces?

Bueno, fijándonos un poco en como funciona esto, veremos que a la final lo que el pop-up hace una vez presionado el botón de tweet, es redireccionar a una página web. No hace falta ser un genio para darse cuenta esa url a la que redirecciona el pop-up la podemos colocar en un enlace común y silvestre en HTML. El enlace se ve así:

<a href="http://twitter.com/share?url=URL&text=TEXTO&via=BLOG&related=AUTOR">Twittear</a>

En donde:
  • URL es la url que queremos recomendar en el tweet.
  • TEXTO es el texto que queremos que aparezca en el tweet.
  • BLOG es el nombre de usuario del primer twittero que queremos que aparezca recomendado.
  • AUTOR es el nombre de usuario del segundo twittero que queremos que aparezca recomendado.

Sólo hay que tener en cuenta que el TEXTO debe estar codificado, pues es parte de una URL. L gente de alt4040 sugiere este sitio para codificar nuestro texto.

Blogger/Wordpress

Si queremos que el botón aparezca en todas las entradas de nuestro blog, podremos copiar y pegar el código html en todas las entradas. Una forma más inteligente es agregar el código a nuestra plantilla.

Para Blogger, en nuestra plantilla debemos ubicar la clase post-footer y colocar allí el siguiente código (reemplazando BLOG y AUTOR por los correspondientes):

<a expr:href='"http://twitter.com/share?text=" + data:post.title + "&url=" + data:post.url + "&via=BLOG&related=AUTOR"'>Twittear</a>

Para wordpress, debemos ubicar el archivo single.php y allí colocar el siguiente código:

<a href="http://twitter.com/share?url=<?php echo urlencode(the_permalink()); ?>&text=<?php echo urlencode(the_title()); ?>&via=BLOG&related=AUTOR">Twittear</a>

Es todo. Nuestro enlace se verá así:


De más estás decir que si no queremos que se vea un texto, sino un botón, o que se vea con cierta apariencia, podemos hacerlo utilizando HTML como siempre lo hemos usado.


Leído en: alt1040


jueves, 19 de agosto de 2010

Construyendo un sitio con KumbiaPHP (4)


En esta entrada voy a hacer uso de la API de twitter para mostrar en una vista mi Timeline, a manera de práctica y a la vez introducir un par de aspectos de kumbia no tratados hasta el momento.

Voy a seguir utilizando el twitter_controller de la entrada anterior, lo que voy a hacer es agregarle una nueva función que llamaré timeline, y por supuesto, una vista para dicha función.

public function timeline()
{
if (empty(
$_SESSION['oauth_token']) || empty($_SESSION['oauth_token_secret']))
{
return
$this->route_to('controller: oauth', 'action: index');
}
else
{
Load::lib("twitter");
Load::lib("config");
$twitter = new Twitter(CONSUMER_KEY, CONSUMER_SECRET);
$twitter->setOAuthToken($_SESSION['oauth_token']);
$twitter->setOAuthTokenSecret($_SESSION['oauth_token_secret']);

$this->tweets = $twitter->statusesHomeTimeline();
}

}

El código es básicamente el mismo que el de la función update, hasta el punto en el que asignamos los Tokens de Acceso. La diferencia está en que aquí utilizamos la función statusesHomeTimeLine() y su resultado se lo asignamos a una variable denominada tweets. Esta función devolverá un arreglo con los datos de 20 tweets más recientes de nuestro TL. Por tanto, tweets será un arreglo de tamaño 20, en el que cada celda almacena un conjunto de variables con información del respectivo tweet.

¿Cómo saber qué información tengo en cada celda del arreglo? Consultando la API de twitter, en la cual encontramos abundante información sobre cada una de las funciones. En este ejemplo utilizaré algunos de los (muchos) datos que la API nos provee por cada tweet.

No hay más nada que hacer en nuestro controlador, el resto es cuestión de vistas. Creamos el respectivo timeline.phtml dentro del subdirectorio app/views/twitter y comenzamos a trabajar en nuestra vista. En nuestro controlador hemos creado una variable denominada tweets, con el arreglo de los últimos 20 tweets de nuestro TL, pues desde la vista tenemos pleno acceso a esta variable, es así de sencillo como pasamos información desde la capa de controlador hacia la capa de vista.

El resto es cuestión de decidir qué vamos a mostrar y cómo lo vamos a mostrar. En este caso, voy a introducir otro concepto de kumbia: los helpers, que son métodos de ayuda para la capa de Vista, por ejemplo para formatear fechas, insertar widgets, etc. Los helpers se almacen dentro del directorio app/extensions/helpers y tienen extensión .php.

En este caso, parece útil utilizar un helper para formatear un arreglo de tweets, de manera que si luego queremos imprimir un arreglo de tweets en otra vista, mantengamos el mismo formato y además no tengamos que volver a escribir el código. Voy a crear entonces un helper twitterHelper.php, en el cual de momento sólo tendrá una función, la que formatea el arreglo de tweets:

<?php
class twitterHelper
{

public static function
buildTL($tweets)
{
Load::lib("util");

$tabla = "<table>";

foreach(
$tweets as $tweet)
{
$tabla .= "<tr>";

$tabla .= "<td><img src=".$tweet['user']['profile_image_url']." height=48 width=48></td>";

$tweet_formateado = url_to_anchor($tweet['text']);
$tweet_formateado = tag_twitter_accounts($tweet_formateado);

$tabla .= "<td>".$tweet_formateado."</td>";

$tabla .= "</tr>";
}

$tabla .= '</table>';

echo
$tabla;
}
}

?>

Es código php planito, no hay mucho que explicar. Nuestra función recibe el arreglo de tweets, y devuelve la cadena html para insertar el TL formateado. Por cada tweet lo que voy a mostrar es el avatar del usuario y el texto. Repito que la respuesta de la API de twitter trae mucha información, sólo es cuestión de revisarla para ver que vamos a necesitar dependiendo de lo que queramos hacer.

Noten que para darle un poco de vistosidad a los tweets, estoy utilizando un par de funciones que transforman los @user en @user y que transforman las url que se encuentren en el texto en hiperlinks. Estas funciones están definidas en una biblioteca llamada util.php que invoco al principio, y que como ya hemos visto, debemos almacenar en el directorio app/libs. Muestro el contenido de este archivo a continuación:

<?php

// Transforma una url en el codigo HTML del anchor
function url_to_anchor($inputString)
{
$outputString = preg_replace('/(www\.)(\S+)/', 'http://\\1\\2', $inputString);
$outputString = preg_replace('/(\w+:\/\/)(\S+)/', '<a href="\\1\\2" target="_blank">\\1\\2</a>', $outputString);

return
$outputString;
}


// Anchoriza cuentas twitter
function tag_twitter_accounts($inputString)
{
return
preg_replace("/(\@)([a-zA-Z0-9\_]+)/", "@<a href=\"http://twitter.com/\\2\">\\2</a>", $inputString);
}

?>

Ya tenemos nuestro helper listo, ahora lo podremos utilizar en cualquier vista con cualquier arreglo de tweets. Vamos a crear la vista para timeline, para ver cómo se invoca:

<div class="textboxright">
<h2>Mi TL</h2>
<br>
<?php
View
::helpers('twitterHelper');

twitterHelper::buildTL($tweets);
?>

</div>

Como vemos, nuestra vista se simplifica enormemente. La forma de utilizar el helper es simple. Creo que ya ha quedado claro, pero recuerdo que en nuestra vista estamos utilizando la variable $tweets (es el argumento con el que invocamos a nuestro método buildTL()), la cual creamos en la capa de controlador.

Es todo por el momento. Espero que todo haya quedado claro.




miércoles, 18 de agosto de 2010

Construyendo un sitio con KumbiaPHP (3)


En la entrada anterior vimos un ejemplo sencillo en kumbiaPHP donde trabajamos con vistas, partials, algunos helpers (por ejemplo link_to()). En fin, un ejemplo sencillo para ir poniéndonos en contexto con kumbia.

Tal como prometí, en esta entrada vamos a comenzar a trabajar con controladores, además retomando nuestro objetivo que no es otro que el hacer aplicaciones para twitter. Vamos a realizar una aplicación en kumbia que se conecte a twitter y permita realizar actualizaciones de estado (similar a lo que hicimos en la entrada Un nuevo comienzo, pero ahora con kumbia y mejorando algunas cosillas).


¿Qué asumo?

Asumo que has ido leyendo las entradas y que por tanto tienes:
1) Una aplicación registrada en twitter
2) El ejemplo de la entrada anterior corriendo en tu servidor web

En lo que resta de entrada, voy a asumir que hemos llamado a nuestro directorio web 'tutuitero', tal como en la entrada anterior.


Manos a la obra

Lo primero que debemos hacer es copiar nuestra Twitter Class (el archivo twitter.php) dentro del directorio app/libs, pues éste es el directorio para almacenar todas las librerías externas a kumbia.

La versión actual de twitter.php tiene un bug, ya conocido por Tijs Verkoyen, que debemos reparar. No es nada del otro mundo, vamos a la línea 231 de twitter.php y sustituimos:

private function calculateHeader(array $parameters, $url)

por:

private function calculateHeader(array $parameters, $url=self::API_URL)

Por comodidad, también he guardado en el directorio app/libs el archivo config.php, que recordemos contiene el consumerKey/consumerSecret de nuestra aplicación y la url de Callback. Ya veremos como vamos a utilizar estos datos.


Creando nuestros controladores

Ahora procedemos a crear nuestros controladores. Lo que vamos a hacer es crear un controlador para manejar todo el asunto de la conexión a twitter con Oauth, que luego podamos invocar desde cualquier otro lugar. Para que queden claros los conceptos, voy a crear otro controlador desde donde vamos a hacer 2 cosas en principio: enviar actualizaciones de estado y ver nuestro timeline.

Comencemos entonces creando nuestro controlador oauth_controller.php, dentro de app/controllers. ¿Qué va a hacer nuestro controlador? Si recordamos lo publicado en la entrada Nuevo comienzo, para realizar una actualización de estado, teníamos una variable de la clase twitter, a la cual por decirlo de alguna forma, autorizábamos (con un Access Token) y luego sobre esa variable invocábamos una función que se utilizaba la API de twitter para realizar la actualización de estado.

Ahora vamos a tener posiblemente varias páginas que van a realizar diferentes tareas (en cada una tendremos al menos una instancia de la clase twitter), queremos tener almacenados en sesión los datos de conexión para utilizarlos en todo nuestro sitio, y no tener que autorizar cada vez que vayamos a hacer algo. Bien, nuestro oauth_controller será el encargado de esta tarea.

oauth_controller se encargará de verificar si están en sesión los datos de acceso, en caso de no estarlos, se conectará a twitter, pedirá autorización al usuario y una vez otorgada, almacenará los datos correspondientes en la sesión del navegador. Voy a colocar el código y luego explicaré los aspectos relevantes:

<?php
Load
::lib("twitter");
Load::lib("config");

class
OauthController extends ApplicationController {

protected
$consumerKey;
protected
$consumerSecret;
protected
$callBack;

public function
initialize()
{
$this->callBack = OAUTH_CALLBACK;
$this->consumerKey = CONSUMER_KEY;
$this->consumerSecret = CONSUMER_SECRET;
}

public function
index()
{

// crear instancia
$twitter = new Twitter($this->consumerKey, $this->consumerSecret);

// Si no tengo tokens de acceso
if (empty($_SESSION['oauth_token']) || empty($_SESSION['oauth_token_secret']))
{
// get a request token
$twitter->oAuthRequestToken($this->callBack);

// authorize
if((!isset($_GET['oauth_token'])))
$twitter->oAuthAuthorize();

// get tokens
$token = $twitter->oAuthAccessToken($_GET['oauth_token'], $_GET['oauth_verifier']);

$_SESSION['oauth_token'] = $token['oauth_token'];
$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];

}
else
{
$token['oauth_token'] = $_SESSION['oauth_token'];
$token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];
}

// set tokens
$twitter->setOAuthToken($token['oauth_token']);
$twitter->setOAuthTokenSecret($token['oauth_token_secret']);

}

}

Como vemos, el código se parece mucho a lo que hemos trabajado antes. Entre las cosas nuevas, tenemos la invocación de nuestras librerías, la cual se realiza mediante la función Load::lib(nombre_de_nuestra_biblioteca);

Luego nos conseguimos con la función initialize(), la cual es una función especial, que se ejecuta antes de invocarse el controlador. En este caso, la hemos utilizado para asignar los valores definidos en config.php.

Luego viene la función index(), en la cual tenemos nuestro algoritmo de verificación de credenciales, conexión a twitter y almacenamiento de credenciales.

Eso es básicamente nuestro controlador. Ahora veamos como sería la vista. Yo simplemente voy a colocar un mensaje que diga que la conexión ha sido exitosa y que muestre un enlace a nuestra página de actualización. Asumo que ya sabemos manejar vistas, pero para recapitular recordamos lo que hay que hacer: crear un subdirectorio oauth dentro de app/views, y dentro de este directorio creamos un archivo index.phtml (pues nuestro controlador sólo tiene una acción, y se llama index). El contenido de este archivo será el siguiente:

<div class="textboxright">
<h2>Conexi&oacute;n exitosa</h2>
<br>
<p>Se ha establecido una conexi&oacute;n exitosa con twitter, utilizando Oauth.</p>
<p><?php echo link_to('twitter/update/', 'Actualizar Estado') ?></p>
</div>

Acá estamos redireccionando hacia una vista que aún no hemos creado, nuestra vista de update. Si queremos probar nuestro oauth, podemos ir a la dirección:
http://localhost/tutuitero/oauth/

Lo que ocurrirá es que al cargar la página, el controlador se dará cuenta que no tenemos autorización, automáticamente redireccionará el navegador al sitio de twitter, y una vez obtenida la autorización nos redireccionará a la dirección del callback (yo en mi config.php he puesto la misma dirección, http://localhost/tutuitero/oauth/). Finalmente veremos el texto que colocamos en la vista, incluyendo el enlace al sitio que aún no hemos creado. Vamos a por él.


Nuestro segundo controlador

Ahora vamos a hacer nuestro segundo controlador. Dijimos que este controlador en un principio va a tener 2 funciones (y por tanto 2 vistas): una para enviar actualizaciones de estado a twitter y otra para ver nuestro timeline. Empecemos por la primera.

<?php
class TwitterController extends ApplicationController {

public function
update() {

if (empty(
$_SESSION['oauth_token']) || empty($_SESSION['oauth_token_secret']))
{
return
$this->route_to('controller: oauth', 'action: index');
}
else
{
Load::lib("twitter");
Load::lib("config");
$twitter = new Twitter(CONSUMER_KEY, CONSUMER_SECRET);
$twitter->setOAuthToken($_SESSION['oauth_token']);
$twitter->setOAuthTokenSecret($_SESSION['oauth_token_secret']);

if(
$this->request('twitter-msg'))
{
$twitter->statusesUpdate($this->request('twitter-msg'));
}

}

}

}
?>

El código se explica solo. Lo primero que verificamos es si en sesión tenemos nuestro Access Token, y de no ser así, utilizamos el helper router_to(), para redireccionar a oauth que se encargará del proceso de conexión a twitter. En caso de existir los tokens en sesión, invocamos nuestras librerías, creamos una instancia de la clase twitter y asignamos los tokens. Finalmente, utilizamos el método request(), para verificar si por get/post el controlador está recibiendo la variable 'twitter-msg', y en caso afirmativo, realizar la actualización a twitter, utilizando la función statusesUpdate().

Veamos ahora la vista:

<div class="textboxright">
<h2>Actualizar Status</h2>

<?= form_tag('twitter/update') ?>

<br>
<?= textarea_tag('twitter-msg', 'size: 80', 'rows: 2', 'cols: 60') ?>
<?= submit_tag('Update!') ?>

<?= end_form_tag() ?>

</div>

Aquí estamos creando un formulario con un textArea y un botón de submit. Importante que el nombre (primer parámetro) de nuestro textArea sea 'twitter-msg', pues este es el nombre que espera nuestro controlador.


Pequeña recapitulación

La entrada se ha vuelto un poco larga, por lo que voy a dejar la segunda parte de lo prometido (mostrar nuestro TL) para la próxima. Lo importante de esta entrada es que:
  1. Por primera vez hemos utilizado nuestros controladores para hacer algo.
  2. En nuestro controlador oauth_controller.php tenemos el algoritmo de conexión que probablemente utilizaremos sin necesidad de cambiar de ahora en adelante.
  3. Con nuestro 'update', por primera vez enviamos información desde la capa de Vista hacia la capa de Controlador, utilizando un formulario.
Más tarde, cuando mostremos nuestro timeline en una vista haremos lo contrario a lo que hicimos con 'update', pues, pasaremos información desde nuestro controlador hacia la vista.


Nota sobre los controladores y modelos

Desde que comencé a hablar de Kumbia, traté el tema de la flexibilidad y sencillez del framework. Hasta el momento no hemos hecho uso de la capa de Modelo, lo cual básicamente está mal, si estamos basándonos en una filosofía MVC. Sin embargo, hemos hecho cosas muy sencillas, y que luego podremos corregir si queremos apegarnos estrictamente a la teoría.

En breve espero estar haciendo pruebas con conexiones a bases de datos, y seguramente tocaré el tema de los modelos, y de por qué un modelo no es necesariamente una base de datos (también revisaré algunas de las cosas que hemos hecho violando las 'leyes' de la arquitectura MVC).

Espero que haya sido útil la entrada, y agradecido con cualquier comentario, duda o sugerencia.


domingo, 18 de julio de 2010

Construyendo un sitio con KumbiaPHP (2)


En la entrada anterior hice el más básico de los ejemplos en kumbia y una burda explicación de algunos de los aspectos más importantes del framework.

Tal como prometí, en esta entrada voy a trabajar un poco con las vistas y para no extender, dejaremos para la siguiente entrada un ejemplo más completo donde se intercambia información entre las capas de vista y controlador.

En primer lugar voy a comenzar trabajando un poco con los partials. Como explique anteriormente, aquí vamos a guardar códigos parciales como lo son el header o footer de nuestras plantillas. La idea es seccionar nuestro código para facilitar posteriores modificaciones.

Lo primero que haremos será crear un directorio no65 dentro del directorio views/partials. Aquí vamos a guardar los partials de nuestro tema no65.

Ahora comenzaremos a desarmar nuestro default.phtml y colocar cada sección en un partial distinto. En este caso, tenemos una plantilla clásica con: header, menú lateral, cuerpo y footer.

Voy a empezar por el footer. Creamos un archivo footer.phtml, y en el colocamos todo el código que se encuentra entre "Begin Footer" y "End Footer" de default.phtml, y lo borramos de ahí. En sustitución, en default.phtml colocaremos lo siguiente:

<!-- Begin Footer -->
<?php View::partial('no65/footer') ?>
<!-- End Footer -->

El archivo footer.phtml quedará de la siguiente forma:

<div id="footer">
<p><a href="http://validator.w3.org/">Valid CSS</a> :: <a href="http://validator.w3.org/">Valid XHTML</a></p>
<p>Copyright &copy; 2007 by Your Company</p>
<p>Template Designed By: <a href="http://web20templates.blogspot.com">Free Web 2.0 Website Templates</a></p>
</div>

Guardamos y recargamos la página en el navegador. Observamos que no hay ningún cambio, por lo que vamos por buen camino. Repetiremos lo mismo con el header y con el menú lateral. Así tendremos nuestro header, footer y menú lateral en archivos separados, lo cual facilitará la modificación de éstos por separado, y mayor legibilidad a nuestra plantilla.


Revisemos el cuerpo

El cuerpo de nuestra plantilla está compuesto actualmente por 3 divs tipo "textboxright": el que agregamos en la entrada anterior donde invocamos a View::content() y dos con códigos de ejemplo proporcionado por la plantilla.

Como no queremos mostrar los ejemplos de nuestra plantilla, lo que haremos será borrar los divs correspondientes, y para hacer más elegante nuestro código, nos llevaremos el "textboxright" donde se encuentra nuestro "Hola Twitter" al archivo hola.phtml. De esta manera dejaremos más limpio nuestro default.phtml, y además así podremos utilizar todos los textboxright que queramos dentro de nuestras vistas particulares.

El body de default.phtml quedaría así de elegante:

<body>

<!-- Begin Wrapper -->
<div id="wrapper">

<!-- Begin Header -->
<?php View::partial('no65/header') ?>
<!-- End Header -->

<!-- Begin Stripes -->
<div id="stripes">

</div>
<!-- End Stripes -->

<!-- Begin Left Column -->
<?php View::partial('no65/leftcolumn') ?>
<!-- End Left Column -->

<!-- Begin Right Column -->
<div id="rightcolumn">
<?php View::content(); ?>
</div>
<!-- End Right Column -->

<!-- Begin Footer -->
<?php View::partial('no65/footer') ?>
<!-- End Footer -->

</div>
<!-- End Wrapper -->

</body>

Demás está decir que debemos trabajar en nuestro header, footer y menú lateral, borrar lo que no necesitemos, agregar la data que nos haga falta. Cambiar el título, colocar un ícono, en fin, lo que queramos.


Tarea

En la entrada anterior colocamos nuestro archivo style.css directamente dentro de la carpeta public/css, e igual hicimos con nuestras imágenes. Si queremos mantener varios estilos, nuestros directorios css e img se van a llenar y luego no vamos a poder identificar con facilidad que archivo pertenece a cada estilo, en el caso de que necesitemos modificarlos. Lo mejor es incluir un directorio dentro css y otro dentro de img que identifique a nuestra plantilla, así como hicimos con los partials. Este cambio es bastante intuitivo, no tendrá mayor complicación.


Agregando otra plantilla

Ahora vamos a incluir en nuestro proyecto una segunda plantilla, para darnos cuenta de lo sencillo que será cambiar de una a la otra. Supongamos que nos bajamos la plantilla NonZero de http://nodethirtythree.com

A grandes rasgos, estos son los pasos que vamos a seguir:

1) Creamos nuestra plantilla nonzero.phtml dentro de views/templates

2) Creamos nuestro directorio de parciales views/partials/nonzero

3) Dentro del directorio de parciales incluiremos header.phtml, footer.phtml y en este caso un rightcolumn.phtml

4) Creamos nuestros directorios public/img/nonzero y public/css/nonzero y guardaremos en ellos los archivos correspondientes

5) Copiaremos el código de index.html de nonzero en nuestra plantilla nonzero.phtml

6) Cortar los trozos de código de nonzero.phtml y pegarlos en el partial correspondiente


Recordemos modificar la forma de llamar las imágenes y css. Recordemos también invocar a la función View::content() en el lugar correspondiente.

Si recargamos nuestro navegador, no habrá pasado nada, puesto que no hemos modificado la plantilla por omsión default.phtml. Lo que vamos a hacer es decirle a nuestro controlador saludo_controller que queremos utilizar la nueva plantilla; para ello, definiremos dentro de saludo_controller.php la variable template:

public $template = 'plantilla';

Ahora apuntamos a nuestro navegador y abrimos http://localhost/tutuitero/saludo/hola. ¿Qué estamos viendo? Estaremos en frente de nuestra nueva plantilla casi perfectamente renderizada. Y digo "casi", porque aunque el resultado general en este caso es muy bueno, recordemos que estamos utilizando dos hojas de estilo distintas y no estamos utilizando la misma convención de nombres de elementos en ambos.

Si queremos utilizar dos plantillas indistintamente, tendremos que trabajar un poco las hojas de estilo, para que utilicemos los mismos elementos en nuestras vistas.


Ejercicio sencillo

Vamos ahora a implementar una despedida (tal como hacen en el tutorial):

1) Creamos la función adios() dentro de saludo_controller.php

public function adios() {
$this->template = 'default';
}

Observe que le hemos a asignado a nuestra variable $template el valor 'default', para que tome la plantilla por omisión.

2) Creamos un documento adios.phtml dentro del directorio views/saludo

<div class="textboxright">
<h2>Adios KumbiaPHP</h2>

<?php echo link_to('saludo/hola/', 'Volver a Saludar') ?>
</div>

Observe que hemos puesto un enlace a hola, haciendo uso de la función echo_link_to(). Dentro de hola, pondremos un enlace a adios utilizando la misma función.

Ahora, haciendo clic en los enlaces estaremos cambiando tanto de función, como de plantilla.

Con este sencillo ejemplo, hemos hecho uso de templates y partials, para mantener simultáneamente dos plantillas distintas en nuestro sitio web. El uso de partials no es obligatorio, aunque recomendado para facilitar el entendimiento del código. El uso de templates agrega mucha versatilidad a nuestro sitio. Pensemos por ejemplo en que tenemos una plantilla para visitantes desde computadores, y una plantilla para visitantes desde dispositivos móviles; ésta es una de las muchas posibilidades de uso.


sábado, 17 de julio de 2010

Construyendo un sitio con KumbiaPHP


En las entradas anteriores he hecho pequeñas pruebas de conceptos, sobre archivos sin ningún tipo de estilo o presentación. Como nuestro objetivo es desarrollar aplicaciones web completas que realicen varias tareas, necesariamente tenemos que pensar en el tema del diseño web.

Como siempre, podemos hacernos nuestros sitios web desde cero, y para ser más drásticos, usando exclusivamente notepad. No es el objetivo de este blog; también como siempre, me iré por el camino más sencillo: soluciones pre-elaboradas. En la red podemos encontrar infinidad de recursos para desarrollo web: Frameworks, CMS, sistemas de plantillas, etc.

Un framework general de desarrollo me parece la opción correcta. Existen muchas opciones, entre las cuales yo me he decidido por KumbiaPHP, por 2 razones:

1) Es un framework sumamente sencillo de usar y sobre todo práctico, con el que además he trabajado previamente y que sé que facilitará el trabajo (sí, ley de mínimo esfuerzo). En este post prometo dejar una aplicación funcional que no tomará más de 30 minutos de construir.

2) En principio, nuestra aplicación no se conectará con una base de datos, pero en un futuro cercano (espero) sí lo hará. KumbiaPHP es un framework basado en MVC, que permite trabajar en primera instancia con solamente las capas de Vista y Controlador (aunque no es lo recomendable), y en cualquier momento podemos agregar la conexión a la base de datos sin ningún problema.

A pesar de que ya lo conocía, voy a hacer como si no, y construiré el sitio, paso por paso, tal como se detalla en este excelente tutorial:

Lo primero que debemos hacer es descargar la librería del sitio oficial.

Descomprimimos el archivo en nuestro directorio web y obtendremos la siguiente estructura:

kumbiaphp/
|--app
|--core
|--.htaccess
|--index.php

Para verificar que todo vaya bien, en un navegador vamos a la url de nuestro site, y debería mostrarse la página de bienvenida de kumbia.

Bien, siguiendo con el tutorial, vamos a crear nuestro 'Hola Twitter'.

1) Crearemos la vista y controlador de nuestra aplicación.
1.1) Dentro del directorio app/controllers creamos un archivo hola_controller.php
1.2) Dentro del directorio app/views creamos un directorio hola

En el archivo hola_controller.php definiremos una clase, con todas las funciones que queremos ejecutar en nuestro controlador. De momento queremos solamente imprimir un saludo por pantalla, así que sólo crearemos una función:

<?php
class SaludoController extends ApplicationController {
public function
hola()
{
//Ver metodo render
$this->render(NULL);
}
}

Por cada controlador, debemos tener un subdirectorio dentro del directorio de vistas (app/views), y por cada función del controlador, debemos crear un archivo dentro de ese subdirectorio. Como nuestra función se llama hola(), crearemos el archivo hola.php dentro de app/views/saludo, que de momento sólo contendrá lo siguiente:

<h1>Hola TuTuitero!<h1>

Ahora vamos a http://localhost/tutuitero/saludo/hola y veremos nuestro saludo funcionando. Hemos creado nuestra primera página con kumbiaPHP. 30min? yo creo que menos! :)

Nótese que en nuestra vista sólo hemos definido un texto dentro de etiquetas H1, sin embargo la página tiene un header, un footer, un estilo de letras, un formato. Esto es debido al versátil sistema de plantillas implementado en kumbia, en el cual nos centraremos en un momento.


Hasta este punto, este es el primer post del blog en el que no he mencionado la palabra twitter. Es el momento de hacerlo, aunque sea sólo para recordar el objetivo principal que llevamos desde el principio: crear una herramienta de conexión para twitter que podamos adaptar a nuestras necesidades.

Para cubrir este objetivo, necesitamos un portal web, que podamos navegar fácilmente y que nos permita realizar actualizaciones/consultas mediante una cuenta twitter. Es por ello que hemos introducido kumbiaPHP. Vamos ahora a construir nuestro primer portal web.


Nuestro portal

Ya he dicho que dependiendo de lo que vayamos a construir, vamos a necesitar un sitio más o menos elaborado. Como siempre, podemos partir desde cero y realizar todo el diseño y funcionalidad de nuestro sitio, pero como el objetivo no es hacer un curso sobre diseño web, me iré por el camino más fácil.

Haciendo uso de las bondades que proveen las arquitecturas MVC, separando el diseño (Vista) de las capas funcionales y de control, y aprovechando la gran cantidad de plantillas web que se pueden conseguir gratuitamente por la red, voy a utilizar una de estas (que luego puede ser fácilmente sustituida), de manera de poder centrarme en la funcionalidad del sitio.

Entre los muchos sitios webs que ofrecen plantillas gratis, me gusta mucho opendesigns.org, tienen cientos de plantillas y es simple de navegar. Escogemos alguna de las plantillas que ofrezca, repito, de acuerdo a nuestras necesidades y la descargamos. Yo me he bajado esta:

Descomprimimos el archivo y vamos a encontrar un index.html, un style.css y un directorio de imágenes. Ahora veremos como incrustar estos archivos dentro de nuestro sitio en kumbiaPHP.


Agregando una plantilla a nuestro sitio hecho con kumbiaPHP

Nos centraremos ahora en el contenido del directorio app/views. Vemos los siguientes subdirectorios: errors, pages, partials y templates (además de nuestro directorio saludo). error y pages no nos interesan (de momento), los que nos importan son partials y templates.

Dentro de partials podemos almacenar como su nombre lo indica códigos parciales que podemos incrustar en diferentes vistas, por ejemplo, el footer de nuestro site. Dentro de templates, podemos almacenar la plantilla que queremos que aplique sobre todas las vista de un controlador; no es necesario crear estos templates, y si no lo hacemos, kumbiaPHP tomará la plantilla por defecto (default.phtml).

Si tenemos varias plantillas, desde la capa de control, podemos escoger cual plantilla utilizar, simplemente con incluir la variable template dentro de la clase:

public $template = 'plantilla';

Hagamos una prueba rápida: vamos a sustituir el contenido del archivo default.phtml por el contenido del archivo index.html que viene con nuestra plantilla. Volvamos a abrir en el navegador saludo y veremos que aparece el texto de nuestra plantilla, pero muy mal formateado. Esto es debido a que no tenemos las hojas de estilo ni las imágenes, lógicamente.

Abrimos el directorio app/public y encontraremos algunos subdirectorios. Intuitivamente sabremos que debemos almacenar nuestras imagenes en el directorio img y nuestras hojas de estilo en el directorio css. Todo esto es configurable, si deseas cambiarlo, debes revisar un poco la documentación de kumbiaPHP. Guardamos el archivo style.css que vino con nuestra plantilla dentro de css, y todas las imagenes en el directorio img.

Ahora nos iremos a default.phtml y sustituiremos la línea 12 (el llamado a la hoja de estilo) por la forma en la que se debe invocar desde kumbiaPHP:
<?php echo stylesheet_link_tag('style'); ?>

Justo después colocamos la siguiente línea:
<?php echo stylesheet_link_tags(); ?>

Si volvemos a recargar la página, veremos que ahora ya ha tomado nuestro estilo, pero le hacen falta las imágenes. La forma de especificar las imágenes es como sigue:
<?php echo img_tag('imagen.jpg','id: id_de_imagen','alt: texto alternativo'); ?>

Recorremos el texto y sustituimos de acuerdo al formato mostrado. Adicionalmente, debemos sustituir en el archivo style.css todas las referencias a imagenes del tipo "images/imagen.jpg" a "../img/imagen.jpg". Con estos cambios, tendremos nuestra página exactamente igual a como se ve el demo online en opendesigns.org.

¿Desapareció el "Hola Twitter"?

Observemos que tanto si visitamos http://localhost/tutuitero/saludo/hola o http://localhost/tutuitero vamos a ver lo mismo. Pareciera que hemos perdido el "Hola Twitter en saludo/hola". Recordemos que estamos utilizando una plantilla que será común para todas las páginas del sitio, y que esa plantilla la hemos rellenado con código html, es decir código estático, no le hemos dicho donde queremos que se muestre el contenido particular de cada página. Esto se hace con la función View::content() de kumbia, la cual incluiremos en el lugar que consideremos apropiado.

En este caso, parece lógico colocar el "Hola Twitter" en el cuerpo de nuestra plantilla, por lo tanto justo después de que comienza el div "rightcolumn", colocaremos un div en donde mostrar nuestro mensaje. Quedaría así:

<div class="textboxright">
<?php View::content(); ?>
</div>

Ahora sí notaremos la diferencia entre abrir la página principal o abrir nuestro saludo.

Con esta pequeña introducción es suficiente para comenzar a experimentar con kumbia. Es necesario revisar la documentación del framework para poder explotar todas las bondades que ofrece. Luego mostraré un ejemplo más elaborado, en el que intercambio datos entre las capas de vista y controlador, y además hago uso de las facilidades que ofrece kumbia para la implementación de vistas. Por ahora, es todo.


jueves, 15 de julio de 2010

Nuevo comienzo


Como expliqué en la entrada anterior, pecl/oauth es de momento infactible bajo Windows, y twitteroauth me parece que se queda corta para lo que quiero. Así que salí a la red en búsqueda de otra biblioteca que haga la conexión con twitter sencilla, pero que a la vez nos ofrezca buenas prestaciones.

Es así como llegué al blog de Tijs Verkoyen, quien ha especificado una clase que el ha llamado Twitter Class, utilizando OAuth y cURL (igual que twitteroauth), en la que implementa una gran cantidad de funciones que nos facilitarán enormemente el trabajo. He realizado unas pequeñas pruebas y va de maravillas.

Lógicamente, lo primero que debemos hacer es decargar la librería desde el sitio oficial:
La colocamos en un nuevo directorio (dentro del directorio web de nuestro servidor) y podemos comenzar a utilizarla. Yo voy a copiar en el nuevo directorio, 2 archivos de la entrada anterior: config.php y tutuitero.css. Ahora lo que voy a hacer es escribir un archivo update.php, que haga exactamente lo que hacía el update.php visto anteriormente, pero utilizando la nueva biblioteca:

<?php
session_start
();

require_once(
'twitter.php');
require_once(
'config.php');

// create instance
$twitter = new Twitter(CONSUMER_KEY, CONSUMER_SECRET);

/* Si no tengo tokens de acceso */
if (empty($_SESSION['oauth_token']) || empty($_SESSION['oauth_token_secret']))
{
// get a request token
$twitter->oAuthRequestToken('http://localhost/tutuitero2/twitter-test.php');

// authorize
if(!isset($_GET['oauth_token'])) $twitter->oAuthAuthorize();

// get tokens
$token = $twitter->oAuthAccessToken($_GET['oauth_token'], $_GET['oauth_verifier']);

$_SESSION['oauth_token'] = $token['oauth_token'];
$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];

}
else
{
$token['oauth_token'] = $_SESSION['oauth_token'];
$token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];
}

// set tokens
$twitter->setOAuthToken($token['oauth_token']);
$twitter->setOAuthTokenSecret($token['oauth_token_secret']);

if(isset($_POST['twitter_msg']))
{
$twitter_message = $_POST['twitter_msg'];
if(
strlen($twitter_message)<1)
{
$error = 1;
}
else
{
$twitter->statusesUpdate($twitter_message);
}
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Send a message to Twitter using PHP</title>
<link rel="stylesheet" type="text/css" href="tutuitero.css" />
</head>

<body>
<h2>Post a message on Twitter</h2>
<p>This page use Twitter API to send an message</p>

<?php if(isset($_POST['twitter_msg']) && !isset($error)){?>
<div class="msg"><?php echo $twitter_status ?></div>
<?php } else if(isset($error)){?>
<div class="msg">Error: please insert a message!</div>
<?php }?>
<p><strong>What are you doing?</strong></p>
<form action="update.php" method="post">
<input name="twitter_msg" type="text" id="twitter_msg" size="40" maxlength="140" />
<input type="submit" name="button" id="button" value="post" />
</form>

<div class="footer">
Visita <a href="http://tutuitero.blogspot.com">tutuitero.blogspot.com</a>
<br />
</div>

</body>
</html>

El código es bastante explícito, no hace falta mayor explicación. En el sitio oficial, se puede encontrar documentación de todos los métodos de la clase. Esta es la biblioteca que utilizaremos de ahora en adelante en tuTuitero.