Hay otras maneras de hacer esto, como usando ArrayCollation, sólo que quería hacer este post sobre lo fácil que es manejar contenido XML en Actionscript 3 (y el gran contraste en ese aspecto con manejar XML en Actionscript 2).
Bien, en AS3 existen las clases XMLDocument y XMLNode, que permiten trabajar con el XML como en AS2, pero no deberían usarse para nada. En su lugar se usa la clase XML.
Aquí viene lo bonito: si tenemos el xml de un rss, por ejemplo, http://www.cristalab.com/rss.php el XML se trabaja automáticamente como un Array de Objets, de tal manera que para referirnos a digamos el primer elemento será simplemente elXML.channel.item[0], sin tener que estar jugando con los condenados firstChild y ChildNodes. Pero lo mejor es que podemos usar un condicional en la propia referencia, y que se seleccionen sólo aquellos elementos para los que el condicional devuelve true. Me explico: Si queremos seleccionar todos los elementos del feed de clab cuyo título empiece por "C" el código sería simplemente:
Código :
elXml.channel.item.(title.substr(0,1)=="C")
También podemos hacer que busque si está una cadena específica, con lo que ya tendríamos creado un filtro:
Dicho esto, les presento este [uu]chapucero, horrible[/uu] inacabado RSSReader en flex:
Código :
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" initialize="init();"> <mx:Script> <![CDATA[ public var clabRss:XML public function init():void{ var req:URLRequest=new URLRequest("http://www.cristalab.com/rss.php"); var xmlLoader:URLLoader=new URLLoader(); xmlLoader.load(req); xmlLoader.addEventListener(Event.COMPLETE,onLoadComplete) } public function onLoadComplete(event:Event):void{ clabRss=XML(event.target.data); main.title=clabRss.channel.title posts.labelField="title"; posts.dataProvider=clabRss.channel.item; posts.selectedIndex=0; titleTxt.text=clabRss.channel.item[0].title description.text=clabRss.channel.item[0].description; } public function filter(evt:Event):void{ if(evt.target.text==""){ posts.dataProvider=clabRss.channel.item; }else{
A grandes rasgos, lo que hace es cargar el rss de clab mediante un URLRequest y un URLLoader, muestra los títulos en el List y al seleccionarlos allí van cambiando las demás propiedades. Además tiene un botón para copiar la ruta al portapapeles... porque me aburría
Nota: Debido a problemas con mi servidor no puedo subir ahora el archivo final. De todas formas, siempre pueden copiar el código y pegarlo en el Flex online compiler
Muy bueno Zah por fin un Tip de Flex en Clab Por:Zguillez
Update: Entiendo lo que hiciste al explicar el manejo de XML, hay tambien que aclara que hay formas más faciles.
Es un buen tuto para explicar el nuevo objeto XML, pero eso tambien puede hacerse con HTTPService sin tanto código.
De hecho, sin código. Haré un tip de ello. Por:Freddie
According to the old writings, the coming of flex arrived.
Arrepentíos pecadores
Buen tip Zah Por:MorphX
De hecho tiene razon F, mi tuto esta basado en la misma descripcion que uso Zah y tiempo despues me di cuenta de eso, la ventaja que existe con la codificacion de Zah es el uso de animaciones entre cada carga. Por:Atse_blog
Freddie® :
Es un buen tuto para explicar el nuevo objeto XML, pero eso tambien puede hacerse con HTTPService sin tanto código.
De hecho, sin código. Haré un tip de ello.
Me parece que voy a meter la pata con lo que voy a decir, corregidme si me equivoco, pero para hacerlo con un HTTPService tienes que programar un backend en php, como hiciste tú en la conferencia, es decir el código que no pones en flash lo pones en un lenguaje de servidor, incluyendo la necesidad de este, además ¿cómo se haría con un rss?
De todas formas, el lector rss no era más que el primer ejemplo práctico que se me ocurrió... Por:Zah
No Hace falta lenguaje de lado de Servidor para usar HTTPService. Es más el ejmplo del lector de RSS que viene en la documentación de flex, esta hecho solo con HTTPService y uno que otro metodo. Pero Bastante simple en realidad Por:shogoki
En el ejemplo de freddie en la conferencia, usaba el backend para flash, y demostraba lo dificil que era hacer una aplicación en flash... para luego hacer lo mismo usando el HTTPService en flex... y demostrar que Flex era superior en ese sentido...
Por:jos_blog
No JOS, Freddie usó un código php para generar el webservice que luego usaría con FLEX, lo que no hizo fue crear una clase en php entera definiendo propiedades y métodos, pero el código que usó para flex se puede aprovechar casi igual con un objeto XML de flash (aunque con algo más de código). Concretamente este código es el que usó:
Código :
<?php function plugClab($consulta){ //Parámetros de la db $db="estudiantes"; $user="root"; $pass=""; $server="localhost"; //Conexion $dbh=mysql_connect($server,$user,$pass) or die ("I cannot open the database because: " . mysql_error()); mysql_select_db($db); $resultado=mysql_query($consulta,$dbh); mysql_close($dbh); return $resultado; } $sql = "SELECT * FROM calificaciones WHERE nombre LIKE '".$_GET["nombre"]."'"; $id=plugClab($sql);
Ya después si queremos acceder a los elementos del XML, basta con utilizar la propiedad lastResult. Por ejemplo si queremos el titulo de un feed escribimos:
Código :
feedRequest.lastResult.rss.channel.title
donde rss, channel y title son nodos del documento xml cargado. Por:shogoki
Yo hasta ahora solo he podido meterle un css a Flex XDXDXD, si es que hay que ser triste. Ya me pondré en serio a estudiar Flex, gracias por este trocito de sabiduría Por:D3N14M_blog
Por cierto, intenté copiar todo el código en el Flex Online Compiler y me largo esto:
Código :
Error #2044: securityError no controlado: text=Error #2048: Violación de la seguridad Sandbox: http://try.flex.org/output/fBF704044E081438F300596AD7ADFED5D.swf no puede cargar datos desde http://www.cristalab.com/rss.php. at App/init() at App/___Application1_initialize() at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.core::UIComponent/dispatchEvent() at mx.core::UIComponent/set processedDescriptors() at mx.core::Container/createComponentsFromDescriptors() at mx.core::Container/mx.core:Container::createChildren() at mx.core::UIComponent/initialize() at mx.core::Container/initialize() at mx.core::Application/initialize() at App/initialize() at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded() at mx.managers::SystemManager/::initializeTopLevelWindow() at mx.managers::SystemManager/::docFrameHandler()
Alguna idea de que puede ser? Porque me suena al legendario error de los permisos de acceso de Flash, pero no se. Por:D3N14M_blog
D3N14M_blog :
Alguna idea de que puede ser? Porque me suena al legendario error de los permisos de acceso de Flash, pero no se.
Pues es eso precisamente. No puedes cargar contenido dentro de Flex a URLs externas al dominio donde se ejecuta el swf. En el Flex Online puedes probar como se vería, pero sólo en local podrás ver su funcionamiento. Por:Freddie
Sí, en el error te da la URL del swf y ese puedes guardarlo en el disco y ejecutarlo desde allí. Por:Zah
Probé el código y me da el siguiente error:
'main': identifier and class may not have the same name.
en la línea 32 Por:Ruben Rojas_blog
El ejemplo de carga de rss que viene con el tutorial de flex es muy ilustrativo, el problema viene, que es lo que me ha pasado a mi, cuando quieres cargar un rss de otro dominio que no te tengan incluido en el crossdomain.xml ,a hi se complica el asunto, y ya hay que tirar de php, o lo que cada uno use. Igualmente creo que con el actionscript 3 se pueden programar operaciones mas complejas de gestion de datos con ficheros xml. O eso creo por el momento. Un saludo. Por:juanan_blog
Porfabor podrian ser un poco más ordenados casi no puedo entender sin ofender porfabor Por:Carolina_blog