<?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>DWUG &#187; Spry</title>
	<atom:link href="http://www.dwug.es/docs/tutoriales/spry/feed" rel="self" type="application/rss+xml" />
	<link>http://www.dwug.es</link>
	<description>Grupo de Usuarios Adobe Dreamweaver</description>
	<lastBuildDate>Wed, 14 Jul 2010 15:32:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spry 1.7 (Preview)</title>
		<link>http://www.dwug.es/go/476</link>
		<comments>http://www.dwug.es/go/476#comments</comments>
		<pubDate>Wed, 10 Dec 2008 14:21:35 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Spry]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/476</guid>
		<description><![CDATA[Ya comienzan a verse las novedades de lo que será la versión 1.7 de Spry. La primera de ellas es la eliminación del uso de xpath.js para el 80% de los datasets.

Hasta la versión 1.6.1 de spry, a la hora de crear un dataset, era necesario, además de incluir el archivo SpryData.js, el fichero xpath.js, [...]]]></description>
			<content:encoded><![CDATA[<p>Ya comienzan a verse las novedades de lo que será la versión 1.7 de Spry. La primera de ellas es la eliminación del uso de xpath.js para el 80% de los datasets.<br />
<span id="more-476"></span><br />
Hasta la versión 1.6.1 de spry, a la hora de crear un dataset, era necesario, además de incluir el archivo SpryData.js, el fichero xpath.js, encargado de convertir las rutas del xml de origen.</p>
<p>En la nueva versión 1.7 ésto no será necesario para la mayoría de las situaciones: Si puedes acceder a los datos de tu xml siguiendo rutas como:</p>
<p><strong>/gallery/photos/photo<br />
/gallery/photos/*<br />
gallery/photos/photo<br />
/gallery//photo<br />
//photo<br />
//photo/@path<br />
//photo/@*</strong></p>
<p>En todos estos casos, ya no será necesario enlazar al archivo xpath.js, con la consiguiente ventaja en tiempos de descarga.</p>
<p>Si tus rutas son más complicadas o utilizan otro tipo de estructura diferente a las indicadas, deberás seguir incluyéndolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/476/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spry 1.6 ya disponible: Actualiza DW</title>
		<link>http://www.dwug.es/go/389</link>
		<comments>http://www.dwug.es/go/389#comments</comments>
		<pubDate>Fri, 05 Oct 2007 09:55:20 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Spry]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/389</guid>
		<description><![CDATA[Ya están disponibles la versión 1.6 de Spry y la actualización para Dreamweaver.

DW incluye e forma nativa la versión 1.4 de la librería, por lo que es recomendable actualizarla para acceder a todas las nuevas características que han ido apareciendo (paneles html, datasets anidados, envio de formularios utilizando AJAX&#8230;)
La actualización consiste en un sencillo mxp [...]]]></description>
			<content:encoded><![CDATA[<p>Ya están disponibles la versión 1.6 de Spry y la actualización para Dreamweaver.<br />
<span id="more-389"></span><br />
DW incluye e forma nativa la versión 1.4 de la librería, por lo que es recomendable actualizarla para acceder a todas las nuevas características que han ido apareciendo (paneles html, datasets anidados, envio de formularios utilizando AJAX&#8230;)</p>
<p>La actualización consiste en un sencillo mxp que se instala a través del Extension Manager.</p>
<p>La URL es:<br />
<a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_spry">http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_spry</a><!--3aa1c2ab027a5426e0d70d3ff6604208--><!--13e8d86eaf800febf580250b9905ff24--><!--9e29e6b40231725381d22b5218e25388--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/389/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crear un lector online/offline con Spry y AIR</title>
		<link>http://www.dwug.es/go/377</link>
		<comments>http://www.dwug.es/go/377#comments</comments>
		<pubDate>Mon, 25 Jun 2007 10:45:45 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/377</guid>
		<description><![CDATA[Aunque AIR ofrece la posibilidad de comprobar si existe conexión o no, para este tutorial hemos preferido comprobar directamente si la fuente de datos XML remota está accesible o no.

El motivo para ello es asegurarnos de que aunque haya conexión, el XML remoto está disponible (el sitio podría estar caído). Al mismo tiempo tiempo queríamos [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque AIR ofrece la posibilidad de comprobar si existe conexión o no, para este tutorial hemos preferido comprobar directamente si la fuente de datos XML remota está accesible o no.</p>
<p><span id="more-377"></span>
<p>El motivo para ello es asegurarnos de que aunque haya conexión, el XML remoto está disponible (el sitio podría estar caído). Al mismo tiempo tiempo queríamos evitar una doble conexión (una para comprobar el estado y otra para leerlo). Para ello partimos de un xml local. El código realiza estos pasos:</p>
<ol>
<li>Crea un dataset de Spry vacio</li>
<li>Se intenta conectar con el xml remoto: Si lo encuentra, actualiza el  xml local. En caso contrario, el xml local permanece sin alterar</li>
<li>Hacemos que Spry cargue el xml local (que ya estará actualizado si el remoto estaba disponible)</li>
</ol>
<p>El primer paso es cargar los archivo js necesarios de AIR y Spry: </p>
<pre class="brush: php;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/AIRAliases.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;SpryAssets/xpath.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;SpryAssets/SpryData.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>A continuación comienza el bloque de script: Las primeras seis lineas crean el dataset,  la conexión y definen 2 listeners para gestionar la lectura o el error en su caso; finalmente, leemos el contenido de la url:</p>
<p><code>//Creamos un dataset vacio, que cargaremos más adelante llamando a loadDataset()<br />
var	ds1 = new Spry.Data.XMLDataSet(null, "events/event",{useCache:false});<br />
//llamamos al archivo externo<br />
//añadimos 2 listeners para gestionar la lectura del archivo o el error de lectura<br />
var urlRemota = new air.URLRequest("http://www.dwug.es/spry/3/events.xml");<br />
var loader = new air.URLLoader();<br />
loader.addEventListener(air.Event.COMPLETE, lecturaCompleta);<br />
loader.addEventListener(air.IOErrorEvent.IO_ERROR, errorIO);<br />
loader.load(urlRemota);</code></p>
<p>La función loadDataSet se encarga de cargar el archivo xml local:</p>
<p><code>function loadDataset(){<br />
ds1.setURL("data/eventos.xml");<br />
ds1.loadData();<br />
}</code></p>
<p>La función errorIO se encarga de cambiar el texto de un div del documento a &#8216;offline&#8217; y carga el dataset local (que no se ha modificado, ya que ha habido un error):</p>
<p><code>function errorIO(event){<br />
document.getElementById('estado').innerHTML="Offline";<br />
loadDataset();<br />
}</code></p>
<p>La función lecturaCompleta (invocada si se ha relizado la conexión y se ha leido el xml remoto) se encarga de sobreescribir el xml local y cargar el dataset (que ahora ya estará actualizado):</p>
<p><code>function lecturaCompleta(event){<br />
document.getElementById('estado').innerHTML="Online";<br />
//obtenemos el contenido del xml remoto<br />
var dataXML = event.target.data;<br />
//buscamos el archivo local: primero su carpeta y luego el archivo<br />
var carpetaDestino=air.File.applicationResourceDirectory.resolve("data");<br />
var archivoDestino = carpetaDestino.resolve("eventos.xml");<br />
//Abrimos el fileStream para poder acceder al archivo<br />
var destinoStream = new air.FileStream();<br />
//listener para avisar de que se ha escrito<br />
destinoStream.addEventListener(air.Event.CLOSE, escrituraCompleta);<br />
//Abrimos de forma asíncrona, para que lance el evento al terminar<br />
destinoStream.openAsync(archivoDestino, air.FileMode.WRITE);<br />
//sobreescribimos el archivo local<br />
destinoStream.writeUTFBytes(dataXML);<br />
//cerramos el fileStream<br />
destinoStream.close();<br />
}</code></p>
<p>Finalmente, la función escrituraCompleta se invoca cuando se ha terminado de sobreescribir el xml local con los datos remotos. se limita a cargar el dataset:</p>
<p><code>function escrituraCompleta(event){<br />
loadDataset();<br />
}</code></p>
<p>El código completo del documento puede verse en la siguiente URL:<br />
<a href="http://www.dwug.es/spry/spry_air_online_offline.txt">http://www.dwug.es/spry/spry_air_online_offline.txt</a></p>
<p><!--0853aeb698316ff51beaa2db5dbd4a54--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/377/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Efecto resaltado con Spry</title>
		<link>http://www.dwug.es/go/374</link>
		<comments>http://www.dwug.es/go/374#comments</comments>
		<pubDate>Wed, 16 May 2007 09:21:26 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/374</guid>
		<description><![CDATA[Tal y como viene preconfigurado, el efecto Resaltado de Spry en Dreamweaver sólo ofrece la posibilidad de cambiar progresivamente de color en una dirección. Vamos a enseñarte a conseguir que el efecto resultante sea progresivo también para volver al color original modificando una sóla línea de código. De paso, aprenderemos algo más sobre las posibilidades [...]]]></description>
			<content:encoded><![CDATA[<p>Tal y como viene preconfigurado, el efecto Resaltado de Spry en Dreamweaver sólo ofrece la posibilidad de cambiar progresivamente de color en una dirección. Vamos a enseñarte a conseguir que el efecto resultante sea progresivo también para volver al color original modificando una sóla línea de código. De paso, aprenderemos algo más sobre las posibilidades de llamar a funciones callback mediante las opciones &#8217;setup&#8217; y &#8216;finish&#8217;.<br />
<span id="more-374"></span><br />
Además de los atributos que necesiten, los efectos de Spry también son capaces de invocar a funciones callback antes de comenzar y una vez ha terminado de ejecutarse. Para acceder a ellos, sólamente es necesario invocar dentro del constructor del efecto a las opciones &#8217;setup&#8217; y &#8216;finish&#8217;.</p>
<p>Vamos a aplicarlo al efecto resaltado de Spry que viene incluido en DW CS3. En su aspecto por defecto, en DW encontraremos este codigo. Incluye el enlace archivo SpryEffects.js que carga los efectos y una función (MM_effectHighlight) que acepta como parámetros:</p>
<ul>
<li>Elemento para el efecto</li>
<li>Duración</li>
<li>Color de inicio</li>
<li>Color durante la transición</li>
<li>Color final</li>
<li>Si el efecto se realizará al revés en su próxima llamada por el usuario (al volver a hacer click de nuevo, por ejemplo)</li>
</ul>
<p><strong>Este efecto se encuentra en el panel de Etiquetas -> pestaña Comportamientos -> Efectos -> Resaltado</strong></p>
<p>El código que se creará es el siguiente:</p>
<pre class="brush: jscript;">
&lt;script src=&quot;/SpryAssets/SpryEffects.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function MM_effectHighlight(targetElement, duration, startColor, endColor, restoreColor, toggle){
    Spry.Effect.DoHighlight(targetElement, {duration: duration, from: startColor, to: endColor, restoreColor: restoreColor, toggle: toggle});
}
....
&lt;div onclick=&quot;MM_effectHighlight(this, 1000, '#FFFFFF', '#0099FF', '#0099FF', false)&quot;&gt;Click Me&lt;/div&gt;
</pre>
<p><script src="/SpryAssets/SpryEffects.js" type="text/javascript"></script><script type="text/javascript">function MM_effectHighlight(targetElement, duration, startColor, endColor, restoreColor, toggle){ Spry.Effect.DoHighlight(targetElement, {duration: duration, from: startColor, to: endColor, restoreColor: restoreColor, toggle: toggle});}</script><script type="text/javascript">function TCN_effectHighlight(targetElement, duration, startColor, endColor, restoreColor, toggle){ Spry.Effect.DoHighlight(targetElement, {duration: duration, from: startColor, to: endColor, restoreColor: restoreColor, toggle: toggle, finish: function(){		Spry.Effect.DoHighlight(targetElement, {duration: duration, from: endColor, to: startColor, restoreColor: startColor, toggle: toggle});	}	});}</script></p>
<p>Y este es el efecto resultante: </p>
<div style="cursor:pointer;padding:20px; border:1px solid" onclick="MM_effectHighlight(this, 1000, '#ffffff', '#0099FF', '#0099FF', false)">
Haz click aqui para ver el efecto original en este parrafo
</div>
<p>Como se puede ver, el efecto no realiza una transición hasta su color de origen. Como mucho, podemos cambiar toggle a &#8216;true&#8217; para que haga el efecto inverso cuando volvamos a pulsar.</p>
<p>Aquí es donde entran los atributos &#8217;setup&#8217; y &#8216;finish&#8217;. En nuestro script vamos a capturar el momento en el que el efecto termina para que cree inmediatamente después un efecto con los colores inversos. Para distinguirla de la original, le hemos cambiado el nombre de MM_efectHighlight a TCN_effectHighlight:</p>
<p><code><br />
<script type="text/javascript">
function TCN_effectHighlight(targetElement, duration, startColor, endColor, restoreColor, toggle)
{
  Spry.Effect.DoHighlight(targetElement, {duration: duration, from: startColor, to: endColor, restoreColor: restoreColor, toggle: toggle, finish: function()
    {
	   Spry.Effect.DoHighlight(targetElement, {duration: duration, from: endColor, to: startColor, restoreColor: startColor, toggle: toggle});
	  }//fin funcion para finish
	});//fin primer highlight
}//fin funcion
</script><br />
....</p>
<div onclick="TCN_effectHighlight(this, 1000, '#FFFFFF', '#0099FF', '#0099FF', false)">Click Me</div>
<p></code></p>
<p>Es decir, le hemos añadido la opción finish al constructor y le asignamos como valor una nueva función que realizará el mismo efecto pero al revés (from: endColor, to: startColor, restoreColor: startColor).</p>
<p>El resultado en este caso es el que deseamos:</p>
<div style="cursor:pointer;padding:20px; border:1px solid" onclick="TCN_effectHighlight(this, 1000, '#ffffff', '#0099FF', '#0099FF', false)">
Haz click aqui para ver el nuevo efecto en este parrafo
</div>
<p>En caso de utilizar setup, la función que le asignemos será ejecutada antes de comenzar el efecto.</p>
<p>Como nota final, Spry ofrece la posibilidad de crear clusteres de efectos que pueden ejecutarse de forma simultánea o uno después de otro. Lo veremos en el futuro.<!--0d7437a68381d7fb639885d23c7916fa--><!--35e8136856bfe74038868da6ddf8d20f--><!--cf1c2cd9221ef127e92e7443d6144d33--><!--18e64b9778df43d1699d6b560891e69c--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/374/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acordeon dinamico</title>
		<link>http://www.dwug.es/go/373</link>
		<comments>http://www.dwug.es/go/373#comments</comments>
		<pubDate>Mon, 07 May 2007 10:50:18 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/373</guid>
		<description><![CDATA[El widget Accordion de Spry es sencillo de utilizar y de entender. Sin embargo, intentar convertirlo en dinámico (de forma que se añadan los paneles según los datos) tiene truco.

Un acordeón básico de un solo panel tiene esta estructura:



titulo
texto






El ejemplo anterior funcionará sin problemas, pero: ¿Qué sucede si intentamos aplicarle una región repetida?

&#60;div class=&#34;Accordion&#34; id=&#34;Accordion1&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>El widget Accordion de Spry es sencillo de utilizar y de entender. Sin embargo, intentar convertirlo en dinámico (de forma que se añadan los paneles según los datos) tiene truco.<br />
<span id="more-373"></span></p>
<p>Un acordeón básico de un solo panel tiene esta estructura:<br />
<code></p>
<div class="Accordion" id="Accordion1">
<div class="AccordionPanel">
<div class="AccordionPanelTab">titulo</div>
<div class="AccordionPanelContent">texto</div>
</p></div>
</div>
<p><script type="text/javascript">
<!--
//var Accordion1 = new Spry.Widget.Accordion("Accordion1");
//-->
</script><br />
</code></p>
<p>El ejemplo anterior funcionará sin problemas, pero: ¿Qué sucede si intentamos aplicarle una región repetida?</p>
<pre class="brush: xml;">
&lt;div class=&quot;Accordion&quot; id=&quot;Accordion1&quot; spry:region=&quot;empleados&quot;&gt;
  &lt;div class=&quot;AccordionPanel&quot; spry:repeat=&quot;empleados&quot;&gt;
    &lt;div class=&quot;AccordionPanelTab&quot;&gt;{nombre}&lt;/div&gt;
    &lt;div class=&quot;AccordionPanelContent&quot;&gt;{datos}&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
var acc = new Spry.Widget.Accordion(&quot;Accordion1&quot;);
//--&gt;
&lt;/script&gt;
</pre>
<p>En este caso, El widget no funcionará. La explicación es sencilla: El widget se crea al mismo tiempo que la región repetida, por lo que aquél es incapaz de controlar todos los paneles que aún no han sido creados. Debemos por tanto encontrar la forma de saber cuándo Spry ha terminado de crear todos los paneles para convertirlos en un acordeón. Para ello tenemos los <strong>observers</strong>.</p>
<p>Existen elementos de Spry (como las regiones y  los datasets) que lanzan notificaciones cuando cambian. Estas notificaciones, similares a los eventos, pueden ser &#8216;observadas&#8217; por un observer (valga la redundancia), que entrará en funcionamiento cuando se produzca alguna notificación.</p>
<p>En nuestro caso, necesitamos comprobar los cambios en una región, la cual puede realizar las siguientes notificaciones:</p>
<ul>
<li>onLoadingData: La región está cargando los datos desde el dataset</li>
<li>onPreUpdate: Los datos se han cargado y la región está a punto de reescribirse con el nuevo html</li>
<li>onPostUpdate: La región ya se ha regenerado con el nuevo html y se ha insertado en el documento</li>
<li>onError: Ha ocurrido algún error durante el proceso</li>
</ul>
<p>Por lo tanto, cuando la región envie la notificación onPostUpdate podremos crear el acordeón sin problemas, ya que todo el html ha sido generado.</p>
<p>Aquí entran en juego los observers: Son objetos o funciones (se aceptan ambos y su funcionalidad es similar), que se encargan de vigilar las notificaciónes enviadas por parte de la región y qué hacer cuando eso sucede. Para nuestro ejemplo, utilizaremos un objeto.</p>
<p>Un objeto observer tiene esta estructura:</p>
<pre class="brush: jscript;">
//creamos el objeto
var miObserver = new Object;
//le decimos  miObserver lo que tiene que hacer cuando recibe un onPostUpdate
//En nuestro caso, debe crear un acordeon
miObserver.onPostUpdate = function()
    {
    var acc1 = new Spry.Widget.Accordion(&quot;Accordion1&quot;);
    };
//Finalmente, indicamos que miObserver estará pendiente del elemento 'Accordion1'
	Spry.Data.Region.addObserver(&quot;Accordion1&quot;, miObserver);
</pre>
<p>A partir de ahora,cuando el elemento &#8216;Accordion1&#8242; se regenere y envie la notificación onPostUpdate, el observer que hemos creado (miObserver) se encargará de crear el acordeon.</p>
<p>El codigo final es:</p>
<pre class="brush: xml;">
&lt;head&gt;
(...)
&lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
//creamos el dataset
var empleados = new Spry.Data.XMLDataSet(&quot;empleados.xml&quot;, &quot;empleados/empleado&quot;);
//creamos el observer
var miObserver = new Object;
miObserver.onPostUpdate = function()
    {
		   acc = new Spry.Widget.Accordion(&quot;Accordion1&quot;);
    };
	Spry.Data.Region.addObserver(&quot;Accordion1&quot;, miObserver);
//--&gt;
&lt;/script&gt;
(...)
&lt;/head&gt;
&lt;body&gt;
&lt;!--Creamos el bloque del futuro acordeon --&gt;
&lt;div class=&quot;Accordion&quot; id=&quot;Accordion1&quot; spry:region=&quot;empleados&quot;&gt;
  &lt;div class=&quot;AccordionPanel&quot; spry:repeat=&quot;empleados&quot;&gt;
    &lt;div class=&quot;AccordionPanelTab&quot;&gt;{nombre}&lt;/div&gt;
    &lt;div class=&quot;AccordionPanelContent&quot;&gt;{datos}&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
</pre>
<p><!--24f6b30b8fb0a3cb1656d0ca88b3a90c--><!--c86d193c99f837c4110f9393b5c44d38--><!--149a4a42512864bada8645106fec43e5--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/373/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Los Widgets de Spry: El elemento Accordion</title>
		<link>http://www.dwug.es/go/333</link>
		<comments>http://www.dwug.es/go/333#comments</comments>
		<pubDate>Sat, 16 Sep 2006 08:30:54 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.com/go/333</guid>
		<description><![CDATA[Spry, como todo framework para AJAX de cierto nivel, contiene una serie de widgets que permiten mejorar la presentación de datos. Uno de ellos es elemento Accordion, que en la versión 1.3 presenta interesantes novedades.

Este elemento Accordion nos permite crear listados que pliegan y despliegan alternativamente a modo de persiana.
Para generarlo, sólamente es necesario enlazar [...]]]></description>
			<content:encoded><![CDATA[<p>Spry, como todo framework para AJAX de cierto nivel, contiene una serie de widgets que permiten mejorar la presentación de datos. Uno de ellos es elemento Accordion, que en la versión 1.3 presenta interesantes novedades.<br />
<span id="more-333"></span><br />
Este elemento Accordion nos permite crear listados que pliegan y despliegan alternativamente a modo de persiana.<br />
Para generarlo, sólamente es necesario enlazar con el archivo SpryAccordion.js del framework, lo que nos permite utilizarlo incluso con datos estáticos.<br />
La estructura html del elemento es relativamente sencilla</p>
<ul>
<li>Un bloque contenedor</li>
<ul>
<li>Bloque de panel 1</li>
<ul>
<li>Un bloque de pestaña/titulo</li>
<li>Un bloque de contenido</li>
</ul>
<li>Bloque de panel 2
<ul>
<li>Un bloque de pestaña/titulo</li>
<li>Un bloque de contenido</li>
</ul>
</li>
<li>&#8230;Bloque de panel n
<ul>
<li>Un bloque de pestaña/titulo</li>
<li>Un bloque de contenido</li>
</ul>
</li>
</ul>
</ul>
</ul>
<p>Estos bloques no necesitan ser obligatoriamente etiquetas div, sino que Spry es capaz de realizarlos con otros elementos html, como una lista.</p>
<p>Una enlazado al archivo creada la estructura de bloques, sólo nos queda instanciar el objeto:<br />
<script>var acordeon1 = new Spry.Widget.Accordion("acordeon");</script></p>
<p>La asignación a la variable nos permitirá realizar otrs acciones posibles, como abrir un determinado panel, crearlos al vuelo&#8230; El valor del parámetro es la id que asignemos al bloque que actua como contenedor.</p>
<p><a href="/demos/spry_accordion/ejemplo1.html" title="ejemplo 1">En el ejemplo 1 podemos ver la estructura básica de un acordeón</a> que utiliza una lista para presentar los datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/333/feed</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Filtrado no destructivo con Spry</title>
		<link>http://www.dwug.es/go/330</link>
		<comments>http://www.dwug.es/go/330#comments</comments>
		<pubDate>Fri, 30 Jun 2006 20:58:53 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.com/go/330</guid>
		<description><![CDATA[La ultima versión de Spry (1.1) tiene entre sus novedades la posibilidad de utilizar un filtrado no destructivo, lo que permite permite filtrar datos de forma no permanente, evitando con ello la necesidad de volver a cagar los datos de la fuente xml, tal y como sucedía hasta ahora.

Spry ofrece ahora ambas posibilidades: Utilizar un [...]]]></description>
			<content:encoded><![CDATA[<p>La ultima versión de Spry (1.1) tiene entre sus novedades la posibilidad de utilizar un filtrado no destructivo, lo que permite permite filtrar datos de forma no permanente, evitando con ello la necesidad de volver a cagar los datos de la fuente xml, tal y como sucedía hasta ahora.<br />
<span id="more-330"></span><br />
Spry ofrece ahora ambas posibilidades: Utilizar un filtro destructivo (de manera que los datos no seleccionados dejarán estar disponibles hasta que se vuelvan a solicitar al fichero xml) y otro no destructivo, en el que los datos persisten sin ecesidad de recargar.</p>
<p>Para el primero de los casos se mantiene la función filterData(), que ya existía en las versiones anteriores de Spry. Ahora, se añade la función filter(), que permite realizar filtrados en los que los datos no utilizados no desaparecen, sino que se mantienen (de ahí su definición de filtrado no destructivo).</p>
<p>Este tutorial es un ejemplo del uso de esta función: Se trata de crear un campo de texto en el queiremos escribiendo texto y que de forma dinámica, irá realizando un filtrado de los datos, los cuales se actualizarán en el documento sin necesidad de recargar. Un ejemplo en la vida real puede ser el quehace Google para ir mostrando posibilidades de búsqueda que coincidan con el texto escrito. Nuestr caso práctico mostrará un listado de productos de Adobe. A medida que escribamos en el campo de texto, se irán eliminando aquellos cuyo nombre no coincida con lo escrito.</p>
<p>El ejemplo en funcionamiento está disponible <a href="http://www.dwug.es/demos/spry/filtrado/index.html">haciendo click aquí</a>.<br />
Pusa aquí para ver el archivo products.xml.<br />
<a href="http://www.dwug.es/demos/spry/filtrado/filtrado.zip">Puedes descargarte el ejemplo completo y listo para funcionar desde aquí</a>.</p>
<p>Nuestro primer caso, como en toda aplicación que use Spry, es definir el namespace y llamar a los 2 archivos js (xpath.js y SpryData.js) necesarios. Debemos recordar que a partir de esta versión 1.1, la sintaxis difiere de la utilizada en versiones anterios (para conseguir la validación como xhtml):</p>
<pre>
<!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" xmlns:spry="http://ns.adobe.com/spry">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<script language="JavaScript" type="text/javascript" src="includes/xpath.js"></script>
<script language="JavaScript" type="text/javascript" src="includes/SpryData.js"></script>
<script language="JavaScript" type="text/javascript">
var dsProductos = new Spry.Data.XMLDataSet("products/products.xml", "products/product");
</script>
</head>
<body>
<form>
Buscar Producto :
<input type="text" id="filterTF" />
</form>
<div id="productsdiv" spry:region="dsProductos">
<ul>
<li spry:repeat="dsProductos">{name}</li>
</ul>
</div>

</body>
</html>
</pre>
<p>Hasta ahora, simplemente hemos creado una región repetida (con la etiqueta li) que nos mostrará todos los productos obtenidos del fichero xml. Nuestro siguiente paso será añadir una función que realice el filtrado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/330/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprendiendo Spry: Mi primera aplicaci&#243;n</title>
		<link>http://www.dwug.es/go/319</link>
		<comments>http://www.dwug.es/go/319#comments</comments>
		<pubDate>Sat, 13 May 2006 22:57:43 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.com/go/319</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/319/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
