<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Código al Descubierto</title>
	<atom:link href="http://codigoaldescubierto.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://codigoaldescubierto.wordpress.com</link>
	<description></description>
	<lastBuildDate>Fri, 08 May 2009 20:25:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='codigoaldescubierto.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/23f1b7b9e89a5663497fc1cb9d0af1e3?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Código al Descubierto</title>
		<link>http://codigoaldescubierto.wordpress.com</link>
	</image>
			<item>
		<title>CSS generado en PHP</title>
		<link>http://codigoaldescubierto.wordpress.com/2008/07/28/css-generado-en-php/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2008/07/28/css-generado-en-php/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 19:43:06 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[dinamico]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/?p=62</guid>
		<description><![CDATA[I. Introducción
Antes de comenzar a explicar el uso de hojas de estilos en PHP, recordar que se haga un repaso previo a qué son las hojas de estilo (CSS) en la programación web en caso de no saber de qué estamos hablando.
Pues bien, el objetivo del siguiente artículo, muy sencillo, todo hay que decirlo, es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=62&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3>I. Introducción</h3>
<p>Antes de comenzar a explicar el uso de hojas de estilos en PHP, recordar que se haga un repaso previo a qué son las hojas de estilo (CSS) en la programación web en caso de no saber de qué estamos hablando.</p>
<p>Pues bien, el objetivo del siguiente artículo, muy sencillo, todo hay que decirlo, es mostrar como podemos hacer una hoja de estilos (el típico estilos.css donde se definen todos los estilos de nuestra página) pero usando variables en PHP.</p>
<p>¿Qué ventajas tiene esto? ¡Muy sencillo! ¿Os imagináis poder crear una hoja de estilos de forma dinámica en función de lo que se introduzca en una base de datos? Darle al usuario la posibilidad de cambiar el diseño web simplemente rellenando formularios. La hoja de estilos se conectará a la base de datos (¡Recordad! ¡Estamos ante un fichero PHP!) y tomará como colores y propiedades aquellas definidas por el usuario.</p>
<p>Un ejemplo muy sencillo podría ser disponer de un pequeño formulario para definir las etiquetas &lt;H1&gt;, &lt;H2&gt; o las capas que se vayan a implementar en la web. Modificando adecuadamente ese formulario, luego, la hoja de estilos recogerá los valores de la base de datos y se usará un estilo totalmente dinámico.</p>
<p>¿Qué necesitamos para implementarlo? Muy sencillo. Básicamente se necesitan dos cosas:</p>
<ul>
<li>Fichero PHP donde se tenga el diseño de la web y se haga referencia a la hoja de estilos.</li>
<li>Fichero PHP que &#8220;hará&#8221; de hoja de estilos.</li>
</ul>
<p>&nbsp;</p>
<h3>II. Hoja de estilos</h3>
<p>La hoja de estilos debe ser un fichero en PHP. Supongamos, &#8220;estilos.php&#8221; y en su contenido debe figurar lo siguiente:</p>
<blockquote><p><span style="color:#999999;"><em>&lt;?php<br />
header(&#8220;Content-type: text/css&#8221;);<br />
$color = &#8220;blue&#8221;;<br />
echo &#8220;<br />
h2{<br />
color: $color;<br />
font-weight: bold;<br />
font-size: 1.2em;<br />
text-align: left;<br />
}<br />
&#8220;;<br />
?&gt;</em></span></p></blockquote>
<p align="justify">Donde pone &#8220;h2&#8243; se deberá colocar toda la hoja de estilos que se tiene prevista implementar. De esa forma, la variable $color (cuyo valor es &#8220;blue&#8221;) será la que se emplee para definir el color de la etiqueta H2. Imaginaos que en vez de coger esa sencilla variable, hacemos una consulta a la base de datos. La funcionalidad y potencia del sistema varía drásticamente.</p>
<p align="justify">La clave del código anterior reside en la primera línea: &#8220;header(&#8220;Content-type: text/css&#8221;);&#8221; línea que hará que el fichero en PHP sea del tipo CSS. De esta forma estamos engañando al sistema implementando una hoja de estilos con PHP.</p>
<p align="justify">Lo último que queda por implementar es hacer referencia a la hoja de estilos en la página diseñada.</p>
<p>&nbsp;</p>
<h3>III. Referencia en páginas PHP</h3>
<p>El procedimiento es exactamente el mismo que si de una hoja CSS se tratara. La única diferencia reside en que en vez de referenciar a un fichero con extensión &#8220;.css&#8221; se hará referencia a un fichero con extensión &#8220;.php&#8221;:</p>
<blockquote><p><span style="color:#999999;"><em>&lt;html&gt;<br />
&lt;head&gt;&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;estilos.php&#8221;&gt;&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;PRUEBA&lt;/h2&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></span></p></blockquote>
<p align="justify">Con el sencillo ejemplo anterior se ha configurado una hoja de estilos en PHP. Como podéis observar, la implementación es muy sencilla, pero siendo algo tan simple, es de gran utilidad según que casos.</p>
<p>&nbsp;</p>
<h3>VI. Referencias</h3>
<ul>
<li>
<div><a title="Ejemplo de cambios de idiomas." href="http://sperling.com/examples/pcss/" target="_blank">CSS using PHP<br />
</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/62/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/62/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=62&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2008/07/28/css-generado-en-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>Páginas en varios idiomas</title>
		<link>http://codigoaldescubierto.wordpress.com/2008/05/17/paginas-en-varios-idiomas/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2008/05/17/paginas-en-varios-idiomas/#comments</comments>
		<pubDate>Sat, 17 May 2008 09:26:49 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[idiomas]]></category>
		<category><![CDATA[sesiones]]></category>
		<category><![CDATA[varios idiomas]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/?p=50</guid>
		<description><![CDATA[I. Introducción
Hace poco he recibido una pregunta en la sección de &#8220;Sesiones en PHP&#8220;. La pregunta me ha parecido tan interesante que he decidido crear un pequeño artículo explicando su duda e intentando resolverla.
Alguno de vosotros, cuando habéis tenido que crear una página web os habéis encontrado con la necesidad de crearla en diferentes idiomas. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=50&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3>I. Introducción</h3>
<p align="justify">Hace poco he recibido una pregunta en la sección de &#8220;<a title="Sesiones en PHP" href="http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/" target="_blank">Sesiones en PHP</a>&#8220;. La pregunta me ha parecido tan interesante que he decidido crear un pequeño artículo explicando su duda e intentando resolverla.</p>
<p align="justify">Alguno de vosotros, cuando habéis tenido que crear una página web os habéis encontrado con la necesidad de crearla en diferentes idiomas. Una primera solución, y desde luego no la más eficiente, consiste en crearnos una página por cada uno de los idiomas. Por ejemplo, si tenemos una página &#8220;index.php&#8221;, si tuvieramos tres idiomas, deberíamos crearnos &#8220;index_esp.php&#8221;, &#8220;index_eng.php&#8221; e &#8221;index_ale.php&#8221; y cada una escrita en un idioma diferente.</p>
<p align="justify">Esta solución, como vosotros podéis ver, es del todo ineficiente. ¡Hagamos un sistema mucho más compacto! Pero&#8230; ¿Cómo? Pues la base consiste en el uso de sesiones. Veamos como se hace.</p>
<p align="justify">Antes de profundizar en como se desarrollará la aplicación, hay que tener en cuenta todos los elementos que van a formar parte de nuestro sistema:</p>
<ul>
<li>
<div>Una variable de sesión que almacene el idioma.</div>
</li>
<li>
<div>Tantas páginas web como idiomas haya con la relación de todas las traducciones necesarias. (Esto se puede suplir usando bases de datos).</div>
</li>
<li>
<div>Un enlace o acceso para que el visitante pueda modificar el idioma.</div>
</li>
<li>
<div>Funciones que gestionen la petición del usuario a la hora de modificar el idioma.</div>
</li>
</ul>
<p align="justify"> </p>
<h3>II. ¿Sesiones? ¿Para qué?</h3>
<p align="justify">Me imagino que muchos de vosotros pensareis: &#8220;¿Para qué narices quiero yo usar sesiones? ¿Qué utilidad tienen aquí?&#8221;. Antes de continuar, para el que no sepa muy bien de que van las sesiones le aconsejo que lea mi <a title="Sesiones en PHP" href="http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/" target="_blank">artículo</a> o al menos revise las referencias que hago en el.</p>
<p align="justify">Pues bien, se usarán las sesiones para almacenar en una variable de sesión el idioma que el visitante ha seleccionado. En el caso de no seleccionar ningún idioma, que se le asigne por defecto el que nosotros prefiramos.</p>
<p align="justify">Por ello, en todas las páginas de la web deberemos incluir las variables de sesión&#8230;</p>
<blockquote>
<p align="justify"><span style="color:#999999;"><em>&lt;?<br />
session_start();</em></span></p>
<p align="justify"><span style="color:#999999;"><em>session_register(&#8216;idioma_s&#8217;);<br />
?&gt;</em></span> </p></blockquote>
<p align="justify">Esas declaraciones deben encontrarse en todas las páginas donde queramos que se pueda elegir entre varios idiomas. De esta forma tendremos almacenado en todo momento el idioma seleccionado por el visitante y en caso de querer cambiarlo, tener el correspondiente código para hacerlo.</p>
<p align="justify">Me explico, el usuario debe ser capaz de poder modificar el idioma en cualquier página web. Cuando lo haga, debe existir un pequeño código que gestione su petición y modifique la variable de sesión a la que el desee.</p>
<p align="justify"> </p>
<h3>III. Ficheros de idiomas</h3>
<p>¿En qué consiste esto de los ficheros de idiomas? En realidad no es una solución única. Se podría implementar también con bases de datos pero ya que así fue como lo implementé en su momento, se realizará de esta forma.</p>
<p>Consiste en tener tantos ficheros &#8220;php&#8221; como idiomas haya y en cada uno de estos ficheros incluir una tabla donde se traduzcan todas las frases y palabras de la página web. Un posible esquema podría ser:</p>
<blockquote><p><em><span style="color:#999999;">$ag = array(<br />
// Título de la pagina:<br />
&#8220;titulo_pagina&#8221; =&gt; &#8220;Sessions in PHP&#8221;,<br />
 <br />
// Indice general:<br />
&#8220;Indice General&#8221; =&gt; &#8220;Index&#8221;,<br />
&#8220;Pagina Principal&#8221; =&gt; &#8220;Principal Index&#8221;,<br />
&#8230;<br />
)</span></em></p></blockquote>
<p style="text-align:justify;">De esta forma, hemos creado una tabla $ag donde, cuando pongamos $ag["titulo_pagina"] hará referencia a lo que está indicado con la flecha. Si lo que está indicado con la flecha está en un determinado idioma, será lo que muestre por pantalla.</p>
<p style="text-align:justify;">Pues bien, habrá tantos ficheros de este tipo como idiomas queramos implementar. Esta sería la parte más laboriosa pues habría que traducir cada una de las palabras de la página web.</p>
<p style="text-align:justify;">Esto añade una pregunta añadida. ¿Cómo escribo yo ahora en las secciones de mi web? Evidentemente ya no se pueden escribir las palabras tal cual sino haciendo referencia a la tabla $ag. Se ve mucho más claro con un ejemplo:</p>
<blockquote>
<p style="text-align:justify;"><em><span style="color:#888888;">&lt;p&gt;&lt;a href=&#8221;index.php&#8221; class=&#8221;linkmenu&#8221;&gt;&lt;?echo $ag["Pagina Principal"];?&gt;&lt;/a&gt;&lt;/p&gt;<br />
&lt;p&gt;&lt;a href=&#8221;buscador.php&#8221; class=&#8221;linkmenu&#8221;&gt;&lt;?echo $ag["Buscador"];?&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;</span></em></p></blockquote>
<p style="text-align:justify;">En vez de colocar la palabra &#8220;Página principal&#8221; hago referencia a la tabla $ag["Pagina Principal"] donde ya se hará la correspondiente traducción. (Recordad, lo que era referenciado por la flecha). Esto habrá que hacerlo para cada una de las palabras que quieran ser traducidas en la página web.</p>
<p style="text-align:justify;">Lo único que habría que hacer ahora para modificar el idioma sería incluir una determinada página u otra en función del idioma que haya seleccionado el visitante. Si se ha seleccionado el español, se hará referencia a la página &#8220;es.inc.php&#8221;, si se ha seleccionado inglés, se hará referencia a &#8220;en.inc.php&#8221; y así sucesivamente. Pero&#8230; ¿Cómo modifico esas referencias? Es lo que se explica a continuación.</p>
<p style="text-align:justify;"> </p>
<h3 style="text-align:justify;">IV. Modificación del idioma</h3>
<p style="text-align:justify;">El usuario debe ser capaz de modificar el idioma en cualquier momento de la visita. Por ello, a modo de ejemplo, se podrían colocar tres banderitas (si fuesen tres idiomas) y cada una de ellas que hiciera que se recargara la página enviando una <a title="POST y GET" href="http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/" target="_blank">variable GET</a> que fuese la que luego se tratar.</p>
<p style="text-align:justify;">El código podría ser el siguiente:</p>
<blockquote>
<p style="text-align:left;"><span style="color:#999999;"><em>Idioma: <br />
&lt;a href=&#8221;index.php?lg=es&#8221;&gt;&lt;img border=&#8221;0&#8243; src=&#8221;esp.gif&#8221;&gt;&lt;/a&gt;  <br />
&lt;a href=&#8221;index.php?lg=en&#8221;&gt;&lt;img border=&#8221;0&#8243; src=&#8221;usa.gif&#8221;&gt;&lt;/a&gt;</em></span></p></blockquote>
<p style="text-align:justify;">De esta forma el usuario cada vez que quiera cambiar de idioma lo que se hará será recargar la página donde nos encontremos (tened en cuenta que donde pone &#8220;index.php&#8221; deberá aparecer la página en cuestión donde estemos). Y se enviará la variable $_GET["lg"] que será la que procesemos. ¿Cómo? A través de un sencillo código:</p>
<blockquote>
<p align="justify"><em><span style="color:#999999;">if($_GET['lg']){<br />
     $HTTP_SESSION_VARS['idioma_s']=$_GET['lg'];<br />
}<br />
$lg=$HTTP_SESSION_VARS['idioma_s'];<br />
if($lg==&#8221;es&#8221; ||$lg==&#8221;en&#8221;){<br />
</span></em><em><span style="color:#999999;">     include($lg.&#8221;.inc.php&#8221;);<br />
}<br />
else{<br />
     $lg=&#8221;es&#8221;;include($lg.&#8221;.inc.php&#8221;);<br />
}</span></em></p></blockquote>
<p align="justify">Como se puede observar, en un primer lugar, si se ha solicitado cambio de idioma, es decir, si la variable $_GET["lg"] existe, se modificará la variable de sesión a lo que se haya indicado.</p>
<p align="justify">A continuación se le asigna esa variable de sesión a una variable ($lg) y se procesa qué es lo que vale. En función de lo que valga se incluirá una determinada página web u otra. En caso de que no exista $lg, se tomará el idioma por defecto el español tal y como se aprecia en el código.</p>
<p align="justify"> </p>
<h3>V. Conclusiones</h3>
<p align="justify">Siempre que se busque una determinada solución a un problema, en todo momento existirá la solución fácil, la que primero se nos ocurren pero que sin duda, no tiene por qué ser la más compacta. Hay que buscar alternativas más eficientes y escalables de forma que las posteriores modificaciones sean &#8220;minucias&#8221; comparado con lo que podría haber sido si se hubiera implementado el sistema con fuerza bruta.</p>
<p align="justify">Tal y como se puede haber visto, para añadir nuevos idiomas lo único que hay que añadir son tantos ficheros &#8220;idioma.enc.php&#8221; como hagan falta y modificar la función que procese el cambio de idioma para hacer referencia a un fichero o a otro.</p>
<p align="justify">De esta forma, no necesitamos una página para cada idioma sino que con una única página se puede implementar tantos idiomas como deseemos.</p>
<p align="justify">Cualquier duda o cualquier aspecto que no se haya entendido correctamente, no dudéis en preguntarlo.</p>
<p align="justify"> </p>
<h3>VI. Referencias</h3>
<ul>
<li>
<div><a title="Ejemplo de cambios de idiomas." href="http://www.institutoestudiosantiguoegipto.com/senenmut/fichas/" target="_blank">Web con cambio de idiomas</a></div>
</li>
<li>
<div><a title="Sesiones en PHP" href="http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/" target="_blank">Sesiones en PHP</a></div>
</li>
<li>
<div><a title="POST y GET" href="http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/" target="_blank">POST y GET</a></div>
</li>
<li>
<div><a title="Ejemplo de uso" href="http://www.box.net/shared/m8fivctbs1" target="_blank">Ejemplo de uso</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=50&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2008/05/17/paginas-en-varios-idiomas/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>CGIs en TOMCAT</title>
		<link>http://codigoaldescubierto.wordpress.com/2008/02/24/cgis-en-tomcat-bajo-windows/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2008/02/24/cgis-en-tomcat-bajo-windows/#comments</comments>
		<pubDate>Sun, 24 Feb 2008 19:50:01 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[Servidores]]></category>
		<category><![CDATA[cgi]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/?p=46</guid>
		<description><![CDATA[I. Introducción 
Debido al proyecto que estoy actualmente desarrollando me he visto en la tesitura de ser capaz de ejecutar CGIs (más concretamente scripts PERL) bajo WINDOWS. Muchos son los manuales que encontré aunque la mayoría no estaban escritos para torpes como yo (y, créanme, ¡las pasé canutas!). Tras estar varios días buscando y buscando logré hacer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=46&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3 align="justify">I. Introducción </h3>
<p align="justify">Debido al proyecto que estoy actualmente desarrollando me he visto en la tesitura de ser capaz de ejecutar CGIs (más concretamente scripts PERL) bajo WINDOWS. Muchos son los manuales que encontré aunque la mayoría no estaban escritos para torpes como yo (y, créanme, ¡las pasé canutas!). Tras estar varios días buscando y buscando logré hacer que funcionaran y me gustaría dejar bien claro qué pasos llevé a cabo para hacer que TOMCAT los ejecutara.</p>
<p align="justify">¿Por qué TOMCAT? Seguramente os lo estéis preguntando. Pues bien, me era necesario TOMCAT debido a que necesitaba ejecutar páginas en <a target="_blank" href="http://es.wikipedia.org/wiki/Java_Server_Pages" title="Java Server Pages">JSP</a>. Ésto, APACHE no es capaz de ejecutarlos y se requiere de TOMCAT para hacer que funcione.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">II. Requisitos previos</h3>
<p align="justify">Los pasos que a continuación se detallan son comunes a todos los CGIs que se quieran ejecutar en TOMCAT. Pues bien, si quisieramos ejecutar scripts en PERL (que fue con lo que yo me tuve que enfrentar) tenemos que &#8220;capacitar&#8221; a WINDOWS para que sea capaz de ejecutar scripts en PERL. En caso de no capacitarlo, aunque lo configuremos adecuadamente, cuando queramos ejecutar el fichero .cgi, no lo reconocerá adecuadamente.</p>
<p align="justify">Por tanto, si lo que queremos es ejecutar scripts en PERL primero debemos descargarnos la aplicación adecuada para que se puedan ejecutar scripts PERL en WINDOWS. Se puede descargar de <a target="_blank" href="http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1002-MSWin32-x86-283697.msi" title="Activate PERL">aquí</a>.</p>
<p align="justify">En el caso de que queramos ejecutar otro lenguaje de programación, será necesario que el sistema operativo sea capaz de interpretarlo. No olvidarlo.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">III. Instalación del servidor</h3>
<p align="justify">Antes de nada, será necesario descargarse JAVA en el ordenador que queramos instalar el servidor. Yo, personalmente, me hago un lío entre <a target="_blank" href="http://es.wikipedia.org/wiki/Java_Runtime_Environment" title="Java Runtime Environment">JRE</a>, <a target="_blank" href="http://es.wikipedia.org/wiki/JDK" title="Java Development Kit">JDK</a>, <a target="_blank" href="http://en.wikipedia.org/wiki/J2SE" title="Java Platform, Standard Edition">J2SE</a>, etc. ¡Imaginaos cuando entré en la página de descargas de JAVA! No sabía ni que descargarme. Pues bien, lo que necesitamos es simplemente ejecutar java, no queremos disponer de ningún entorno de desarrollo ni nada por el estilo. Por tanto, lo que os tenéis que descargar en este caso es JRE (Java Runtime Environment) que sirve, simplemente, para ejecutar JAVA en el ordenador. En mi caso me descargué la versión 6. Se puede descargar de <a target="_blank" href="http://www.java.net/download/jdk6/6u10/promoted/b11/binaries/jre-6u10-ea-bin-b11-windows-i586-p-24_jan_2008.exe" title="Java Runtime Environment">aquí</a>. Una vez descargado, lo instalais.</p>
<p align="justify">Lo que hay que hacer a continuación es bajarse el servidor TOMCAT. Para ello, el que usé para la instalación fue la versión 5.5. La podéis descargar de <a target="_blank" href="http://ftp.udc.es/apache-dist/tomcat/tomcat-5/v5.5.26/bin/apache-tomcat-5.5.26.exe" title="Descargar TOMCAT">aquí</a>.</p>
<p align="justify">Una vez descargado, debéis instalarlo. Cuando se está instalando, nos va a pedir donde tenemos instalado el JRE. Normalmente lo detectará solo, si no, hay que seleccionar la carpeta donde se haya instalado (Normalmente está en <em>C:\Archivos de programa\Java\jre1.6.0_01</em>).</p>
<p align="justify">Si no tocáis absolutamente nada, el puerto por defecto será el 8080. Es decir, cuando intentemos ejecutar una página web alojada en el ordenador deberemos poner la dirección escuchando en el puerto 8080. Es decir: <em>http://localhost:8080/carpeta_web/index.jsp</em>, por ejemplo.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">IV. Visualización web</h3>
<p align="justify">Antes de continuar, haré un pequeño inciso en donde alojar las páginas web para visualizarlas en el navegador. Yo me llevé un buen rato dándome errores de compilación de java (¡imaginaos la cara que se me ponía!) y era simplemente porque la carpeta estaba mal alojada dentro del servidor.</p>
<p align="justify">Pues bien, imaginemos que tenemos una página web alojada en una carpeta. Por ejemplo, la carpeta <em>codigoaldescubierto</em>.</p>
<p align="justify">Para alojar adecuadamente esa página dentro del servidor tendremos que entrar dentro de la carpeta asociada a TOMCAT para almacenar las diferentes páginas web. Si no hemos tocado nada cuando hemos instalado TOMCAT, por defecto será: <em>C:\Archivos de programa\Apache Software Foundation\Tomcat 5.5\webapps</em>.</p>
<p align="justify">Es decir, dentro de esa carpeta tendremos que copiar la carpeta <em>codigoaldescubierto.</em></p>
<p align="justify">Para acceder a dicha página web, se deberá poner en el navegador lo siguiente: <em>http://localhost:8080/codigoaldescubierto/index.html</em>, por ejemplo.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">V. Configuración de TOMCAT</h3>
<p align="justify">Pues bien, cerremos ese pequeño paréntesis y dediquémonos a intentar configurar TOMCAT para que ejecute CGIs. Lo primero que hay que hacer es detener el servidor en el caso de que estuviera ejecutándose.</p>
<p align="justify">&nbsp;</p>
<h5 align="justify">Modificación de web.xml </h5>
<p align="justify">Simplemente debeis acceder al fichero web.xml (Alojado en <em>C:\Archivos de programa\Apache Software Foundation\Tomcat 5.5\conf</em>) y descomentar las siguientes líneas de código:</p>
<blockquote>
<p align="justify"><font color="#999999"><em>&lt;servlet&gt;<br />
     &lt;servlet-name&gt;cgi&lt;/servlet-name&gt;<br />
    &lt;servlet-class&gt;org.apache.catalina.servlets.CGIServlet&lt;/servlet-class&gt;<br />
    &lt;init-param&gt;<br />
          &lt;param-name&gt;debug&lt;/param-name&gt;<br />
          &lt;param-value&gt;0&lt;/param-value&gt;<br />
    &lt;/init-param&gt;<br />
    &lt;init-param&gt;<br />
          &lt;param-name&gt;cgiPathPrefix&lt;/param-name&gt;<br />
          &lt;param-value&gt;WEB-INF/cgi&lt;/param-value&gt;<br />
    &lt;/init-param&gt;<br />
    &lt;load-on-startup&gt;5&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;</em></font></p></blockquote>
<p align="justify">Además, hay que descomentar lo siguiente:</p>
<blockquote>
<p align="justify"><em><font color="#999999">&lt;servlet-mapping&gt;<br />
      &lt;servlet-name&gt;cgi&lt;/servlet-name&gt;<br />
      &lt;url-pattern&gt;/cgi-bin/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</font></em> </p></blockquote>
<p align="justify">Con esto estamos diciendo a TOMCAT que todo lo que alojemos en la carpeta cgi-bin, lo redirecionará a la carpeta cgi que tendremos alojada dentro de WEB-INF (más tarde explicaremos más detalladamente como ejecutar el script).</p>
<p align="justify">&nbsp;</p>
<h5 align="justify">Creación del fichero JAR </h5>
<p align="justify">Simplemente debeis renombrar el fichero <em>servlets-cgi.renametojar</em> a <em>servlets-cgi.jar</em>. ¿Dónde está alojado este fichero? Normalmente (para la versión 5.5) está alojado en <em>C:\Archivos de programa\Apache Software Foundation\Tomcat 5.5\server\lib</em>. Si no fuera así, simplemente debéis buscar donde está alojado.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Por último, arrancaremos el servidor que se encontraba detenido. ¡Ya estamos en disposición de probar nuestro primer CGI!</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">VI. Ejecución de los scripts</h3>
<p align="justify">Una vez configurado TOMCAT, hay que ver si funciona correctamente. Para ello, lo primero que hay que hacer es distribuir adecuadamente la carpeta donde estará alojada la página web.</p>
<p align="justify">Un posible ejemplo de la distribución mínima puede ser (suponiendo que la carpeta es <em>codigoaldescubierto</em>):</p>
<blockquote>
<p align="justify"><font color="#999999"><em>codigoaldescubierto/<br />
|__index.jsp<br />
|__WEB-INF/<br />
       |__ cgi/<br />
              |__script.cgi</em></font></p></blockquote>
<p align="justify">La idea es tener dentro de la carpeta <em>cgi</em> todos los scripts que queramos ejecutar. Imaginemos que tenemos un script denominado script.cgi que queremos ejecutar en nuestra página web. Pues bien, para acceder a dicho script, bastará con acceder a la siguiente URL: <em>http://localhost:8080/codigoaldescubierto/cgi-bin/script.cgi</em> </p>
<p align="justify">&nbsp;</p>
<h3 align="justify">VII. Referencias</h3>
<ul>
<li>
<div align="justify"><a target="_blank" href="http://tomcat.apache.org/" title="Apache TOMCAT">[ENG] Página de TOMCAT</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://download.java.net/jdk6/" title="Descargas JAVA">[ENG] Desargar JAVA</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.activestate.com/store/productdetail.aspx?prdGUID=81fbce82-6bd5-49bc-a915-08d58c2648ca" title="Activate PERL">[ENG] Descargar PERL</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/46/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/46/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=46&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2008/02/24/cgis-en-tomcat-bajo-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>Sesiones en PHP</title>
		<link>http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 13:08:54 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[almacenar]]></category>
		<category><![CDATA[sesiones]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/</guid>
		<description><![CDATA[I. Introducción
¿Qué son las sesiones? Es uno de los sistemas más usados en PHP para el almacenamiento de variables a lo largo de la navegación por una página web son las sesiones.
Consisten básicamente en variables globales que mantienen su valor a pesar de cambiar de sección dentro de una misma web. Recordamos que existen tres [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=45&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3 align="justify">I. Introducción</h3>
<p align="justify">¿Qué son las sesiones? Es uno de los sistemas más usados en PHP para el almacenamiento de variables a lo largo de la navegación por una página web son las sesiones.</p>
<p align="justify">Consisten básicamente en variables globales que mantienen su valor a pesar de cambiar de sección dentro de una misma web. Recordamos que existen tres formas de almacenar la información de las variables que más tarde querremos procesar:</p>
<ul>
<li>
<div align="justify"><strong>POST</strong>: Envía los datos de forma &#8220;oculta&#8221; en la cabecera de la página y requiere de un formulario para enviar las variables.</div>
</li>
<li>
<div align="justify"><strong>GET</strong>: Envía la información en la URL. Tiene la ventaja de poder enlazar directamente con los valores de las variables. Limitación de capacidad y falta de confidencialidad.</div>
</li>
<li>
<div align="justify"><strong>SESIONES</strong>: Gracias a las sesiones podremos almacenar el valor de variables cuyo contenido se preservará a lo largo de toda la visita.</div>
</li>
</ul>
<p align="justify">Un ejemplo de su gran potencial es, por ejemplo, cuando queremos almacenar el nombre de usuario y la contraseña de una persona a lo largo de su recorrido por la web. Podríamos ir enviando dichos valores mediante el método GET pero tanto el nombre de usuario y la contraseña saldrían visibles en la URL destino. Para asegurar confidencialidad y seguridad, se usan las sesiones.</p>
<p align="justify">En definitiva, si queremos almacenar valores en unas determinadas variables y que dichos valores permanezcan a lo largo de una visita sin necesidad de ir enviando formularios ni enviando variables por la URL, el método más cómodo son las sesiones. Veamos como se implementan.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">II. Implementación práctica</h3>
<p align="justify">La implementación no debe suponer ningún problema. Hay que tener claro que en cada página donde queramos mantener el valor de dichas variables hay que añadirle las siguientes líneas de código (cuyo significado se explicará detenidamente más adelante):</p>
<blockquote>
<p align="justify"><font color="#999999"><em>&lt;?<br />
session_start();</em></font></p>
<p align="justify"><font color="#999999"><em>session_register(&#8216;dni_usuario&#8217;);<br />
session_register(&#8216;variable_2&#8242;);<br />
&#8230;<br />
session_register(&#8216;variable_n&#8217;);<br />
?&gt;</em></font> </p></blockquote>
<p align="justify">Es importante añadir que dichas lineas deben estar colocadas al comienzo del fichero HTML. Antes incluso de cualquier etiqueta HTML o código en PHP. Esto es importante pues si no, genera errores.</p>
<p align="justify">Como su propia palabra indica, <em><font color="#999999">session_start();</font></em> indica a la página web en concreto que, en ese fichero HTML queremos usar las variables almacenadas en la sesión.</p>
<p align="justify">Posteriormente hay que definir que variables son las que vamos a usar a través de la orden <font color="#999999"><em>session_register(&#8216;nombre_variable&#8217;);</em></font></p>
<p align="justify">&nbsp;</p>
<p align="justify"><em><font color="#999999"></font></em></p>
<p align="justify">Imaginemos que tenemos tres páginas web:</p>
<ul>
<li>
<div align="justify">index.php: Donde colocaremos un formulario de login para el usuario y lugar donde se procesarán los datos introducidos en el formulario.</div>
</li>
<li>
<div align="justify">contenidos.php: De acceso exclusivo a la gente registrada.</div>
</li>
<li>
<div align="justify">noticias.php: Sección que puede tener acceso todo el mundo.</div>
</li>
</ul>
<p align="justify">La idea consiste en que, gracias a los datos insertados en la página index.php, el sistema identifique al usuario y le de acceso o no a la página restringida contenidos.php. En el caso de noticias.php no será necesario implementar nada referente a las sesiones pues no se usarán esas variables para procesar absolutamente nada.</p>
<p align="justify">En las otras dos páginas (index.php y contenidos.php) será necesario incluir las líneas citadas anteriormente. De esta forma estamos ordenando que dichas páginas &#8220;recuperen&#8221; el valor de las variables de la sesión para ser usadas en la sección en concreto.</p>
<p align="justify">Una vez tenemos dicho a las páginas que vamos a usar las variables de sesión, lo único que queda es saber asignarle valores, quitárselos o recuperarlos. De esta forma, si en la página contenidos debemos verificar si el usuario está registrado o no, podríamos hacer un simple &#8220;if&#8221; para saber si existe un usuario o no y en caso negativo sacarle el correspondiente error.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Siguiendo con nuestro ejemplo, en index.php y en contenidos.php habrá que colocar las siguientes líneas:</p>
<blockquote>
<p align="justify"><font color="#999999"><em>&lt;?<br />
session_start();</em></font></p>
<p align="justify"><em><font color="#999999">session_register(&#8216;nombre_usuario&#8217;);<br />
session_register(&#8216;clave_usuario&#8217;);<br />
?&gt;</font></em></p></blockquote>
<p align="justify">De esta forma se han definido dos variables: <em><font color="#999999">nombre_usuario</font></em> y <em><font color="#999999">clave_usuario</font></em>.</p>
<p align="justify">Pues bien, en la página index.php lo que haremos será recoger las variables del formulario en cuestión y almacenarlas en las variables de sesión. En este punto se le pueden añadir tantas restricciones como se quieran. Por ejemplo, comprobar mediante una base de datos que el nombre de usuario y la contraseña corresponden a un usuario registrado con anterioridad. En caso de no existir, denegar la identificación.</p>
<blockquote>
<p align="left"><em><font color="#999999">if($_POST['login']){<br />
     $HTTP_SESSION_VARS['nombre_usuario']=$_POST['nombre_usuario'];<br />
     $HTTP_SESSION_VARS['clave_usuario']=$_POST['clave_usuario'];<br />
}</font></em> </p></blockquote>
<p align="justify">En lugar de escribir <em><font color="#999999">$HTTP_SESSION_VARS</font></em> se puede optar por poner <em><font color="#999999">$_SESSION</font></em> cuyo significado es equivalente. En este caso, escriba lo que escriba, se van a almacenar los valores del formulario dentro de la sesión.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Si existiera un botón de &#8220;Desconectar&#8221;, se podría poner algo así:</p>
<blockquote>
<p align="justify"><em><font color="#999999">if($_POST['desconectar']){<br />
     session_unset();<br />
}</font></em></p></blockquote>
<p align="justify">De esta forma, a través de <em><font color="#999999">session_unset()</font></em> lo que se hace es eliminar todas las variables que estuvieran definidas en la sesión. De esta forma, cuando la página web intentara reconocer al usuario, vería que no existe por lo que la desconexión se habría realizado con éxito. </p>
<p align="justify">&nbsp;</p>
<p align="justify">En la página contenidos.php podemos incluir un &#8220;if&#8221; de forma que si existen las dos variables de sesión, se le de acceso. En caso contrario, mostrarle un mensaje de error. También se podría comprobar si las variables de sesión corresponde a un usuario registrado en una base de datos u operaciones similares.</p>
<blockquote>
<p align="left"><em><font color="#999999">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;<br />
&lt;?<br />
if(isset($HTTP_SESSION_VARS['nombre_usuario']) &amp;&amp; isset($HTTP_SESSION_VARS['clave_usuario'])){<br />
     echo &#8220;Bievenido a la sección&#8230;&#8221;;<br />
}<br />
else{<br />
     echo &#8220;Error: Ha accedido a una sección restringida. Vueva a intentarlo&#8221;;<br />
}<br />
?&gt;<br />
&lt;/body&gt;&lt;/html&gt;</font></em></p></blockquote>
<p align="justify">&nbsp;</p>
<p align="justify">Como se puede comprobar, las posibilidades son infinitas. Incluso, si se dispone de un índice, se pueden &#8220;anular&#8221; accesos en dicho índice comprobando simplemente si el usuario está identificado. Por ejemplo:</p>
<blockquote>
<p align="left"><em><font color="#999999">&lt;a href=&#8221;index.php&#8221; mce_href=&#8221;index.php&#8221;&gt;Principal&lt;/a&gt;&lt;br&gt;<br />
&lt;a href=&#8221;noticias.php&#8221; mce_href=&#8221;noticias.php&#8221;&gt;Noticias&lt;/a&gt;&lt;br&gt;<br />
&lt;?if(isset($HTTP_SESSION_VARS['nombre_usuario']) &amp;&amp; isset($HTTP_SESSION_VARS['clave_usuario'])){<br />
?&gt;&lt;a href=&#8221;contenidos.php&#8221;&gt;Contenidos&lt;/a&gt;&lt;?}?&gt;</font></em></p></blockquote>
<p align="justify">En este caso, si vamos a usar las variables de sesión en el índice, la sección noticias.php ya si requerirá el uso de las variables de sesión por lo que habrá que incluir las mismas líneas que se incluyeron en las otras dos. Solo en el caso de que el usuario esté identificado, le saldrá en el menú el acceso a la sección contenidos.php.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Todo este ejemplo queda disponible en la parte de &#8220;Referencias&#8221; para su descarga. En él, se dispondrá del código completo para una mejor interpretación.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">III. Funciones</h3>
<p align="justify">A pesar de la explicación anterior, es importante disponer de una buena referencia de funciones usadas en las sesiones. Entendiendo los fundamentos básicos de las sesiones y sabiendo usar adecuadamente cada función, su uso no debería suponer ningún misterio.</p>
<p align="justify">A continuación os comento las funciones más importantes. El resto de funciones podéis encontrarlas en las referencias.</p>
<p align="justify">&nbsp;</p>
<h5 align="justify"><a target="_blank" href="http://www.php-es.com/function.session-start.html" title="session_start">session_start</a></h5>
<p align="justify">Inicializa los datos de una determinada sesión. Su uso es imprescindible y se coloca justamente donde se indicó en el anterior apartado: Al comienzo de cada página web que requiera su uso.</p>
<h5 align="justify"><a target="_blank" href="http://www.php-es.com/function.session-register.html" title="session_register">session_register</a></h5>
<p align="justify">Sirve para declarar las variables que se van a usar en la sesión.</p>
<h5 align="justify"><a target="_blank" href="http://www.php-es.com/function.session-destroy.html" title="session_destroy">session_destroy</a></h5>
<p align="justify">Destruye la sesión actual sin destruir ninguna de las variables. Por ejemplo, si usamos este método únicamente para desconectar a un usuario, no serviría pues las variables asociadas a su identificación seguirían activas. Haría falta borrar dichos valores.</p>
<h5 align="justify"><a target="_blank" href="http://www.php-es.com/function.session-unset.html" title="session_unset">session_unset</a></h5>
<p align="justify">Borra las variables asociadas a una sesión eliminando su valor.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">IV. Conclusiones</h3>
<p align="justify">El uso de las sesiones está del todo difundido en las páginas web con un mínimo de programación. Su uso es muy sencillo y da un enorme potencial de trabajo: Identificación de usuario, variables globales de la página o cualquier otro tipo de variable que se quiera almacenar durante todo el recorrido de una página. Incluso se podría ir almacenando el historial de visita de cada usuario de la web.</p>
<p align="justify">Las posibilidades son infinitas y su implementación, tal y como habéis visto, bien sencilla.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">V. Referencias</h3>
<ul>
<li>
<div align="justify"><a target="_blank" href="http://www.box.net/shared/z9ssqb144w" title="Ejemplo de uso">Ejemplo uso sesiones</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.php-es.com/ref.session.html" title="Funciones de sesiones">[ESP] Funciones de sesiones</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.desarrolloweb.com/articulos/235.php" title="Artãulo Desarrolloweb">[ESP] Artículo desarrolloweb (I)</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.desarrolloweb.com/articulos/321.php" title="Artãulo Desarrolloweb">[ESP] Artículo desarrolloweb (II)</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.webestilo.com/php/php12a.phtml" title="Webestilo">[ESP] Manual webestilo</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.webestilo.com/php/php12e.phtml" title="Carrito de la compra (I)">[ESP] Carrito de la compra (I)</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.desarrolloweb.com/articulos/1634.php" title="Carrito de la compra (II)">[ESP] Carrito de la compra (II)</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=45&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2008/01/04/sesiones-en-php/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>Borrar un Directorio</title>
		<link>http://codigoaldescubierto.wordpress.com/2007/12/30/borrar-un-directorio/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2007/12/30/borrar-un-directorio/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 08:19:58 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[Funciones]]></category>
		<category><![CDATA[borrar]]></category>
		<category><![CDATA[directorio]]></category>
		<category><![CDATA[funcion]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/2007/12/30/borrar-un-directorio/</guid>
		<description><![CDATA[I. Introducción 
Con este artículo no pretendo mostraros ninguna maravilla en programación. Consiste en una función sencilla, muy simple y de fácil implementación que es capaz de borrar un directorio y todos los subdirectorios que existan en ella.
A veces, en muchas de las páginas que se implementan, surge la necesidad de poder borrar un directorio de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=44&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3>I. Introducción </h3>
<p align="justify">Con este artículo no pretendo mostraros ninguna maravilla en programación. Consiste en una función sencilla, muy simple y de fácil implementación que es capaz de borrar un directorio y todos los subdirectorios que existan en ella.</p>
<p align="justify">A veces, en muchas de las páginas que se implementan, surge la necesidad de poder borrar un directorio de una determinada carpeta. El problema surge cuando, para borrar un directorio, es necesario antes eliminar todos los ficheros que contenga. Es decir, el directorio debe estar vacío. Ésto puede suponer un quebradero de cabeza si no pensamos las cosas con claridad.</p>
<p align="justify">Por ello, y debido a la necesidad que me surgió, implementé una sencilla función (no más de diez líneas) que borrara recursivamente todos los ficheros y subdirectorios dentro de una carpeta.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">II. Implementación</h3>
<p align="justify">El código de la función a implementar es el siguiente:</p>
<blockquote>
<p align="left"><font color="#999999"><em>function borra_carpeta_llena($dir){<br />
     if (is_dir($dir)) {<br />
          if ($gd = opendir($dir)) {<br />
               while (($archivo = readdir($gd)) !== false){<br />
                    if($archivo!=&#8221;.&#8221; &amp;&amp; $archivo != &#8220;..&#8221;){<br />
                         if(is_dir($dir.&#8221;/&#8221;.$archivo)){borra_carpeta_llena($dir.&#8221;/&#8221;.$archivo);rmdir($dir.&#8221;/&#8221;.$archivo);}<br />
                         else{unlink($dir.&#8221;/&#8221;.$archivo);}<br />
                    }<br />
               }<br />
               closedir($gd);<br />
          }<br />
     }<br />
}</em></font> </p></blockquote>
<p align="justify">Pues bien, su explicación es bastante sencilla.</p>
<p align="justify">Para empezar, cabe destacar que el parámetro que se le mete a la función es la ruta de directorio que queremos borrar. Me explico, ese directorio es el que vaciaremos pero no se borrará. Si luego queremos borrar dicho directorio también, bastará con poner <font color="#999999"><em>rmdir($dir)</em></font> puesto que ese directorio ya se encontrará vacío.</p>
<blockquote>
<p align="justify"><em><font color="#999999">if (is_dir($dir)) {<br />
     if ($gd = opendir($dir)) {</font></em></p></blockquote>
<p align="justify">Lo primero que hace la función es comprobar que dicho directorio existe y luego intenta abrirlo. Lógicamente, en caso de no poder abrirlo o no existir, saldría de la función sin ningún tipo de problemas. Ésto nos hará evitar posibles errores posteriores.</p>
<blockquote>
<p align="left"><em><font color="#999999">while (($archivo = readdir($gd)) !== false){<br />
     if($archivo!=&#8221;.&#8221; &amp;&amp; $archivo != &#8220;..&#8221;){<br />
          if(is_dir($dir.&#8221;/&#8221;.$archivo)){borra_carpeta_llena($dir.&#8221;/&#8221;.$archivo);rmdir($dir.&#8221;/&#8221;.$archivo);}<br />
          else{unlink($dir.&#8221;/&#8221;.$archivo);}<br />
     }<br />
}</font></em></p></blockquote>
<p align="justify">Lo que se hace a continuación es recorrer el directorio en cuestión fichero por fichero. Intento leer un fichero (<em><font color="#999999">($archivo = readdir($gd)) !== false</font></em>) y si lo puedo abrir para leer, entonces prosigo.</p>
<p align="justify">En caso afirmativo, debo comprobar que el fichero abierto no sea el de cambio de directorio (es decir, un &#8220;.&#8221; o los dos &#8220;..&#8221;). En cuyo caso ya debo verificar si nos encontramos ante un fichero o ante un subdirectorio. Es aquí cuando tomaré las dos posibles decisiones:</p>
<blockquote>
<p align="justify"><em><font color="#999999">if(is_dir($dir.&#8221;/&#8221;.$archivo)){borra_carpeta_llena($dir.&#8221;/&#8221;.$archivo);rmdir($dir.&#8221;/&#8221;.$archivo);}</font></em></p>
</blockquote>
<p align="justify">Si es un directorio, vuelvo a llamar a la función indicándole como ruta del directorio aquella donde se encuentre y a continuación, borro dicho directorio.</p>
<p align="justify">&nbsp;</p>
<blockquote>
<p align="justify"><em><font color="#999999">else{unlink($dir.&#8221;/&#8221;.$archivo);}</font></em></p>
</blockquote>
<p align="justify">Si se trata de un fichero, borro directamente dicho fichero.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Como veis, su explicación es bien sencilla pero, simplemente con la llamada a la función ya nos quitamos de ir borrando cada directorio uno por uno.</p>
<p align="justify">&nbsp;</p>
<p align="justify">La llamada a la función sería como sigue:</p>
<blockquote>
<p align="justify"><font color="#999999"><em>$dir = &#8220;ruta/carpeta/a/borrar&#8221;;<br />
borra_carpeta_llena($dir);</em></font> </p></blockquote>
<p align="justify">Sencillamente eso, sin ningún tipo de historias ni librerías ni nada por el estilo.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">III. Referencias</h3>
<ul>
<li>
<div align="justify"><a target="_blank" href="http://www.php-es.com/ref.dir.html" title="Funciones de Directorio">[ESP] Funciones de directorio</a></div>
</li>
<li>
<div align="justify"><a target="_blank" href="http://www.php-es.com/ref.filesystem.html" title="Funciones de Archivos">[ESP] Funciones de archivos</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/44/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/44/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=44&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2007/12/30/borrar-un-directorio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>POST y GET</title>
		<link>http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 21:42:35 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[variables nulas]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/</guid>
		<description><![CDATA[I. Introducción 
En más de una ocasión me han comentado el mismo problema cuando se trabaja con formularios, enlaces y variables en PHP. Consiste, básicamente en que las variables que se envían a través del formulario o las páginas que se acceden enviando los parámetros por la barra de direcciones, luego pierden su valor. Puede llegar a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=42&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3 align="justify">I. Introducción </h3>
<p align="justify">En más de una ocasión me han comentado el mismo problema cuando se trabaja con formularios, enlaces y variables en PHP. Consiste, básicamente en que las variables que se envían a través del formulario o las páginas que se acceden enviando los parámetros por la barra de direcciones, luego pierden su valor. Puede llegar a ocasionar pérdidas de tiempo innecesarias que, desde este pequeño manual, intenteremos solventar.</p>
<p align="justify">Antes de profundizar en el problema de las &#8220;variables perdidas&#8221;, voy a explicar brevemente qué es eso de POST y GET cuando trabajamos con PHP, formularios y HTML.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">II. POST y GET </h3>
<p align="justify">Existen tres formas de dar valor a variables en PHP en páginas web. Formularios, enlaces HTML y sesiones. Aquí me limitaré a comentar las dos primeras. La última, se comentará en su debido manual.</p>
<p align="justify">&nbsp;</p>
<h5 align="justify">Formularios </h5>
<p align="justify">La primera forma es a través de formularios. Lo habitual es usar el método POST debido a una razón que comentaremos a continuación. Los formularios en cuestión se definen de la siguiente forma: </p>
<blockquote>
<p align="justify"><em><font color="#999999">&lt;form action=&#8221;url&#8221; method=&#8221;post&#8221;&gt;&#8230;&lt;/form&gt; || &lt;form action=&#8221;url&#8221; method=&#8221;get&#8221;&gt;&#8230;&lt;/form&gt;</font></em></p>
</blockquote>
<p align="justify">Con el parámetro <font color="#999999"><em>method</em></font>, estamos indicando la forma en la que se enviarán las variables del formulario.</p>
<p align="justify">Si tomamos como elección GET, todas las variables se enviarán por la dirección html. Me explico, cuando recarguemos la página web al haber enviado el formulario, saldrá algo así:</p>
<blockquote>
<p align="justify"><em><font color="#999999">http://www.dominio.com/index.php?nombre=Un_nombre&amp;tipo=2&#8230;</font></em> </p>
</blockquote>
<p align="justify">Es decir, ¡las variables aparecen en la barra de direcciones! Esto, para envío de formularios, no es lo normal pues estamos mostrando todos los datos del envío y pueden ser muchísima información, alguna incluso, confidencial que el usuario no debe enterarse. Es por ello por lo que, cuando tratamos con formularios, usamos el método POST.</p>
<p align="justify">Este método consiste, básicamente en enviar las variables de forma &#8220;oculta&#8221; para que nadie pueda ver los datos que ha enviado al pulsar el botón de envío de formulario.</p>
<p align="justify">&nbsp;</p>
<h5 align="justify">Enlaces HTML</h5>
<p align="justify">La segunda forma de enviar las variables es a través de enlaces.  Aquí, lo que se hace es enviar las variables mediante el método GET. Más que nada porque cuando escribimos el enlace ya le estamos pasando las variables por la línea de dirección:</p>
<blockquote>
<p align="justify"><font color="#999999"><em>&lt;a href=&#8221;index.php?estilo=4&amp;tipo=2&#8243; mce_href=&#8221;index.php?estilo=4&amp;tipo=2&#8243;&gt;Recargar&lt;/a&gt;</em></font> </p>
</blockquote>
<p align="justify">En este caso, las variables PHP <font color="#999999"><em>estilo</em></font> y <font color="#999999"><em>tipo</em></font>, se envían usando el método GET. Cuando uno pinche en la palabra recargar, accederá justamente a la dirección marcada y las dos variables aparecerán en la barra de direcciones.</p>
<p align="justify">&nbsp;</p>
<h5 align="justify">Sesiones</h5>
<p align="justify">Existe un tercer método de manejo de variables en PHP; las sesiones. Pero este no es el artículo donde procede hablar de ellas.</p>
<p align="justify">&nbsp;</p>
<p align="justify">En definitiva, existen dos formas de tratar las variables (las que vemos aquí) y por tanto, y es a lo que quería llegar: Dos formas de recoger el valor de dichas variables. Veámoslo en detalle.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">III. Recogida de valores. Problemática </h3>
<p align="justify">Tal y como se ha explicado, existen dos formas de enviar las variables:</p>
<ul>
<li>
<div align="justify">Con formularios: En este caso, lo normal es usar el método POST.</div>
</li>
<li>
<div align="justify">Con enlaces: Se usará el método GET.</div>
</li>
</ul>
<p align="justify">El problema surge debido a que antes, los servidores recogían las variables tal cual. Ésto, produjo que muchos de nosotros nos malacostumbraramos en la &#8220;recogida de variables&#8221;. Me explico, si cuando uno envía un formulario, declara una variable llamada &#8220;nombre&#8221;, a la hora de recargar la página, se creaba automáticamente una variable PHP llamada <em><font color="#999999">$nombre</font></em>. De esta forma, la manera de recoger el valor de la variable era bien sencillo. Esto no sucede en la actualidad.</p>
<p align="justify">Suponiendo el mismo caso que antes, para recoger los valores de un formulario donde se ha usado el método POST se debe escribir:</p>
<blockquote>
<p align="justify"><em><font color="#999999">$nombre=$_POST['nombre'];</font></em></p>
</blockquote>
<p align="justify">Es decir, si cogemos directamente la variable <em><font color="#999999">$nombre</font></em>, nos encontraremos con que no vale nada. Todas las variables enviadas con el método POST se almacenan en una especie de tabla que se accede tal y como hemos comentado.</p>
<p align="justify">Si resulta que la variable se ha enviado usando el método GET o a través de un enlace HTML, habrá que declarar lo siguiente:</p>
<blockquote>
<p align="justify"><em><font color="#999999">$nombre=$_GET['nombre'];</font></em></p>
</blockquote>
<p align="justify">El procedimiento es similar a lo anteriormente comentado.</p>
<p align="justify">Os puede parecer algo demasiado obvio, pero realmente puede ocasionar muchos quebraderos de cabeza si sois tan despistados como lo fui yo en su momento.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">IV. Referencias</h3>
<ul>
<li>
<div align="justify">[ESP] Métodos POST y GET en formularios: <a target="_blank" href="http://www.webestilo.com/php/php09b.phtml" title="POST y GET">POST_y_GET</a></div>
</li>
<li>
<div align="justify">[ESP] POST y GET en desarrolloweb: <a target="_blank" href="http://www.desarrolloweb.com/articulos/2194.php" title="POST y GET">POST_y_GET</a></div>
</li>
<li>
<div align="justify">[ESP] Recogida automática de variables POST y GET: <a target="_blank" href="http://www.cristalab.com/tips/31736/obtener-todas-las-variables-get-y-post-para-un-php" title="POST y GET">POST_y_GET</a></div>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=42&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2007/12/20/post-y-get/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
		<item>
		<title>Select dinámico</title>
		<link>http://codigoaldescubierto.wordpress.com/2007/12/18/select-dinamico/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2007/12/18/select-dinamico/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 13:52:45 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[dinamico]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/2007/12/18/select-dinamico/</guid>
		<description><![CDATA[I. Introducción 
En el siguiente artículo os muestro como crear un &#60;select&#62; múltiple dinámico. Es decir, un campo &#8220;&#60;select&#62;&#8221; dentro de un formulario que, mediante dos &#8220;flechitas&#8221; puedo ir modificando dinámicamente los campos cambiando el orden de los mismos. El concepto se ve mucho mejor con una imagen:
&#160;

&#160;
Como se puede observar, la imagen consta de dos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=39&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3 align="justify">I. Introducción </h3>
<p align="justify">En el siguiente artículo os muestro como crear un <em><font color="#999999">&lt;select&gt;</font></em> múltiple dinámico. Es decir, un campo &#8220;&lt;select&gt;&#8221; dentro de un formulario que, mediante dos &#8220;flechitas&#8221; puedo ir modificando dinámicamente los campos cambiando el orden de los mismos. El concepto se ve mucho mejor con una imagen:</p>
<p align="justify">&nbsp;</p>
<p style="text-align:center;"><img src="http://codigoaldescubierto.files.wordpress.com/2007/12/x.jpg" alt="Select dinámico" /></p>
<p align="justify">&nbsp;</p>
<p align="justify">Como se puede observar, la imagen consta de dos partes:</p>
<ul>
<li>
<p align="justify">Un campo <em><font color="#999999">&lt;select&gt;</font></em> múltiple.</p>
</li>
<li>
<p align="justify">Dos flechas de dirección.</p>
</li>
</ul>
<p align="justify">La primera parte consiste en un listado de las opciones que nosotros queramos mostrar. Por ejemplo, si queremos evaluar a alguien con una pregunta de &#8220;Ordena de menor a mayor&#8221; o similar, este ejemplo podría ser muy ilustrativo.</p>
<p align="justify">La segunda parte consta de dos flechas a través de las cuales, vamos cambiando de posición la opción seleccionada en el <em><font color="#999999">&lt;select&gt;</font></em>.</p>
<h3 align="justify">  </h3>
<h3 align="justify">II. Desarrollo del código</h3>
<p align="justify">Dividiré la explicación en dos grandes bloques:</p>
<h5>Select múltiple</h5>
<blockquote><p><font color="#999999"><em>&lt;select name=&#8221;orden_bloque&#8221; multiple&gt;<br />
&lt;option selected value=&#8221;0&#8243;&gt;Planeta Tierra&lt;/option&gt;<br />
&lt;option value=&#8221;1&#8243;&gt;Galaxia&lt;/option&gt;<br />
&lt;option value=&#8221;2&#8243;&gt;Andalucía&lt;/option&gt;<br />
&lt;option value=&#8221;3&#8243;&gt;Hemisferio Norte&lt;/option&gt;<br />
&lt;option value=&#8221;4&#8243;&gt;Universo&lt;/option&gt;<br />
&lt;/select&gt;</em></font></p></blockquote>
<p><font color="#999999"><font color="#999999"><font color="#999999"><font color="#999999"><font color="#000000">Es importante aplicar a cada <font color="#999999"><em>&lt;option&gt;</em></font> un valor. De forma que los valores van asignándose del 0 al máximo del número de campos elegidos.</font></font></font></font><font color="#999999"><font color="#999999"><font color="#999999"><font color="#000000"> </font></font></font></font></font></p>
<p><font color="#999999"><font color="#999999"><font color="#999999"><font color="#999999"><font color="#000000"><font color="#999999"><font color="#999999"><font color="#999999"><font color="#000000"><font color="#999999"><font color="#999999"><font color="#999999"><font color="#000000"><font color="#999999"><font color="#999999"><font color="#000000"><font color="#999999"><font color="#999999"><font color="#000000">Por último, cabe destacar que se le ha dado un nombre al <font color="#999999"><em>&lt;select&gt;</em></font> a través de la etiqueta <font color="#999999"><em>name</em></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<h5>Flechas</h5>
<blockquote><p><em><font color="#999999">&lt;input type=&#8221;button&#8221; value=&#8221;&lt;&lt;&#8221; onclick=&#8221; <br />
          ind=formu.orden_bloque[formu.orden_bloque.selectedIndex].value;<br />
          if(ind&gt;0){<br />
                    nombre_1=formu.orden_bloque[ind].text;<br />
                    nombre_2=formu.orden_bloque[ind-1].text;<br />
                    formu.orden_bloque[ind].text=nombre_2;<br />
                    formu.orden_bloque[ind-1].text=nombre_1;<br />
                    formu.orden_bloque.selectedIndex=ind-1;<br />
          }<br />
&#8220;&gt;</font></em></p></blockquote>
<p>La primera flecha se caracteriza por un <font color="#999999"><em>onclick</em></font>. Esto quiere decir que cuando nosotros hagamos click en ese botón ocurrirá lo que hemos definido a continuación:</p>
<blockquote><p><em><font color="#999999">ind=formu.orden_bloque[formu.orden_bloque.selectedIndex].value;</font></em></p></blockquote>
<p><font color="#999999"><em>ind</em></font> indicará el valor de la opción seleccionada. Hacemos referencia al valor <font color="#999999"><em>value</em></font> que asignamos cuando creamos el select múltiple. <font color="#999999"><em>formu</em></font> es el nombre que se le ha dado al formulario en su declaración: <em><font color="#999999">&lt;form name=&#8221;formu&#8221; method=&#8221;post&#8221;&gt;</font></em></p>
<p>Antes de continuar, compruebo que <em><font color="#999999">ind</font></em> sea mayor que cero porque si nos encontramos en la opción más baja, si le damos a la flecha de bajar, no debe realizar ninguna acción.</p>
<p>En el caso de que ind sea mayor que cero:</p>
<blockquote><p><font color="#999999"><em>nombre_1=formu.orden_bloque[ind].text;</em><font color="#000000"> </font></font></p></blockquote>
<p><font color="#999999"><font color="#000000">Asigno el contenido de la opción seleccionada con el select en nombre_1</font></font></p>
<blockquote><p><font color="#999999"><em>nombre_2=formu.orden_bloque[ind-1].text;</em></font></p></blockquote>
<p><font color="#999999"><font color="#000000">Asigno el contenido de la opción anterior a la seleccionada con el select en nombre_2</font></font></p>
<blockquote><p><em><font color="#999999">formu.orden_bloque[ind].text=nombre_2;</font></em> </p></blockquote>
<p>Indico que la posición actual seleccionada será la anterior a la elegida. Es decir, coloco el nombre_2 donde antes estaba nombre_1.</p>
<blockquote><p><font color="#999999"><em>formu.orden_bloque[ind-1].text=nombre_1;</em></font></p></blockquote>
<p><font color="#999999"><font color="#000000">A la posición anterior a la elegida le asigno el nombre_1.  </font></font><font color="#000000">De esta forma, ya he intercambiado los valores. </font></p>
<blockquote><p><font color="#999999"><em>formu.orden_bloque.selectedIndex=ind-1;</em></font></p></blockquote>
<p><font color="#999999"><font color="#000000">Lo que falta sería marcar como opción seleccionada la que corresponde a nombre_1. </font></font></p>
<p>El procedimiento en la flecha contigua sería similar pero considerando que ahora el campo seleccionado lo movemos &#8220;hacia abajo&#8221;:</p>
<blockquote><p><em><font color="#999999">&lt;input type=&#8221;button&#8221; value=&#8221;&gt;&gt;&#8221; onclick=&#8221; <br />
          ind=formu.orden_bloque[formu.orden_bloque.selectedIndex].value;<br />
          max=document.formu.orden_bloque.length-1;<br />
          if(ind&lt;max){<br />
                     nombre_1=formu.orden_bloque[ind].text;<br />
                     nombre_2=formu.orden_bloque[ind-(-1)].text;<br />
                     formu.orden_bloque[ind].text=nombre_2;<br />
                     formu.orden_bloque[ind-(-1)].text=nombre_1;<br />
                     formu.orden_bloque.selectedIndex=ind-(-1);<br />
          }<br />
&#8220;&gt;</font></em></p></blockquote>
<p><font color="#000000">La primera línea hace lo mismo que con la anterior flecha. Es decir, seleccionar el valor de la opción seleccionada en ese momento:</font></p>
<blockquote><p><em><font color="#999999">ind=formu.orden_bloque[formu.orden_bloque.selectedIndex].value;</font></em></p></blockquote>
<p><font color="#999999"><font color="#000000">En</font><em> ind </em></font><font color="#000000">almacenamos lo ya comentado. Ahora bien, solo se procederá a realizar las operaciones siguientes siempre y cuando no se haya alcanzado el máximo (almacenado en la variable <em><font color="#999999">max</font></em>)</font></p>
<blockquote><p><em><font color="#999999">nombre_1=formu.orden_bloque[ind].text;<br />
nombre_2=formu.orden_bloque[ind-(-1)].text;</font></em></p></blockquote>
<p><font color="#000000">En realidad hacemos lo mismo que antes pero ahora almacenando en <em><font color="#999999">nombre_2</font></em> el valor de la siguiente opción a la seleccionada.</font></p>
<blockquote><p><em><font color="#999999">formu.orden_bloque[ind].text=nombre_2;<br />
formu.orden_bloque[ind-(-1)].text=nombre_1;<br />
formu.orden_bloque.selectedIndex=ind-(-1);</font></em></p></blockquote>
<p><font color="#000000">En este bloque realizamos un procedimiento análogo a lo ya explicado. Cambiamos el contenido en el formulario y hacemos que la opción seleccionada sea la siguiente a la que estaba.</font></p>
<h3>  </h3>
<h3>III. Referencias</h3>
<ul>
<li>Descarga ejemplo: <a target="_blank" href="http://www.box.net/shared/dsm0yvbr4k" title="Select dinámico">Select dinámico</a></li>
<li><a target="_blank" href="http://www.desarrolloweb.com/articulos/1027.php" title="Tutorial JavaScript en SELECT">[ESP]Tutorial JavaScript en SELECT</a></li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/39/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/39/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=39&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2007/12/18/select-dinamico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>

		<media:content url="http://codigoaldescubierto.files.wordpress.com/2007/12/x.jpg" medium="image">
			<media:title type="html">Select dinámico</media:title>
		</media:content>
	</item>
		<item>
		<title>Ventanas emergentes</title>
		<link>http://codigoaldescubierto.wordpress.com/2007/12/12/ventanas-emergentes/</link>
		<comments>http://codigoaldescubierto.wordpress.com/2007/12/12/ventanas-emergentes/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 00:21:34 +0000</pubDate>
		<dc:creator>ZoItrix</dc:creator>
				<category><![CDATA[Librerías]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[capas]]></category>
		<category><![CDATA[greybox]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[thickbox]]></category>
		<category><![CDATA[ventanas emergentes]]></category>

		<guid isPermaLink="false">http://codigoaldescubierto.wordpress.com/2007/12/12/ventanas-emergentes/</guid>
		<description><![CDATA[I. Introducción 
En este artículo pretendo presentar de una forma genérica y de manera muy simple todas las librerías que he logrado encontrar para implementar (mediante AJAX) el uso de ventanas emergentes dentro de una misma página web sin necesidad de abrir más ventanas.
Existen gran variedad de librerías. Realmente todas las librerías realizan más o menos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=18&subd=codigoaldescubierto&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3 align="justify">I. Introducción </h3>
<p align="justify">En este artículo pretendo presentar de una forma genérica y de manera muy simple todas las librerías que he logrado encontrar para implementar (mediante AJAX) el uso de ventanas emergentes dentro de una misma página web sin necesidad de abrir más ventanas.</p>
<p align="justify">Existen gran variedad de librerías. Realmente todas las librerías realizan más o menos lo mismo pero con pequeñas diferencias.</p>
<p align="justify">Básicamente en todas los pasos son los mismos:</p>
<ol>
<li>
<p align="justify"><strong>Descargar</strong> la librería y copiarla en un directorio dentro de la página web.</p>
</li>
<li>
<p align="justify">Realizar las correspondientes <strong>referencias</strong> en la cabecera.</p>
</li>
<li>
<p align="justify">Crear un <strong>enlace</strong> de acceso a la web o imagen incluyendo ciertos parámetros.</p>
</li>
</ol>
<p align="justify">La gran diferencia estará en que habrá librerías que tengan que implementar códigos javascript dentro de la página HTML, otros que todo se hará a través de referencias en la cabecera, otras librerías que por mucho que se intenta implementar no hay manera de hacerlo, otras que no son compatibles en todos los sistemas de navegación, etc.</p>
<p align="justify">El objetivo de este artículo es poder discernir y valorar cada una de ellas viendo cuales ofrecen las mejores garantías. Tened en cuenta que nosotros, cuando buscamos una solución la queremos lo más rápidamente posible y con los mejores resultados. ¿Para qué detenernos en un recurso si para poder ponerlo en funcionamiento hay que llevarse horas y horas teniendo muchas otras alternativas en la web? Hay que ofrecer la mayor simplicidad al usuario y por lo que he podido comprobar, muchas de las librerías que se implementan no están por la labor.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">II. Listado de librerías</h3>
<p align="justify">He dividido el listado de librerías en dos. Un primer listado donde aparecen las librerías que considero realmente útiles y se pueden manejar sin problemas. </p>
<p align="justify">Justo a continuación incluyo un segundo listado con el resto de librerías que, o no se adecuan a la sencillez que se requiere de ellas o realmente no las considero de calidad para ser comentada como librería indispensable o sencillamente son modificaciones de librerías ya explicadas por lo que no merecen la pena ser comentadas.</p>
<p align="justify">Las librerías de interés general son:</p>
<ul>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/bride-of-windows/" title="Bride of Windows">Bride of Windows</a><br />
Intenta imitar las ventanas de Windows. Permite minimizar la ventana.</li>
</ul>
<ul>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/greybox/" title="GreyBox">GreyBox</a><br />
Esta librería fue adecuada a mis necesidades. Muestra tanto imágenes como páginas webs.</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/ibox/" title="iBox">iBox</a><br />
Similar a las anteriores. Sirve para mostrar imágenes y páginas web.</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/imagebox/" title="imageBox">ImageBox</a><br />
Sencilla, útil y práctica. Su única limitación es que solo muestra imágenes.</li>
</ul>
<ul>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/lightbox/" title="LightBox">LightBox</a><br />
Está limitada al uso de imágenes para mostrar en ventanas.</li>
</ul>
<ul>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/litebox/" title="LiteBox">LiteBox</a><br />
Muy similar a ImageBox pero sin necesidad de incluir JS en la web HTML. Es una extensión de LightBox pero pesando mucho menos (3KB)</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/mediabox/" title="MediaBox">MediaBox</a><br />
Ofrece la posibilidad de visualizar flash y videos directamente como si de una imagen se tratara. Eso sí, da problema al visualizar imágenes</li>
</ul>
<ul>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/moodalbox/" title="MoodalBox">MoodalBox</a><br />
Muy sencillo e implementa el efecto de ventana &#8220;abriendose&#8221; poco a poco.</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/roebox/" title="RoeBox">RoeBox</a><br />
Mezcla entre LightBox y SlimBox. Fácil uso y sin complicaciónes. Solo muestra imágenes.</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/submodal/" title="subModal">subModal</a><br />
Permite visualizar páginas web. Sencillo uso.</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/thickbox/" title="ThickBox">ThickBox</a><br />
De fácil uso e implementa gran variedad de opciones: imágenes, galerías, páginas webs&#8230;</li>
<li>
<p align="justify"><a href="http://codigoaldescubierto.wordpress.com/contenido/triptracker/" title="TripTracker">TripTracker</a><br />
Sirve para mostrar imágenes. Diseño simpático y con posibilidades. Muy sencillo su uso.</li>
</ul>
<p align="justify">A continuación, si tenéis más curiosidad, un listado con el resto de librerías disponibles en la web:</p>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://livepipe.net/projects/control_modal/" title="Control Modal">Control.Modal</a><br />
Ofrece algunas nuevas funcionalidades como que la ventana emergente sea una capa simple de forma que agilice el proceso. Aun así, no la recomiendo pues su uso ofrece muchísimas complicaciones.</li>
<li>
<p align="justify"><a target="_blank" href="http://www.wingo.com/dialogbox/index.html">Dialog Box</a><br />
La página en sí es un caos. Lo único que proporciona es que la ventana pueda cambiar de posición en la misma página web.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://www.matthijskamstra.nl/blog/index.php/flashbox-just-another-box/" title="FlashBox">FlashBox</a><br />
Muestra las imágenes dentro de un FLASH con sus correspondientes efectos. Únicamente para mostrar imágenes. No funciona bajo internet explorer.</li>
<li>
<p align="justify"><a target="_blank" href="http://www.ryanjlowe.com/?p=9" title="LitBox">LitBox</a><br />
Apertura de ventanas movibles.</li>
</ul>
<ul>
<li>
<p align="justify"><a href="http://prototype-window.xilinus.com/">Prototype Window</a><br />
En su web comenta que es de fácil uso. Para mí fue imposible implementarla de una forma rápida y sencilla.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://blog.craigambrose.com/articles/2006/08/16/redbox-a-rails-compatible-lightbox" title="RedBox">RedBox</a><br />
No ofrece nada nuevo a lo ya comentado. Ventanas muy simples y sin diseño.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://www.oscandy.com/open-source/58-slightbox-extension-for-jondesigns-smoothgallery" title="SlightBox">SlightBox</a><br />
Variante de LightBox. Ofrece prácticamente lo mismo. Sólo para mostrar imágenes.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://www.digitalia.be/software/slimbox" title="SlimBox">SlimBox</a><br />
Al igual que el anterior, es otra variante del famoso LightBox.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://mondaybynoon.com/2006/03/27/suckerfish-hoverlightbox/" title="Sukerfixh HoverLightbox">Sukerfixh HoverLightbox</a><br />
Variante de LightBox. No he conseguido hacer que funcione ni desde la web propia de la librería.</li>
</ul>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://freenet-homepage.de/ralph.becker/tinybox/" title="TinyBox">TinyBox</a><br />
Librería muy extraña. Me la intenté bajar y resultaba ser un fichero EXE. En fin&#8230; Con la cantidad de posibilidades que existen, paso tener que instalar nada.</li>
</ul>
<p align="justify">Para más información, basta con acceder a los enlaces que os he facilitado tanto en la sección en particular de cada librería como en este artículo.</p>
<p align="justify">&nbsp;</p>
<h3 align="justify">III. Referencias</h3>
<ul>
<li>
<p align="justify"><a target="_blank" href="http://www.anieto2k.com/2007/09/19/coleccion-de-clones-de-lightbox-para-todos/" title="Recopilatorio de Librerás">[ESP] Recopilatorio de Librerías</a></p>
</li>
<li>
<p align="justify"><a target="_blank" href="http://earthcode.com/blog/2006/07/lightbox_for_modal_dialogs_red.html" title="Recopilación de librerás en ingles">[ENG] Recopilatorio de Librerías</a></p>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/codigoaldescubierto.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/codigoaldescubierto.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codigoaldescubierto.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codigoaldescubierto.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codigoaldescubierto.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codigoaldescubierto.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codigoaldescubierto.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codigoaldescubierto.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codigoaldescubierto.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codigoaldescubierto.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codigoaldescubierto.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codigoaldescubierto.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codigoaldescubierto.wordpress.com&blog=2292052&post=18&subd=codigoaldescubierto&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codigoaldescubierto.wordpress.com/2007/12/12/ventanas-emergentes/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd0c05218f842b008efadca82e1babe1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ZoItrix</media:title>
		</media:content>
	</item>
	</channel>
</rss>