<?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>.:: klr20mg ::. Una dosis diaria de .... &#187; Tutoriales</title>
	<atom:link href="http://klr20mg.com/category/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>http://klr20mg.com</link>
	<description>Blog acerca de desarrollo orientado hacia Flash, Flex y Actionscript.</description>
	<lastBuildDate>Wed, 26 May 2010 21:59:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Introducción a PureMVC</title>
		<link>http://klr20mg.com/2008/03/19/introduccion-a-puremvc/</link>
		<comments>http://klr20mg.com/2008/03/19/introduccion-a-puremvc/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 22:15:53 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PureMVC]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://klr20mg.com/2008/03/19/introduccion-a-puremvc/</guid>
		<description><![CDATA[La Teoría PureMVC es un framework open source que implementa el modelo MVC para crear aplicaciones usando ActionScript 3 bajo Flash CS3 y Flex, creado originalmente por Cliff Hall . Dentro de los planes de desarrollo podemos encontrar que se intenta implementar este framework en diversos lenguajes de programación, tales como: ActionScript 2 ColdFusion CSharp [...]]]></description>
			<content:encoded><![CDATA[<h1>La Teoría</h1>
<p>PureMVC es un framework open source que implementa el modelo MVC para crear aplicaciones usando ActionScript 3 bajo Flash CS3 y Flex, creado originalmente por <a href="http://puremvc.org/component/option,com_contact/Itemid,3/">Cliff Hall</a> .</p>
<p>Dentro de los planes de desarrollo podemos encontrar que se intenta implementar este framework en diversos lenguajes de programación, tales como:</p>
<ul class="stars">
<li>ActionScript 2</li>
<li>ColdFusion</li>
<li>CSharp</li>
<li>Java</li>
<li>Perl</li>
<li>PHP</li>
<li>Python</li>
<li>Ruby</li>
</ul>
<p>Al implementar el patrón MVC (Modelo-Control-Vista) podemos separar los datos de la aplicación, las vistas (Interfaz de usuario) y la lógica de control en tres &#8220;componentes&#8221;, para poder reutilizar código y sobre todo hacer nuestras aplicaciones escalabres y mantenibles.</p>
<p>PureMVC separa estos 3 componentes en 3 &#8220;actores&#8221; dentro del framework:</p>
<ul class="stars">
<li>Proxies</li>
<li>Mediators</li>
<li>Commands</li>
</ul>
<p>En donde:</p>
<p>Los datos, remotos o locales son manejados por los Proxies.<br />
Las vistas o interfaz de usuario, son manejados por los Mediators.<br />
La lógica de la aplicación es manejada por los Commands los cuales pueden interactuar con los Proxies, los Mediators y pueden activar o ejecutar otros Commands.</p>
<p>Existe un cuarto elemento en PureMVC llamado Facade el cual provee una interfaz simple de comunicación para que los 3 actores principales puedan comunicarse entre sí. Además de que PureMVC implementa un esquema de notificaciones (Eventos) mediante los cuales se puede activar/ejecutar una o varias acciones.</p>
<p><span id="more-190"></span></p>
<h1>La Práctica Hello PureMVC</h1>
<div align="center">

<object width="640" height="546">
<param name="movie" value="http://www.klr20mg.com/video/introPureMvc/introPureMvc.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#2a2a2a"></param>
<param name="allowFullScreen" value="true"></param>
<embed type="application/x-shockwave-flash" width="640" height="546" src="http://www.klr20mg.com/video/introPureMvc/introPureMvc.swf" quality="high" bgcolor="#2a2a2a" wmode="window" menu="false" allowFullScreen="true" ></embed>
</object>

</div>
<p>Wow. Tanto para solo un Hello World? No siempre trabajar con frameworks significa menos código, además la potencia de estos frameworks se nota al trabajar en aplicaciones medianas-grandes, yo recomiendo usarlo y ustedes mismos verán las ventajas.</p>
<p>En fin espero les sea útil, además de decir que este es el primer video-tutorial de Klr20mg, que piensan al respecto, seguimos con los tutos escritos o seguimos con video?</p>
<p>Enjoy <img src='http://klr20mg.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Enlaces:</h2>
<p> <a href="http://puremvc.org/">PureMVC Home</a>, <a href="http://puremvc.org/content/view/50/1/">Download PureMVC</a></p>
<h4>Download Sources</h4>
<div class="legend">
<h3 class="legend-title">Files</h3>
<div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of HelloPureMVC.zip" href="http://klr20mg.com/downloads/HelloPureMVC.zip"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of HelloPureMVC.zip" href="http://klr20mg.com/downloads/HelloPureMVC.zip">HelloPureMVC.zip</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>March 21, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>285.13 KB</td>
		</tr>
	</table>
</div>

</div>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/03/19/introduccion-a-puremvc/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Trabajando con SQLite, AIR y FLASH CS3</title>
		<link>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/</link>
		<comments>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 18:34:06 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/</guid>
		<description><![CDATA[Air desde su versión beta 2 si no mal recuerdo trae integrado un engine de base de datos SQL mediante SQLite. ¿Que significa esto? Significa que podemos crear base de datos locales desde nuestra aplicación de AIR sin la necesidad de que el usuario final instale nada más que el Runtime de AIR. Con esto [...]]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">A</span>ir desde su versión beta 2 si no mal recuerdo trae integrado un engine de base de datos SQL mediante SQLite.</p>
<p>¿Que significa esto?</p>
<p>Significa que podemos crear base de datos locales desde nuestra aplicación de AIR sin la necesidad de que el usuario final instale nada más que el Runtime de AIR.</p>
<p>Con esto podemos crear eliminar modificar bases de datos, tablas, registro etc.</p>
<p>Para propósitos de este tutorial vamos a crear un simple cliente que cree una base de datos si no existe, que cree la tabla con la cual trabajaremos y donde consultaremos, agregaremos y eliminaremos entradas.</p>
<p>Cabe mencionar que para efectos prácticos no posteare todo el código en cada ejemplo. Al final del tutorial estará la clase final así como los archivos fuente para su estudio <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Creación de Base de Datos</h2>
<p>Al ser una base de datos local, evidentemente dicho archivo se tiene que crear en la maquina del usuario, para saber si la base de datos existe o no, debemos verificar si el archivo existe, para ello hacemos uso de la Clase File</p>
<p>[as]<br />
package com.tmeister.samples.sql<br />
{<br />
	import flash.filesystem.File;</p>
<p>	public class sqlSample extends MovieClip<br />
	{<br />
		private var db:File;</p>
<p>		public function sqlSample()<br />
		{<br />
			db = File.applicationStorageDirectory.resolvePath(&#8220;myFirst.db&#8221;);<br />
			(!db.exists) ? createDatabase() : dbExist();<br />
		}<br />
		private function createDatabase()<br />
		{<br />
			trace(&#8220;Creamos la BD&#8221;)<br />
		}<br />
		private function dbExist()<br />
		{<br />
			trace(&#8220;La Base de datos ya existe&#8221;)<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p><span id="more-178"></span></p>
<p>Con esto sabremos si la base de datos existe o no, si dicha base de datos no existe debemos crearla, pero antes de poder crearla debemos crear una instancia de la clase SQLConnection para poder conectarnos con el engine y después de esto entonces si crear la BD.</p>
<p>[as]<br />
//Importamos las clases para trabajar con SQLite<br />
import flash.data.SQLConnection;<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>//Creamos una nueva conexion y seteamos sus respectivos handlers<br />
conn = new SQLConnection();<br />
conn.addEventListener(SQLEvent.OPEN, dbConnOpen);<br />
conn.addEventListener(SQLErrorEvent.ERROR, dbConnError);</p>
<p>//&#8221;Abrimos&#8221; la base de datos, si no existe se crea<br />
conn.openAsync(db);</p>
<p>// Handlers de los eventos<br />
private function dbConnOpen(e:SQLEvent)<br />
{<br />
	trace(&#8220;Se conecto a la base de datos &#8220;)<br />
	trace(&#8220;Ya podemos hacer uso de la base de datos.&#8221;)<br />
}<br />
private function dbConnError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error al conectarse a la base de datos&#8221;);<br />
	trace(e)<br />
}<br />
[/as]</p>
<p>En esta parte de código asignamos 2 listeners a conn que es nuestra conexión con el engine, Los listeners son:</p>
<ul>
<li><span class="highlight">SQLEvent.OPEN</span> : El cual se ejecuta cuando la base de datos esta lista para ser usada.</li>
<li><span class="highlight">SQLErrorEvent.ERROR</span> : El cual se ejecuta si un error ocurrió al momento de intentar acceder a la base de datos.</li>
</ul>
<p>La línea “mágica” es </p>
<p>[as]<br />
conn.openAsync(db);<br />
[/as]</p>
<p>Con esta instrucción abrimos la base de datos pasando como referencia el archivo respectivo, si el archivo no existe se crea automáticamente. Hay dos formas de trabajar con SQLite, de forma <span class="highlight">Síncrona</span> o <span class="highlight">Asíncrona</span>, en este ejemplo trabajamos con la segunda opción, en una entrada posterior tratare de explicar las diferencias entre cada una de ellas.</p>
<p>Con esto ya tenemos una base de datos creada ahora lo siguiente es crear un tabla</p>
<h2>Creación de Tablas</h2>
<p>Una vez que ya tenemos nuestra base de datos ahora necesitamos una tabla en donde insertar datos.</p>
<p>Las interacciones hacia la base de datos es exactamente igual que en otros lenguajes de programación (dígase PHP), se crea la conexión a la base de datos se escribe el SQL y se ejecuta la instrucción.</p>
<p>Lo único que cambia en AS3 es que debemos crear una instancia de la clase SQLStatement en la cual seteamos que conexión a DB usar, asignar la cadena de consulta o ejecución (SQL) y asignar los valores.</p>
<p>Todo esto se resume a lo siguiente.</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>private const TABLE_NAME:String = &#8220;people&#8221;</p>
<p>//Creamos una instancia de la clase<br />
var dbManager:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
dbManager.sqlConnection  = conn</p>
<p>//Asignamos listeners a los eventos<br />
dbManager.addEventListener(SQLErrorEvent.ERROR, sqlError);<br />
dbManager.addEventListener(SQLEvent.RESULT, tableResult);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;CREATE TABLE &#8221; + TABLE_NAME + &#8221; (&#8220;;<br />
sql += &#8220;id INTEGER PRIMARY KEY AUTOINCREMENT,&#8221;<br />
sql += &#8220;name TEXT,&#8221;;<br />
sql += &#8220;age NUMERIC&#8221;;<br />
sql += &#8220;)&#8221;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
dbManager.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
dbManager.execute();</p>
<p>//Handlers<br />
private function tableResult(e:SQLEvent)<br />
{<br />
	trace(&#8220;La tabla se creo correctamente&#8221;);<br />
}<br />
private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
[/as]</p>
<h2>Inserts</h2>
<p>Como mencione antes todas las interacciones con la base de datos se deben de hacer mediante una instancia de la clase SQLStatement. Lo único que cambia de acuerdo con el ejemplo anterior (Creación de tablas) es la sentencia SQL  y la asignación de los valores de los campos.</p>
<p>Ejemplo de Insert</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>//Creamos una instancia de la clase<br />
var insertManager:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
insertManager.sqlConnection = conn;</p>
<p>//Asignamos listeners a los eventos<br />
insertManager.addEventListener(SQLEvent.RESULT, insertResult);<br />
insertManager.addEventListener(SQLErrorEvent.ERROR, sqlError);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;INSERT INTO &#8221; + TABLE_NAME + &#8221; (name, age) VALUES (:name, :age)&#8221;;</p>
<p>//Asignacion de valor a los parametros de la sentencia<br />
insertManager.parameters[":name"] = &#8220;Tmeister&#8221;;<br />
insertManager.parameters[":age"] = &#8220;29&#8243;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
insertManager.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
insertManager.execute();</p>
<p>//Handlers<br />
private function tableResult(e:SQLEvent)<br />
{<br />
	trace(&#8220;La tabla se creo correctamente&#8221;);<br />
}<br />
private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
[/as]</p>
<p>Aqui vemos cosas nuevas en la sentencia.</p>
<p>Primero </p>
<p>[as]<br />
var sql:String = &#8220;INSERT INTO &#8221; + TABLE_NAME + &#8221; (name, age) VALUES (:name, :age)&#8221;;<br />
[/as]</p>
<p>Si pueden ver los valores de los campos están precedidos de dos puntos <span class="highlight">:</span> esto significa que son parámetros de la sentencia.</p>
<p>La clase SQLStatement tiene una propiedad llamada parameters que es un Array en donde se tiene que asignar el valor de cada parámetro escrito en nuestra sentencia, en este ejemplo tenemos 2 parámetros <span class="highlight">:name</span> y <span class="highlight">:age</span> entonces necesitamos asignarle valores esto se hace con estas líneas</p>
<p>[as]<br />
insertManager.parameters[":name"] = &#8220;Tmeister&#8221;;<br />
insertManager.parameters[":age"] = &#8220;29&#8243;;<br />
[/as]</p>
<p>En realidad es algo simple. no?</p>
<h2>Obteniendo datos de la base de datos</h2>
<p>Para obtener datos de la base de datos es exactamente lo mismo que hicimos para crear la tabla, solamente cambia la sentencia SQL</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;<br />
import flash.data.SQLStatement;</p>
<p>private const TABLE_NAME:String = &#8220;people&#8221;</p>
<p>//Creamos una instancia de la clase<br />
var query:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
query.sqlConnection = conn</p>
<p>//Asignamos listeners a los eventos<br />
query.addEventListener(SQLErrorEvent.ERROR, sqlError);<br />
query.addEventListener(SQLEvent.RESULT, sqlResult);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;SELECT * FROM &#8221; + TABLE_NAME + &#8221; order by id&#8221;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
query.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
query.execute();</p>
<p>private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
private function sqlResult(e:SQLEvent)<br />
{<br />
	var result:SQLResult = e.target.getResult();<br />
	for each ( var row:Object in result.data)<br />
	{<br />
		trace(row)<br />
		trace(row.id)<br />
		trace(row.name)<br />
		//etc<br />
	}<br />
}<br />
[/as]</p>
<p>Para obtener el resultado de la consulta de debemos ejecutar la función getResult de la instancia SQLStatement.</p>
<p>[as]<br />
var result:SQLResult = e.target.getResult();<br />
[/as]</p>
<p>Por último solo queda recorrer los resultados, que son devueltos como objetos</p>
<p>[as]<br />
for each ( var row:Object in result.data)<br />
	{<br />
		trace(row)<br />
		trace(row.id)<br />
		trace(row.name)<br />
		//etc<br />
	}<br />
[/as]</p>
<p>Con esto ya podemos comenzar a trabajar con SQLite para manejar información en la maquina local del usuario final.</p>
<div class="legend">
<h3 class="legend-title">Archivos para descarga</h3>
<table>
<tr>
<td><div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of SQLite.zip" href="http://klr20mg.com/downloads/SQLite.zip"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of SQLite.zip" href="http://klr20mg.com/downloads/SQLite.zip">SQLite</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>January 17, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>898.21 KB</td>
		</tr>
	</table>
</div>
</td>
<td><div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of SQLSample.air" href="http://klr20mg.com/downloads/SQLSample.air"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of SQLSample.air" href="http://klr20mg.com/downloads/SQLSample.air">SQLSample</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>January 17, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>78.04 KB</td>
		</tr>
	</table>
</div>
</td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>[Tutorial] Flex2 y Amfphp (RemoteObject)</title>
		<link>http://klr20mg.com/2007/01/28/tutorial-flex2-y-amfphp-remoteobject/</link>
		<comments>http://klr20mg.com/2007/01/28/tutorial-flex2-y-amfphp-remoteobject/#comments</comments>
		<pubDate>Sun, 28 Jan 2007 22:24:25 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=144</guid>
		<description><![CDATA[Hace poco mas de un mes se anuncio el lanzamiento de la versión 1.9 alpha de amfphp, esta versión por fin soportaba AMF3 y con ello interactuar totalmente con Flex2. Y el pasado viernes se lanzo la versión beta 2, Así que es hora de que nos vayamos enterando de como funciona esta nueva versión [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco mas de un mes se anuncio el lanzamiento de la versión 1.9 alpha de amfphp, esta versión por fin soportaba AMF3 y con ello interactuar totalmente con Flex2. Y el pasado viernes se lanzo la versión beta  2, Así que es hora de que nos vayamos enterando de como funciona esta nueva versión =)</p>
<p style="margin-bottom: 0cm"><strong>1.Descargar e Instalar <a href="http://www.5etdemi.com/uploads/amfphp-1.9.beta.20070126.zip">Amfphp 1.9 beta 2</a>.</strong></p>
<p style="margin-bottom: 0cm">Descarga el archivo zip de <a href="http://www.5etdemi.com/uploads/amfphp-1.9.beta.20070126.zip">amfphp 1.9</a>, descomprimelo y sube el folder amfphp a algún lugar de tu servidor, el mejor sitio seria el directorio principal de tu sitio. Para comprobar que todo esta correcto haremos la vieja pero siempre efectiva comprobación. En tu navegador escribe la dirección que apunte hacia el archivo gateway.php</p>
<p style="margin-bottom: 0cm">Si el folder de amfphp se encuentra en el folder raíz de tu sitio entonces la dirección seria:</p>
<p style="margin-bottom: 0cm"><a href="http://www.tusitio.com/amfphp/gateway.php">http://www.tusitio.com/amfphp/gateway.php</a></p>
<p style="margin-bottom: 0cm">Si todo sale bien debes de ver un mensaje como este.</p>
<blockquote><p style="margin-bottom: 0cm">“amfphp and this gateway are installed correctly. You may now connect to this gateway from Flash.</p>
<p>Note: If you&#8217;re reading an old tutorial, it will tell you that you should see a download window instead of this message. This confused people so this is the new behaviour starting from amfphp 1.2.</p>
<p>View the amfphp documentation</p>
<p>Load the service browser”
</p></blockquote>
<p><strong>2. Crear nuestro primer servicio.</strong></p>
<p><strong>HelloWorld.php</strong></p>
<pre class="brush: php;">
&lt;?php
 class HelloWorld
 {
 	public function SayHi()
 	{
 		return &quot;Hi there. =)&quot;;
 	}
 }
?&gt;
</pre>
<p style="margin-bottom: 0cm">Si ya habías trabajado con una versión vieja de amfphp te darás cuenta que $this-&gt;methodTable se ha eliminado de la estructura de la clase. </p>
<p>$this-&gt;methodTable era utilizado para asignar las propiedades de las funciones, sobre todo la descripción, y la forma de acceso, esto ultimo para saber si se podría acceder a la función de forma remota o solo local. </p>
<p>En esta nueva versión como dije antes $this-&gt;methodTable dejo de usarse. Ahora esta nueva versión de amfphp asume que todas las funciones pueden accederse remotamente a menos que el nombre de la función comience con guion-bajo “_” o la función sea declarada como privada, esta ultima opción solo esta disponible en php5.</p>
<p>Un ejemplo <strong>HelloWorld2.php</strong></p>
<pre class="brush: php;">
&lt;?php
 class HelloWorld
 {
 	public function SayHi()
 	{
 		return &quot;Hi there. =)&quot;;
 	}
 	private function connectDB()
 	{
 		//PHP5
 		//Solo se puede ejecutar desde la misma clase
 	}
 	function _localMethod()
 	{
 		//PHP4
 		//Esta funcion tambien sera accesible desde la misma clase unicamente
 	}
 }
?&gt;
</pre>
<p style="margin-bottom: 0cm"><strong>3. Configurar Flex2 para trabajar con 	amfphp</strong></p>
<p style="margin-bottom: 0cm">Debemos crear un proyecto básico en Flex.</p>
<p><img src="http://klr20mg.com/tutorials/project1.jpg" alt="project1" /></p>
<p><img src="http://klr20mg.com/tutorials/project2.jpg" alt="project2" /></p>
<p style="margin-bottom: 0cm">Ahora necesitamos crear un archivo de configuración para que flex sepa donde buscar nuestros servicios de amfphp.</p>
<p style="margin-bottom: 0cm">Para ello creamos el archivo <strong>services-config.xml</strong> con la siguiente estructura</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;services-config&gt;
	&lt;services&gt;
		&lt;service id=&quot;amfphp-service&quot; class=&quot;flex.messaging.services.RemotingService&quot; messageTypes=&quot;flex.messaging.messages.RemotingMessage&quot;&gt;
			&lt;destination id=&quot;amfphp&quot;&gt;
				&lt;channels&gt;
					&lt;channel ref=&quot;amfphpId&quot;/&gt;
				&lt;/channels&gt;
				&lt;properties&gt;
					&lt;source&gt;*&lt;/source&gt;
				&lt;/properties&gt;
			&lt;/destination&gt;
		&lt;/service&gt;
	&lt;/services&gt;
	&lt;channels&gt;
		&lt;channel-definition id=&quot;amfphpId&quot; class=&quot;mx.messaging.channels.AMFChannel&quot;&gt;
			&lt;endpoint uri=&quot;http://www.klr20mg.com/amfphp/gateway.php&quot; class=&quot;flex.messaging.endpoints.AMFEndpoint&quot;/&gt;
		&lt;/channel-definition&gt;
	&lt;/channels&gt;
&lt;/services-config&gt;
</pre>
<p style="margin-bottom: 0cm">La única linea que nos interesa y que debemos modificar es la siguiente:</p>
<pre class="brush: xml;">
&lt;endpoint uri=&quot;http://www.klr20mg.com/amfphp/gateway.php&quot; class=&quot;flex.messaging.endpoints.AMFEndpoint&quot;&gt;
</pre>
<p style="margin-bottom: 0cm"> Modificando la ruta hacia donde esta nuestro archivo gateway y guardandolo en el folder raíz de nuestro proyecto.</p>
<p style="margin-bottom: 0cm">Una vez que tenemos nuestro archivo, dar click derecho sobre el nombre del mismo e ir a propiedades. Se abrirá una ventana de propiedades, obviamente, seleccionamos del menú izquierdo la pestaña “Flex Compiler” y en la linea de “Argumentos adicionales de compilación” <strong>-s services “services-config.xml”</strong> y damos click en “Ok”</p>
<p><img src="http://klr20mg.com/tutorials/project3.jpg" alt="project3" /></p>
<p style="margin-bottom: 0cm">Ahora ya estamos listos para trabajar con amfphp 1.9 y Flex.</p>
<p style="margin-bottom: 0cm"> <strong>4. Probando la conexión  	</strong></p>
<p style="margin-bottom: 0cm"> Lo primero es subir nuestro servicio  “HelloWorld.php” el cual creamos en el paso 2.</p>
<p style="margin-bottom: 0cm">Este servicio debe de estar dentro del folder amfphp/services, dentro, puedes crear folders anidados sin ningún problema en este caso lo colocare en  la carpeta Tutorials/HelloWorld.</p>
<p style="margin-bottom: 0cm">Creamos una pequeña interfaz la cual constara de un un par de LinkButtuns, un TextArea contenidos dentro de un panel cuyos botones ejecutaran los métodos remotos de amfphp.</p>
<p style="margin-bottom: 0cm">Algo así</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;
	&lt;!-- Funciones que controlan los eventos del RemoteObject --&gt;
	&lt;mx:Script &gt;
		&lt;![CDATA[
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			public function onMethodResult(event:ResultEvent):void
			{
				out_txt.text = &quot;Result &quot;+event.result
				out_txt.text += &quot;\nDataType &quot;+ typeof(event.result)
			}
			public function onServiceFault(event:FaultEvent):void
			{
				out_txt.text = &quot;Fault &quot;+event.fault
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;!-- Declaracion del RemoteObject y sus metodos --&gt;
	&lt;mx:RemoteObject
		id=&quot;helloService&quot;
		source=&quot;Tutorials.HelloWorld.HelloWorld&quot;
		destination=&quot;amfphp&quot;
		fault=&quot;{onServiceFault(event)}&quot;
		showBusyCursor=&quot;true&quot;
	&gt;

		&lt;mx:method
			name=&quot;SayHi&quot;
			result=&quot;{onMethodResult(event)}&quot;
		&gt;
		&lt;/mx:method&gt;

	&lt;/mx:RemoteObject&gt;
	&lt;!-- Layout general--&gt;
	&lt;mx:Panel x=&quot;0&quot; y=&quot;0&quot; width=&quot;250&quot; height=&quot;200&quot; layout=&quot;absolute&quot; title=&quot;Amfphp-RemoteObject&quot;&gt;
		&lt;mx:LinkButton x=&quot;178&quot; y=&quot;135&quot; label=&quot;Fault&quot; click=&quot;{helloService.invalidMethod.send()}&quot;/&gt;
		&lt;mx:LinkButton x=&quot;108&quot; y=&quot;135&quot; label=&quot;SayHi&quot; click=&quot;{helloService.SayHi.send()}&quot;/&gt;
		&lt;mx:TextArea x=&quot;7&quot; y=&quot;7&quot; width=&quot;216&quot; height=&quot;121&quot; id=&quot;out_txt&quot;/&gt;
	&lt;/mx:Panel&gt;
&lt;/mx:Application&gt;
</pre>
<p><strong>
<p style="margin-bottom: 0cm">vamos a ver parte por parte.</p>
<p></strong></p>
<pre class="brush: xml;">
&lt;mx:RemoteObject
	id=&quot;helloService&quot;
	source=&quot;Tutorials.HelloWorld.HelloWorld&quot;
	destination=&quot;amfphp&quot;
	fault=&quot;{onServiceFault(event)}&quot;
	showBusyCursor=&quot;true&quot;
&gt;

	&lt;mx:method
		name=&quot;SayHi&quot;
		result=&quot;{onMethodResult(event)}&quot;
	&gt;
	&lt;/mx:method&gt;
&lt;/mx:RemoteObject&gt;
</pre>
<p style="margin-bottom: 0cm"> En este tag como se puede ver creamos nuestro RemoteObject los parámetros son:</p>
<blockquote><p><strong>id :</strong> El nombre con el cual  haremos  referencia<br />
<strong>source:</strong> el path a partir del folder amfphp/services, donde se encuentra nuestro servicio en el servidor,<br />
<strong>destination:</strong> el identificador seteado en el tag <strong>&lt;destination&gt;</strong> del archivo <strong>services-config.xml</strong><br />
<strong>fault:</strong> El método que sera ejecutado al momento de que ocurra un error.<br />
<strong>showBusyCursor:</strong> Mientras dure la ejecución del método remoto flex mostrara el cursor de ocupado
</p></blockquote>
<p style="margin-bottom: 0cm"> Dentro del tag RemoteObject  debemos agregar los métodos a los cuales vallamos a acceder desde Flex y definir la función que se ejecutara cuando el método se haya ejecutado con éxito.</p>
<p style="margin-bottom: 0cm">Esto lo hacemos definiendo el tag &lt;mx:method&gt;</p>
<pre class="brush: xml;">
&lt;mx:method
	name=&quot;SayHi&quot;
	result=&quot;{onMethodResult(event)}&quot;
&gt;
&lt;/mx:method&gt;
</pre>
<p style="margin-bottom: 0cm">los parámetros son:</p>
<blockquote><p><strong>name:</strong> El nombre del método que se ejecutara, que es el mismo que tenemos en nuestro servicio.<br />
<strong>result :</strong> asignamos la función que se ejecutara cuando el método remoto se ejecute.
</p></blockquote>
<p style="margin-bottom: 0cm">Por ultimo, debemos ejecutar dichos métodos desde nuestra interfaz, en este ejemplo se ejecutan mediante un LinkButton</p>
<pre class="brush: xml;">
&lt;mx:linkbutton x=&quot;108&quot; y=&quot;135&quot; label=&quot;SayHi&quot; click=&quot;{helloService.SayHi.send()}&quot;&gt;
</pre>
<p style="margin-bottom: 0cm">Al momento de dar click enviamos la petición de ejecución del método <strong>SayHi</strong> que esta definido dentro del RemoteObject <strong>helloService</strong>, simple cierto? <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="margin-bottom: 0cm">Este es el resultado final.</p>
<div align="center">[FLASH]http://klr20mg.com/flex/tutorials/helloworldamfphp.swf,250,200[/FLASH]</div>
<p>Aqui estan los archivos completos del proyecto. <a href="http://klr20mg.com/tutorials/helloworld-amfphp19.zip">helloworld-amfphp19.zip</a></p>
<p>Con esto podemos comenzar a trabajar y a aprovechar todas la ventajas que amfphp nos ofrece.</p>
<p>Cheers. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/01/28/tutorial-flex2-y-amfphp-remoteobject/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
