<?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ú &#187; función</title>
	<atom:link href="http://quenerapu.com/etiquetas/funcion/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>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>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>De checkbox múltiple a lista</title>
		<link>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/</link>
		<comments>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 13:08:51 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[javaScript]]></category>
		<category><![CDATA[checkbox múltiple]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[lista]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=100</guid>
		<description><![CDATA[Ésta es la técnica que uso cuando quiero llevar los datos de un checkbox múltiple en un formulario web a una tabla de datos.]]></description>
			<content:encoded><![CDATA[<p>No sé si es lo más correcto, pero habitualmente almaceno en las tablas de datos el contenido de un campo checkbox múltiple&#8230;</p>
<div id="attachment_115" class="wp-caption alignnone" style="width: 392px"><img class="size-full wp-image-115" title="Checkbox múltiple" src="http://quenerapu.com/wp-content/uploads/2009/03/checkboxmultiple1.jpg" alt="Checkbox múltiple" width="382" height="111" /><p class="wp-caption-text">Checkbox múltiple</p></div>
<p>&#8230;del siguiente modo:</p>
<div id="attachment_114" class="wp-caption alignnone" style="width: 392px"><img class="size-full wp-image-114" title="Tabla en la base de datos" src="http://quenerapu.com/wp-content/uploads/2009/03/checkboxmultiple2.jpg" alt="Tabla en la base de datos" width="382" height="120" /><p class="wp-caption-text">Tabla en la base de datos</p></div>
<p>Nomalmente uso comas para separarlos pero cuando esto es un problema tiro de caracteres menos frecuentes como la <a href="http://en.wikipedia.org/wiki/Vertical_bar">barra vertical <strong>|</strong></a>, por ejemplo.</p>
<p>Para convertir el contenido de un campo checkbox múltiple en una lista separada por comas utilizo esta función:</p>
<pre class="brush: jscript;">
function chkd2lst(frm,fld)
	{
	var t=&quot;&quot;;var s=&quot;,&quot;;
	for(var i=0;i&lt;document[frm].elements[&quot;_&quot;+fld].length;i++)
		{
		if(document[frm].elements[&quot;_&quot;+fld][i].checked)
			{
			t+=document[frm].elements[&quot;_&quot;+fld][i].value+s;
			}
		}
	document[frm].elements[fld].value=t;
	alert(document[frm].elements[fld].value);
	}
</pre>
<p>La función <strong>chkd2lst</strong> espera el nombre del formulario y el nombre del campo checkbox múltiple. También define que la coma será el separador de los elementos de la lista (<strong>variable s</strong>) pero esto es fácilmente editable. Al final de la función hay un <strong>alert</strong> que puede ser eliminado, por supuesto. Está ahí simplemente para comprobar que la función funciona.</p>
<p>Supongamos que, como en el ejemplo de las imágenes, el campo se llama <strong>diasClase</strong>. El formulario ha de llamar entonces al javaScript de esta manera:</p>
<pre class="brush: xml;">
&lt;form
	name=&quot;ficha&quot;
	method=&quot;post&quot;
	onSubmit=&quot;chkd2lst(this.name,'diasClase');return;&quot;
&gt;
</pre>
<p>Dentro del formulario, divido el tema del checkbox múltiple en dos partes. Por un lado la sucesión de checkboxes:</p>
<pre class="brush: xml;">
&lt;input name=&quot;_diasClase&quot; value=&quot;1&quot; type=&quot;checkbox&quot;&gt;Lunes
&lt;input name=&quot;_diasClase&quot; value=&quot;2&quot; type=&quot;checkbox&quot;&gt;Martes
&lt;input name=&quot;_diasClase&quot; value=&quot;3&quot; type=&quot;checkbox&quot;&gt;Miércoles
&lt;input name=&quot;_diasClase&quot; value=&quot;4&quot; type=&quot;checkbox&quot;&gt;Jueves
&lt;input name=&quot;_diasClase&quot; value=&quot;5&quot; type=&quot;checkbox&quot;&gt;Viernes
&lt;input name=&quot;_diasClase&quot; value=&quot;6&quot; type=&quot;checkbox&quot;&gt;Sábado
</pre>
<p>Y a continuación un campo hidden en el que guardaré la lista generada a partir de los checkboxes.</p>
<pre class="brush: xml;">
&lt;input name=&quot;diasClase&quot; value=&quot;&quot; type=&quot;hidden&quot;&gt;
</pre>
<p>La función espera que el nombre de los campos checkbox y hidden sean el mismo, pero que el nombre de cada <strong>input</strong> del checkbox múltiple vaya precedido de un <a href="http://en.wikipedia.org/wiki/Low_line">guión bajo <strong>_</strong></a> y que el nombre del campo hidden no lo lleve.</p>
<p>Y ya está: antes de enviar el formulario, <strong>chkd2lst</strong> convierte las opciones seleccionadas en <strong>_diasclase</strong> en una lista separada por comas y la lleva a <strong>diasclase</strong>. <a href="http://quenerapu.com/ejemplos/checkboxMultiple.htm">He colgado un ejemplo aquí</a> en el que sustituyo el <strong>campo hidden</strong> por un <strong>campo text</strong> sólo para que se vea el resultado.</p>
<p>Próximamente publicaré otro artículo en el que trataré el proceso inverso, es decir: traigo de la base de datos un campo conteniendo la lista separada por comas y marco como <strong>checked</strong> los elementos correspondientes del checkbox multiple. Imprescindible para poder editar, claro.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web multilingüe</title>
		<link>http://quenerapu.com/php/web-multingue/</link>
		<comments>http://quenerapu.com/php/web-multingue/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 16:48:15 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=96</guid>
		<description><![CDATA[Una función PHP pequeña y sencilla (nada del otro mundo, está basada en arrays) que facilita el desarrollo de páginas web multingües.]]></description>
			<content:encoded><![CDATA[<p>Me planteo hacer una web en 3 idiomas: Supongamos español, inglés y alemán.</p>
<p>Todo en esta web es exactamente igual en los tres idiomas salvo naturalmente, los textos. Así que vamos a ser organizados desde el principio y no caeremos en aquello de &#8216;hacer la misma web tres veces&#8217;.</p>
<p>Esta simple función devuelve el texto en el idioma correspondiente para cada palabra o cadena de texto solicitada.</p>
<pre class="brush: php;">
&lt;?php
function l($t,$i=&quot;es&quot;)
	{
	$l = array();
	$l['enviar'] =	array(
					&quot;es&quot;=&gt;&quot;Enviar&quot;,
					&quot;en&quot;=&gt;&quot;Send&quot;,
					&quot;de&quot;=&gt;&quot;Senden&quot;,
					);
	$l['cancelar'] = array(
					&quot;es&quot;=&gt;&quot;Cancelar&quot;,
					&quot;en&quot;=&gt;&quot;Cancel&quot;,
					&quot;de&quot;=&gt;&quot;Abbrechen&quot;,
					);
	$l['despedida'] = array(
					&quot;es&quot;=&gt;&quot;Hasta luego&quot;,
					&quot;en&quot;=&gt;&quot;See you later&quot;,
					&quot;de&quot;=&gt;&quot;Tschüs&quot;,
					);
	return $l[$t][$i];
	}

$i = &quot;de&quot;; // El idioma elegido.
?&gt;
&lt;p&gt;&lt;?=l(&quot;despedida&quot;,$i);?&gt;&lt;/p&gt;
&lt;input type=&quot;submit&quot; value=&quot;&lt;?=l(&quot;enviar&quot;,$i);?&gt;&quot;&gt;
&lt;input type=&quot;button&quot; value=&quot;&lt;?=l(&quot;cancelar&quot;,$i);?&gt;&quot;&gt;
</pre>
<p>La <strong>función l($t,$i)</strong> es muy fácil de manejar. Sin complicación podemos incorporar palabras o frases nuevas, o añadir un idioma más. Lo de dar en la función un valor predeterminado a <strong>$i</strong> es simplemente para tener un idioma por defecto, mientras el usuario no elige el suyo.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/web-multingue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Links clicables en texto libre</title>
		<link>http://quenerapu.com/javascript/links-clicables-en-texto-libre/</link>
		<comments>http://quenerapu.com/javascript/links-clicables-en-texto-libre/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 17:22:34 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[función]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=67</guid>
		<description><![CDATA[Una cómoda función que automatiza el código necesario para hacer clicables los enlaces web contenidos en cualquier cadena de texto.]]></description>
			<content:encoded><![CDATA[<p>A menudo facilitamos al usuario de formularios algún cuadro de texto libre que permiten la inclusión de enlaces web. Se me ocurren sólo tres formas de conseguir que esos enlaces sean clicables al volver a volcar la info en pantalla:</p>
<ol>
<li>Dejarlo en manos del usuario, confiando en que use correctamente los tags <strong>&lt;a href=&#8221;&#8230;&#8221;&gt;&lt;/a&gt;</strong></li>
<li>Dejarlo en manos del usuario, confiando en que use correctamente alguna herramienta web que le facilitemos para ello, como <a href="http://www.fckeditor.net/">FCKEditor</a>, <a href="http://tinymce.moxiecode.com/">TinyMCE</a> o similares</li>
<li>Dejarlo en manos de una función.</li>
</ol>
<p>Dejar el HTML en manos del usuario medio es habitualmente una fuente de problemas, así que suelo prescindir de la <strong>opción 1</strong>.</p>
<p>La <strong>opción 2</strong> es muy tentadora pero sólo la utilizo cuando desarrollo paneles de control ya que sus usuarios tienen formación específica o han recibido algún cursillo, así que todo suele ir como la seda.</p>
<p>Así que cuando se trata de dejar formularios al alcance de usuarios desconocidos, me decanto siempre por la <strong>opción 3</strong>.</p>
<p>Ejemplo: Supongamos que el siguiente texto es introducido en un textarea de un formulario web.</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es http://www.cuatro.com, la de Antena 3 es http://antena3.com, la de RTVE es http://rtve..es y la de La Sexta creo que es www.lasexta.com. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Vemos que el mensaje incluye cuatro enlaces:</p>
<ul>
<li><strong>http://www.cuatro.com</strong> es correcto.</li>
<li><strong>http://antena3.com</strong> es correcto aunque no incluya el subdominio &#8216;www&#8217;.</li>
<li><strong>http://rtve..es</strong> presenta una errata (dos puntos entre &#8216;rtve&#8217; y &#8216;es&#8217;) y no es un enlace válido.</li>
<li><strong>www.lasexta.com</strong> sería correcto en la barra de direcciones del navegador pero en principio no es directamente reconocible como enlace al no ir precedido del indicador de protocolo &#8216;http://&#8217;.</li>
</ul>
<p>La función que presento hoy es capaz de reconocer los enlaces y actuar en consecuencia:</p>
<pre class="brush: php;">
&lt;?php
function addLinks($str,$alt=false)
	{
	$com = &quot;[enlace]&quot;;
	$pcl = &quot;((ht|f)tps?:\/\/)&quot;;
	$hst = &quot;([a-z\d][-a-z\d]*[a-z\d]\.)+&quot;.
		   &quot;[a-z][-a-z\d]*[a-z]&quot;;
	$prt = &quot;(:\d{1,})?&quot;;
	$pth = &quot;(\/[^?&lt;&gt;\#\&quot;\s]+)?&quot;;
	$qry = &quot;(\?[^&lt;&gt;\#\&quot;\s]+)?&quot;;
	$str = preg_replace(
			&quot;#({$pcl}{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot;&lt;a href='$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	$str = preg_replace(
			&quot;#\s(www.{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot; &lt;a href='http://$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	return $str;
	}

$txt = &quot;Hola Juan. La web de Cuatro es http://www.cuatro.com, &quot;.
	   &quot;la de Antena 3 es http://antena3.com, la de RTVE es &quot;.
	   &quot;http://rtve..es y la de La Sexta creo que es &quot;.
	   &quot;www.lasexta.com. A ver si ahí puedes encontrar la info &quot;.
	   &quot;que buscas. Un saludo.&quot;;

echo addLinks($txt);
?&gt;
</pre>
<p>Esta función devuelve el valor de <strong>$txt</strong> como sigue:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">http://www.cuatro.com</a>, la de Antena 3 es <a href="http://antena3.com">http://antena3.com</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">www.lasexta.com</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Vemos que los tres enlaces válidos son clicables. El enlace a RTVE no lo es porque la función no lo dio por bueno. Pero aparece como parte del texto con la esperanza de que quien lo lea detecte la errata, corrija el enlace y pueda utilizarlo.</p>
<p>¡Ah! Y si queremos que no aparezcan los enlaces escritos (a veces ocupan demasiado espacio), podemos sustituirlos por una palabra comodín simplemente añadiendo &#8216;true&#8217; como segundo parámetro:</p>
<pre class="brush: php; gutter: false;">
&lt;?= addLinks($txt,true); ?&gt;
</pre>
<p>Lo que nos devuelve:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">[enlace]</a>, la de Antena 3 es <a href="http://antena3.com">[enlace]</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">[enlace]</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Muy práctico, ¿verdad?.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/links-clicables-en-texto-libre/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>El sistema de plantillas más simple del mundo (probablemente)</title>
		<link>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/</link>
		<comments>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 04:23:11 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=42</guid>
		<description><![CDATA[Un método muy sencillo de separar forma de contenido, con lo que el diseñador web y el programador podrán trabajar simultáneamente.]]></description>
			<content:encoded><![CDATA[<p>Supongamos que acabo de diseñar en HTML una ficha tipo (voy a hacer algo muy básico, sólo para ilustrar):</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;[NOMBRE] [APELLIDO]&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    [ID]&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   [NOMBRE] [APELLIDO]&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     [EDAD] años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; [TELÉFONO]&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:[EMAIL]&quot;&gt;[EMAIL]&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Y ahora convierto las variables a sintaxis PHP básica, manteniendo el HTML intacto:</p>
<pre class="brush: php;">
&lt;html&gt;
&lt;head&gt;&lt;?=$nombre.' '.$apellido;?&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    &lt;?=$id;?&gt;&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   &lt;?=$nombre.' '.$apellido;?&gt;&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     &lt;?=$edad;?&gt; años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; &lt;?=$telefono;?&gt;&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:&lt;?=$eMail;?&gt;&quot;&gt;&lt;?=$eMail;?&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>LLamo a esta plantilla «ficha.php» y la guardo en una carpeta «plantillas», por ejemplo. A continuación, en un documento nuevo (que llamaré «index.php», para ser original) declaro la función que sirve para crear contenidos en base a plantillas.</p>
<pre class="brush: php;">
&lt;?php
function tpl($p,$d=array())
	{
	extract($d);
	ob_start();
	require('plantillas/'.$p.'.php');
	return ob_get_clean();
	}
?&gt;
</pre>
<p>Y ya está: No tengo más que llamar a esa función con la info obtenida de la base de datos cada vez que quiera volcarla en pantalla utilizando esa plantilla.</p>
<pre class="brush: php;">
&lt;?php
echo tpl('ficha',
			array(
				'id'=&gt;      123,
				'nombre'=&gt;  'Juan',
				'apellido'=&gt;'Gómez',
				'edad'=&gt;    33,
				'telefono'=&gt;'987654321',
				'eMail'=&gt;   'foo@bar.es'
				)
		);
?&gt;
</pre>
<p>Con ese PHP generamos este HTML:</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;Juan Gómez&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    123&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   Juan Gómez&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     33 años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; 987654321&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:foo@bar.es&quot;&gt;foo@bar.es&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>La principal ventaja que presenta este método es que estoy separando en la medida de lo posible la forma del contenido. El documento «ficha.php» es fácilmente editable por un diseñador web sin conocimientos de programación PHP (Tan sólo ha de comprender la sintaxis <strong>&lt;?=$variable;?&gt;</strong>, que no es mucho pedir), mientras que el documento «index.php» sólo contiene programación PHP, sin una sola etiqueta HTML molestando por medio, de modo que el programador se centra exclusivamente en la programación.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>La clásica función «¿Estás seguro/a?»</title>
		<link>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/</link>
		<comments>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 02:35:55 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[minimal]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=36</guid>
		<description><![CDATA[Una función javaScript muy básica, para pedir confirmación al usuario/a sobre lo que va a hacer (como por ejemplo, eliminar un registro).]]></description>
			<content:encoded><![CDATA[<p>Una de esas funciones básicas que no deben faltar en ningún proyecto. Es simple: Se trata de pedir confirmación al usuario antes de acceder al link indicado. Muy útil antes de eliminar un registro, por ejemplo. Incluye algo que me gusta añadir a mi programación en los momentos en que el software se dirige al usuario/a. Texto personalizado según su género.</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function rUSure(u,g)
	{
	if(!g){var g='o';}
	if(confirm(&quot;¿Estás segur&quot;+g+&quot;?&quot;)){document.location.href=u;}
	}
&lt;/script&gt;
</pre>
<p>Nota: Esta función hace uso de la técnica <a href="2009/02/25/argumentos-por-defecto-en-funciones-javascript/">Argumentos por defecto en funciones javaScript</a> para ajustar el mensaje al género del usuario (¿Estás seguro?|¿Estás segura?)</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Argumentos por defecto en funciones javaScript</title>
		<link>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/</link>
		<comments>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 02:15:13 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[javaScript]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=32</guid>
		<description><![CDATA[En PHP es sencillo declarar parámetros por defecto en las funciones. En javaScript también se puede, aunque de un modo menos directo]]></description>
			<content:encoded><![CDATA[<p>En PHP es posible (y sencillo) declarar parámetros por defecto en las funciones.</p>
<pre class="brush: php;">
&lt;?php
function qq($a,$b=2)
	{
	return $a+$b;
	}

echo qq(3);		// Devuelve 5
echo qq(3,3);	// Devuelve 6
?&gt;
</pre>
<p>Vemos que si no asignamos un valor a <strong>$b</strong>, la función tiene reservado para <strong>$b</strong> un valor por defecto.</p>
<p>Lamentablemente en javaScript no es posible declarar un argumento por defecto en una función de un modo tan directo. El siguiente ejemplo **<strong>no funciona</strong>**:</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b=2)	// Esto no va a funcionar
	{
	return a+b;
	}
&lt;/script&gt;
</pre>
<p>¿Cómo podemos conseguirlo? Pues con un poco de ingenio es posible expresar la idea de «argumento por defecto en funciones javaScript» de la siguiente manera:</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b)
	{
	if(!b){var b=2;} // Si no hay b, b=2
	return a+b;
	}

document.write(qq(3));		// Devuelve 5
document.write(qq(3,3));	// Devuelve 6
&lt;/script&gt;
</pre>
<p>¿Fácil, no?</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF-8 a minúsculas o mayúsculas</title>
		<link>http://quenerapu.com/php/utf-8-minusculas-mayusculas/</link>
		<comments>http://quenerapu.com/php/utf-8-minusculas-mayusculas/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 05:03:31 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[mayúsculas]]></category>
		<category><![CDATA[minúsculas]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=15</guid>
		<description><![CDATA[Una pequeña función que convierte una cadena de texto UTF-8 a minúsculas o mayúsculas sin que tildes o eñes se resientan por ello.]]></description>
			<content:encoded><![CDATA[<p>Esta función convierte una cadena de texto en formato UTF-8 a minúsculas o mayúsculas sin que las tildes o las eñes se resientan por ello.</p>
<pre class="brush: php;">
&lt;?php
function utfChCase($s,$u=false)
	{
	$s=utf8_decode($s);
	$s=$u?strtoupper($s):strtolower($s);
	$s=utf8_encode($s);
	return $s;
	}
?&gt;
</pre>
<p>Así, para hacer minúsculas:</p>
<pre class="brush: php;">
&lt;?= utfChCase(&quot;Hola&quot;); ?&gt;
</pre>
<p>Y para hacer mayúsculas:</p>
<pre class="brush: php;">
&lt;?= utfChCase(&quot;Hola&quot;,true); ?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/utf-8-minusculas-mayusculas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Segundos a H:i:s</title>
		<link>http://quenerapu.com/php/segundos-a-his/</link>
		<comments>http://quenerapu.com/php/segundos-a-his/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 18:37:25 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[horas]]></category>
		<category><![CDATA[minutos]]></category>
		<category><![CDATA[segundos]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=3</guid>
		<description><![CDATA[Sencilla función que convierte un número de segundos a la notación H:i:s (horas:minutos:segundos) con dos dígitos para cada elemento.]]></description>
			<content:encoded><![CDATA[<p>Esta función convierte un número de segundos a la notación H:i:s (horas:minutos:segundos) con dos dígitos para cada elemento.</p>
<pre class="brush: php;">
&lt;?php
function s2His($s)
	{
	$r=sprintf(&quot;%02d&quot;,intval(intval($s)/3600)).&quot;:&quot;.
	sprintf(&quot;%02d&quot;,bcmod((intval($s)/60),60)).&quot;:&quot;.
	sprintf(&quot;%02d&quot;,bcmod(intval($s),60));
	return $r;
	}
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/segundos-a-his/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
