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.




0 comentarios:

Publicar un comentario