<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AlvaroVeliz &#187; php</title>
	<atom:link href="http://blog.alvaroveliz.cl/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alvaroveliz.cl</link>
	<description>Recetas de Desarrollo</description>
	<lastBuildDate>Wed, 01 Feb 2012 15:41:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tutorial: Crear una aplicación para Facebook (FBML)</title>
		<link>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/</link>
		<comments>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 14:00:20 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[fracework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=68</guid>
		<description><![CDATA[Una vez estaba en la cocina preparándome un café cuando de repente me bajó la inspiración y decidí hacer una aplicación Facebook. La investigación fue ardua, hice las pruebas de concepto respectivas y logré mi cometido. Sin embargo, por cosas de tiempo no  terminé la aplicación para variar y quedó stand by hasta el próximo [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-crear-una-aplicacion-para-facebook-fmbl-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-crear-una-aplicacion-para-facebook-fmbl-2%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una vez estaba en la cocina preparándome un café cuando de repente me bajó la inspiración y decidí hacer una aplicación <strong>Facebook</strong>. La investigación fue ardua, hice las <a href="http://blog.alvaroveliz.cl/2009/11/las-pruebas-de-concepto-en-el-desarrollo-de-software/" target="_self">pruebas de concepto</a> respectivas y logré mi cometido. Sin embargo, por cosas de tiempo no  terminé la aplicación <span style="text-decoration: line-through;">para variar</span> y quedó <em>stand by</em> hasta el próximo semestre.</p>
<p>Hace unos días, me pidieron ayuda para hacer lo mismo usando lenguaje <strong>FBML</strong> y recordé lo que ya había realizado. Pero como la memoria es frágil decidí utilizar a nuestro amigo Google para resolver algunas dudas que tenía. Para mi sorpresa, no encontré lo que necesitaba, así que por lo tanto decidí hacer un Tutorial en <strong>lenguaje humano</strong> para que todos <span style="text-decoration: line-through;">los desarrolladores</span> entendamos como es que debemos hacer una aplicación para Facebook compatible con la versión actual. Así que, manos a la obra!<br />
<span id="more-68"></span></p>
<h2>Como funciona una aplicacion Facebook?</h2>
<p><strong>Facebook</strong> soporta dos formatos de aplicaciones externas, aplicaciones creadas usando <a href="http://wiki.developers.facebook.com/index.php/FBML" target="_self"><strong>FBML</strong></a> y las que usan <span style="text-decoration: line-through;">el no estandar</span> iframe. Para este tutorial nos enfocaremos en la creación de aplicaciones usando <strong>FBML</strong>, ya que es una opción importante cuando se necesita usar las gráficas y herramientas de Facebook nativas.</p>
<p>Antes de seguir les recomiendo leer el <a href="http://developers.facebook.com/get_started.php?tab=tutorial">Tutorial que Facebook dispone como introducción</a> para que entiendan con mayor claridad, luego de eso, sigan con la este tutorial.</p>
<h2>Ingredientes</h2>
<ul>
<li>Tener conocimientos de HTML, CSS y de PHP</li>
<li>Contar con un hosting y dominio para subir la aplicación</li>
<li>Librerias cliente PHP de Facebook &#8211; <a href="http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz">Que puedes descargar aquí</a></li>
<li>Ser parte de Facebook Developers &#8211; Si no eres parte, debes ingresar en <a href="http://www.facebook.com/developers/">App Developers</a></li>
<li>Un objetivo de aplicación, por ejemplo: &#8220;Una aplicación para mostrar <strong>mi último mensaje de twitter</strong>!&#8221;</li>
</ul>
<h2>Creando la aplicacion</h2>
<p>Como ya contamos con todos estos nuestros ingredientes podemos comenzar con la <strong>creación de la aplicación</strong>.</p>
<p>Lo primero en el menú es <a href="http://www.facebook.com/developers/createapp.php">Configurar una nueva aplicación</a>, esto lo podemos hacer en la App de Developers de Facebook  haciendo click en el botón &#8220;<strong>+ Configurar una nueva aplicación</strong>&#8221; o, si estás más atento, haciendo click en el link anterior.<br />
Acá entraré en detalle para guiarlos mejor:</p>
<ul>
<li>Escribimos el nombre de nuestra aplicación y aceptamos los términos y condiciones.<br />
<a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso1_fb.png"><img class="size-medium wp-image-84 alignnone" style="border: 1px solid #dddddd; padding: 4px;" title="Paso 1 - Creación Facebook App" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso1_fb-300x139.png" alt="" width="300" height="139" /></a></li>
<li>La siguiente pantalla nos entrega información relacionada con nuestra aplicación y que ocuparemos para el desarrollo: <strong>Application ID, API Key, Secret</strong>. Estos valores son los que nos identifican con Facebook como aplicación y que nos permite interactuar con Facebook y los usuarios. Estos datos son sumamente importantes y nunca deben ser revelados, bueno, el nombre sí.<br />
<a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso2_fb.png"><img class="size-medium wp-image-85 alignnone" style="border: 1px solid #dddddd; padding: 4px;" title="Paso 2 - Creación facebook app" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso2_fb-300x209.png" alt="" width="300" height="209" /></a></li>
<li>A la izquierda tenemos un menú de configuración donde nos enfocaremos en los siguientes puntos: <strong>&#8220;Auth (Autencación)&#8221;</strong>, &#8220;<strong>Profiles (Perfiles)</strong>&#8220;, &#8220;<strong>Advanced (Avanzado)</strong>&#8221; y &#8220;<strong>Canvas (Lienzo)</strong>&#8220;.</li>
<li>En  <strong>&#8220;Auth (Autencación)&#8221; </strong>seleccionamos &#8220;Disponible para usuarios&#8221; y en Post-Authorize Callback URL escribimos la URL de retorno, es decir, &#8220;<strong>http://apps.facebook.com/ultimotwitterupdate/</strong>&#8220;</li>
<li>En &#8220;<strong>Profiles (Perfiles)</strong>&#8221; debemos escribir el <em>Tab Name</em> y el <em>Tab URL.</em><br />
En el Tab Name debemos escribir un nombre de no más de 16 caracteres (&#8220;<strong>Ultimo Update</strong>&#8220;) y en el Tab URL debemos definir la URL donde se encuentra la vista de nuestra aplicación para los perfiles (&#8220;<strong>tab</strong>&#8220;).<br />
El Profile Box es la forma en que se mostrara en las cajas del perfil por defecto, por ejemplo &#8220;<strong>Narrow</strong>&#8220;.</li>
<li>La seccion de &#8220;<strong>Advanced (Avanzado)</strong>&#8221; nos sirve para dejar nuestra aplicación en &#8220;<strong>Sandbox Mode</strong>&#8221; y así solo los desarrolladores podrán verla. Debemos activar esta opción antes de seguir.</li>
<li>En la sección &#8220;<strong>Canvas (Lienzo)</strong>&#8221; se define la URL que contiene el despliegue (layout) de la aplicación y de donde Facebook debe obtenerlo para mostrarlo. Para configurarlo vamos a escribir &#8220;<strong>ultimotwitterupdate</strong>&#8221; en la URL de la página y <strong>http://www.midominio.com/ultimotwitterupdate/</strong> en <strong>Canvas Callback URL</strong>. Para ver los cambios realizados debemos desarrollar en forma local y subir mediante FTP.<br />
Luego, en la sección donde dice &#8220;<strong>Render Method (Método de renderización)</strong>&#8221; debemos seleccionar <strong>FBML</strong>, los otros datos quedan por defecto.</li>
<li>Guardamos los cambios.</li>
</ul>
<h2>A ensuciarse las manos</h2>
<p>Ahora es cuando viene la parte mas entretenida de la historia, el desarrollo de la aplicación.</p>
<p>Pero, un momento&#8230;<strong>no tengo idea de que debe hacer la aplicación</strong>! Mejor investigo todo lo necesario en base al objetivo planteado y luego, defino la conclusión.</p>
<p>El proceso anteriormente nombrado dio como resultado dos objetivos más específicos:</p>
<ul>
<li><strong>&#8220;Debo usar la API de Twitter para traer el último mensaje de un usuario en formato JSON&#8221;</strong><br />
Pero, y cómo? Del siguiente modo, usamos la API de Twitter para llegar a la información de algún usuario:<br />
<em>http://api.twitter.com/1/statuses/user_timeline.json?screen_name=<strong>USUARIO_TWITTER</strong>&amp;count=1</em></li>
<li><strong>&#8220;El usuario Facebook elige el nombre de usuario y se almacena en una base de datos (SQLite)&#8221;.</strong><br />
Listo! Ahora que tengo claro lo que debo hacer voy a dedicarme al layout en Facebook, porque si quiero realizar la aplicación primero debo saber verla funcionando.</li>
</ul>
<p>Para esto, tenemos que conocer un poco más de <strong>FBML</strong>, así que les dejo la misión de leer sobre este lenguaje en el <a href="http://wiki.developers.facebook.com/index.php/Main_Page" target="_self">Wiki de Facebook</a>.</p>
<h3>Preparar bien la mesa</h3>
<p>Antes de partir con el sitio debemos configurar un archivo que permita la comunicación entre Facebook y la aplicación. Dicho archivo se llama &#8220;<strong>xd_receiver.htm</strong>&#8221; y es un archivo que va en la raiz del sitio. Su contenido es el siguiente:</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;
&lt;head&gt;
&lt;title&gt;Cross-Domain Receiver Page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script src=&quot;http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?2&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Si quieren leer más sobre esto pueden hacerlo en el <a href="http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication_Channel">Wiki de Facebook: Cross-Domain Communication Channel</a></p>
<h3>&#8220;Aunque no venia preparado&#8221;</h3>
<p>Ahora viene lo importante. Yo sé que ustedes esperan que explique todo el código de conexión y de configuración para la App Facebook, pero les quiero contar que me adelanté y les traje una especie de <em>framework</em> que les facilitará muchas de las tareas. Este <em>framework</em> se creó en base a otras aplicaciones que tenía desarrolladas y que me hicieron pensar en la <strong>real ayuda</strong> de este tutorial, su nombre es &#8220;<strong>Fracework</strong>&#8221; y lo pueden revisar en: <a href="http://code.google.com/p/fracework/">http://code.google.com/p/fracework/</a></p>
<p>Esta suerte de <em>framework, </em>permite configurar la aplicación y crear las vistas. Probablemente cuando lo vean no va a ser lo que esperan <span style="text-decoration: line-through;">a nivel de código</span>, pero estoy seguro que les va a ser muy útil.</p>
<p>El contenido de <strong>Fracework</strong> tiene la siguiente estructura de archivos:</p>
<ul>
<li>client/ : Libreria cliente PHP de Facebook</li>
<li>config/ : Archivo de configuraciones de la aplicación</li>
<li>includes/ : Conexión con facebook, instancia de clase clientes</li>
<li>modules/ : Modulos de la aplicación</li>
<li>views/ : Vistas de la aplicación</li>
<li>index.php : Archivo que muestra las distintas vistas</li>
<li>xd_receiver.htm : Cross-Domain Communication Channel</li>
</ul>
<p>Para utilizarlo solo deben descomprimir el archivo en la carpeta de la aplicación y comenzar a desarrollar.</p>
<h3>Configuracion</h3>
<p>En la carpeta &#8220;<strong>config</strong>&#8220;, de nuestra aplicación, nos encontramos con el archivo de configuraciones de la aplicación &#8220;<strong>facebook.php</strong>&#8220;, acá editamos los datos de nuestra aplicación y guardamos:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
* Facebook App client
* @author @alvaroveliz
**/

$fb_apikey        = '...'; // Configurar API KEY
$fb_secret        = '...'; // Secret Key
$app_callbackurl  = 'http://www.midominio.com/ultimotwitterupdate/'; // APP Canvas URL
$canvas_url       = 'http://apps.facebook.com/ultimotwitterupdate/'; // Canvas URL

?&gt;</pre>
<p>Recuerdan que les comente en la creación de la aplicación sobre los datos &#8220;importantes&#8221;, bueno, acá es donde se deben configurar.</p>
<h3>Hello World</h3>
<p>En la carpeta &#8220;<strong>views</strong>&#8221; encontramos 3 archivos:</p>
<ul>
<li>default.php: Vista general de la aplicación</li>
<li>profile.php: Vista de caja caja en el perfil</li>
<li>global.php: Vista de tab  (cuadro) en el perfil (narrow y wide)</li>
<li>Las vistas personalizadas se agregan en la carpeta &#8220;views&#8221; y se ven usando el parámetro &#8220;section&#8221;. Por ejemplo &#8220;index.php?section=help&#8221; mostrará la vista help.php</li>
</ul>
<p>Ahora, para hacer la prueba de &#8220;Hello world&#8221;, editamos el archivo <strong>default.php</strong> y agregamos &#8220;&lt;h1&gt;Hello facebook app&lt;/h1&gt;&#8221; como dice el código:</p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:fbml version=&quot;1.0&quot;&gt;
&lt;h1&gt;Hello facebook app&lt;/h1&gt;
&lt;/fb:fbml&gt;</pre>
<p>Subimos al servidor nuestra aplicación y vamos a la dirección http://apps.facebook.com/ultimotwitterupdate/, en esta dirección vamos a ver nuestra aplicación creada, pero antes debemos agregarla a nuestro perfil.</p>
<p>Luego de agregarla, la aplicación nos mostrará el siguiente resultado:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/develop_fb.png"><img class="alignnone size-medium wp-image-86" style="border: 1px solid #dddddd; padding: 4px;" title="Facebook App Hello World" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/develop_fb-300x158.png" alt="" width="300" height="158" /></a></p>
<h3>Agregando el boton para perfil</h3>
<p>Como ya tenemos nuestra aplicación andando, podemos agregar un código FBML que nos permitirá llegar más lejos aún. Por ejemplo, con la siguiente linea podremos agregar un botón que permitirá agregar nuestra aplicación como caja en el perfil.</p>
<p>Editamos el archivo de vistas &#8220;<strong>default.php</strong>&#8221; y agregamos:</p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:add-section-button section=&quot;profile&quot; /&gt;</pre>
<p>Esto nos da el siguiente resultado:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_popup.png"><img class="alignnone size-medium wp-image-87" style="padding: 4px;" title="Facebook app Agregar a perfil" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_popup-300x212.png" alt="" width="300" height="212" /></a> <a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_fb.png"><img class="alignnone size-medium wp-image-88" style="padding: 4px;" title="Facebook app Cuadros" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_fb-300x119.png" alt="" width="300" height="119" /></a></p>
<h3>&#8220;Guayerfreims&#8221;</h3>
<p>Ahora que tenemos andando la aplicación, nos vamos a enfocar en nuestro ejemplo.</p>
<p>El layout de nuestro ejemplo debe preguntar cual es el nick del usuario en twitter, para que traiga dinámicamente el último update, luego deberá mostrarlo. (Como consideración, el usuario no debe tener sus updates protegidos)</p>
<p>Está sería la disposición del despliegue:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_1.jpg"><img class="alignnone size-medium wp-image-91" style="padding: 4px;" title="Facebook app Wireframe 1" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_1-225x300.jpg" alt="" width="225" height="300" /></a> <a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_2.jpg"><img class="alignnone size-medium wp-image-92" style="padding: 4px;" title="Facebook app Wireframe 2" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_2-225x300.jpg" alt="" width="225" height="300" /></a></p>
<h3>El modelo de datos</h3>
<p>Luego que hicimos nuestros layouts en papel, nos debemos enfocar en el modelo de datos. En nuestra base de datos debemos guardar la información que nos permita relacionar usuario de facebook y usuario twitter, esta podría ser la mejor opción: &#8220;id de usuario de facebook&#8221;, &#8220;nombre usuario de twitter&#8221;, &#8220;mensaje ultimo update&#8221;, &#8220;fecha y hora de ultima consulta&#8221;.</p>
<p>La única tabla que necesito la nombraremos como &#8220;<strong>last_updates</strong>&#8220;:</p>
<ul>
<li>id:integer(11), PK</li>
<li>facebook_user:integer(11)</li>
<li>twitter_username:varchar(30)</li>
<li>last_update:varchar(140)</li>
<li>last_query:datetime</li>
</ul>
<p>La instrucción SQL sería del siguiente modo:</p>
<pre class="brush: sql; title: ; notranslate">CREATE  TABLE &quot;last_updates&quot; (&quot;id&quot; INTEGER PRIMARY KEY  NOT NULL , &quot;facebook_user&quot; INTEGER NOT NULL , &quot;twitter_username&quot; VARCHAR(30) NOT NULL , &quot;last_update&quot; VARCHAR(140) NOT NULL , &quot;last_query&quot; DATETIME NOT NULL )</pre>
<h3>El código da App</h3>
<p>De acuerdo a los &#8220;<em>wireframes</em>&#8221; el código de la vista por defecto será del siguiente modo:</p>
<p><strong>Vista default.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:fbml version=&quot;1.0&quot;&gt;

	&lt;fb:dashboard&gt;
		&lt;fb:help href=&quot;index.php?section=help&quot;&gt;Ayuda&lt;/fb:help&gt;
	&lt;/fb:dashboard&gt;

	Ingrese el nick del usuario (el usuario no debe tener los updates protegidos)
	&lt;br /&gt;
	&lt;form name=&quot;save_user&quot; method=&quot;post&quot; action=&quot;&quot;&gt;
		&lt;input type=&quot;text&quot; id=&quot;twitter_user&quot; name=&quot;twitter_user&quot; size=&quot;20&quot; /&gt; &lt;input type=&quot;submit&quot; value=&quot;Definir usuario&quot; /&gt;
	&lt;/form&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
	&lt;/div&gt;

	&lt;br /&gt;
	&lt;fb:add-section-button section=&quot;profile&quot; /&gt;

&lt;/fb:fbml&gt;</pre>
<p><strong>Vista global.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:narrow&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
		Narrow View
	&lt;/div&gt;

&lt;/fb:narrow&gt;

&lt;fb:wide&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
		Wide View
	&lt;/div&gt;

&lt;fb:wide&gt;</pre>
<p><strong>Vista profile.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;div id=&quot;update-quote&quot;&gt;
&lt;/div&gt;</pre>
<p>Con un poco de estilos podríamos llegar a nuestro objetivo con mayor efectividad, pero por el momento solo haré el ejemplo con una aplicación <span style="text-decoration: line-through;">casi</span> por defecto.</p>
<h3>El módulo &#8220;app.php&#8221;</h3>
<p>Para habilitar los módulos que vamos creando, se debe editar el archivo &#8220;config/app.php&#8221; y agregar al arreglo el nombre de la app, por ejemplo:</p>
<pre class="brush: php; title: ; notranslate">$modules = array(
'app', // Modulo de Aplicacion
);</pre>
<p>Este módulo se encarga de realizar todas las conexiones con Twitter y la base de datos para almacenar la información.A grandes rasgos se compone de funciones como:</p>
<ul>
<li>get_twitter_data : Que obtiene la información de Twitter usando cURL</li>
<li>set_user_data : Que guarda la información del usuario que agrego la aplicación</li>
<li>get_user_data : Que obtiene la información de un usuario</li>
<li>update_user_data  : Que actualiza la información del usuario utilizando la información de Twitter.</li>
</ul>
<h3>A probar la aplicación</h3>
<p>Luego, que está todo listo, subo a producción y hago las pruebas necesarias para evitar errores. No está demás decir que a medida que realizo el diseño y el desarrollo siempre se deben hacer updates, porque es como estar trabajando a ciegas.</p>
<p>Para probar la aplicación ingresen a: <a href="http://app.facebook.com/ultimotwitterupdate/">http://apps.facebook.com/ultimotwitterupdate/</a></p>
<h2>Deje reposar 5 minutos y sirva</h2>
<p>Luego de todo este desarrollo podemos sacar como conclusión que <strong>Facebook</strong> es una de las Redes Sociales más potentes por la facilidad en que se pueden desarrollar aplicaciones y la capacidad de integración que se puede obtener.</p>
<p>Si bien el desarrollo no es muy cómodo, es muy simple la forma en que se pueden agregar elementos propios de Facebook, esto lo hace una herramienta ágil.</p>
<p>Finalmente, les dejo la misión de leer mucho sobre lo nuevo que se viene para el desarrollo de aplicaciones en Facebook y además de que le pierdan el miedo a crear aplicaciones nuevas.</p>
<p>Muchas gracias por su tiempo, espero que este <em>plato</em> haya sido de su agrado.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.facebook.com/developers/F</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Firma Twitter para foros IPB con PHP + GD + SimplePie</title>
		<link>http://blog.alvaroveliz.cl/2009/11/firma-twitter-para-foros-ipb-con-php-gd-simplepie/</link>
		<comments>http://blog.alvaroveliz.cl/2009/11/firma-twitter-para-foros-ipb-con-php-gd-simplepie/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 23:09:51 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=29</guid>
		<description><![CDATA[Hace mucho tiempo que circulo por foros de internet, el que más visito es Tarreo y como usa Invision Power Board, no puedo poner una firma con imágenes dinámicas. Es por esto que tuve que acudir a una solución, hacer una imágen dinámica que pudiera ser vista en cualquier foro invision protegido. Para lograr este [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2009%2F11%2Ffirma-twitter-para-foros-ipb-con-php-gd-simplepie%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2009%2F11%2Ffirma-twitter-para-foros-ipb-con-php-gd-simplepie%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace mucho tiempo que circulo por foros de internet, el que más visito es <a href="http://tarreo.com/foro" target="_blank">Tarreo</a> y como usa <a href="http://www.invisionpower.com/" target="_blank">Invision Power Board</a>, no puedo poner una firma con imágenes dinámicas. Es por esto que tuve que acudir a una solución, hacer una imágen dinámica que pudiera ser vista en cualquier foro invision protegido.</p>
<p>Para lograr este objetivo necesitaremos los siguientes <strong>ingredientes</strong>:</p>
<ul>
<li>Tener cuenta <a href="http://twitter.com" target="_blank">Twitter</a> (publica, con protección de twitts no sirve)</li>
<li>Saber <a class="zem_slink" title="PHP" rel="homepage" href="http://www.php.net/">PHP</a></li>
<li>Conocer la librería GD (para PHP)</li>
<li>SimplePie</li>
<li>Servidor para hostear la imagen (con soporte curl)</li>
<li>Conocer de .htaccess</li>
</ul>
<p><span id="more-29"></span>La idea es utilizar <a href="http://simplepie.org/" target="_blank">SimplePie</a> para que se lea el <a class="zem_slink" title="RSS" rel="wikipedia" href="http://en.wikipedia.org/wiki/RSS">RSS</a> de mi cuenta para que con PHP + GD se genere una imagen dinámica, luego con el .htaccess se redireccionan todos los archivos .jpg a.php (esta es la joda para tinelli)</p>
<p><strong>Preparación</strong>:</p>
<ol>
<li>Descargar el amigable <a href="http://github.com/rmccue/simplepie/downloads" target="_blank">SimplePie</a> de su sitio web (vamos a utilizar el archivo <strong>simplepie.inc.php</strong> solamente)</li>
<li>Creamos el archivo twitter.php (con vim, gedit, eclipse, textmate o lo que se les ocurra) con el siguiente código:
<pre class="brush: php; title: ; notranslate">&lt;?php
require 'simplepie.inc.php';
// Configuraciones
$feed_url    = &quot;http://twitter.com/statuses/user_timeline/MI_RSS_DEL_TIMELINE.rss&quot;;
$feed        = new SimplePie($feed_url);
// Configuraciones de la imagen
$im          = imagecreatetruecolor(320, 60);
$text_color  = imagecolorallocate($im, 0, 0, 0);
$tw_color    = imagecolorallocate($im, 56, 204, 255);
$bg_color    = imagecolorallocate($im, 255, 255, 255);
// Despliegue
imagefilledrectangle($im, 1, 1, 318, 58, $bg_color);
imagestring($im, 2, 5, 5, 'Twitter', $tw_color);
// Me traigo el ultimo tweet
foreach ($feed-&gt;get_items(0, 1) as $item)
{
   $twitt = $item-&gt;get_title();
}
// Lo corto y le hago wordwrap
$twitt = wordwrap($twitt, 58, '\n');
$twitt_texts = explode('\n', $twitt);
foreach ($twitt_texts as $i =&gt;; $t)
{
   imagestring($im, 1, 55, 14*($i+1), $t, $text_color);
}
// Muestro la imagen
header('Content-type: image/jpeg');
imagejpeg($im, NULL, 100);
imagedestroy($im);
?&gt;</pre>
</li>
<li>Luego, debemos redireccionar los request a archivos JPG a PHP utilizando un .htaccess
<pre>RewriteEngine On
RewriteRule ^(.*\.jpg(/.*)?)$ twitter.php [L,QSA]</pre>
</li>
<li>Ahora lo subes a tu servidor y lo revisas, deberia ser algo como:<br />
<img class="alignnone" title="Firma twitter" src="http://hypn.eianes.com/twitter_firma/firma.jpg" alt="" width="320" height="60" /></li>
</ol>
<p>Deje cocinar a fuego lento.<br />
Sirva acompañado con galletas de salvado.</p>
<p>Claramente podemos aplicarnos mucho más en el código, pero esto salio de improviso y fue relativamente rápido.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 336px; width: 1px; height: 1px;">
<pre>&lt;?php
require 'simplepie.inc.php';
// Configuraciones
$feed_url    = "http://twitter.com/statuses/user_timeline/MI_RSS_DEL_TIMELINE.rss";
$feed        = new SimplePie($feed_url);
// Configuraciones de la imagen
$im          = imagecreatetruecolor(320, 60);
$text_color  = imagecolorallocate($im, 0, 0, 0);
$tw_color    = imagecolorallocate($im, 56, 204, 255);
$bg_color    = imagecolorallocate($im, 255, 255, 255);
// Despliegue
imagefilledrectangle($im, 1, 1, 318, 58, $bg_color);
imagestring($im, 2, 5, 5, 'Twitter', $tw_color);
// Me traigo el ultimo tweet
foreach ($feed-&gt;get_items(0, 1) as $item)
{
   $twitt = $item-&gt;get_title();
}
// Lo corto y le hago wordwrap
$twitt = wordwrap($twitt, 58, '\n');
$twitt_texts = explode('\n', $twitt);
foreach ($twitt_texts as $i =&gt;; $t)
{
   imagestring($im, 1, 55, 14*($i+1), $t, $text_color);
}
// Muestro la imagen
header('Content-type: image/jpeg');
imagejpeg($im, NULL, 100);
imagedestroy($im);
?&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2009/11/firma-twitter-para-foros-ipb-con-php-gd-simplepie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

