<?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>Quenerapú</title>
	<atom:link href="http://quenerapu.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://quenerapu.com</link>
	<description>Sentado delante de un ordenador desde 1982. ¿De qué voy a hablar, si no?</description>
	<lastBuildDate>Mon, 12 Jul 2010 09:09:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>De dónde viene lo de «Quenerapú»</title>
		<link>http://quenerapu.com/bio/de-donde-viene-lo-de-%c2%abquenerapu%c2%bb/</link>
		<comments>http://quenerapu.com/bio/de-donde-viene-lo-de-%c2%abquenerapu%c2%bb/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 10:59:35 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[Bio]]></category>
		<category><![CDATA[curiosidad]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=144</guid>
		<description><![CDATA[A menudo me preguntan de dónde viene lo de «Quenerapú». Incluso muchos piensan que soy sudamericano. Aquí explico el origen de este palabro.]]></description>
			<content:encoded><![CDATA[<p>Mucha gente me lo pregunta así que lo voy a dejar escrito. La historia es esta:</p>
<p>Entre setiembre de 1993 y junio de 1994 (tenía yo 23 años) viví en Granada algo parecido a un año sabático. Compartí piso con 3 marroquíes y pasaba mis días en La Alhambra mirando para los gatos y las turistas alemanas. En Granada tengo familia, y con mis primos de allí había pasado estupendos veranos cuando éramos críos y venían a Galicia. Pero por cosas de la vida, en 1993 se había enfriado bastante mi relación con ellos, así que aproveché aquel año sabático para retomar contacto. Redescubrí a mis primos Alberto, Ana, Carlos, Eduardo, Jose, y Marcos y a mis tíos Eduardo y Ana.</p>
<p>Mi primo Alberto y yo teníamos en común una gran afición por dibujar cómics y se nos metió a ambos en la cabeza que debíamos tener cada uno un nombre artístico. Él escogió enseguida &#8216;Gart Tetsuo&#8217;. Yo quise pensarlo con más calma.</p>
<p>Una tarde de charleta con mi prima Ana, ella me puso un poco al día con las noticias que les llegaban de nuestra familia común en la lejana Galicia. Y uno de los temas fue que nuestra tía común Ana (sí, otra Ana) estaba embarazada de nuevo, así que pronto tendríamos un primito nuevo. Pero Ana (mi prima) no pudo contener la risa al contarme los nombres que mis tíos pensaban ponerle a la criatura. He de explicar que parte de mi familia es de la que pone nombres bíblicos a sus hijos. Y en eso, como en todo: hay nombres preciosos pero también los hay horrorosos.</p>
<p>Así que con su simpatiquísimo acento andaluz me dice mi prima, escandalizada: <em>—&#8221;¡Y no te pierdas etto: que disen que si es niño le van a poné a la criatura «Quenerapú»!&#8221;</em></p>
<p>Y ahí es cuando rompí yo a reirme a carcajadas. En la Biblia no hay ningún &#8220;Quenerapú&#8221;. Lo más parecido que recuerdo es un profeta llamado &#8220;Nahum&#8221; y también otro llamado &#8220;Habacuc&#8221; (que también es un nombre feo de c*jones). Mira, yo no sé qué fue lo que oyó Ana al teléfono. Quizá desde Galicia le dijeron: &#8220;Y para niño, quieren Nahum&#8221; o &#8220;Y para niño, quieren Habacuc&#8221; y ella entendió &#8220;Y para niño, Quenerapú&#8221;. El caso es que mi prima, la pobre, estaba escandalizada.</p>
<p>Y a mi acababan de regalarme un nombre artístico para firmar cómics: <strong>QUENERAPÚ</strong>. Era perfecto. Un palabro absolutamente nuevo y con un origen de lo más <em>friki</em>: Un nombre hebreo, mal entendido, y pronunciado con acento andaluz. ¡Simplemente genial!</p>
<p>Desde aquel día firmé mis cómics como Quenerapú. Me presenté a todo el mundo como Quenerapú y a menudo sustituyo mis apellidos Pérez Rodríguez por Quenerapú (que yo a mis padres los quiero mucho, pero tengo unos apellidos la mar de vulgares). En la primavera de 1994, por cierto, tuve mi primer contacto con Internet gracias a un amiguete en la Universidad de Granada. Y allí decidí que en Internet me identificaría como Quenerapú o Iñaki Quenerapú.</p>
<p>Y esto es todo. No sé si al lector le ha hecho algo de gracia la historia o le importa tres pepinos. Pero bueno, necesitaba dejarlo por escrito de una vez por todas. ¡Ah! Es curioso que mucha gente piensa que soy sudamericano. Quizá porque Quenerapú suena como Quilapayún, qué se yo. Pero no. Nací en el País Vasco de padres gallegos. Y por cierto, aquel primo mío que pudo haberse llamado &#8220;Nahum&#8221; o &#8220;Habacuc&#8221; al final nació niña y se llama Nerea, felizmente. <img src='http://quenerapu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&#8212;-</p>
<p><strong>Actualización (12 de julio de 2010):</strong> En conversación informal con mi hermano <a href="http://twitter.com/angelinoperez"><strong>Ángel</strong></a> hace dos días salió el tema de «Quenerapú» (él sabe muchísimo más que yo de temas bíblicos) y me aclaró el tema, echando un poco por tierra (pero sólo un poco, ¿eh?) mi teoría.</p>
<p>Al parecer, el nombre que mi tía Ana quiso poner a su bebé no era &#8220;Nahum&#8221; ni &#8220;Habacuc&#8221; sino <strong>&#8220;Keren-hapuc&#8221;</strong>, que, por cierto, es nombre de chica. Ahora sí que suena parecido. ¡Ese fue el nombre que mi prima Ana no comprendió por teléfono! Y es muy fácil si te dicen &#8220;Keren-hapuc&#8221; por teléfono entender «Quenerapú» o cualquier cosa parecida. Mimá, es que parece el nombre de un personaje de <strong>Star Wars</strong>, <strong>Willow</strong> o algo así, ¿verdad?. Al parecer «Keren-hapuc» es nombre de chica (dicen que fue «la hija menor de Job, que nació después de su gran tribulación» (<a href="http://bibliaparalela.com/job/42-14.htm">Job 42:14</a>).</p>
<p>Sinceramente, creo que mis tíos hicieron muy bien llamando a mi prima «Nerea» y dejando sin proponérselo, el «Quenerapú» para mi: Un nombre hebreo, mal entendido por teléfono y pronunciado con acento andaluz. Y ahora resulta que además <strong>¡es un nombre de tía!</strong> Jajaja&#8230;. Pues mira, ahora me hace todavía un poco más de gracia la historia. ¡Gracias Ángel por la aclaración! <img src='http://quenerapu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/bio/de-donde-viene-lo-de-%c2%abquenerapu%c2%bb/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Logo Imperial Stormtroopers</title>
		<link>http://quenerapu.com/vector/logo-imperial-stormtroopers/</link>
		<comments>http://quenerapu.com/vector/logo-imperial-stormtroopers/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 14:21:24 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[Vector]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[fh9]]></category>
		<category><![CDATA[imperial stormtroopers]]></category>
		<category><![CDATA[logo]]></category>
		<category><![CDATA[svg]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=138</guid>
		<description><![CDATA[Logo vectorizado de Imperial Stormtroopers, para quien lo pueda necesitar. En versiones .svg, .ai, .fh9 y .cdr.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-141" title="Logo Imperial Stormtroopers" src="http://quenerapu.com/wp-content/uploads/2010/03/logoimperial.gif" alt="Logo Imperial Stormtroopers" width="503" height="482" /></p>
<p>Logo vectorizado de <a href="http://imperialstormtroopers.com/" target="_blank">Imperial Stormtroopers</a> (en sus dos versiones válidas), para quien lo pueda necesitar.</p>
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/es/"><img class="alignnone" style="border-width: 0;" src="http://i.creativecommons.org/l/by-nc-nd/3.0/es/88x31.png" alt="Creative Commons License" /></a></p>
<p>Si quieres crear un elemento promocional del Imperial Stormtroopers (un cartel, una pegatina, un diseño de camiseta, etc, etc) ya puedes incluir el logo oficial. Tienes permiso para usarlo, siempre que no lo modifiques, no te lucres por ello y sólo lo uses para promocionar el evento Imperial Stormtroopers. No es necesario que menciones al autor del logo, pues el propio logo es una URL y con eso ya queda todo dicho. <img src='http://quenerapu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ah! Si creas algún elemento promocional para el Imperial Stormtroopers, acuérdate de sacarle una foto y colgarla de Internet para que lo veamos todos.</p>
<p><a href="http://quenerapu.com/logoteca/imperialstormtroopers.svg"><img style="float: left; margin-right: 5px;" title="Download SVG" src="http://quenerapu.com/images/download-svg.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/imperialstormtroopers.ai"><img style="float: left; margin-right: 5px;" title="Download Illustrator" src="http://quenerapu.com/images/download-ai.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/imperialstormtroopers.fh9"><img style="float: left; margin-right: 5px;" title="Download FreeHand" src="http://quenerapu.com/images/download-fh9.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/imperialstormtroopers.cdr"><img style="float: left; margin-right: 5px;" title="Download CorelDraw" src="http://quenerapu.com/images/download-cdr.gif" alt="" width="48" height="60" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/vector/logo-imperial-stormtroopers/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Directorios virtuales en Ubuntu</title>
		<link>http://quenerapu.com/linux/directorios-virtuales-en-ubuntu/</link>
		<comments>http://quenerapu.com/linux/directorios-virtuales-en-ubuntu/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:46:33 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[directorio virtual]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=137</guid>
		<description><![CDATA[Crear directorios virtuales es muy cómodo y práctico cuando desarrollas sitios web sobre Apache. Lo hago a menudo y por eso lo recomiendo.]]></description>
			<content:encoded><![CDATA[<p>Digo Ubuntu sólo porque es la distro que uso, pero esto vale para cualquier distribución Linux.</p>
<p>Los directorios virtuales son comodísimos a la hora de desarrollar sitios web sobre Apache. Lo hago a menudo y por eso lo recomiendo. Doy por hecho que <strong>Apache</strong> está correctamente instalado y configurado.</p>
<p>En mi directorio de usuario creo un directorio llamado <strong>http</strong> (donde pongo <em>username</em> has de poner tu nombre de usuario, obviamente)</p>
<pre class="brush: bash; gutter: false;">
$ mkdir /home/username/http
</pre>
<p>En ese directorio voy a construir mis proyectos web. Creo el directorio de mi primer proyecto web (donde pongo <em>proyecto1</em> has de poner el nombre de tu proyecto, obviamente).</p>
<pre class="brush: bash; gutter: false;">
$ mkdir /home/username/http/proyecto1
</pre>
<p>Recomiendo, para no complicarnos la vida, dar a este tipo de directorios nombres sin eñes, tildes ni espacios.</p>
<p>Y sólo por tener algo, creo el clásico <strong>index.html</strong> conteniendo el típico saludo:</p>
<pre class="brush: bash; gutter: false;">
$ echo &quot;&lt;h1&gt;Hola mundo&lt;/h1&gt;&quot; &gt; /home/username/http/proyecto1/index.html
</pre>
<p>Bueno. Como este directorio no está donde Apache espera que estén sus directorios web, lo primero que tengo que hacer es notificar a Apache esta situación especial. Le diré a Apache que no es el típico directorio web sino un directorio virtual: Un directorio web creado donde me dió la gana <img src='http://quenerapu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Doy de alta <strong>proyecto1</strong> como directorio virtual:</p>
<pre class="brush: bash; gutter: false;">
$ cd /etc/apache2/sites-available
$ sudo cp default proyecto1
$ sudo gedit proyecto1
</pre>
<p>En el documento que se abre, para no complicarnos, sustituyo el texto por este otro (adáptalo según tus necesidades, claro):</p>
<pre class="brush: bash;">
&lt;VirtualHost *:80&gt;
ServerAdmin aqui.tu@email.com
ServerName proyecto1
DocumentRoot /home/username/http/proyecto1
  &lt;Directory /&gt;
  Options FollowSymLinks
  AllowOverride None
  &lt;/Directory&gt;
  &lt;Directory /home/username/http/proyecto1 &gt;
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order deny,allow
    Allow from all
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Y activo este directorio virtual:</p>
<pre class="brush: bash; gutter: false;">
$ sudo a2ensite proyecto1
</pre>
<p>Edito el archivo <strong>hosts</strong> en conformidad:</p>
<pre class="brush: bash; gutter: false;">
$ sudo gedit /etc/hosts
</pre>
<p>añadiendo esta línea:</p>
<pre class="brush: bash; gutter: false;">
127.0.0.1 proyecto1
</pre>
<p>Reinicio Apache</p>
<pre class="brush: bash; gutter: false;">
$ sudo /etc/init.d/apache2 reload
</pre>
<p>Y ya está. En <a href="http://proyecto1">http://proyecto1</a> puedo ver mi página <strong>Hola mundo</strong>. Ahora, <strong>¡a trabajar!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/linux/directorios-virtuales-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manifiesto “En defensa de los derechos fundamentales en Internet”</title>
		<link>http://quenerapu.com/general/manifiesto-%e2%80%9cen-defensa-de-los-derechos-fundamentales-en-internet%e2%80%9d/</link>
		<comments>http://quenerapu.com/general/manifiesto-%e2%80%9cen-defensa-de-los-derechos-fundamentales-en-internet%e2%80%9d/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 23:49:50 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[En red]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[copyright]]></category>
		<category><![CDATA[democracia]]></category>
		<category><![CDATA[derechos fundamentales]]></category>
		<category><![CDATA[España]]></category>
		<category><![CDATA[manifesto]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=130</guid>
		<description><![CDATA[Manifiesto ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones que afectan al libre ejercicio de las libertades de expresión.]]></description>
			<content:encoded><![CDATA[<p>Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, <em>bloggers</em>, usuarios, profesionales y creadores de Internet manifestamos nuestra firme oposición al proyecto, y declaramos que:</p>
<ol>
<li><strong>Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos</strong>, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.</li>
<li><strong>La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial</strong>. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.</li>
<li><strong>La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español</strong>, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.</li>
<li><strong>La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural.</strong> Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.</li>
<li><strong>Los autores</strong>, como todos los trabajadores,<strong> tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades</strong> asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.</li>
<li>Consideramos que <strong>las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales,</strong> en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.</li>
<li><strong>Internet debe funcionar de forma libre y sin interferencias políticas</strong> auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.</li>
<li><strong>Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España,</strong> ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.</li>
<li><strong>Proponemos una verdadera reforma del derecho de propiedad intelectual</strong> orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.</li>
<li><strong>En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público</strong> y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/general/manifiesto-%e2%80%9cen-defensa-de-los-derechos-fundamentales-en-internet%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Construir formularios (casi) automáticamente con PHP</title>
		<link>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/</link>
		<comments>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 09:49:22 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[label]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=129</guid>
		<description><![CDATA[Una función sencilla (y fácilmente escalable) para construir formularios html con php, basándose en simples arrays.]]></description>
			<content:encoded><![CDATA[<p>Construir formularios <strong>html</strong> es una tarea bastante monótona y en la que es fácil cometer algún error tonto y puñetero así que tenía que haber una forma de hacerlos automáticamente (o casi).</p>
<p>Como tengo la costumbre de convertir en <strong>arrays</strong> todo lo que saco de las bases de datos antes de combinarlo con el <strong>html</strong>, una buena parte del camino ya la tenía hecha.</p>
<p>El método que voy a proponer a continuación no es nada del otro mundo y sólo pretende ser un punto de partida para que cada cual lo adapte y complique a su gusto.</p>
<p>Cuando me di cuenta de que un array como este:</p>
<pre class="brush: php;">
$a = array(
	type=&gt;&quot;text&quot;,
	name=&gt;&quot;nombre&quot;,
	value=&gt;&quot;Pepe&quot;,
	)
</pre>
<p>era fácilmente convertible, vía <strong>php</strong>, en un <strong>html</strong> como este:</p>
<pre class="brush: php;">
&lt;input
	type=&quot;&lt;?=$a[type];?&gt;&quot;
	name=&quot;&lt;?=$a[name];?&gt;&quot;
	value=&quot;&lt;?=$a[value];?&gt;&quot;
/&gt;
</pre>
<p>Decidí hacer una función que resolviera la construcción de cualquier formulario simplemente recibiendo los datos necesarios en forma de arrays.</p>
<p>Antes de nada traté de agrupar más o menos los diferentes elementos que componen un formulario: Los <strong>&lt;input&gt;</strong> tipo text, password y hidden tienen una sintaxis muy parecida. A <strong>&lt;textarea&gt;</strong> hay que darle de comer aparte y lo mismo con los <strong>&lt;select&gt;</strong>. Los <strong>&lt;input&gt;</strong> tipo radio y checkbox se portan de una manera muy similar, y luego quedan los <strong>&lt;input&gt;</strong> tipo submit.</p>
<p>En el ejemplo de este artículo presento la <strong>función f</strong>, que resuelve los <strong>&lt;input&gt;</strong> tipo text, password, hidden y submit, los <strong>&lt;textarea&gt;</strong> y los <strong>&lt;select&gt;</strong> y los botones de submit. El resto lo dejo para una pŕoxima ocasión.</p>
<p>El ejemplo resuelve de paso los <strong>&lt;label&gt;</strong> y permite aplicar <strong>class</strong> o <strong>style</strong> particulares a cada elemento. Por cierto: Tengo la costumbre en los formularios de utilizar siempre el mismo valor en <strong>name</strong> y en <strong>id</strong>. No sé si eso es bueno o malo (al menos el validador del W3C no protesta), pero si a alguien no le gusta eso no tiene más que crear una nueva variable para uno de ellos.</p>
<p>Ah! La parte en la que se construye el menú desplegable tipo <strong>&lt;select&gt;</strong> es la que ya presenté en el artículo <a href="http://quenerapu.com/php/construir-un-menu-select/">Construir un menú Select con PHP</a> publicado el 25|09|2009.</p>
<p>Bueno, probadlo y a ver qué os parece. <a href="http://quenerapu.com/ejemplos/f.php">En este link he colgado una demo con CSS y todo</a>.</p>
<pre class="brush: php;">
&lt;?php
$colores = array( // Array de valores para el select
		1=&gt;Azul,
		2=&gt;Negro,
		3=&gt;Naranja,
		4=&gt;Violeta,
		5=&gt;Granate,
		);

$qq=array(
	f=&gt;array( // Datos generales del formulario
		fN=&gt;&quot;loginForm&quot;, // name
		fM=&gt;&quot;post&quot;, // method
		fA=&gt;&quot;form.php&quot;, // action
		fB=&gt;&quot;Enviar&quot;, // texto del botón submit
		),
	ff=&gt;array(
			array( // Datos del input id
				fN=&gt;&quot;id&quot;,
				fV=&gt;123,
				fT=&gt;&quot;hidden&quot;, // Tipo hidden
				),
			array( // Datos del input nombre
				fN=&gt;&quot;nombre&quot;, // Variable
				fV=&gt;&quot;Perico&quot;, // Valor
				fL=&gt;&quot;Nombre&quot;, // Texto para el label
				fT=&gt;&quot;text&quot;, // Tipo text
				fC=&gt;&quot;special&quot;, // Class CSS (dato opcional)
				fS=&gt;&quot;width:100px;&quot;, // Style CSS (dato opcional)
				),
			array( // Datos del input apellidos
				fN=&gt;&quot;apellidos&quot;,
				fV=&gt;&quot;Los Palotes&quot;,
				fL=&gt;&quot;Apellidos&quot;,
				fT=&gt;&quot;text&quot;,
				fC=&gt;&quot;readonly&quot;, // Class CSS (dato opcional)
				fS=&gt;&quot;width:200px;&quot;,
				rO=&gt;true, // queremos que sea 'readonly'
				),
			array( // Datos del input contrasena
				fN=&gt;&quot;contrasena&quot;,
				fV=&gt;&quot;123456&quot;,
				fL=&gt;&quot;Contraseña&quot;,
				fT=&gt;&quot;password&quot;, // Tipo password
				),
			array( // Datos del textarea direccion
				fN=&gt;&quot;direccion&quot;,
				fV=&gt;&quot;Calle de Los Desamparados s/n&quot;,
				fL=&gt;&quot;Dirección&quot;,
				fT=&gt;&quot;textarea&quot;, // Tipo textarea
				fC=&gt;&quot;login&quot;,
				fW=&gt;&quot;10|3&quot;, // Width | Height
				fS=&gt;&quot;width:200px;height:100px;&quot;,
				),
			array( // Datos del select desplegable color
				fN=&gt;&quot;color&quot;,
				fV=&gt;3, // Valor (numérico en este caso)
				fL=&gt;&quot;Color favorito&quot;,
				fT=&gt;&quot;select&quot;, // Tipo select (desplegable)
				fC=&gt;&quot;login&quot;,
				fZ=&gt;$colores, // Array de valores
				),
		),
	);

function f($x)
	{
	extract($x);
	$r=&quot;&lt;form name=\&quot;{$f[fN]}\&quot; id=\&quot;{$f[fN]}\&quot; method=\&quot;{$f[fM]}\&quot; action=\&quot;{$f[fA]}\&quot;&gt;\n&quot;;
	for($i=0;$i&lt;count($ff);++$i)
		{
		if(in_array($ff[$i][fT],array(&quot;text&quot;,&quot;password&quot;,&quot;hidden&quot;,))){$r.=&quot;\t&quot;.($ff[$i][fT]!=&quot;hidden&quot;?&quot;&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&quot;:&quot;&quot;).&quot;&lt;input type=\&quot;{$ff[$i][fT]}\&quot; name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot; value=\&quot;{$ff[$i][fV]}\&quot;&quot;.($ff[$i][fT]!=&quot;hidden&quot;?($ff[$i][fC]?&quot; class=\&quot;{$ff[$i][fC]}\&quot;&quot;:&quot;&quot;).($ff[$i][fS]?&quot; style=\&quot;{$ff[$i][fS]}\&quot;&quot;:&quot;&quot;):&quot;&quot;).($ff[$i][rO]?&quot; readonly=\&quot;readonly\&quot;&quot;:&quot;&quot;).&quot; /&gt;&quot;.($ff[$i][fT]!=&quot;hidden&quot;?&quot;&lt;br /&gt;&quot;:&quot;&quot;).&quot;\n&quot;;}
		if(in_array($ff[$i][fT],array(&quot;textarea&quot;,))){$r.=&quot;\t&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&lt;textarea name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot;&quot;;$w=explode('|',$ff[$i][fW]);$r.=&quot; cols=\&quot;{$w[0]}\&quot; rows=\&quot;{$w[1]}\&quot;&quot;.($ff[$i][fC]?&quot; class=\&quot;{$ff[$i][fC]}\&quot;&quot;:&quot;&quot;).($ff[$i][fS]?&quot; style=\&quot;{$ff[$i][fS]}\&quot;&quot;:&quot;&quot;).&quot;&gt;{$ff[$i][fV]}&lt;/textarea&gt;&lt;br /&gt;\n&quot;;}
		if(in_array($ff[$i][fT],array(&quot;select&quot;,))){$r.=&quot;\t&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&lt;select name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot;&gt;&quot;;foreach($ff[$i][fZ] as $x=&gt;$v){$r.=&quot;&lt;option value=\&quot;$i\&quot;&quot;;$r.=$ff[$i][fV]==$x?&quot; selected=\&quot;selected\&quot;&quot;:&quot;&quot;;$r.=&quot;&gt;&quot;.$v.&quot;&lt;/option&gt;&quot;;}$r.=&quot;&lt;/select&gt;&lt;br /&gt;\n&quot;;}
		}
	$r.=&quot;&lt;input type=\&quot;submit\&quot; value=\&quot;{$f[fB]}\&quot; /&gt;&quot;;
	$r.=&quot;&lt;/form&gt;&quot;;
	return $r;
	}

echo f($qq);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usa el jQuery de Google, anda</title>
		<link>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/</link>
		<comments>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 02:11:11 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=127</guid>
		<description><![CDATA[Usar la misma librería jQuery que usa Google tiene muchas ventajas. Por eso recomiendo hacerlo.]]></description>
			<content:encoded><![CDATA[<p>Al programar usando <a href="http://jquery.com/">jQuery</a> es lo común colgarlo de un directorio del proyecto e invocarlo con el clásico:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Sin embargo <a href="http://encosia.com/2008/12/10/3-reasons-why-you-should-let-google-host-jquery-for-you/">un artículo que leí hace algún tiempo</a> [Encosia.com] recomienda evitar esa práctica, y utilizar el jQuery que Google cuelga de sus servidores y usa para sus propios sitios web. De esta manera:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p><strong>Dave Ward</strong>, el autor, lo razonaba con tres sólidos argumentos:</p>
<ul>
<li><strong>Tu página cargará antes.</strong> jQuery es una librería pesada y, asúmelo, siempre se cargará antes desde un servidor de Google (un señor servidor) que desde el tuyo.</li>
<li><strong>¿He dicho ya que tu página cargará antes?</strong> Mientras el navegador lee jQuery desde el servidor de Google, puede ir cargando el resto de la web que sí están en tu servidor. Simultáneamente. Eso es un gran ahorro de tiempo.</li>
<li><strong>Tu página (y todas nuestras páginas) cargarán antes.</strong> Cuando forzamos la carga de un jQuery nuevo en cada web, estamos llenando la caché de los navegadores de material redundante. Pero si en vez de eso llamamos siempre al mismo jQuery de Google, si todos los hiciéramos, los navegadores no necesitarían cargar jQuery <strong>porque ya lo tienen.</strong></li>
</ul>
<p>Me convenció aquel artículo así que de un tiempo a esta parte procuro no apuntar hacia un jQuery en mi servidor, sino al que alberga Google en sus servidor de APIs.</p>
<p>No obstante, con un proyecto web en el que uso esta técnica me pasó una cosa curiosa el otro día. Durante un viaje en tren aproveché para programar un rato y al no tener acceso a Internet el jQuery de Google, claro, no cargaba y por consiguiente no podía trabajar.</p>
<p>La solución fue obvia: Temporalmente cambié esa línea, dejando de apuntar al servidor de Google para apuntar a un jQuery local.<br />
Y viendo que esto podía sucederme de nuevo en el futuro, opté por algo también obvio, que es mantener ambas líneas en el código de la página y comentar la que sobra según la situación. Nada del otro mundo.</p>
<p>Pero luego me empeñé en perfeccionar un poco la cosa y salió esto:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;if(typeof jQuery==='undefined'){document.write(unescape(&quot;&lt;scri&quot;+&quot;pt src='js/jquery-1.3.2.min.js' type='text/javascript'&gt;&lt;/scri&quot;+&quot;pt&gt;&quot;));}&lt;/script&gt;
</pre>
<p>Utilizando este código <strong>me despreocupo totalmente del tema</strong>. ¿Que encuentra el jQuery de Google? Lo usa. ¿Que no? Pues usa el jQuery local.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>El layout con columnas más simple del mundo (probablemente)</title>
		<link>http://quenerapu.com/css/el-layout-con-columnas-mas-simple-del-mundo-probablemente/</link>
		<comments>http://quenerapu.com/css/el-layout-con-columnas-mas-simple-del-mundo-probablemente/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 16:19:54 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[crossbrowser]]></category>
		<category><![CDATA[minimal]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=125</guid>
		<description><![CDATA[Hace tiempo que deseaba terminar con mis quebraderos de cabeza al diseñar sitios web con columnas. Y creo que al fin lo he conseguido.]]></description>
			<content:encoded><![CDATA[<p>Hace mucho tiempo que deseaba dar definitivamente por cerrados mis quebraderos de cabeza al diseñar sitios web con columnas. Y creo que al fin lo he conseguido.</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
 &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot; /&gt;
&lt;title&gt;TinyCSS&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
*{margin:0;padding:0;}
h1{font-size:1em;}
.header{border-bottom:1px solid #aaa;}
.container{overflow:hidden;height:100% !important;}
.main{width:500px;margin-bottom:-1000px;padding-bottom:1000px;float:left;}
.sideBar{margin-bottom:-1000px;padding-bottom:1000px;float:right;}
.s1{width:160px;border-left:1px solid #aaa;}
.s2{width:300px;border-left:1px solid #aaa;}
.footer{border-top:1px solid #aaa;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;header&quot;&gt;&lt;h1&gt;Header&lt;/h1&gt;&lt;/div&gt;
&lt;div class=&quot;container&quot;&gt;
	&lt;div class=&quot;sideBar s2&quot;&gt;&lt;h1&gt;Sidebar 2&lt;/h1&gt;&lt;/div&gt;
	&lt;div class=&quot;sideBar s1&quot;&gt;&lt;h1&gt;Sidebar 1&lt;/h1&gt;&lt;/div&gt;
	&lt;div class=&quot;main&quot;&gt;&lt;h1&gt;Main&lt;/h1&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;footer&quot;&gt;&lt;h1&gt;Footer&lt;/h1&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Si bien el resultado final es bastante feo (<a href="http://quenerapu.com/ejemplos/tinycss/01/">puedes ver una demo aquí</a>) el peso de este documento es de menos de 1Kb. y es compatible con <strong>Internet Explorer</strong> (versión 6 incluída), <strong>Firefox</strong>, <strong>Chrome</strong>, <strong>Opera</strong> y <strong>Safari</strong> (<a href="http://browsershots.org/http://quenerapu.com/ejemplos/tinycss/02/">Browsershots.org</a>).</p>
<p>No será difícil para un diseñador hábil con las CSS partir de este esqueleto para crear algo mucho más agradable a la vista.</p>
<p>Lo que más me gusta es que los <strong>&lt;div&gt;</strong> de las columnas pueden crecer al alto tanto como quieras sin preocuparte por sus vecinas, que se prolongarán en lo vertical para que todas sean iguales (<a href="http://quenerapu.com/ejemplos/tinycss/02/">con unos ejemplos me explico mejor</a>). Para ello no he usado ni javaScript ni el conocido método <a href="http://www.alistapart.com/articles/fauxcolumns/">Faux Columns</a>, sino un truco CSS que consiste en atribuir</p>
<pre class="brush: css; gutter: false;">
margin-bottom:-1000px; padding-bottom:1000px;
</pre>
<p>a cada una de las columnas, y</p>
<pre class="brush: css; gutter: false;">
overflow:hidden;
</pre>
<p>al <strong>&lt;div&gt;</strong> que las contiene.</p>
<p>Y para terminar, es importante recordar que en la línea</p>
<pre class="brush: css; gutter: false;">
.container{overflow:hidden;height:100% !important;}
</pre>
<p><strong>height:100% !important;</strong> son necesarios para que el sistema sea compatible con IE6. <a href="http://ie6update.com">El glorioso día en que IE6 sea desterrado</a> ya no será necesario incluir ese código.</p>
<p>Me ha ayudado mucho un viejo post de <a href="http://www.ejeliot.com/blog/61">Ed Elliot</a>. Gracias Ed!</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/css/el-layout-con-columnas-mas-simple-del-mundo-probablemente/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Construir un menú Select con PHP</title>
		<link>http://quenerapu.com/php/construir-un-menu-select/</link>
		<comments>http://quenerapu.com/php/construir-un-menu-select/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 01:42:44 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=123</guid>
		<description><![CDATA[Función PHP que permite construir dinámicamente un menú desplegable tipo select partiendo de un array.]]></description>
			<content:encoded><![CDATA[<p>Esta sencilla función PHP permite construir dinámicamente un menú desplegable tipo select, partiendo de un array con los datos del desplegable.</p>
<p>la función permite que uno de los elementos del desplegable ya esté seleccionado previamente.</p>
<pre class="brush: php;">
&lt;?php
$dias = array(
		1=&gt;Lunes,
		2=&gt;Martes,
		3=&gt;Miércoles,
		4=&gt;Jueves,
		5=&gt;Viernes,
		6=&gt;Sábado,
		7=&gt;Domingo
		);

function doSelect($n,$d,$s=null)
	{
	$doSelect = &quot;&lt;select name=\&quot;$n\&quot;&gt;\n&quot;;
	foreach($d as $i=&gt;$v)
		{
		$doSelect.=&quot;\t&lt;option value=\&quot;$i\&quot;&quot;;
		$doSelect.=$s==$i?&quot; selected&quot;:&quot;&quot;;
		$doSelect.=&quot;&gt;&quot;.$v.&quot;&lt;/option&gt;\n&quot;;
		}
	$doSelect.=&quot;&lt;/select&gt;&quot;;
	return $doSelect;
	}

// El miércoles, pre-seleccionado
echo doSelect(&quot;dias&quot;,$dias,3);
?&gt;
</pre>
<p>La función devuelve el siguiente html:</p>
<pre class="brush: xml;">
&lt;select name=&quot;dias&quot;&gt;
	&lt;option value=&quot;1&quot;&gt;Lunes&lt;/option&gt;
	&lt;option value=&quot;2&quot;&gt;Martes&lt;/option&gt;
	&lt;option value=&quot;3&quot; selected&gt;Miércoles&lt;/option&gt;
	&lt;option value=&quot;4&quot;&gt;Jueves&lt;/option&gt;
	&lt;option value=&quot;5&quot;&gt;Viernes&lt;/option&gt;
	&lt;option value=&quot;6&quot;&gt;Sábado&lt;/option&gt;
	&lt;option value=&quot;7&quot;&gt;Domingo&lt;/option&gt;
&lt;/select&gt;
</pre>
<p>Si no quisiéramos ningún elemento pre-seleccionado en el desplegable, sólo tenemos que omitir el tercer parámetro de la función.</p>
<pre class="brush: php;">
&lt;?php
// Ningún día pre-seleccionado
echo doSelect(&quot;dias&quot;,$dias);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/construir-un-menu-select/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Logo Coren</title>
		<link>http://quenerapu.com/vector/logo-coren/</link>
		<comments>http://quenerapu.com/vector/logo-coren/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 18:12:17 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[Vector]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[coren]]></category>
		<category><![CDATA[fh9]]></category>
		<category><![CDATA[logo]]></category>
		<category><![CDATA[svg]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=119</guid>
		<description><![CDATA[Logo vectorizado de Coren, para quien lo pueda necesitar.<br />En versiones .svg, .ai, .fh9 y .cdr.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-120" title="Logo Coren" src="http://quenerapu.com/wp-content/uploads/2009/07/logocoren.gif" alt="Logo Coren" width="400" height="220" /></p>
<p>Logo vectorizado de <a href="http://coren.es/" target="_blank">Coren</a>, para quien lo pueda necesitar:</p>
<p><a href="http://quenerapu.com/logoteca/coren.svg"><img style="float:left;margin-right:5px;" title="Download SVG" src="http://quenerapu.com/images/download-svg.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/coren.ai"><img style="float:left;margin-right:5px;" title="Download Illustrator" src="http://quenerapu.com/images/download-ai.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/coren.fh9"><img style="float:left;margin-right:5px;" title="Download FreeHand" src="http://quenerapu.com/images/download-fh9.gif" alt="" width="48" height="60" /></a><a href="http://quenerapu.com/logoteca/coren.cdr"><img style="float:left;margin-right:5px;" title="Download CorelDraw" src="http://quenerapu.com/images/download-cdr.gif" alt="" width="48" height="60" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/vector/logo-coren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Constantes dentro de una cadena de texto</title>
		<link>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/</link>
		<comments>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 14:13:31 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[constantes]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=117</guid>
		<description><![CDATA[Del mismo modo que puedo utilizar variables dentro de una cadena de texto, he buscado la manera de hacer lo mismo con las constantes.]]></description>
			<content:encoded><![CDATA[<p>Buscaba hoy la manera de resolver esto:</p>
<p>Del mismo modo que puedo utilizar variables <strong>dentro</strong> de una cadena de texto:</p>
<pre class="brush: php;">
&lt;?php
	$nombre = &quot;Manolo&quot;;
	$alias = &quot;El del bombo&quot;;
	echo &quot;Me llamo $nombre ($alias)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
<p>Hasta donde yo sé, no es posible hacer nada parecido con las constantes:</p>
<pre class="brush: php;">
&lt;?php
	define(&quot;NOMBRE&quot;, &quot;Manolo&quot;);
	define(&quot;ALIAS&quot;, &quot;El del bombo&quot;);
	echo &quot;Me llamo NOMBRE (ALIAS)&quot;;

//	Mal: Devuelve 'Me llamo NOMBRE (ALIAS)'
?&gt;
</pre>
<p>El único modo posible sería este:</p>
<pre class="brush: php;">
&lt;?php
	echo &quot;Me llamo &quot;.NOMBRE .&quot;(&quot;.ALIAS.&quot;)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
<p>Pero a mi siempre me resultó bastante incómoda esta sintaxis:</p>
<p><strong>&#8221;texto &#8221;.$variable_o_CONSTANTE.&#8221; siguiente texto&#8221;</strong></p>
<p>Así que hoy decidí apartar un poco de tiempo para buscar un modo de incluir constantes <strong>dentro</strong> de una cadena de texto con misma libertad que tengo cuando uso variables. Y creo que lo encontré <img src='http://quenerapu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para empezar, <strong>define()</strong> no es la única manera de definir una constante. En <a href="http://php.net/manual/en/function.constant.php">php.net</a> he visto que las constantes se pueden definir dentro de clases, y que lo hacen con una sintaxis un poco diferente:</p>
<pre class="brush: php;">
&lt;?php
	class constantes
	{
	const NOMBRE = &quot;Manolo&quot;;
	const ALIAS = &quot;El del bombo&quot;;
	}
?&gt;
</pre>
<p>Y a estas constantes puedes llamarlas así:</p>
<pre class="brush: php;">
&lt;?php echo constantes::NOMBRE; ?&gt;
</pre>
<p>Hasta ahí, estupendo, pero el problema viene cuando quiero llamar a la constante desde una instancia:</p>
<pre class="brush: php;">
&lt;?php
	$c = new constantes();
	echo &quot;Me llamo $c::NOMBRE ($c::ALIAS)&quot;;

//	Mal: Devuelve 'Me llamo ()'
?&gt;
</pre>
<p>Tirando de Google, encontré en <a href="http://www.cristalab.com/">cristalab.com</a> una solución que me ha parecido elegante. Ellos publicaron en marzo de 2007 el artículo <strong><a href="http://www.cristalab.com/tips/como-usar-y-acceder-a-constantes-en-clases-de-php-c35762l/">Cómo usar y acceder a constantes en clases de PHP</a></strong> y en él proponían añadir una función privada que permitiera llamar a cualquiera de esas constantes. La cosa queda así</p>
<pre class="brush: php;">
&lt;?php
	class constantes
	{
	const NOMBRE = &quot;Manolo&quot;;
	const ALIAS = &quot;El del bombo&quot;;

	private function __get($name)
		{
		if(defined(&quot;self::$name&quot;))
			{
			return constant(&quot;self::$name&quot;);
			}
		trigger_error(&quot;$name isn't defined&quot;);
		}
	}
?&gt;
</pre>
<p>De modo que ahora ya puedo hacer esto:</p>
<pre class="brush: php;">
&lt;?php
	$c = new constantes();
	echo &quot;Me llamo $c-&gt;NOMBRE ($c-&gt;ALIAS)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
