<?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>Tutoriales DWEB</title>
	<atom:link href="http://www.quimeraazul.com/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.quimeraazul.com/tutoriales</link>
	<description>Tutoriales e información sobre Desarollo Web</description>
	<lastBuildDate>Sat, 28 May 2011 16:42:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>AJAX entre dominios con el estándar CORS (Cross-Origin Resource Sharing)</title>
		<link>http://www.quimeraazul.com/tutoriales/2011/02/ajax-entre-dominios-con-el-estandar-cors-cross-origin-resource-sharing/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2011/02/ajax-entre-dominios-con-el-estandar-cors-cross-origin-resource-sharing/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 17:57:56 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ajax seguridad]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=358</guid>
		<description><![CDATA[La generalización de AJAX ha supuesto un impulso gigantesco para el desarrollo de aplicaciones web cada vez más importantes. Avanzamos claramente hacia aplicaciones que integran, mediante AJAX, servicios o módulos desarrollados por terceros (Google, Yahoo, Facebook, etc). Sin embargo esta tendencia se ha topado con un problema importante: la política del mismo origen (Same Origin [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-359" title="w3c" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/w3cSmall.jpg" alt="W3C " width="115" height="98" /></p>
<p>La generalización de AJAX ha supuesto un impulso gigantesco para el desarrollo de aplicaciones web cada vez más importantes. Avanzamos claramente hacia aplicaciones que integran, mediante AJAX, servicios o módulos desarrollados por terceros (Google, Yahoo, Facebook, etc). Sin embargo esta tendencia se ha topado con un problema importante: la política del mismo origen (<em>Same Origin Policy</em>), que impide que se puedan realizar peticiones HTTP desde JavaScript a un dominio diferente.</p>
<p>Además de diferentes <em>hacks</em> que se han ido desarrollando con el tiempo  para rodear el problema, existe una especificación del W3C para  solucionarlo: <strong>Cross-Origin Resource Sharing</strong> (CORS), que podriamos  traducir como &#8220;Compartición de Recursos entre Origenes&#8221;.<span id="more-358"></span></p>
<h2>Política del Mismo Origen</h2>
<p><em>Same Origin Policy </em>es una importante <strong>medida de seguridad</strong> que  implementan actualmente todos los navegadores. Significa que una web sólo puede utilizar el objeto XMLHttpRequest para  hacer peticiones HTTP <strong>AJAX</strong> al mismo domino desde el que se cargó la  página original. Las peticiones a dominios diferentes serán descartadas.</p>
<div id="attachment_360" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-360" title="sameOriginPolicy" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/sameOriginPolicy.png" alt="Same Origin Policy" width="550" height="402" /><p class="wp-caption-text">Same Origin Policy impide comunicación AJAX entre origenes diferentes</p></div>
<p>¿Qué se entiende por un dominio diferente? además del evidente nombre  del dominio, tampoco se permite comunicación si cambia el protocolo (por  ejemplo de http a https) o el puerto.</p>
<div id="attachment_363" class="wp-caption aligncenter" style="width: 516px"><img class="size-full wp-image-363" title="url" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/url.png" alt="protocolo, dominio y puerto" width="506" height="127" /><p class="wp-caption-text">Origen: protocolo, dominio y puerto</p></div>
<p>Esto quiere decir que tampoco nos funcionará una petición desde una  página cargada de http:www.miweb.com a https:www.miweb.com. Aunque en este  caso lo único que cambia es que utilizamos el protocolo seguro https,  pero no es posible.</p>
<p>La necesidad de poder hacer estas peticiones como parte de las aplicaciones actuales ha llevado a buscar varias soluciones:</p>
<ul>
<li>JSONP</li>
<li>Servidor Proxy</li>
<li>uso de iFrames</li>
<li>CORS</li>
</ul>
<p>Las tres primeras son en realidad diferentes formas de &#8216;rodear&#8217; el problema en vez de solucionarlo, sólo <strong>CORS trata de definir un estándar</strong> para crear una forma de comunicación por AJAX entre diferentes dominios.</p>
<h2>¿En qué consiste el estándar Cross-Origin Resource Sharing?</h2>
<p>El estándar propone incluir <strong>nuevas cabeceras HTTP</strong> en la comunicación  cliente-servidor para saber si se debe enviar (servidor) o mostrar  (navegador) un recurso concreto, en función del origen de la petición.</p>
<blockquote><p>La  idea es que mediante la información que se intercambia en las cabeceras  HTTP el servidor y el navegador puedan decidir si esa petición, desde  ese origen, puede permitirse.</p></blockquote>
<p>EL navegador, cuando se va a  realizar una petición asíncrona a un dominio diferente, debe incluir  automáticamente la cabecera ORIGIN en la petición:</p>
<pre class="brush: xml; title: ;">
Origin: http://www.sitio1.com
</pre>
<p>Esta cabecera indicará al servidor el dominio desde el que se está haciendo la petición (desde el que se recibió la página original). El servidor tendrá una lista de dominios permitidos y, si este está en la lista, devolverá el recurso solicitado incluyendo en la respuesta la nueva cabecera Access-Control-Allow-Origin:</p>
<pre class="brush: xml; title: ;">
Access-Control-Allow-Origin: http://www.sitio1.com
</pre>
<p>Con esta cabecera el servidor indica el <em>origen</em> al que le permite leer este contenido. El navegador siempre comprobará esta cabecera. Si no se recibe o no indica el dominio correcto, bloqueará la respuesta para no permitir acceso al DOM a ningún script procedente de un dominio &#8216;extraño&#8217;.</p>
<p>Este es el funcionamiento básico. El estándar define también otro tipo de petición más compleja, que requiere un intercambio previo de cabeceras para decidir si puede enviarse. Vamos a ver a continuación los dos casos en detalle.</p>
<h2>Petición simple</h2>
<p>Una petición se considera simple cuando:</p>
<ul>
<li>Utilizamos el método GET</li>
<li>Utilizamos POST para enviar datos pero el tipo de contenido (Content-Type) es: <span style="font-family: Courier New;">application/x-www-form-urlencoded</span>, <span style="font-family: Courier New;">multipart/form-data</span>, o <span style="font-family: Courier New;">text/plain</span></li>
<li>No incluimos cabeceras HTTP personalizadas en la petición</li>
</ul>
<p>En este caso el procedimiento es tan simple como el que hemos descrito antes.</p>
<p>Supongamos  que vamos a hacer una petición GET mediante AJAX, utilizando el objeto  XMLHttpRequest, desde una página cargada de <em>www.sitio1.com</em>. El destino  de la petición es <em>www.sitio2.com/utilidad.php</em></p>
<p>El navegador  incluirá automáticamente la nueva cabecera HTTP ORIGIN al detectar un  intento de comunicación a un dominio diferente.</p>
<p>La petición HTTP, entre otras cabeceras, enviará:</p>
<pre class="brush: xml; title: ;">
GET /utilidad.php HTTP/1.1
Host: www.sitio2.com
   ...
Origin: http://www.sitio1.com
</pre>
<p>La última linea es la que incluyen los navegadores que soportan el nuevo  estándar, indicando al servidor que esta petición llega desde contenido  cargado desde otro dominio (www.sitio1.com).</p>
<p>El servidor comprobará que el dominio www.sitio1.com está en la lista de aceptados y enviará la respuesta, por ejemplo:</p>
<pre class="brush: xml; title: ;">
HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: http://www.sitio1.com

[Data]
</pre>
<p>La cabecera Access-Control-Allow-Origin se incluye como parte de CORS, para indicar al navegador que esta información puede ser leido por el origen indicado. Si esta cabecera no aparece o el origen indicado no es el de la página cargada, el navegador bloqueará la respuesta.</p>
<p>Este tipo de peticiones simples son soportadas por los navegadores mayoritarios (Internet Explorer 8+, Firefox 3.5+, Safari 4+, and Chrome) y pueden ser suficientes para utilizar servicios públicos de terceros.</p>
<h2>Petición con verificación previa (preflighted)</h2>
<p>El estándar propone que para peticiones más complejas, que incluyan  cabeceras HTTP personalizadas, métodos HTTP diferentes de GET o POST o  con Content-Type diferente de los tres listados anteriormente (por  ejemplo <em>application/xml</em>), se haga una verificación previa.</p>
<p>La  idea es utilizar este método para todas las peticiones que puedan  implicar cambios en datos almacenados en el servidor. Este tipo de  peticiones se hacen en dos pasos:</p>
<ol>
<li>Determinar, utilizando la cabecera OPTIONS, si la petición se puede mandar</li>
<li>Enviar la petición</li>
</ol>
<p>En la primera parte del proceso, el navegador informará al servidor,  mediante cabeceras, de los métodos y cabeceras personalizadas que va a  utilizar en la petición para ver si el servidor las acepta. También  indicará si pretende enviar información de autenticación o cookies, pero esto lo veremos en otro apartado.</p>
<p>Un ejemplo de petición podría ser este:</p>
<pre class="brush: xml; title: ;">
OPTIONS /utilidad.php HTTP/1.1
Host: www.sitio2.com
...
Origin: http://www.sitio1.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-CUSTOM
</pre>
<p>OPTIONS no es en realidad una cabecera nueva, forma parte del estándar  HTTP 1.1 y se utiliza para obtener más información sobre las  opciones que soporta el servidor.</p>
<p>Las tres últimas cabeceras sí  son particulares de CORS y, en este caso, indicarían que se pretende  enviar una petición desde el origen <em>www.sitio1.com</em>, utilizando el método POST e  incluyendo la cabecera personalizada X-CUSTOM. El servidor responderá  indicando las cabeceras y métodos que permite para este origen.</p>
<p>La respuesta podría ser algo así:</p>
<pre class="brush: xml; title: ;">
HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: http://www.sitio1.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-CUSTOM
Access-Control-Max-Age: 1500000
Content-Type: text/plain
</pre>
<p>Viendo estas cabeceras el navegador sabe que puede enviar la petición y que el servidor la acepta. <em>Access-Control-Max-Age</em> sirve para indicar el tiempo, en segundos, durante el que esta misma petición puede hacerse directamente, sin el proceso de <em>preflight</em>.</p>
<p>A continuación se enviará la petición real, incluyendo la cabecera ORIGIN y el servidor enviará la respuesta incluyendo la cabecera <em>Access-Control-Allow-Origin: http://www.sitio1.com</em> como en una petición simple.</p>
<h2>El nuevo XMLHttpRequest de nivel 2</h2>
<p>Las peticiones AJAX se realizan a través del objeto XMLHttpRequest (XHR). Era necesario actualizarlo para permitir las comunicaciones inter-dominios en los casos y las condiciones que contempla el estándar <em>Cross-Origin Resource Sharing</em>. Estas nuevas capacidades, junto con algunas más, se definen en el estándar <a href="http://www.w3.org/TR/XMLHttpRequest2/">XMLHttpRequest Nivel 2</a>.</p>
<p>Microsoft ha decidido, una vez más, no seguir los estándares e implementar la funcionalidad de CORS mediante un objeto diferente llamado XDomainRequest (XDR), en vez de aumentar las capacidades de XMLHttpRequest. Mas adelante veremos las limitaciones que esto supone.</p>
<p>Afortunadamente los métodos y propiedades que debemos utilizar son comunes por lo que sólo tenemos que decidir qué objeto instanciamos. El <em>interface</em> que podemos usar con cualquiera de los dos objetos es el siguiente:</p>
<ul>
<li><strong>abort()</strong> &#8211; detiene una petición en marcha</li>
<li><strong>onerror</strong> &#8211; para asignar el callback que se dispara en caso de error</li>
<li><strong>onload</strong> &#8211; para asignar el callback que se dispara en caso de éxito</li>
<li><strong>open()</strong> &#8211; establece el método y URL para la petición HTTP</li>
<li><strong>responseText</strong> &#8211; propiedad en la que se almacenan los datos de la respuesta</li>
<li><strong>send()</strong> &#8211; Para enviar la petición</li>
</ul>
<p>Un ejemplo sencillo de cómo podriamos usar el objeto XHR en una petición a un dominio diferente sería:</p>
<pre class="brush: jscript; title: ;">
var xhrObject = new XMLHttpRequest();
xhrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);
xhrObject.onload = function(){
   alert(xhrObjet.responseText)
};
xhrObject.send(null);
</pre>
<p>El objeto XHR se crea normalmente, y se utiliza <em>open()</em> y <em>send()</em> igual que para peticiones normales. La diferencia es que el evento que se dispara cuando la petición se ha recibido con éxito es <em>load</em>. Por eso definimos nuestra función callback para manejar el resultado en <em>xhrObject.onload</em>. Para una llamada AJAX normal, en el dominio propio, definiriamos el callback en <em>xhrObject.onreadystatechange</em></p>
<p>En este ejemplo, cuando la petición se completa, mostramos los datos que hemos recibido en <em>xhrObjet.responseText</em> con un <em>alert()</em>.</p>
<p>El objeto XDomainRequest del IE se utilizaría exactamente igual:</p>
<pre class="brush: jscript; title: ;">
var xdrObject = new XDomainRequest();
xdrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);
xdrObject.onload = function(){
   alert(xdrObjet.responseText)
};
xdrObject.send(null);
</pre>
<p>En un caso real no es necesario duplicar el código, símplemente tenemos que detectar qué objeto debemos crear.</p>
<p>Para saber si el navegador en el que estamos soporta el nuevo objeto XHR, con las capacidades CORS, comprobaremos si el objeto tiene definida la propiedad withCredentials, exclusiva del XHR nivel 2 y que más adelante veremos cómo se utiliza. Si el resultado es negativo debemos preguntar si existe el objeto XDomainRequest para saber si estamos en alguna versión del IE con soporte CORS. Si el resultado también es negativo, no tenemos soporte para peticiones AJAX inter-dominios.</p>
<p>El ejemplo anterior, con un código único sería:</p>
<pre class="brush: jscript; title: ;">
//Función para encapsular la detección del objeto que tenemos que usar para AJAX inter-dominios, según el navegador en el que estemos.
function createCorsObject(){

//Inicialmente creamos XHR
var xhrObject = new XMLHttpRequest();
    //comprobamos si XHR tiene capacidades CORS o es el antiguo
    if (&quot;withCredentials&quot; in xhrObject){
        return xhrObject;
    }
    //si es el antiguo, comprobamos si el navegador soporta el objeto XDR
    else if (typeof XDomainRequest != &quot;undefined&quot;){
         xhrObject = new XDomainRequest();
    } else {
    xhrObject = null;
    }
return xhrObject;
}

//obtenemos un objeto para AJAX cross-dominio
var xhrObject = createCorsObject();

//si tenemos un objeto válido...
if (xhrObject){

//definimos los parámetros de la petición HTTP
xhrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);

//definimos un callback para tratar los datos que recibamos
xhrObject.onload = function(){
alert(xhrObjet.responseText)
};

//definimos un callback para tratar el caso de error
xhrObject.onerror = function(){
    // código para caso de error
};

//Enviamos la petición
xhrObject.send(null);
}
</pre>
<p>Creo que los comentarios del código son suficiente para explicarlo. En este caso la novedad es que hemos definido también una función para tratar errores.</p>
<h2>Peticiones con cookies o autentificación</h2>
<p>Las cookies o la información de autentificación (certificados SSL o  cabeceras HTTP de autenticación) no se envía nunca por defecto para este  tipo de comunicación. Existe una propiedad del objeto XHR nivel 2 (el  que implementan los navegadores que soportan CORS) que sirve para  indicar que queremos enviar y recibir este tipo de información:</p>
<pre class="brush: jscript; title: ;">
XHR.withCredentials = true;
</pre>
<p>Si el servidor permite el envío de este tipo de información para peticiones desde este origen lo indicará en la respuesta incluyendo una cabecera HTTP especial:</p>
<pre class="brush: xml; title: ;">
Access-Control-Allow-Origin:  http://www.sitio1.com
Access-Control-Allow-Credentials: true
</pre>
<p>Para estos casos, la cabecera <em>Access-Control-Allow-Origin</em> debe indicar el origen exacto, no puede indicarse un origen genérico mediante &#8216;*&#8217;.</p>
<p>El Internet Explorer 8 no soporta esta funcionalidad. <strong>El objeto XDR, propietario del IE, ni siquiera incluye la propiedad withCredentials</strong>. Nunca se enviarán cookies ni información de autenticación para este tipo de comunicación.</p>
<h2>Las limitaciones de XDomainRequest (IE)</h2>
<p>El Internet Explorer sólamente implementa una parte del estándar Cross-Origin Resource Sharing. Puede utilizarse para peticiones sencillas (obtener datos RSS o widgets para presentar en nuestra página) pero para comunicaciones complejas presenta las siguientes limitaciones importantes:</p>
<ul>
<li>En ningún caso permite comunicación entre HTTPS y HTTP o viceversa</li>
<li>En ningún caso permite enviar cookies o información de autentificación</li>
<li>No permite peticiones con verificación previa (preflighted)</li>
<li>Sólo soporta <em>Content-Type: text/plain </em></li>
<li>No permite añadir cabeceras HTTP personalizadas</li>
</ul>
<p>Puedes obtener información más detallada en los documentos: <a href="http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx ">XDomainRequest &#8211; Restrictions, Limitations and Workarounds</a> y <a href="http://msdn.microsoft.com/library/cc709423.aspx">Client-side Cross-domain Security</a>. En este último,  Microsoft intenta explicar las razones por las que han elegido esta implementación y estas limitaciones.</p>
<h2>¿Que seguridad aporta CORS?</h2>
<p>En principio puede parecer que CORS no aporta mucha seguridad. Se basa  en una cabecera ORIGIN que el servidor comprueba y en otras cabeceras de  respuesta que el comprueba navegador. Enviar una cabecera ORIGIN falsa  es algo trivial, al alcance de cualquiera y utilizar un navegador  modificado que no bloquee las respuestas, también.</p>
<p>Sin embargo,  el propósito de este estándar, es proteger al usuario que está navegando  en su ordenador, con su navegador, de scripts maliciosos que intentarán  acceder a páginas web sin que lo sepa, suplantando su identidad.  Supongamos un caso con los siguientes actores:</p>
<ul>
<li>Inocencio, el usuario que navega tranquilamente por internet desde su ordenador</li>
<li>Malone, un <em>hacker</em> con su propio sitio web de descargas <em>www.pelisgratis.es</em></li>
<li>La tienda online <em>www.tienda.com</em> en la que Inocencio tiene una cuenta</li>
</ul>
<p>Inocencio visita la web <em>www.pelisgratis.es</em> que le ha recomendado un  amigo. La página inicial de &#8216;Pelis Gratis&#8217; presenta el listado de  películas e incluye también un <em>script</em> en JavaScript que, sin que  Inocencio lo sepa, intenta utilizar AJAX para conectarse a la conocida  tienda online <em>www.tienda.com</em>.</p>
<p>Si el <em>hacker</em> tiene suerte y el  usuario ha abierto sesión en la tienda recientemente, aún tendrá la  <em>cookie</em> de sesión válida y el servidor le reconoce como Inocencio. Malone  puede utilizar su <em>script</em> para realizar cualquier cosa o robar cualquier  información de la cuenta de Inocencio. Esto es lo que trata de  impedirse mediante la <strong>Política del Origen Común</strong> y el estándar  <strong>Compartición de Recursos entre Origenes</strong></p>
<p>El caso del <em>hacker</em> usando un navegador modificado no presenta los mismos problemas porque  no tendría la <em>cookie</em> del usuario para suplantarle. El acceso se  protegería mediante la comprobación de credenciales (usuario/password).</p>
<p>La modificación de cabeceras en el trayecto de la información, entre el usuario y el destino, puede protegerse utilizando HTTPS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2011/02/ajax-entre-dominios-con-el-estandar-cors-cross-origin-resource-sharing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS Float: Tutorial Visual (II)</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-ii/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-ii/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 17:43:51 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[float]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=268</guid>
		<description><![CDATA[En la primera parte de este tutorial vimos los conceptos básicos de la propiedad float, ejemplos de cómo se comportan los elementos flotantes y cómo afectan a su entorno en el documento. Vamos a continuar viendo, también a través de ejemplos, cómo podemos modificar ese comportamiento. Clear: Para no estar al lado de un float [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-272" title="Tutorial Visual de Floats " src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floatInicial.png" alt="Tutorial Visual de Floats " width="115" height="115" /><br />
En la <a href="http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-i/">primera parte</a> de este tutorial vimos los conceptos básicos de la propiedad <strong><em>float</em></strong>, ejemplos de cómo se comportan los elementos flotantes y cómo afectan a su entorno en el documento. Vamos a continuar viendo, también a través de ejemplos, cómo podemos modificar ese comportamiento.<span id="more-268"></span></p>
<h2>Clear: Para no estar al lado de un float</h2>
<p>Como ya hemos visto,  un elemento flotante modifica el comportamiento de otros elementos de bloque,  que suben para ocupar su sitio y su contenido se desplaza para dejarle hueco . Este comportamiento se puede evitar con la propiedad <em><strong>clear</strong></em>, que puede tomas los valores: <em>left, right, both, none o inherit</em>.</p>
<p><em>Clear</em> se aplica a elementos de bloque no flotantes o a cualquier elemento flotante, forzándolos a desplazarse debajo de un <em>float</em> anterior si están al lado. Los valores indican a que lado del elemento no permitimos que haya un <em>float</em>: a la derecha, a la izquierda o a ambos.</p>
<blockquote><p><em>Clear</em> se aplica a elementos de bloque no flotantes o a cualquier elemento flotante, forzándolos a mostrarse debajo de un <em>float</em></p></blockquote>
<p>Vamos a retomar algunos ejemplos y aplicar <em>clear</em> para ver cómo afecta al resultado.</p>
<p>En la siguiente imagen tenemos 3 bloques con dimensiones diferentes y con <em>float:left</em>:</p>
<div id="attachment_245" class="wp-caption aligncenter" style="width: 505px"><img class="size-full wp-image-245" title="Tres bloques flotados" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/tresFloatsParaClear.png" alt="Tres bloques flotados" width="495" height="301" /><p class="wp-caption-text">Los tres bloques con float:left</p></div>
<p>Si no queremos que el bloque azul se quede donde está, podemos ponerle <em>clear:left</em>. Con esto estamos indicando que este bloque no puede tener ningún <em>float</em> a su izquierda. Si hubiera alguno debe bajar hasta colocarse debajo. Y esto es lo que hace:</p>
<pre class="brush: css; title: ;">
div#azul {
clear: left;
}
</pre>
<div id="attachment_246" class="wp-caption aligncenter" style="width: 508px"><img class="size-full wp-image-246" title="bloque azul con clear" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/azulClear.png" alt="bloque azul con clear" width="498" height="353" /><p class="wp-caption-text">Bloque azul clear:left</p></div>
<p>Si en vez de eso aplicamos clear:left sólo al naranja:</p>
<pre class="brush: css; title: ;">
div#naranja {
clear: left;
}
</pre>
<div id="attachment_247" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-247" title="Ejemplo clear" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/naranjaClear.png" alt="Ejemplo clear" width="500" height="370" /><p class="wp-caption-text">Bloque naranja clear:left</p></div>
<p>El naranja baja, porque no puede tener a su izquierda ningún bloque flotante y el azul se coloca a su lado. Si al bloque naranja le ponemos <em>clear:both</em> significa que no puede tener ningún elemento flotante a su izquierda ni a su derecha, pero si lo aplicamos veremos que no ocurre nada. Este ejemplo nos sirve para resaltar que la propiedad <em>clear</em> obliga a un elemento a colocarse debajo de un <em>float</em> <strong>anterior</strong>. Como el bloque azul está declarado despues en el HTML, no cambia nada.</p>
<p>Para desplazar el bloque azul podemos añadirle también clear:left:</p>
<pre class="brush: css; title: ;">
div#naranja {
clear: left;

div#azul {
clear: left;
}
</pre>
<div id="attachment_248" class="wp-caption aligncenter" style="width: 518px"><img class="size-full wp-image-248" title="Ejemplo con 2 bloques cleared" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/azulYNaranjaClear.png" alt="Ejemplo con 2 bloques cleared" width="508" height="436" /><p class="wp-caption-text">Bloque naranja y bloque azul con clear:left</p></div>
<p>Cuando tratamos con elementos no flotantes, la propiedad se aplica sólo a bloques, los elementos de línea no se ven afectados. En este ejemplo tenemos tres imágenes, el pez azul es flotante a la izquierda:</p>
<div id="attachment_249" class="wp-caption aligncenter" style="width: 541px"><img class="size-full wp-image-249" title="Ejemplo con imágenes" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/azulFloatLeft.png" alt="Ejemplo con imágenes" width="531" height="244" /><p class="wp-caption-text">Pez azul float:left</p></div>
<p>Podriamos pensar que si le ponemos a la mariquita <em>clear:left</em> bajará a la siguiente línea, pero no es así, al ponerlo no cambia nada porque es un elemento de línea y no es flotante. Sin embargo, si tenemos imágenes dentro de bloques, sí podemos utilizarlo. En el siguiente ejemplo teníamos el pez azul con <em>float:left</em> y las otras dos imágenes en un <em>div</em> con borde rojo. El <em>div</em> ha subido al ser flotante la imagen del pez azul y las dos imágenes se han desplazado para dejarle sitio.</p>
<div id="attachment_250" class="wp-caption aligncenter" style="width: 554px"><img class="size-full wp-image-250" title="Ejemplo clear. Bloque con imágenes" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bloqueConImgsFlotado.png" alt="Ejemplo clear. Bloque con imágenes" width="544" height="257" /><p class="wp-caption-text">Pez azul con float:left. Las otras dos imágenes en un bloque</p></div>
<p>Si ahora le ponemos al <em>div</em> con borde rojo <em>clear:left</em>:</p>
<div id="attachment_251" class="wp-caption aligncenter" style="width: 548px"><img class="size-full wp-image-251" title="Ejemplo de bloques cleared" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/imgsEnBloqueCleared.png" alt="Ejemplo de bloques cleared" width="538" height="377" /><p class="wp-caption-text">pez float:left, div con imágenes clear:left</p></div>
<p>El bloque no puede tener un <em>float</em> a su izquierda por lo que se desplaza abajo.</p>
<p>La propiedad <em>clear</em> es muy útil también para controlar como se coloca el texto alrededor de una imagen. En el siguiente ejemplo tenemos una imagen flotante a la izquierda y dos parrafos que hemos marcado con borde rojo:</p>
<div id="attachment_253" class="wp-caption aligncenter" style="width: 559px"><img class="size-full wp-image-253" title="Ejemplo con imágenes y texto" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/imgYTextoClear.png" alt="Ejemplo con imágenes y texto" width="549" height="370" /><p class="wp-caption-text">imagen con float:left</p></div>
<p>Si no queremos que el segundo párrafo empiece a la derecha de la imagen le ponemos <em>clear:left</em>:</p>
<div id="attachment_254" class="wp-caption aligncenter" style="width: 555px"><img class="size-full wp-image-254" title="Párrafo con clear" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/parrafosCleared.png" alt="Párrafo con clear" width="545" height="379" /><p class="wp-caption-text">Imagen float:left, segundo párrafo con clear:left</p></div>
<p>Todo el bloque del párrafo baja para colocarse debajo del elemento flotante.</p>
<p>Si tenemos varias imágenes podemos utilizar <em>clear</em> para controlar cómo se colocan. En el siguiente ejemplo tenemos tres imágenes y a continuación 2 párrafos con el borde marcado en rojo. Ninguno es flotante:</p>
<p><img class="aligncenter size-full wp-image-323" title="Ejemplo con varias imágenes" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/variasImgsYTexto.png" alt="Ejemplo con varias imágenes" width="542" height="483" />Como queremos que el texto quede alrededor de las imágenes, vamos a hacerlas flotantes a la derecha, las tres ( <em>float:right</em> ). El resultado es:</p>
<div id="attachment_324" class="wp-caption aligncenter" style="width: 549px"><img class="size-full wp-image-324" title="Ejemplo con las imágenes flotantes a la derecha" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/tresImagenesYTxtFloatRight.png" alt="" width="539" height="444" /><p class="wp-caption-text">Ejemplo con las imágenes flotantes a la derech</p></div>
<p>Si queremos que el corazón quede debajo del caballo, le ponemos <em>clear: right</em>:</p>
<div id="attachment_326" class="wp-caption aligncenter" style="width: 543px"><img class="size-full wp-image-326" title="Ejemplo" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/tresImgsYTxtCorazonFloat.png" alt="Ejemplo con corazón clear:right" width="533" height="437" /><p class="wp-caption-text">Las tres imágenes float:right, Corazón clear:right</p></div>
<p>Como el corazón no puede tener ningún elemento flotante a su derecha, bajará para colocarse por debajo. El periódico, que es flotante a la derecha, como los otras imágenes, quedará al lado del corazón, y no del caballo porque los elementos flotantes se desplazan a derecha o izquierda <strong>en su línea</strong>. El corazón a bajado y, para el periódico, declarado en el HTML después del corazón, esta es ahora su linea.</p>
<p>Es muy importante tener en cuenta que para lograr la disposición que queramos tenemos que jugar con <em>float/clear</em> y con <strong>el orden en que declaramos los elementos en el HTML</strong>. Si queremos que el periódico quede al lado del caballo y el corazón debajo, tenemos que cambiar el orden de las imágenes en el HTML. Ponemos primero el caballo, después el periódico y después el corazón. Las tres imágenes con <em>float:right</em> y el corazón, ademas con <em>clear:right</em>. Nos quedaría:</p>
<div id="attachment_328" class="wp-caption aligncenter" style="width: 557px"><img class="size-full wp-image-328" title="Ejemplo de clear" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo6.png" alt="Ejemplo de clear" width="547" height="444" /><p class="wp-caption-text">Las tres imágenes float:right. Corazón clear:right</p></div>
<p>Igualmente, si queremos que el primer párrafo quede por encima de las imágenes, tendría que estar declarado antes.</p>
<blockquote><p>Es muy importante tener en cuenta que para lograr la disposición que queramos tenemos que jugar con <em>float/clear</em> y con <strong>el orden en que declaramos los elementos en el HTML</strong></p></blockquote>
<p>Para que las tres imágenes queden en vertical tendríamos que poner <em>clear:right</em> a la segunda y la tercera:</p>
<div id="attachment_329" class="wp-caption aligncenter" style="width: 544px"><img class="size-full wp-image-329" title="Ejemplo con las imágenes en vertical" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floatsEjemplo7.png" alt="Ejemplo con las imágenes en vertical" width="534" height="476" /><p class="wp-caption-text">Las tres imágenes con float:right. Periódico y corazón con clear:right</p></div>
<p>Y este es un buen punto para retomar la explicación de los elementos contenedores que se encogen sin tener en cuenta los <em>floats&#8230;</em></p>
<h2>El increíble contenedor menguante</h2>
<p>La razón por la que el bloque contenedor se va encogiendo es sencilla: para los elementos de bloque (como el <em>div</em> contenedor) los elementos con <em>float</em> no ocupan espacio en la página, por lo tanto no los tiene en cuenta. En alguno de los ejemplos que hemos visto, con todos los elementos flotantes, el bloque no contiene nada. La única razón por la que no desaparece completamente es que tiene un <em>padding</em> declarado de 10px.</p>
<p>Este comportamiento a veces no es lo que queremos (ya veremos como se evita) y puede parecer un <em>bug</em>, un error de diseño, pero no lo es. Es una decisión consciente de los desarrolladores del estándar CSS y tiene una razón de ser: el texto que fluye alrededor de las imágenes flotadas.</p>
<p>Para entenderlo nos sirve un ejemplo similar al del apartado anterior. El siguiente documento tiene dos párrafos, y el primero de ellos contiene también una imagen:</p>
<div id="attachment_332" class="wp-caption aligncenter" style="width: 546px"><img class="size-full wp-image-332" title="Imagen dentro de un párrafo" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo9.png" alt="Imagen dentro de un párrafo" width="536" height="443" /><p class="wp-caption-text">Imagen y texto, ninguno flotante</p></div>
<p>Si hacemos la imagen flotante a la izquierda, todo queda como debe, el texto se coloca alrededor de la imagen como en los medios impresos tradicionales:</p>
<div id="attachment_331" class="wp-caption aligncenter" style="width: 551px"><img class="size-full wp-image-331" title="Imagen flotante entre párrafos" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo8.png" alt="Imagen flotante entre párrafos" width="541" height="368" /><p class="wp-caption-text">Imagen con float:left</p></div>
<p>Cada párrafo es un elemento de bloque que ha subido para recolocarse como si el <em>float</em> no estuviera ahí. El contenido de los bloques, al ser elementos de línea que quedan al lado de un <em>float</em>, acortan su longitud para dejarle sitio. <strong>El pez azul está dentro del párrafo 1</strong>, pero éste no le tiene en cuenta y se ha encogido hasta encerrar sólo al texto. Si el contenedor no ignorara al elemento flotante el resultado sería este:</p>
<p><img class="aligncenter size-full wp-image-333" title="Error del contenedor no menguante" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo10.png" alt="Error del contenedor no menguante" width="533" height="415" />Que, obviamente, no sería aceptable.</p>
<h2>Soluciones al problema del contenedor</h2>
<p>Vamos a partir de un ejemplo con una imagen y un bloque de texto, los dos dentro de un <em>div</em> contenedor (<em>#wrapper</em>) que hemos marcado con borde negro.</p>
<p>Ponemos la imagen flotante a la izquierda y el bloque de texto flotante a la derecha. El texto está dentro de un <em>div</em> al que hemos puesto borde rojo y al que hemos fijado una anchura de 365 pixels para que quepa al lado de la imagen. Estos serían los estilos aplicados a cada elemento:</p>
<pre class="brush: css; title: ;">
div#wrapper {
   padding: 10px;
   width: 500px;
   border: 1px solid black;
}

img {
   float:left;
}

div#texto {
   float:right;
   border: 1px dotted red;
   width: 365px;
}
</pre>
<p>El resultado visual es:</p>
<div id="attachment_335" class="wp-caption aligncenter" style="width: 541px"><img class="size-full wp-image-335" title="Ejemplo contenedor vacío" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo11.png" alt="Ejemplo contenedor vacío" width="531" height="324" /><p class="wp-caption-text">imagen float:right, bloque de texto float:left</p></div>
<p>Como el texto y la imagen son flotantes, el contenedor no los tiene en cuenta y queda vacío. No desaparece por completo porque tiene un <em>padding</em> de 10px. Hay varias formas de solucionar esto, vamos a ir viéndolas una por una.</p>
<h3>1.-Hacer el contenedor flotante</h3>
<p>Si el contenedor es también flotante sí abarcará a los elementos flotantes dentro de él. Si le ponemos, por ejemplo, <em>float:right </em>:</p>
<div id="attachment_337" class="wp-caption aligncenter" style="width: 546px"><img class="size-full wp-image-337" title="Ejemplo. Contenedor flotante" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo12.png" alt="Ejemplo. Contenedor flotante" width="536" height="342" /><p class="wp-caption-text">Contenedor con float:right</p></div>
<p>Naturalmente esta solución no siempre puede aplicarse, porque muchas veces necesitamos que el contenedor no sea flotante. Si lo tenemos centrado en la página, por ejemplo, al ponerlo flotante se nos desplazará estropeándonos el diseño. Afortunadamente hay más soluciones.</p>
<h3>2.- Poner un elemento con <em>clear</em> después de los flotantes</h3>
<p>Esta solución es muy utilizada porque no tiene &#8216;efectos secundarios&#8217;. Si tenemos un elemento de bloque después de los flotantes es perfecto, le ponemos <em>clear:both</em>, y el contenedor, al tener que contener a este elemento, incluirá también a los que están por encima (los flotantes). Recuerda que <em>clear</em> se aplica a elementos de bloque.</p>
<p>Cuando no tenemos ningún elemento más, como en nuestro ejemplo, tenemos que incluir uno vacío, normalmente un <em>div</em>,  sólo para ponerle el <em>clear</em> y arreglar el contenedor. Debajo del bloque que contiene el texto, añadiríamos el siguiente:</p>
<pre class="brush: xml; title: ;">
		&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
</pre>
<p>Definimos <em>clear</em> como una clase porque podemos utilizarla sobre otros elementos si los tenemos disponibles:</p>
<pre class="brush: css; title: ;">
.clear {
clear: both;
}
</pre>
<p>Este <em>div</em> sería invisible, en la imagen de abajo le hemos puesto unos pixels de <em>padding</em> y borde verde para que se vea:</p>
<div id="attachment_341" class="wp-caption aligncenter" style="width: 543px"><img class="size-full wp-image-341" title="Poniendo un elemento vacio con clear" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floats2Ejemplo13.png" alt="Poniendo un elemento vacio con clear" width="533" height="347" /><p class="wp-caption-text">Div vacío con clear:both</p></div>
<p>El bloque contenedor se ha tenido que extender incluyendo a los <em>float</em>. El único problema de esta solución es que a veces tenemos que incluir elementos vacíos, que no tienen un significado real (semántico) en la página.</p>
<h3>3.- Utilizar la propiedad CSS  <em>overflow</em></h3>
<p>Si ponemos <em>overflow:hidden</em> o <em>overflow:auto</em> en el elemento padre (el contenedor en este caso) se expandirá siempre para abarcar a los elementos flotantes. Esta solución también es muy utilizada, sólo hay que tener en cuenta que esta propiedad implica también algo más, para saber si podemos aceptarlo:</p>
<p><em>overflow: hidden</em> &#8211; Significa que el contenido que exceda de las dimensiones del <em>div</em> (si las tiene) se oculta, no habrá barra de desplazamiento ni se verán por fuera del <em>div</em>.</p>
<p><em>overflow: auto</em> &#8211; Significa que si el contenido excede las dimensiones del <em>div</em>, aparecerán unas barras de desplazamiento para hacer <em>scroll</em>.</p>
<p>Algunos navegadores (IE6 por ejemplo) necesitan que el contenedor tenga fijada una anchura o altura para que la solución funcione bien.</p>
<p>Existen otros métodos, como el llamado <a href="http://www.csslab.cl/2006/07/20/flotando-en-la-incertidumbre/">clearfix hack</a> que utiliza la pseudo clase CSS <em>:after</em> para generar un elemento dentro del contenedor con <em>clear:both</em>, como hicimos en el primer caso. No vamos a entrar en detalle en esta solución porque falla en algunos navegadores y necesita un poco más de código para hacerla funcionar.</p>
<h2>Float para diseñar la estructura de una página</h2>
<p>En la actualidad el esquema de posicionamiento <em>float</em> es muy utilizado para hacer el diseño general de una página o para disponer los elementos dentro de una parte de una página, normalmente un <em>div</em>.</p>
<p>Ahora que sabemos como funcionan, no es muy dificil ver cómo podemos utilizarlos para el diseño visual. No hay en realidad nada nuevo que explicar, sólo se trata de aplicar lo que sabemos para organizar los bloques generales que vamos a tener en la página.</p>
<p>¿Cómo podríamos hacer un diseño con una cabecera, un contenido principal, una columna a la derecha y un pie de página?. Bueno, pues así, por ejemplo:</p>
<div id="attachment_208" class="wp-caption aligncenter" style="width: 474px"><img class="size-full wp-image-208 " title="Estructura de un documento con Floats" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/estructuraDoc.png" alt="Estructura de un documento con Floats" width="464" height="298" /><p class="wp-caption-text">Estructura de un documento con Floats</p></div>
<p>Hay varias formas posibles de hacerlo, la que vemos en la imagen es sólo una de ellas. De todas formas, veremos más adelante algún tutorial monográfico sobre disposición de elementos en formularios y en páginas utilizando <em>floats</em>.</p>
<p>Esto es todo por ahora, puedes plantear sugerencias, mejoras o dudas en los comentarios. También puedes decirnos si te gusta o no te gusta el tutorial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Consejos SEO desde GOOGLE</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/11/consejos-seo-desde-google/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/11/consejos-seo-desde-google/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 15:28:07 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[buscadores]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=290</guid>
		<description><![CDATA[El 20 de Mayo del 2010 Matt Cutts y su equipo, del departamento de calidad de Google Search, hicieron una presentación sobre errores comunes y consejos a tener en cuenta para mejorar el posicionamiento de una web en buscadores. En la charla Matt revisa páginas que la gente le ha enviado comentando errores y aciertos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-303" title="Icono Google" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/googleIcon.png" alt="Icono Google" width="115" height="115" />El 20 de Mayo del 2010 Matt Cutts y su equipo, del departamento de calidad de Google Search, hicieron una presentación sobre errores comunes y consejos a tener en cuenta para mejorar el posicionamiento de una web en buscadores.</p>
<p>En la charla Matt revisa páginas que la gente le ha enviado comentando errores y aciertos para conseguir un buen puesto en las búsquedas. Este artículo es un resumen de esa conferencia.<span id="more-290"></span></p>
<h2>Web: Phoenician Stone</h2>
<div id="attachment_295" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-295" title="Phoenician Stone" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/phoenicianStone-300x221.png" alt="Phoenician Stone" width="300" height="221" /><p class="wp-caption-text">Web de Phoenician Stone</p></div>
<p>El error más notable de esta web (pensando en su posicionamiento) es que no tiene texto. Todas las palabras que vemos son imágenes, incluso el menú. Es imposible para Google saber su contenido. El único texto está en el código HTML, en las <em>meta keywords</em>:</p>
<pre class="brush: xml; title: ;">
&lt;meta name=&quot;KeyWords&quot;
 content=&quot;Antique fireplaces, stone fountains, antique stone pavers,
stone wall cladding, stone columns, Antique terracotta and jars, roman mosaics,
courtyard fountains, stone mantles, Biblical stone, reclaimed limestone,
antique carrara marble, dalle de france, antique barre, barre blonde,
Encaustic Tiles, dalle de bourgogne, antique jerusalem stone, antique countertops,
Tuscan fireplaces, provance fireplaces, antique mantles, antique wall veneers,
stone pool coping, stone range hoods, stone kitchen hoods, antique wellheads&quot;&gt;
 </pre>
<p>desgraciadamente, este es casi el único texto que Google no indexa. Hay demasiada gente que utiliza las <em>keywords</em> para incluir todos los términos que creen que pueden llevar tráfico a su web, aunque no estén relacionados con el contenido. Google ya no se fía de esa etiqueta, la descarta.</p>
<p>El título de la página es también Phoenician Stone, y este es otro punto a mejorar. Aprovecha el título para dar una idea del contenido de tu página. Piensa en lo que los usuarios van a teclear cuando busquen los servicios que ofreces y pon esas palabras en tu página.</p>
<p>La <a href="https://adwords.google.com/o/Targeting/Explorer?__u=1000000000&amp;__c=1000000000&amp;ideaRequestType=KEYWORD_IDEAS#search.none">herramienta para buscar palabras clave</a> de Adwords puede ayudarte. Puedes teclear una frase de búsqueda y te mostrará búsquedas relacionadas que hace la gente.</p>
<h2>Web: RodsBot</h2>
<div id="attachment_296" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-296" title="web de RodsBot" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/rodsbot-300x224.png" alt="web de RodsBot" width="300" height="224" /><p class="wp-caption-text">Web de RodsBot</p></div>
<p>Es una página que muestra sitios <em>extraños</em> capturados en Google Earth. ¿Como podríamos hacer que un sitio así puntúe alto en Google?. El principal problema es otra vez que la página tiene muy poco texto. ¿Cómo podríamos solucionarlo fácilmente? En un sitio como este, la mejor solución es hacer que los propios usuarios del sitio sean los que generen el texto: añadir comentarios y valoraciones de los usuarios y, por supuesto, utilizar <em>twitter</em> y <em>facebook</em> para promocionarlo un poco.</p>
<p>El mismo autor tiene otras 5 ó 6 webs más listadas al final. En general da mucho mejor resultado tener un solo sitio muy cuidado y trabajado que cinco sitios mediocres.</p>
<h2>Web:  Android And Me</h2>
<div id="attachment_297" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-297" title="Web de Android And Me" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/androidAndMe-300x166.png" alt="Web de Android And Me" width="300" height="166" /><p class="wp-caption-text">Web de Android And Me</p></div>
<p>Lo primero que llama la atención al entrar en esta página es que, en la primera pantalla,  apenas se ve contenido útil. Nos perdemos entre publicidad, menús, contenido relacionado, etc. No es malo mostrar todo esto pero podemos organizarlo de forma que no haya que desplazarse para ver algo de lo que ofreces, porque algunos visitantes no van a hacerlo.</p>
<p>Si utilizas WordPress en tu web (o Joomla, Drupal, etc) es importantísimo tenerlo siempre actualizado porque si no tu sitio sera infectado o hackeado.</p>
<p>El formato de las URLs que utiliza es bueno:</p>
<p><strong>http://androidandme.com/2010/11/news/another-gingerbread-sighting-at-the-googleplex/</strong></p>
<p>Incluye el título de los artículos como parte de la URL. Esos pequeños detalles, como usar palabras clave del artículo en la url y en el título, son importantes en SEO.</p>
<p>El título de <em>Android And Me</em> es <em>Android And Me</em>. No es muy buena idea. Estamos desperdiciando un lugar importante sin decir nada nuevo sobre la página. Podriamos poner, por ejemplo, <em>Android News and reviews</em> o algo similar.</p>
<h2>Web: Surprises Galore  (Hackeado)</h2>
<p>Es un ejemplo de página que ha sido atacada y modificada. La página muestra uno de esos anuncios &#8216;<em>Your computer is infected, click here to desinfect</em>&#8216;. Cando pulsas es cuando realmente te instala el virus. A veces el ataque puede ser también para que tu sitio muestre spam.</p>
<p>Puedes utilizar <a href="http://www.google.es/webmasters/">Google Webmaster Central</a> para comprobar si tu web está infectada con algún tipo de software malicioso (<em>malware</em>). Si es así te informará y te propone una serie de pasos a seguir para solucionarlo. Es muy importante hacerlo porque si Google detecta que tu sitio contiene <em>malware</em> te bloqueará en los resultados de las búsquedas.</p>
<p>También te puedes llevar una sorpresa con el contenido de tu página si no moderas o revisas los comentarios. Puedes encontrarte que, debido a los comentarios <em>spam</em>, las palabras que más aparecen tu página pueden no ser las que tu quieres.</p>
<h2>Web:  The hookup</h2>
<div id="attachment_298" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-298" title="Web de The HookUp" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/thehookup-300x193.png" alt="Web de The HookUp" width="300" height="193" /><p class="wp-caption-text">Web de The HookUp</p></div>
<p>Es una web sobre audio para el coche y las entradas son de este tipo:</p>
<p><img class="aligncenter size-medium wp-image-309" title="post ejemplo" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/hookupExample1-300x203.png" alt="post ejemplo" width="300" height="203" /></p>
<p><img class="aligncenter size-medium wp-image-310" title="Ejemplo post 2" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/hookupExample2-300x201.png" alt="Ejemplo post 2" width="300" height="201" /></p>
<p>Un producto y una lista de características. ¿Es este el tipo de entradas normales de un blog?. Lo único que el autor está haciendo es coger notas de prensa de productos para coches y pegarlos en su blog. No hay ni una línea de contenido original, con lo que Google lo valorará muy bajo. Puedes crear sitios de este tipo, no hay problema, pero cuando una web no tiene contenido original que mostrar,  no subirá muy alto en el ranking de Google.</p>
<p>Escribir contenido original realmente marca la diferencia. La gente no guarda nunca un sitio como este sitio en favoritos, no siente necesidad de volver.</p>
<h2>Web: Kathy Toth (Agente Inmobiliario)</h2>
<div id="attachment_299" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-299" title="Web de Kathy Toth" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/kathytoth-300x194.png" alt="Web de Kathy Toth" width="300" height="194" /><p class="wp-caption-text">Web de Kathy Toth</p></div>
<p>La web tiene bastante contenido original, pero una vez más tenemos que parte del texto son realmente imágenes. Ese texto no va a existir para Google.</p>
<p>Si pulsamos en el blog  aparecen algunas cosas que deben cuidarse un poco. Las entradas no son originales y en algunas se habla, por ejemplo, de &#8216;La tortura del beso de Hillary Clinton&#8217;. Es bueno que el blog muestre tu lado humano, pero hay que saber hasta donde llegar. En una web de empresa, frases como esta pueden ser ofensivas para algunos clientes.</p>
<p>La empresa aparece en Google Maps. Es bueno no centrarse únicamente en la página web, puedes crear vídeos, puedes añadir imágenes en Flicker, utilizar Facebook, twitter,  etc. No te centres únicamente en ser el primero en una búsqueda  concreta, porque la gente va a buscar de miles de formas diferentes.</p>
<p>Es bueno comprobar de vez en cuando las frases de búsqueda por las que llegan a ti y incluirlas en un par de sitios en tu contenido (si encajan bien, sin <em>spam</em>). Esto puede hacerte subir  en las búsquedas.</p>
<p>Utilizando  <a href="http://www.google.es/webmasters/">Google Webmaster Central</a> puedes ver en que tipo de busquedas apareces y también en que página.</p>
<h2>Web: APPBrain</h2>
<div id="attachment_311" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-311" title="Web de APP Brain" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/appbrain-300x188.png" alt="Web de APP Brain" width="300" height="188" /><p class="wp-caption-text">Web de APP Brain</p></div>
<p>En este caso la estructura de las URLs es también buena:</p>
<p><strong>http://www.appbrain.com/app/fruit-slice/com.droidhen.fruit</strong></p>
<p>Puedes usar un punto o un guión como separador de palabras. Se pueden utilizar guiones bajos también pero Google tiende a indexarlos como términos separados: &#8216;artículo-sobre-seo&#8217;  se indexa junto mientras que &#8216;artículo_sobre_seo&#8217; puede indexarse como 3 términos separados.</p>
<p>El sitio está bastante bien en general, tienen contenido original y bien organizado. Un detalle importante es que presentan una lista de artículos relacionados con el que estás viendo. YouTube, por ejemplo, recibe una cantidad increíble de tráfico de sus <em>vídeos relacionados</em>. Si el visitante tiene un poco de tiempo (incluso si no lo tiene) es muy tentador ver algo muy relacionado con el tema que te ha llevado hasta allí.</p>
<p>Al contrario que <em>meta keywords</em>, la etiqueta <em>meta description</em> sí es importante. En las búsquedas, es el texto que aparecerá debajo del enlace en la página de resultados. Una buena descripción puede hacer el link más atractivo y atraer más a los usuarios. Si no hay <em>meta description</em> o es la misma en todas las páginas, Google intenta generar una con partes del texto de la página, y el resultado no siempre es bueno.</p>
<h2>Web: Grow In Style</h2>
<div id="attachment_300" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-300" title="Web de Grow In Style" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/growinstyle-300x181.png" alt="Web de Grow In Style" width="300" height="181" /><p class="wp-caption-text">Web de Grow In Style</p></div>
<p>Tiene URLs &#8216;no amigables&#8217;  (unfriendly URL&#8217;s), ¿ Puede penalizarles eso en Google?</p>
<p>La imagen que vemos arriba tiene la URL:</p>
<p><strong>http://www.growinstyle.com/shop/item.aspx?itemid=129</strong></p>
<p>Si todo lo demás es bueno en la página no te preocupes mucho por las URLs. Si estas haciendo un sitio nuevo o no te supone mucho problema, cámbialo, pero no le des demasiada importancia, todos los motores de búsqueda trabajan bien con las URLs no amigables<em>. </em>Resumiendo, si puedes cambiarlas, es bueno, pero no debes preocuparte demasiado si no puedes.</p>
<h2>Web: Jim Dantona</h2>
<div id="attachment_312" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-312" title="Web de Jim Dantona" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/jimDantona-300x236.png" alt="Web de Jim Dantona" width="300" height="236" /><p class="wp-caption-text">Web de Jim Dantona</p></div>
<p>Hay que tener cuidado que nuestros propios links estén bien organizados. A veces partes de nuestra web apuntan a contenido que tenemos en otro dominio, o tenemos contenido muy similar en dos páginas diferentes. Conviene evitar esto porque el page rank que conseguimos se divide en diferentes páginas o diferentes dominios. Es mejor tenerlo todo bajo el mismo dominio y que todas tus páginas sumen.</p>
<p>El título de la página es excelente:</p>
<p><strong>Jim Dantona | Ventura County Clerk Recorder| Primary Election | Vote June 8th 2010</strong></p>
<p>Es informativo, no contiene spam y tiene terminos que es facil que la gente interesada en las elecciones busque: Vote June 8th 2010,  Primary Election, etc.</p>
<p>No es el caso de este sitio, pero hay veces que los autores quieren tomar un atajo para conseguir links a sus webs y en vez de tener contenido de calidad y esperar a que la gente les enlace, deciden compran links. Esto en general no es una buena idea porque los links suelen venir de páginas de muy mala calidad que no van a aportar visitas y Google puede incluso penalizar.</p>
<p>Nada más por hoy, si tienes más curiosidad puedes ver la charla original, en ingles: <a href="http://www.youtube.com/watch?v=7Hk5uVv8JpM">SEO Site advice form the experts</a></p>
<p>Puedes dejarnos algún comentario con tus impresiones</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/11/consejos-seo-desde-google/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS Float: Tutorial Visual (I)</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-i/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-i/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 20:06:40 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[float]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=176</guid>
		<description><![CDATA[Float es una propiedad CSS que define un tipo de posicionamiento de los elementos de una página web. En el estándar se definen tres esquemas de posicionamiento para presentar elementos: Normal.  (y aquí se incluye también el posicionamiento relativo). Absoluto. Flotante. El flotante es, quizá, el menos intuitivo de los tres y el que presenta [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-272" title="Tutorial Visual de Floats I" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/floatInicial.png" alt="Tutorial Visual de Floats I" width="115" height="115" />Float es una propiedad CSS que define un tipo de posicionamiento de los elementos de una página web. En el estándar se definen tres esquemas de posicionamiento para presentar elementos:</p>
<ol style="clear: left;">
<li> <strong>Normal</strong>.  (y aquí se incluye también el posicionamiento <em>relativo</em>).</li>
<li><strong>Absoluto</strong>.</li>
<li><strong>Flotante</strong>.</li>
</ol>
<p>El flotante es, quizá, el menos intuitivo de los tres y el que presenta particularidades más &#8216;extrañas&#8217; que intentaremos aclarar completamente en esta serie de dos tutoriales.<span id="more-176"></span></p>
<h2>Conceptos Básicos</h2>
<p>Para que un elemento flote utilizamos la propiedad <em>float</em> que puede tener los siguientes valores:</p>
<ul>
<li><strong>left</strong> &#8211; Flota a la izquierda</li>
<li><strong>right</strong> &#8211; Flota a la derecha</li>
<li><strong>none</strong> &#8211; No flota, valor por defecto</li>
<li><strong>inherit</strong> &#8211; Hereda el valor del padre. No se utiliza porque en IE no funciona</li>
</ul>
<p>Como vemos, un elemento no puede ser simplemente <em>flotante</em>, tiene que ser <strong>flotante a la derecha</strong> o <strong>flotante a la izquierda</strong>:</p>
<pre class="brush: css; title: ;">
#elemento1 {
    float: right;
}
#elemento2 {
    float: left;
}
</pre>
<p>Que un elemento flote significa que intentará siempre desplazarse a la izquierda o a la derecha sobre la línea actual hasta chocar con el borde de su caja contenedora o de otro elemento flotante. Sólo otro elemento <em>float</em> puede interponerse entre él y el borde del contenedor. Veremos muchos ejemplos en los próximos apartados para entender todas las implicaciones de este comportamiento.</p>
<p>Hay cuatro reglas importantes que debemos tener en cuenta. Conociéndolas podremos siempre predecir dónde quedará un elemento si lo flotamos:</p>
<div id="attachment_217" class="wp-caption aligncenter" style="width: 588px"><img class="size-full wp-image-217" title="Reglas de oro de los float" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/reglasFloat.png" alt="Reglas de oro de los float" width="578" height="360" /><p class="wp-caption-text">Las 4 reglas de oro de los float</p></div>
<p>Veremos también que este comportamiento se puede modificar con propiedades como <em>clear</em> o <em>overflow</em>.</p>
<h2>Flotando Bloques</h2>
<p>Vamos a empezar viendo cómo se comportan los elementos de bloque (<em>divs</em> en este ejemplo) cuando los flotamos. Trabajaremos con un documento con tres <em>divs</em>, cada uno con un fondo de color diferente.</p>
<p>En el HTML simplemente hemos declarado el título y tres <em>divs</em> vacíos dentro de un <em>div</em> (<em>#wrapper</em>) que los envuelve a todos:</p>
<pre class="brush: xml; title: ;">
	&lt;div id=&quot;wrapper&quot;&gt;
		&lt;h1&gt;Sólo Bloques (Divs)&lt;/h1&gt;
		&lt;div id=&quot;verde&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;naranja&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;azul&quot;&gt;&lt;/div&gt;
	&lt;/div&gt;
</pre>
<p>Y  en la hoja de estilos CSS les hemos puesto un borde punteado, altura, anchura y un color de fondo diferente para cada uno:</p>
<pre class="brush: css; title: ;">
		div#verde, div#naranja, div#azul {
			width: 130px;
			height:130px;
			border:1px dotted black;
		}
		div#verde {
			background-image: url(./images/verde.png);
		}
		div#naranja {
			background-image: url(./images/naranja.png);
		}
		div#azul {
			background-image: url(./images/azul.png);
		}
</pre>
<p>La página se verá así en pantalla:</p>
<div id="attachment_191" class="wp-caption aligncenter" style="width: 546px"><img class="size-full wp-image-191" title="Tres Divs sin float" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/3bloquesSinFloat.png" alt="Tres Divs sin float" width="536" height="514" /><p class="wp-caption-text">Tres bloques (div) sin float</p></div>
<p>Si asignamos <strong>float:right</strong> al bloque naranja se desplazará a la derecha y saldrá del flujo de elementos de la página para los otros elementos de bloque, que ocuparan su lugar como si no existiera:</p>
<div id="attachment_193" class="wp-caption aligncenter" style="width: 554px"><img class="size-full wp-image-193" title="Div naranja float:right" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bloqueAmarilloFloatRight.png" alt="Div naranja float:right" width="544" height="387" /><p class="wp-caption-text">Div naranja float:right</p></div>
<p>¿Y si lo flotamos hacia la izquierda?</p>
<div id="attachment_194" class="wp-caption aligncenter" style="width: 549px"><img class="size-full wp-image-194" title="div naranja float:left" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/divNaranjaFloatLeftNota.png" alt="div naranja float:left" width="539" height="379" /><p class="wp-caption-text">div naranja float:left</p></div>
<p>¿Qué ha pasado? Lo mismo que antes, el bloque flotante (naranja) sale del flujo de elementos de la página, los bloques que están debajo ocupan su lugar como si no existiera (el azul sube). El naranja se coloca en su línea hacia la izquierda hasta el borde del contenedor tapando el bloque azul.</p>
<blockquote><p>Para los elementos de bloque, las cajas flotadas están fuera del flujo de elementos de la página, no ocupan espacio</p></blockquote>
<p>¿Y si flotamos también el bloque azul?¿qué ocurrirá?</p>
<div id="attachment_195" class="wp-caption aligncenter" style="width: 556px"><img class="size-full wp-image-195" title="Bloque naranja y azul con float:left" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/naranjaYAzulFloat.png" alt="Bloque naranja y azul con float:left" width="546" height="391" /><p class="wp-caption-text">Bloque naranja y azul con float:left</p></div>
<p>Como siempre, los bloques que están por encima no se ven afectados, el título (h1) y el bloque verde siguen en su sitio, pero por debajo nos llama la atención que el bloque contenedor (<em>#wrapper</em>) se ha encogido dejando fuera los dos bloques con <em>float:left</em>. La razón es sencilla, para los elementos de bloque (como el <em>div</em> contenedor, con borde negro en la imagen), los elementos flotantes no ocupan espacio en la página, por lo tanto no los tiene en cuenta. Veremos esto en detalle mas adelante y veremos también varias formas de evitarlo.</p>
<p>Para saber en que orden quedan los bloques es importante saber cómo están declarados en el código HTML. En este caso el naranja está primero, flota hacia la izquierda y sále del flujo de elementos, por lo que el azul sube a su misma línea, después éste también flota hacia la izquierda por lo que se intentará colocar al lado del borde o de otros elementos flotantes anteriores. En este caso le toca detrás del naranja.</p>
<p>Si flotamos también el verde el resultado es:</p>
<div id="attachment_196" class="wp-caption aligncenter" style="width: 546px"><img class="size-full wp-image-196" title="Los tres bloques flotados" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/3bloquesFloat.png" alt="Los tres bloques flotados" width="536" height="250" /><p class="wp-caption-text">Los tres bloques float:left</p></div>
<p>¿Y si flotamos también el título, al fin y al cabo es otro elemento de bloque (h1)?</p>
<div id="attachment_198" class="wp-caption aligncenter" style="width: 555px"><img class="size-full wp-image-198" title="Todos los elementos float:left" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/todoFloatLeft.png" alt="Todos los elementos float:left" width="545" height="297" /><p class="wp-caption-text">Todos los elementos float:left</p></div>
<p>Como el título es el primer elemento, flota en su línea a la izquierda, los demás elementos van subiendo y flotando en su misma línea detrás de él. Cuando no hay sitio en la misma línea se desplazan a la siguiente, donde hay hueco para seguir colocándose. Y mientras tanto, el <em>div</em> contenedor a lo suyo, encogiendo hasta casi desaparecer.</p>
<p>Cuando un elemento fotado cambia de línea por falta de espacio, es muy importante tener en cuenta la altura de las <a href="http://www.librosweb.es/css/capitulo4.html">cajas</a> de cada uno, porque <strong>el elemento se quedará donde tenga un hueco</strong> y puede quedar colocado de forma extraña:</p>
<div id="attachment_226" class="wp-caption aligncenter" style="width: 553px"><img class="size-full wp-image-226" title="Ejemplo de bloques descolocados" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bloques-descolocados.png" alt="Ejemplo de bloques descolocados" width="543" height="316" /><p class="wp-caption-text">Ejemplo de bloques descolocados. Los tres bloques son flotantes a la izquierda</p></div>
<p>El bloque azul ha quedado &#8216;enganchado&#8217; en el verde porque es unos pixels más alto que el naranja. Al cambiar de línea quedará en el primer lugar que quepa, tocando al bloque de arriba. En este caso el problema se ve muy claro, pero cuando no tenemos fondos de color y un borde marcado, los elementos quedan descuadrados y el problema no se ve fácilmente.</p>
<p>La siguiente situación es parecida pero ahora el bloque azul es más ancho que la distancia que queda entre el verde y el borde del contenedor, como no cabe debajo del naranja, se irá hasta el extremo:</p>
<div id="attachment_227" class="wp-caption aligncenter" style="width: 553px"><img class="size-full wp-image-227" title="Bloques desordenados" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/desordenados2.png" alt="Bloques desordenados" width="543" height="306" /><p class="wp-caption-text">Ejemplo de bloques desordenados. Todos los bloques con float:left</p></div>
<h2>Elementos de Línea. Imágenes y Texto</h2>
<p>Las líneas de texto, y cualquier elemento de línea en general (span, em, strong, etc), adaptarán su longitud al colocarse al lado de un elemento flotante, para dejarle hueco.</p>
<p>Vamos a empezar viendo como se comportan las imágenes, que actúan como elementos de línea aunque en realidad son una mezcla, <em>inline-block</em>, porque fluyen en la línea pero tienen altura y anchura definible con <em>width</em> y <em>height</em>.</p>
<p>Veamos un documento con tres imágenes:</p>
<div id="attachment_185" class="wp-caption aligncenter" style="width: 540px"><img class="size-full wp-image-185" title="3 Imágenes sin flotar" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/float5.png" alt="3 Imágenes sin flotar" width="530" height="243" /><p class="wp-caption-text">Ningún elemento flotante</p></div>
<p>¿Qué ocurrirá si flotamos el pez azul hacia la izquierda?</p>
<pre class="brush: css; title: ;">
img#pezAzul {
    float:left;
}
</pre>
<p>El pez azul se desplazará alegremente en su línea hacia la izquierda hasta el borde del contenedor (o hasta chocar con otro elemento flotante, pero en este caso no hay ninguno) y los otros elementos de línea (las otras dos imágenes), al estar al lado de un float, le harán hueco:</p>
<div id="attachment_186" class="wp-caption aligncenter" style="width: 541px"><img class="size-full wp-image-186" title="imagen float:left" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/azulFloatLeft.png" alt="imagen con float:left" width="531" height="244" /><p class="wp-caption-text">El pez azul con float:left</p></div>
<p>Si lo flotamos a la derecha:</p>
<div id="attachment_187" class="wp-caption aligncenter" style="width: 543px"><img class="size-full wp-image-187" title="Imagen flotada a la derecha" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/azulFloatRight.png" alt="Imagen flotada a la derecha" width="533" height="245" /><p class="wp-caption-text">Pez azul con float:right</p></div>
<p>La imagen se desplaza a la derecha hasta el borde y los otros elementos le dejan hueco.</p>
<p>¿Y si las imágenes estuvieran dentro de bloques, en un <em>div</em>?. Como siempre, para saber cómo van a quedar los elementos es importante saber en que orden están declarados en el código. Declaramos primero un título, luego la imagen del pez, y luego un <em>div</em> con borde rojo que contiene dos imágenes, la mariquita y el smiley:</p>
<pre class="brush: css; title: ;">
	&lt;h1&gt;Imágenes en Divs&lt;/h1&gt;
	&lt;img src=&quot;images/fish1.png&quot;&gt;
	&lt;div class=&quot;bordeRojo&quot;&gt;
		&lt;img src=&quot;images/bug.png&quot;&gt;
		&lt;img src=&quot;images/smile.png&quot;&gt;
	&lt;/div&gt;
</pre>
<div id="attachment_230" class="wp-caption aligncenter" style="width: 552px"><img class="size-full wp-image-230" title="Imágenes en divs" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/imgsEnBloqueCleared.png" alt="Imágenes en divs" width="542" height="385" /><p class="wp-caption-text">Las dos imágenes de abajo están contenidas en un div</p></div>
<p>Si ahora flotamos la imagen del pez hacia la izquierda:</p>
<div id="attachment_231" class="wp-caption aligncenter" style="width: 554px"><img class="size-full wp-image-231" title="Ejemplo con Imágenes en bloque" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bloqueConImgsFlotado.png" alt="Ejemplo con Imágenes en bloque" width="544" height="257" /><p class="wp-caption-text">Pez azul con float:left</p></div>
<p>Lo que ocurre es lo siguiente:</p>
<ol>
<li>La imagen sále del flujo normal de elementos de la página por lo que no ocupa espacio (para los elementos de bloque)</li>
<li>El bloque de abajo (con borde rojo) sube para ocupar su espacio</li>
<li>Los elementos de línea (las 2 imágenes) se encuentran ahora al lado de un float y se desplazan para hacerle hueco</li>
</ol>
<p>Este comportamiento se ve mucho más claro con las líneas de texto, que también son elementos de línea (faltaría mas) y normalmente están contenidas dentro de un párrafo (<em>&lt;p&gt;&#8230;&lt;/p&gt;</em>) que es un elemento de bloque.</p>
<p>En el siguiente ejemplo tenemos un documento con un título, una imagen y un párrafo:</p>
<div id="attachment_180" class="wp-caption aligncenter" style="width: 549px"><img class="size-full wp-image-180" title="Texto e Imagen, sin float" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/float1.png" alt="Texto e Imagen, sin float" width="539" height="433" /><p class="wp-caption-text">Sin floats</p></div>
<p>Si flotamos la imagen a la izquierda el bloque de texto subirá como si la imagen no existiera. Las líneas quedan ahora al lado de un <em>float</em> y se acortarán para <em>fluir</em> por el lado de la imagen:</p>
<div id="attachment_182" class="wp-caption aligncenter" style="width: 543px"><a href="http://www.quimeraazul.com/tutoriales/wp-content/uploads/float2.png"><img class="size-full wp-image-182" title="Imagen con float:left" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/float2.png" alt="Imagen con float:left" width="533" height="316" /></a><p class="wp-caption-text">Imagen con float:left</p></div>
<p>Si la flotamos a la derecha:</p>
<div id="attachment_183" class="wp-caption aligncenter" style="width: 539px"><img class="size-full wp-image-183" title="Imagen con float:right" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/float3.png" alt="Imagen con float:right" width="529" height="319" /><p class="wp-caption-text">Imagen con float:right</p></div>
<h2>Terminando por hoy &#8230;</h2>
<p>Aqui vamos a terminar la primera entrega de este tutorial, en la segunda parte veremos:</p>
<ul>
<li>Un amplísimo apartado sobre el uso de la propiedad <em>clear</em>, con numerosos ejemplos para ver cómo afecta a elementos de bloque y de línea, dependiendo de si son flotantes o no y cómo podemos utilizarlo para controlar la disposición de los elementos.</li>
<li>Porqué se produce el &#8216;problema&#8217; del contenedor, que se encoge hasta desaparecer cuando contiene elementos flotantes. Veremos que esto no es un error, sino una decisión de diseño, sabremos el porqué y varias formas diferentes de evitarlo.</li>
<li>Cómo utilizar los <em>floats</em> para diseñar la estructura de una página.</li>
</ul>
<p>Hasta el próximo tutorial! Deja tus comentarios si te ha gustado o si tienes alguna sugerencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/11/css-float-tutorial-visual-i/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Personalización Básica de una tienda en Magento</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/10/personalizacion-basica-de-una-tienda-en-magento/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/10/personalizacion-basica-de-una-tienda-en-magento/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 13:03:10 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=139</guid>
		<description><![CDATA[En este tutorial nos vamos a centrar en personalizar la apariencia de una tienda de la forma más sencilla posible. Vamos a aprovechar que Magento tiene un excelente diseño en su tema por defecto y veremos como podemos darle un aspecto personalizado con cuatro pequeños cambios. ¿Qué vamos a hacer? Vamos a crear una tienda [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-141" title="Personalizar temas de Magento" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/inicioSmall.png" alt="Personalizar temas de Magento" width="120" height="100" />En este tutorial nos vamos a centrar en personalizar la apariencia de una tienda de la forma más sencilla posible. Vamos a aprovechar que Magento tiene un excelente diseño en su tema por defecto y veremos como podemos darle un aspecto personalizado con cuatro pequeños cambios.<span id="more-139"></span></p>
<h2>¿Qué vamos a hacer?</h2>
<p>Vamos a crear una tienda de libros que se llamará <strong>Rosa de Papel</strong>. Partiremos del tema por defecto y veremos como hacer unos cambios sencillos para personalizar mínimamente la tienda.</p>
<p>El aspecto que presenta una tienda Magento por defecto es este:</p>
<p><img class="aligncenter size-full wp-image-142" title="Tema por defecto" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/temaPorDefectoSmall.png" alt="Tema por defecto" width="400" height="253" /></p>
<p>Las categorías, banners y productos que ves debajo de la cabecera son solo datos de relleno que hemos cargado para que la tienda no aparezca completamente vacía. Estos datos de muestra pueden descargarse en un fichero comprimido de la página de Magento y cargarse en la base de datos, pero no son necesarios en absoluto.</p>
<p>El tema por defecto es elegante y está bien diseñado, vamos a cambiar sólo la cabecera para adaptarlo a nuestro negocio. Este es el logo que tenemos:</p>
<p><img class="aligncenter size-full wp-image-143" title="Logo de Rosa de Papel" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/logoRosaPapel.jpg" alt="Logo de Rosa de Papel" width="376" height="126" /><br />
Lo mejor, si queremos tener más flexibilidad a la hora de utilizarlo con cualquier fondo, es tener una versión del logo con fondo transparente (fichero gif o png). De todas formas esto no es imprescindible para seguir este tutorial.</p>
<h2>¿Dónde haremos nuestros cambios?</h2>
<p>Los ficheros y carpetas del tema &#8216;<strong>default</strong>&#8216; se encuentran repartidos en estos dos directorios:</p>
<pre><strong>magento/app/design/frontend/default/default</strong> (plantillas y layouts si el tema los requiere)

<strong>magento/skin/frontend/default/default</strong>  (imágenes, css y javascript)</pre>
<p>El primer &#8216;<strong>default</strong>&#8216; es el nombre del paquete y el segundo el nombre del tema. Un paquete (<em>package</em>) es una forma de agrupar temas relacionados, o más exactamente, variaciones de un mismo tema.</p>
<p>Cuando creemos un tema más complejo utilizaremos nuestra propia carpeta de paquete, pero como lo que vamos a hacer es realmente una pequeña variación sobre el original, vamos a colocar nuestro tema dentro del paquete &#8216;<strong>default</strong>&#8216;. Nuestros ficheros estarán en:</p>
<pre><strong>magento/app/design/frontend/default/rosa_de_papel</strong>

<strong>magento/skin/frontend/default/rosa_de_papel</strong></pre>
<p>Esto nos permite aprovechar la jerarquía de temas de Magento para colocar en nuestras carpetas sólo 4 ficheros con los cambios sobre el original. Magento buscará el resto de ficheros siguiendo esta jerarquía:</p>
<p><strong>default/rosa_de_papel → default/default → base/default</strong></p>
<p>El segundo eslabón de esta cadena es siempre el tema <strong>&#8216;default&#8217;</strong> del paquete en el que estemos.</p>
<p>Haciendo nuestros cambios de esta forma contaremos con las actualizaciones que el equipo de Magento haga para mejorar el tema y tendremos nuestras modificaciones separadas y fáciles de localizar.</p>
<p>Nunca debemos hacer nuestros cambios en el tema &#8216;<strong>default</strong>&#8216; directamente, porque si hacemos alguna actualización, todos nuestros cambios se perderán y tendremos que volver a hacerlos.</p>
<h2>Lo más básico, cambiar el logo</h2>
<p>El cambio del logo es lo más sencillo que podemos hacer para personalizar nuestra tienda. Es un paso imprescindible incluso cuando contemos con un tema que no necesita ninguna modificación. El nombre de nuestro negocio es lo mínimo que tendremos que incluir.</p>
<p>Al ser un cambio tan necesario, se puede hacer directamente desde el interface de administración de Magento.</p>
<p>Vamos a colocar la imagen con el logo con fondo transparente en el directorio de nuestro tema. La imagen iría en:</p>
<pre><strong>magento/skin/frontend/default/rosa_de_papel/images/rosaDePapelLogo.png </strong></pre>
<p>Ahora tenemos que decirle a Magento que utilice nuestro nuevo tema y luego decirle cómo se llama la imagen que utilizamos como logo.</p>
<p>Para cambiar el tema, entramos en el panel de administración de Magento, en <strong>Sistema/Configuración</strong>. Seleccionamos <em>Diseño</em> en el menú de la izquierda y abrimos el apartado <em>Temas</em>.</p>
<p>En el desplegable que aparece en la esquina superior izquierda, seleccionamos &#8216;<em>configuración por defecto</em>&#8216; y, en la pantalla central, como tema &#8216;<em>por defecto</em>&#8216; ponemos el nuestro &#8216;rosa_de_papel&#8217; (el nombre del directorio con nuestro tema).<br />
<img class="aligncenter size-full wp-image-146" title="Configurar tema" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/configurarTemaSmall.png" alt="Configurar tema" width="500" height="297" /></p>
<p>Y pulsamos el botón &#8216;<em>guardar la configuración</em>&#8216; que aparece en la parte superior derecha.</p>
<p>No vamos a ver ningún cambio porque nuestro tema sólo tiene la imagen del logo y todavía no le hemos dicho a Magento cómo se llama (si la hemos llamado logo.gif entonces sí la cogerá sin que sea necesario indicarselo, porque es la que busca por defecto).</p>
<p>Para indicar cual es el logo, en la misma pantalla de configuración anterior (<strong>Sistema/Configuracion</strong> → Diseño). Seleccionamos &#8216;<strong>Cabecera</strong>&#8216; y en la entrada de texto que pone &#8216;<em>Logo Image src</em>&#8216; ponemos nuestra imagen: <strong>images/rosaDePapelLogo.png</strong></p>
<p><img class="aligncenter size-full wp-image-147" title="Cambiar logo" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/enterLogoImageSmall.png" alt="Cambiar logo" width="600" height="337" /></p>
<p>En esta misma pantalla también puedes cambiar el &#8216;Welcome Text&#8217; para poner cualquier mensaje de bienvenida que quieras para tu tienda. Este mensaje aparece en la cabecera, en la parte derecha. Si no lo cambias puedes verlo con el mensaje &#8216;Default welcome msg!&#8217;.</p>
<p>No olvides pulsar el botón &#8216;<strong>guardar la configuración</strong>&#8216; para salvar tus cambios.</p>
<p>El logo original del tema por defecto mide 167 x 47 pixels. Si hacemos nuestro logo del mismo tamaño o de un tamaño muy similar no tendremos ningún problema:</p>
<p><img class="aligncenter size-full wp-image-148" title="Logo OK" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/logoPequenoSmall.png" alt="Logo OK" width="600" height="274" /></p>
<p>Pero queda un poco pequeño y queremos darle mucha mas visibilidad a nuestra marca. Nuestro logo mide 340 x 100 px. Al colocarlo vemos que la cabecera queda un poco ancha:</p>
<p><img class="aligncenter size-full wp-image-149" title="Logo grande" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/soloLogoCambiadoSmall.png" alt="Logo grande" width="600" height="343" /></p>
<p>El problema es que el <em>div</em> que contiene todos los elementos de la derecha es muy ancho (600px). Cuando el logo es un poco más ancho que el que tenía por defecto, este <em>div</em> no cabe a la derecha y queda por debajo:</p>
<p><img class="aligncenter size-full wp-image-165" title="Logo descolocado" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/logoFloatsSePisanSmall1.png" alt="Logo descolocado" width="400" height="103" /></p>
<p>La solución es muy sencilla, sólo tenemos que cambiar en la hoja de estilos el ancho de la caja que contiene los links y enlaces de la derecha para que sea más corta y no quede &#8216;enganchada&#8217; debajo de nuestro logo.</p>
<h2>Cambiando la hoja de estilos</h2>
<p>Para saber exactamente lo que cambiamos y no tener que andar tocando lineas en el fichero original, vamos a crear nuestra propia hoja de estilos y hacer que se incluya junto con las hojas de estilos que tiene el tema por defecto. Para esto tendremos que crear dos ficheros:</p>
<pre><strong>magento/app/design/frontend/default/rosa_de_papel/layout/local.xml</strong> (sólo para indicar a  Magento que coja nuestra hoja de estilos)

<strong>magento/skin/frontend/default/rosa_de_papel/css/local.css</strong> (nuestra hoja de estilos)</pre>
<p><strong>local.xml</strong> debe contener sólo las siguientes líneas:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
      &lt;layout&gt;
          &lt;default&gt;
              &lt;!-- add the local stylesheet --&gt;
              &lt;reference name="head"&gt;
                  &lt;action method="addCss"&gt;&lt;stylesheet&gt;css/local.css&lt;/stylesheet&gt;&lt;/action&gt;
              &lt;/reference&gt;
          &lt;/default&gt;
      &lt;/layout&gt;</pre>
<p>La línea <strong>&lt;action method=&#8221;addCss&#8221;&gt;&lt;stylesheet&gt;css/local.css&lt;/stylesheet&gt;&lt;/action&gt;</strong> es la que indica el fichero .css que debe cargarse.</p>
<p>Ahora podemos volver al problema que queríamos solucionar: la anchura del <em>div</em> con los enlaces de la derecha de la cabecera. Esta anchura está definida originalmente en los estilos del tema que estamos tomando como base (&#8216;default&#8217;):</p>
<p><strong>magento/skin/frontend/default/default/css/styles.css</strong></p>
<p>sobre la línea 494 de la siguiente forma:</p>
<pre>.header .quick-access { float:right; width:600px; padding:28px 10px 0 0; }</pre>
<p>Lo único que queremos cambiar es la anchura, que vamos a pasar de 600px a 400px, así que en nuestro fichero <strong>local.css</strong> sólo tenemos que incluir:</p>
<pre>.header .quick-access {width:600px;}</pre>
<p>Y el resultado es:</p>
<p><img class="aligncenter size-full wp-image-151" title="Logo colocado" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/logoGrandeColocadoSmall.png" alt="Logo colocado" width="600" height="297" /></p>
<p>Perfecto!. Justo lo que queríamos.</p>
<p>Estos cambios tan sencillos pueden ser suficiente para muchas tiendas. Podemos utilizar el tema por defecto u otro que nos guste, pero siempre tendremos que añadir nuestro logo para tener la tienda mínimamente personalizada.</p>
<p>Para diferenciarnos un poquito más de la instalación por defecto vamos a cambiar también el color de fondo de la cabecera.</p>
<h2>Cambiando el fondo de la cabecera</h2>
<p>Teníamos pensado nuestro logo sobre un fondo marrón y queremos que nuestra tienda tenga esos colores. Podemos cambiarlo con un par de líneas en el fichero css y una imagen que pondremos como fondo.</p>
<p>Como siempre, vamos a buscar primero como está definido el fondo de la cabecera en el tema <strong>default</strong>. En su hoja de estilos, sobre la línea 482 tenemos:</p>
<pre>.header-container { border-top:5px solid #0d2131; border-bottom:1px solid #415966; background:url(../images/bkg_header.jpg) 50% 0 repeat; }</pre>
<p>El fondo de la cabecera original es esta imagen:</p>
<p><strong>magento/skin/frontend/default/default/images/bkg_header.jpg</strong></p>
<p><img class="aligncenter size-full wp-image-166" title="header original" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bkg_headerSmall1.jpg" alt="header original" width="400" height="30" /></p>
<p>Podemos copiarla y editarla con cualquier programa de edición gráfica para pintarla como queramos o podemos crear una imagen desde cero. El tamaño del original es 2000 x 150 pixels. La imagen final debemos colocarla en:</p>
<p><strong>magento/skin/frontend/default/rosa_de_papel/images/bkg_header.jpg</strong></p>
<p><img class="aligncenter size-full wp-image-167" title="Nuevo header" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/bkg_header4Small1.jpg" alt="Nuevo header" width="400" height="30" /></p>
<p>Para nuestro diseño hemos utilizado varios tonos marrones y hemos conservado las dos sombras laterales que marcan el ancho de la tienda, pero puedes hacerlo tan sencillo o tan complicado como quieras.</p>
<p>Hay que tener en cuenta que si tenemos un logo muy alto esta imagen de fondo tendrá que repetirse verticalmente. Si prevés que esto puede ocurrir, tienes que hacer un diseño del fondo que quede bien al repetirse, como el original, con líneas horizontales, o con colores planos. En nuestro caso, el logo mide sólo 100 pixels de alto y el fondo no necesitará repetirse.</p>
<p>Para que coja nuestra imagen tendremos que copiar la línea que vimos antes en nuestra hoja de estilos (magento/skin/frontend/default/rosa_de_papel/css/local.css):</p>
<pre>.header-container { border-top:5px solid #0d2131; border-bottom:1px solid #415966; background:url(../images/bkg_header.jpg) 50% 0 repeat; }</pre>
<p>Realmente sólo necesitariamos incluir la parte de &#8216;background&#8217; para que machaque la información de la línea original, pero la copiamos entera porque más adelante cambiaremos algún otro detalle. El resultado es:</p>
<p><img class="aligncenter size-full wp-image-157" title="Cambiar caja de búsqueda" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/cambiarCajaBusquedaSmall.png" alt="Cambiar caja de búsqueda" width="600" height="268" /></p>
<p>Como podemos ver en la imagen, todavía nos quedan algunos detalles por cambiar para que el resultado sea aceptable. La caja de búsqueda en la parte superior todavía tiene una imagen azul de fondo y la zona con el menú de categorías también.</p>
<p>Como en este tutorial queremos hacer lo más sencillo posible, simplemente vamos a eliminar la imagen de fondo de la caja de búsqueda (utilizando nuestra hoja de estilos).</p>
<p>Sobre la línea 490 de la hoja de estilos original ( magento/skin/frontend/default/default/css/styles.css ) encontramos la línea que define el fondo y el estilo general del formulario de búsqueda:</p>
<pre>
.header .form-search { position:absolute; top:0; right:29px; width:315px; height:30px; background:url(../images/bkg_form-search.gif) 0 0 no-repeat; padding:1px 0 0 16px; }</pre>
<p>Lo único que queremos cambiar es el fondo (<em>background</em>) por lo que en nuestro fichero <strong>local.css</strong> ponemos:</p>
<pre>.header .form-search { background: none;}</pre>
<p>Para cambiar la barra de color azul oscuro en la que aparecen las categorías podríamos hacer como antes, copiar y editar la imagen que tenemos por defecto:</p>
<p><strong>magento/skin/frontend/default/default/images/bkg_nav0.jpg</strong></p>
<p>pero en este ejemplo vamos a cambiarlo por un color plano, sin imagen, que queda muy bien para los colores que hemos elegido. En el css del tema default encontramos que el fondo de esta barra de navegación se define en la siguiente línea (513 aproximadamente):</p>
<pre>.nav-container { background:#0a263d url(../images/bkg_nav0.jpg) 50% 0 repeat-y; }</pre>
<p>En nuestro fichero <strong>local.css</strong> quitamos la referencia a la imagen, dejando sólo el código del color que queramos:</p>
<pre>
.nav-container { background:#4A2D07; }
</pre>
<p><em>Nota: El código del color que quieras puedes obtenerlo, por ejemplo en esta web:<br />
<a href="http://www.colorpicker.com/">http://www.colorpicker.com/</a></em></p>
<p><img class="aligncenter size-full wp-image-162" title="Barra de navegación completa" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/barraNavOkFaltaLineaSmall.png" alt="Barra de navegación completa" width="400" height="150" /></p>
<p>Ya lo tenemos casi listo. Si nos fijamos bien en la imagen, queda una línea muy fina de color azul entre la cabecera y la barra de navegación con las categorías. Esto podemos cambiarlo directamente en una línea que ya tenemos en nuestro fichero <strong>local.css</strong>:</p>
<pre>.header-container { border-top:5px solid #0d2131; border-bottom:1px solid #415966; background:url(../images/bkg_header.jpg) 50% 0 repeat; }</pre>
<p>Esta línea, además de la imagen de fondo de la cabecera, está definiendo una línea superior de 5px con color #0d2131 y otra línea inferior de 1px con color #415966. Esa línea inferior es la que queremos modificar. Vamos a cambiarla a color negro, quedando:</p>
<pre>.header-container { border-top:5px solid #0d2131; border-bottom:1px solid #000000; background:url(../images/bkg_header.jpg) 50% 0 repeat; }</pre>
<p>El resultado final es:</p>
<p><img class="aligncenter size-full wp-image-163" title="Resultado final" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/resultadoFinalSmall.png" alt="Resultado final" width="400" height="201" /></p>
<p>Naturalmente podríamos seguir cambiando cosas, todavía nos quedan tonos azules, podríamos cambiar el pie de la tienda, etc, pero la idea de este tutorial es mostrar que con sólo 4 cambios muy básicos, sin ninguna complicación, podemos personalizar la tienda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/10/personalizacion-basica-de-una-tienda-en-magento/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>JavaScript Orientado a Objetos</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/10/javascript-orientado-a-objetos/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/10/javascript-orientado-a-objetos/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 11:19:04 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[oo javascript]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=64</guid>
		<description><![CDATA[JavaScript es un lenguaje orientado a objetos, pero es diferente de los lenguajes más populares como Java o C++. Basa su orientación a objetos en Prototipos (prototype-based) en lugar de Clases. Esta es la razón por la que presenta algunas particularidades que nos pueden resultar extrañas a la hora de utilizarlo. La diferencia más importante [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-94" title="JavaScript Orientado a Objetos" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/javascriptOOimgInicio.png" alt="JavaScript Orientado a Objetos" width="115" height="103" />JavaScript es un lenguaje orientado a objetos, pero es diferente de los  lenguajes más populares como Java o C++. Basa su orientación a objetos  en <em>Prototipos</em> (prototype-based) en lugar de <em>Clases</em>. Esta  es la razón por la que presenta algunas particularidades que nos pueden  resultar extrañas a la hora de utilizarlo.</p>
<p>La diferencia más importante de este tipo de lenguajes es que <strong>no  tienen clases</strong>, todo son  objetos. No existen clases pero existen  funciones constructoras que  pueden jugar un papel parecido en cuanto a  crear una &#8216;plantilla&#8217; para  instanciar objetos.<span id="more-64"></span></p>
<p>En JavaScript prácticamente todo son objetos, incluso las funciones:</p>
<pre class="brush: jscript; title: ;">
function sumar (a, b) {
    return a+b;
}
</pre>
<p>La función <em>sumar</em> es automáticamente un objeto, con sus métodos y sus propiedades, por ejemplo:</p>
<ul>
<li><em>sumar.length</em> contendrá el número de parámetros que acepta la función.</li>
<li><em>sumar.arguments</em> es un array que contendrá los argumentos que se hayan pasado a la función.</li>
<li><em>sumar.call()</em> es un método que permite definir un contexto de ejecución nuevo para la función.</li>
</ul>
<p>Estos son métodos y propiedades definidos por defecto, pero tambien podemos añadir algunos nuevos:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; sumar.nivel = "sencillo"</em></span></pre>
<p>No olvidemos que <em>sumar()</em> sigue siendo una función, si en una consola de JavaScript (recomiendo <a href="http://getfirebug.com/" target="_blank">Firebug</a>) llamamos a la función con dos parámetros nos dará la suma:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; sumar (3, 1)</em></span>
<strong>4</strong></pre>
<p>pero tambien podemos utilizar la propiedad &#8216;nivel&#8217; que acabamos de definir:</p>
<pre><span style="color: #0000ff;">&gt;&gt;&gt; sumar.nivel</span>
<strong>"sencillo"</strong></pre>
<p>Algunos programadores consideran que es un lenguaje <em>basado en objetos</em>, pero no <em>orientado a objetos</em>. Simplemente es una forma de evitar llamar <em>orientado a objetos</em> a un lenguaje que los maneja de una forma diferente a la que estamos acostumbrados.</p>
<blockquote><p>En JavaScript no existen las clases, todo son objetos</p></blockquote>
<h2>Creando Objetos</h2>
<p>La tarea de crear un objeto nuevo es increiblemente sencilla en JavaScript:</p>
<pre><em><span style="color: #0000ff;">&gt;&gt;&gt; var miObjeto = {}</span></em></pre>
<p>y ya tendriamos nuestro  objeto. Obviamente está vacío pero podemos añadirle todo lo que queramos después de crearlo:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; miObjeto.nombre = "Prueba"</em></span>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; miObjeto.metodo1 = function() {return "soy el objeto " + this.nombre}</em></span></pre>
<p>Ahora nuestro objeto tiene una propiedad y un método:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; miObjeto.nombre</em></span>
<strong>"Prueba"</strong>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; miObjeto.metodo1()</em></span>
<strong>"soy el objeto Prueba"</strong></pre>
<p><em>this.nombre</em> hace referencia a la variable <em>nombre</em> dentro del propio objeto.</p>
<p>También podíamos haber creado el objeto completo desde el principio:</p>
<pre class="brush: jscript; title: ;">

var miObjeto = {

    nombre: &quot;Prueba&quot;,
    metodo1: function () { return &quot;soy el objeto &quot; + this.nombre}
}
</pre>
<p>Y esto no impide que despues podamos añadir nuevos miembros a este objeto:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; miObjeto.metodo2 = function(parametro) {return "tengo un parámetro: " + parametro}</em></span>

<em><span style="color: #0000ff;">&gt;&gt;&gt; miObjeto.metodo2("Hola")</span></em>
<strong>"tengo un parámetro: Hola"</strong></pre>
<p>Esta forma rápida y sencilla de crear objetos se llama <em>notación literal</em>.</p>
<h2>Usando Constructores</h2>
<p>Tratándose de JavaScript podemos esperar que haya varias formas diferentes de hacer lo mismo, y en efecto, hay otra forma de crear objetos: usando una <strong>función constructora</strong>.</p>
<p>En realidad se trata de una función normal. Cualquier función en JavaScript puede utilizarse como constructor si la invocamos con el operador <em>new</em>, pero para que los objetos que creamos sean útiles, debemos hacer que tengan algún método o propiedad públicos, accesibles para los usuarios del objeto. Esto lo conseguimos añadiendo variables o funciones a <em>this</em> dentro de la función.</p>
<pre class="brush: jscript; title: ;">

function Calcular () {
    this.version = &quot;1&quot;;
    this.suma = function(a,b) { return a+b};
    this.multiplica = function (a,b) {return a*b};
}
</pre>
<p>Podemos utilizar Calcular como constructor para crear objetos capaces de sumar y de multiplicar dos números:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var calculadora = new Calcular()</em></span>

<em><span style="color: #0000ff;">&gt;&gt;&gt; calculadora.version</span></em>
<strong>"1"</strong>

<em><span style="color: #0000ff;">&gt;&gt;&gt; calculadora.suma(3,2)</span></em>
<strong>5</strong>

<em><span style="color: #0000ff;">&gt;&gt;&gt; calculadora.multiplica(3,2)</span></em>
<strong>6</strong></pre>
<p>El constructor nos sirve de &#8216;plantilla&#8217; para crear objetos similares, algo parecido a las clases en Java:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var calculadora2 = new Calcular();</em></span>

<em><span style="color: #0000ff;">&gt;&gt;&gt; var calculadora3 = new Calcular();</span></em></pre>
<p>En este caso los 3 objetos serían iguales. El constructor sería mucho más útil si le podemos pasar algún parámetro a la hora de crear el objeto para inicializarlo de la forma que necesitemos:</p>
<pre class="brush: jscript; title: ;">

function Mensajero (mensaje) {

    this.muestraMensaje = function () { return &quot;Atención: &quot; + mensaje}

}
</pre>
<p>Ahora podríamos crear varios objetos pasando un parámetro particular al constructor en cada caso:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var mensajero1 = new Mensajero ("Error gordo");</em></span>

<em><span style="color: #0000ff;">&gt;&gt;&gt; var mensajero2 = new Mensajero ("Bateria baja...");</span></em>

<em><span style="color: #0000ff;">&gt;&gt;&gt; mensajero1.muestraMensaje()</span></em>
<strong>"Atención: Error gordo"</strong>

<em><span style="color: #0000ff;">&gt;&gt;&gt; mensajero2.muestraMensaje()</span></em>
<strong>"Atención: Bateria baja..."</strong></pre>
<p>Hemos visto que añadiendo variables y funciones de la forma <em>this.variable</em> o <em>this.funcion</em> creamos propiedades y métodos públicos, accesibles para cualquiera que utilice el objeto, pero también podemos crear miembros privados. Cualquier variable que declaremos de la forma <em>var miVariable</em> será sólo visible dentro de la función (y dentro del objeto que se cree con ella).</p>
<p>Vamos a añadir al constructor Mensajero un método privado que comprueba si el mensaje está vacio y, si es asi, coloca uno por defecto:</p>
<pre class="brush: jscript; title: ;">

function Mensajero (mensaje) {

    //variable privada
    var defaultMsg = &quot;Sin novedad&quot;;

    //método privado
    var compruebaMsgPrivado = function () {
        if (!mensaje) mensaje = defaultMsg;
    }

    //método público
    this.muestraMensaje = function () {
        compruebaMsgPrivado();
        return &quot;Atención: &quot; + mensaje;
    }
}
</pre>
<p>Ahora tenemos una propiedad privada (defaultMsg) y un método privado (metodoPrivado) que sólamente pueden ser utilizados internamente por el objeto.</p>
<p>Si ahora construimos un objeto sin mensaje:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var mensajero1 = new Mensajero()</em></span></pre>
<p>El método privado se encargará de asignarle un mensaje por defecto:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt;mensajero1.muestraMensaje()</em></span>
<strong>"Atención: Sin novedad"</strong></pre>
<h2>¿Y que hay de la herencia?</h2>
<p>Como vimos en la introducción, JavaScript es un lenguaje cuya orientación a objetos se basa en prototipos (prototype).</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-92" title="Prototype es la pieza clave" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/piezaClave2.png" alt="Prototype es la pieza clave" width="523" height="336" /></p>
<p>Básicamente se trata de que en vez de tener una clase base de la que heredan los hijos, <strong>creamos un prototipo</strong>, que es un objeto que tiene métodos y propiedades que pueden necesitar otros objetos, y lo vinculamos ( asignándolo a la propiedad <em>prototype </em>) a esos objetos. Todos los objetos que tengan este prototipo habrán heredado todas sus propiedades y métodos y podrán usarlos como si fueran suyos.</p>
<p>Vamos a ver esto un poco más en detalle y con algunos ejemplos para entenderlo. Es muy importante tener en cuenta que <em>prototype</em> es una propiedad de las funciones (recuerda que las funciones también son objetos), no de los objetos en general. Por lo tanto un prototipo se asigna siempre a una función constructora y , si queremos acceder a él, por ejemplo para extenderlo, debemos hacerlo a través del constructor de nuestro objeto.</p>
<p><img class="aligncenter size-full wp-image-86" title="Caracteristicas de prototype" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/propiedadDeFunciones.png" alt="Caracteristicas de prototype" width="590" height="244" />Supongamos que estamos creando una aplicación que necesitará varios objetos para realizar calculos particulares. Podríamos crear un objeto <em>estadisticas</em> que haría unos cálculos estadísticos complejos, otro tipo de objeto se utilizara para calcular unos códigos de producto, etc. Todos estos objetos , además de sus funciones complejas particulares necesitarán unas funciones básicas comunes (sumar, restar, multiplicar, etc).</p>
<p>Podemos crear un prototipo con las funciones básicas que luego heredarán los otros objetos. Nuestro objeto prototipo será este, creado con notación literal por simplicidad:</p>
<pre class="brush: jscript; title: ;">
var calculosBasicos = {
    sumar: function (a,b) {return a+b},
    multiplicar: function(a,b) {return a*b}
}
</pre>
<p>Ahora creamos una función constructora para los objetos de estadísticas:</p>
<pre class="brush: jscript; title: ;">
function Estadisticas (departamento) {

    this.dimeElResponsable = function () {
        return 'Estadísticas para el departamento: ' + departamento ;
    }

    this.calculaEstadisticas = function () {
        return &quot; e = mc2 y mucho más&quot;;
    }

}
</pre>
<p>Y ahora realizamos la herencia, asignando como prototipo del constructor el objeto que hemos creado antes:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; Estadisticas.prototype = calculosBasicos</em></span></pre>
<p><strong>Nota:</strong> como hemos utilizado notación literal, directamente asignamos el objeto. Si hubiéramos creado un constructor , haríamos Estadisticas.prototype =  new CalculosBasicos para asignar el objeto</p>
<p>Ahora todos los objetos de estadisticas que creemos tendrán acceso a los cuatro métodos:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var estadisticasBiblioteca = new Estadisticas ("Libros")</em></span>

<span style="color: #0000ff;"><em>&gt;&gt;&gt;var estadisticasTienda = new Estadisticas ("Ventas")</em></span>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; estadisticasBiblioteca.dimeElResponsable()</em></span>
<strong>"Estadísticas para el departamento: Libros "</strong>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; estadisticasBiblioteca.multiplicar (2, 3)</em></span>
<strong>6</strong>

<span style="color: #0000ff;"><em>&gt;&gt;&gt;estadisticasTienda.dimeElResponsable()</em></span>
<strong>"Estadísticas para el departamento: Ventas "</strong>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; estadisticasTienda.multiplicar (2, 2)</em></span>
<strong>4</strong></pre>
<p>Igualmente podríamos crear ahora un constructor para otro tipo de objetos y asignarle el mismo prototipo para que disponga de las funciones básicas.</p>
<h2>Extendiendo el prototipo</h2>
<p>Todos los objetos tienen un prototipo vinculado, aunque por defecto será un objeto vacío {}. Podemos ir añadiéndole funciones poco a poco en vez de asignar un objeto completo como hicimos en el ejemplo anterior.</p>
<p>Si tenemos el siguiente constructor de futbolistas:</p>
<pre class="brush: jscript; title: ;">

function Futbolista (nombre) {

    this.habla = function () { return &quot;yo soy: &quot; + nombre}
    this.bicicleta = function () {return &quot;haciendo la bicicleta&quot;}

}
</pre>
<p>Esta función construirá futbolistas:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; var futbolista1 = new Futbolista ("Pichichi")</em></span>

<em><span style="color: #0000ff;">&gt;&gt;&gt; var futbolista2 = new Futbolista("Figura")</span></em></pre>
<p>Pero hay varias funciones básicas que tendrán todos los futbolistas y que podríamos poner en nuestro prototipo: correr y escupir. Todo futbolista que se precie tiene que correr y, cuando le enfoque alguna cámara,  escupir al suelo, si no nunca será nadie.</p>
<p>Podemos añadir ahora estas funciones al prototipo del constructor e inmediatamente estarán disponibles para los objetos instanciados, aunque hayan sido creados antes:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; Futbolista.prototype.correr = function () {return "run Forrest, run!"}</em></span>

<span style="color: #0000ff;"><em>&gt;&gt;&gt; Futbolista.prototype.escupir = function () { return "gargajo"}</em></span></pre>
<p>Todos los objetos creados anteriormente ya disponen de estos métodos:</p>
<pre><span style="color: #0000ff;"><em>&gt;&gt;&gt; futbolista1.correr()</em></span>
<strong>"run Forrest, run!"</strong></pre>
<p>Aunque hayamos asignado un objeto nuevo como prototipo inicialmente también podemos extenderlo después con nuevas funciones. Lo que no debemos hacer es asignar un objeto nuevo completo (en vez de extender el existente) después de crear objetos, en ese caso los objetos ya instanciados seguirán teniendo la referencia al viejo prototipo y los que se creen nuevos tendrán referencia al nuevo.</p>
<blockquote><p>No debemos asignar un objeto nuevo completo como prototipo (en vez de  extender el existente) después de crear objetos, en ese caso los objetos  ya instanciados seguirán teniendo la referencia al viejo prototipo y  los que se creen nuevos tendrán referencia al nuevo.</p></blockquote>
<p>Aquí terminamos esta introducción a la orientación a objetos de JavaScript. Si te ha gustado o no te ha gustado, por favor indícalo en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/10/javascript-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño en PHP5: Singleton</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/10/patrones-de-diseno-en-php5-singleton/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/10/patrones-de-diseno-en-php5-singleton/#comments</comments>
		<pubDate>Sat, 16 Oct 2010 10:53:43 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[patrones de diseño]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=43</guid>
		<description><![CDATA[El Singleton es uno de los patrones de diseño más sencillos de implementar. Quizá sea esto lo que ha llevado a que se utilice en muchos casos de forma inapropiada y a que actualmente su uso esté siendo bastante cuestionado. En este tutorial veremos en qué consiste y cuales son las razones para que algunos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-44" title="Patrón de diseño Singleton" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/singletonStart.png" alt="Patrón de diseño Singleton" width="115" height="129" /><br />
El Singleton es uno de los patrones de diseño más sencillos de implementar. Quizá sea esto lo que ha llevado a que se utilice en muchos casos de forma inapropiada y a que actualmente su uso esté siendo bastante cuestionado. En este tutorial veremos en qué consiste y cuales son las razones para que algunos desarrolladores consideren que es mejor no utilizarlo.<span id="more-43"></span></p>
<h2>Definición</h2>
<p>El patrón singleton se utiliza cuando necesitamos que exista <strong>una sola instancia</strong> de una clase determinada. Puesto que no podemos crear instancias nuevas (utilizando <em>new</em>), la clase debe proporcionar una forma de acceso global a la única instancia existente.</p>
<p>Las claves de su funcionamiento son las siguientes:</p>
<ul>
<li>El constructor de la clase no debe ser accesible, para que no se puedan crear instancias libremente. Lo hacemos privado.</li>
<li>La clase debe proveer un método público para devolver la instancia única de la clase a quien la pida..</li>
</ul>
<h2>Implementación</h2>
<p>El código básico para crear una clase que se ajuste al patrón que estamos tratando sería el siguiente:</p>
<pre class="brush: php; title: ;">
&lt;?php
class EjemploSingleton
{
    // variable para guardar la instancia cuando exista
    private static $instance;

    // hacemos el constructor privado
    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new EjemploSingleton();
        }

        return self::$instance;
    }

/*
.
.
métodos de la funcionalidad particular de la clase
.
.
*/

}

?&gt;
</pre>
<p>Tenemos una variable privada para almacenar la instancia única que existe de esta clase:</p>
<pre class="brush: php; title: ;">
private static $instance;
</pre>
<p>El constructor es privado para que no sea accesible por ninguna clase cliente:</p>
<pre class="brush: php; title: ;">
  private function __construct()
    {}
</pre>
<p>Y proporcionamos un método público para obtener la instancia:</p>
<pre class="brush: php; title: ;">
    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new EjemploSingleton();
        }

        return self::$instance;
    }
</pre>
<p>La función <em>getInstance()</em> es estática, es decir, es una función de la clase, no de ninguna instancia en particular. Es la única forma de implementar un método de este tipo porque:</p>
<ol>
<li>El método debe controlar el número de instancias de la clase que existen</li>
<li>Debemos poder acceder a él incluso cuando no haya instancias creadas de la clase (se encarga de crearla si no existe)</li>
</ol>
<p>Lo que hace <em>getInstance()</em> es sencillo. Primero comprueba si ya existe una instancia creada de la clase (comprobando $instance) y si no existe la crea, después devuelve $instance al objeto/cliente que lo solicitó.</p>
<p>Al ser el punto de acceso una función estática, debe utilizarse de la siguiente forma:</p>
<pre class="brush: php; title: ;">
$tengoElSingleton = ejemploSingleton::getInstance();
</pre>
<p>Ahora <em>$tengoElSingleton</em> contiene la instancia de la clase <em>ejemploSingleton</em> y podrá utilizar sus métodos y su funcionalidad.</p>
<h2>Afinando un poco más</h2>
<p>Con el código de arriba todavía no cerramos todas las puertas para que algún cliente obstinado pueda crear una instancia de nuestra clase. Podría utilizar el método <em>clone()</em> para obtener una cópia:</p>
<pre class="brush: php; title: ;">
$tengoElSingleton = ejemploSingleton::getInstance();
$tengoOtraInstancia = clone($tengoElSingleton);
</pre>
<p>Para evitar este problema sólo tenemos que hacer que la función __clone() no pueda utilizarse, por ejemplo, lanzando un error:</p>
<pre class="brush: php; title: ;">
    public function __clone()
    {
        trigger_error('Esta clase no puede clonarse', E_USER_ERROR);
    }
</pre>
<p>De una forma un poco más rebuscada podría conseguirse una copia utilizando las funciones serialize() y unserialize():</p>
<pre class="brush: php; title: ;">
$tengoElSingleton = ejemploSingleton::getInstance();
$objetoSerializado = serialize($tengoElSingleton);
$yaTengoLaCopia = unserialize($objetoSerializado);
</pre>
<p>Para evitar que esto pueda ocurrir anulamos el método __wakeup() que se utiliza al deserializar:</p>
<pre class="brush: php; title: ;">
    public function __wakeup()
    {
        trigger_error('Esta clase no puede deserializarse', E_USER_ERROR);
    }
</pre>
<h2>¿Para qué puedo usarlo?</h2>
<p>El ejemplo más clásico, que verás en cientos de tutoriales, pero que plantea algunas cuestiones, es una conexión a la base de datos de la aplicación, por ejemplo un objeto que llamaremos <strong>dbInterface()</strong>. Podemos pensar que la aplicación necesitará acceder muchas veces a la base de datos y desde muchas clases diferentes. Si creamos esta clase como un <em>singleton</em> nos aseguramos de que sólo habrá una conexión a la base de datos y esta será compartida por todos.</p>
<p>Es un buen ejemplo para entender las ventajas de este patrón, pero debemos asegurarnos de que realmente necesitamos que sólo exista una conexión a la BD antes de implementarlo de esta manera. El hecho de que el contexto de una aplicación web sea muy diferente del de una aplicación de escritorio, hace que no se utilice realmente el mismo objeto durante toda la &#8216;vida&#8217; de la aplicación ya que los objetos creados en PHP sólo permanecen mientras se sirve la página actual, para la siguiente petición tendrán que crearse de nuevo. En el siguiente apartado veremos esto más en detalle y volveremos sobre este ejemplo.</p>
<p>Además de esto, para aplicaciones muy grandes, limitarnos a una sola conexión con la base de datos puede ser un cuello de botella innecesario. Si prevemos que en el futuro podemos necesitar más conexiones es mejor no utilizar un <em>singleton</em>, <strong>puede haber otros patrones más apropiados, como <em>factory</em></strong>.</p>
<p>Otro ejemplo de uso es una clase de <em>logging</em>. Una clase que podemos llamar desde cualquier punto de la aplicación para enviar un mensaje a un fichero o a una consola. Puede utilizarse para estadísticas, mantenimiento, depuración, etc.</p>
<p>Una clase de configuración de la aplicación también puede implementarse utilizando este patrón. Aseguramos que el objeto con los datos de configuración es único y accesible globalmente desde cualquier punto.</p>
<h2>Particularidades del contexto web</h2>
<p>En aplicaciones instaladas, de escritorio, un singleton realmente asegura que se utiliza la misma instancia de la clase desde que arrancamos hasta que cerramos la aplicación. La conexión a la base de datos, por ejemplo, sería única y se haría una sola vez. En una aplicación web en PHP no es así. Todos los objetos y el entorno de la aplicación en el servidor se crean y se destruyen para cada petición HTTP. Para hacer una simplificación sencilla de entender, nuestro programa PHP sólo vive para servir una página (o una pequeña parte de una página para llamadas AJAX). Cuando el usuario haga otro click en el interface, todo se creará y se destruirá de nuevo. El singleton sólo nos asegura que existirá y se utilizará una única instancia mientras se sirve una petición HTTP concreta.</p>
<blockquote><p>Cuando el usuario haga otro click en el interface, todo se creará y se destruirá de nuevo. El singleton sólo nos asegura que existirá y se utilizará una única instancia mientras se sirve una petición HTTP concreta.</p></blockquote>
<p>Debemos pensar detenidamente si realmente necesitamos el patrón para nuestro diseño. En el ejemplo de <em>dbInterface()</em> sólo lo necesitamos si para servir alguna de nuestras peticiones hay varios objetos diferentes que acceden a la base de datos y <em>necesitamos</em> que sólo exista una conexión.</p>
<h2>Un patrón desprestigiado</h2>
<p><img class="aligncenter size-full wp-image-45" title="Se Busca: Singleton" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/SeBusca.png" alt="Se Busca: Singleton" width="140" height="197" /><br />
Últimamente se ha hablado mucho de este patrón y en la mayoría de los casos para advertir contra su uso excesivo y ciertos problemas que puede conllevar.</p>
<p>Básicamente las razones del movimiento anti-singleton son las siguientes:</p>
<ol>
<li>Un singleton puede considerarse en algunos aspectos como una variable global (es una instancia global) y el uso de variables globales debe evitarse en lo posible. Lo que ocurre es que al utilizar algo de forma global, en vez de pasarlo como argumento, se ocultan las dependencias que tiene una clase, en vez de hacerlas visibles en su API.</li>
<li>Se viola el principio de <strong>responsabilidad única</strong> (cada clase debe ser responsable de una sola tarea). En este caso, además de las responsabilidades propias de la clase, debe controlar su creación y limitar sus instancias.</li>
<li>Hace el código dependiente de su entorno (la instancia global en este caso) lo que dificulta las pruebas de unidad (unit testing).</li>
</ol>
<p>Son razones válidas pero siempre deben considerarse en el caso concreto de la aplicación que estamos desarrollando. Si, en nuestro caso, aplicar el patrón soluciona un problema de forma sencilla y no nos crea otros, no hay razón para no aplicarlo.</p>
<p>El Singleton es un patrón mas que debemos conocer y que, como todos, debemos aplicar cuando sea la mejor opción. El problema que resuelven es muy claro: <strong>sólo puede haber una instancia de una clase concreta</strong>. Si tenemos un recurso que sólo puede/debe utilizarse mediante un único punto de acceso, usa un Singleton.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/10/patrones-de-diseno-en-php5-singleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Temas hijo: Cómo hacer modificaciones sencillas en un tema de WordPress</title>
		<link>http://www.quimeraazul.com/tutoriales/2010/10/temas-hijo-como-hacer-modificaciones-sencillas-en-un-tema-de-wordpress/</link>
		<comments>http://www.quimeraazul.com/tutoriales/2010/10/temas-hijo-como-hacer-modificaciones-sencillas-en-un-tema-de-wordpress/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 13:59:09 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[temas]]></category>

		<guid isPermaLink="false">http://www.quimeraazul.com/tutoriales/?p=4</guid>
		<description><![CDATA[Cuando buscamos temas para WordPress nos encontramos muchas veces con plantillas que nos gustan pero que tienen algún detalle que no nos convence. Pensamos: &#8220;si tuviera esto de esta manera sería perfecto&#8221;, y seguimos buscando. Podríamos personalizar el tema a nuestro gusto mediante un tema hijo (child theme). Un tema hijo es un tema derivado [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-38" title="Child Temes" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/introIMG1.png" alt="Child Temes" width="115" height="140" /><br />
Cuando buscamos temas para WordPress nos encontramos muchas veces con plantillas que nos gustan pero que tienen algún detalle que no nos convence. Pensamos: &#8220;si tuviera esto de esta manera sería perfecto&#8221;, y seguimos buscando. Podríamos personalizar el tema a nuestro gusto mediante un tema hijo (child theme).<span id="more-4"></span></p>
<p>Un tema hijo es un tema derivado de otro, que sólo incluye los cambios que necesitemos hacer. Heredamos toda la funcionalidad y el diseño del tema padre y sólo tenemos que incluir las modificaciones para personalizarlo. Es tan sencillo como crear nuestra hoja de estilos style.css y especificar ahí las propiedades que queremos cambiar.</p>
<blockquote><p>Utilizar estos temas derivados es la forma recomendada en la documentación de WordPress para hacer cambios en un tema original.</p></blockquote>
<p>Tienen la enorme ventaja de que los ficheros del tema que nos sirve de base no se tocan, todos nuestros cambios están claramente separados en su propio fichero, en la carpeta del tema hijo. Podemos actualizar el tema original sin perder nuestro trabajo.</p>
<h2>Modificando el tema &#8220;Titan&#8221;</h2>
<p>Para ver un ejemplo partiremos del excelente tema <a href="http://wordpress.org/extend/themes/titan">Titan</a>, creado por <a href="http://thethemefoundry.com/">The Theme Foundry</a> y disponible en el directorio de temas gratuitos de WordPress.</p>
<div id="attachment_9" class="wp-caption aligncenter" style="width: 610px"><img class="size-full wp-image-9 " title="Tema Titan" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/temaTitan.png" alt="Tema Titan" width="600" height="312" /><p class="wp-caption-text">Tema Titan de &#39;The Teme Foundry&#39;</p></div>
<p>Supongamos que hemos encontrado este tema que se ajusta casi perfectamente a lo que buscábamos, pero&#8230; hay algunos detalles que no coinciden con la idea que teníamos. Los gustos de cada uno son muy particulares y, para colmo, el creador del tema tiene los suyos propios.</p>
<p>Para ver cómo adaptarlo a nuestras necesidades mediante un sencillo tema hijo, vamos a suponer que queremos hacer los siguientes cambios:</p>
<ul>
<li>Nuestros posts van a ser extensos y el formato se queda un poco corto. Vamos a alargar todo el contenido del post hacia la izquierda para aprovechar el espacio vacío que queda debajo de la fecha.</li>
<li>El título de cada entrada queremos que sea un poco más grande y de color negro en vez de azul link.</li>
<li>Queremos una separación entre posts más clara</li>
</ul>
<p style="text-align: center;"><img class="size-full wp-image-12 aligncenter" title="Cambios a realizar" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/temaTitanCambios600_2.png" alt="Cambios a realizar" width="600" height="312" /></p>
<p>Evidentemente son pequeños detalles pero pueden hacer que descartes un tema que te gusta casi al 100%.</p>
<p>Vamos a ver como hacer estas modificaciones creando nuestro propio ficheros style.css con sólo unas líneas para obtener este resultado:</p>
<p style="text-align: center;"><img class="size-full wp-image-13 aligncenter" title="Titan Child" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/titanChild.png" alt="Tema hijo de Titan" width="595" height="391" /></p>
<h2>¿Dónde hago mis cambios?</h2>
<p>Crear un tema hijo es tan sencillo como crear una carpeta con el nombre que le daremos al tema (yo lo he llamado titan-child ) y dentro de la carpeta crear un fichero <em>style.css</em> que será nuestra hoja de estilos para todo lo que queramos cambiar.</p>
<p>En WordPress todos los temas están en la carpeta wp-content/themes y ahí es donde colocaremos también el nuestro. Por supuesto tenemos que haber descargado el tema padre y haberlo colocado en la carpeta themes.</p>
<p style="text-align: center;"><img class="size-full wp-image-14 aligncenter" title="carpeta del tema" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/carpeta.png" alt="carpeta del tema" width="384" height="219" /></p>
<p style="text-align: center;"><img class="size-full wp-image-15 aligncenter" title="Hoja de estilos" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/hojaEstilos.png" alt="Hoja de estilos" width="384" height="220" /></p>
<p>El nombre de la carpeta con nuetro tema puede ser cualquiera, no tiene que contener la palabra child por ser un tema hijo. El nombre de nuestra hoja de estilos sí tiene que ser style.css obligatoriamente.</p>
<h2>La hoja de estilos de nuestro tema: style.css</h2>
<p>Al principio de este fichero se incluyen siempre unas lineas de información con el nombre del tema, el autor, descripción, etc. Al ser un tema hijo debe incluirse también el campo <strong>Template</strong> para indicar cuál es el tema padre, ya que WordPress tendrá que coger los ficheros de esta plantilla para luego modificarlo con los nuestros.</p>
<p>Estas serían las líneas de la cabecera de nuestro fichero style.css:</p>
<pre class="brush: css; title: ;">
/*
Theme Name: Titan Child
Theme URI: -
Description: Tema derivado de Titan
Author: Pablo L. Pastor
Author URI: -
Template: titan
Version: 1.0
*/
</pre>
<p>Las dos únicas etiquetas requeridas obligatoriamente son <strong>Theme Name</strong> y <strong>Template</strong>. En este último campo debe aparecer el nombre del tema padre tal como aparece en la carpeta que lo contiene, en el directorio themes.</p>
<p>Debemos tener en cuenta que nuestra hoja de estilos <strong>sustituye</strong> a la original. Normalmente, para no perder los estilos del tema base, se incluye la siguiente línea:</p>
<pre class="brush: css; title: ;">
@import url('../titan/style.css');
</pre>
<p>que incluirá todas las reglas css del tema padre al principio de nuestro fichero css. Esta línea debe aparecer al principio del fichero, después del comentario con la información del tema.</p>
<p>debemos añadir @import siempre que queramos contar con el aspecto visual original y modificar a partir de ahí. Si no lo hacemos contaremos con el HTML puro y duro y tendremos que definir el diseño desde cero. Partiríamos de esto:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-18" title="tema sin estilos" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/temaSinImport.png" alt="tema sin estilos" width="480" height="321" /></p>
<p>En nuestro caso esto no es lo que queremos, añadimos @import para partir del tema original tal como es.</p>
<p>Ahora empezamos con las reglas css para cambiar los detalles que nos interesan. Para saber que propiedades tenemos que cambiar, lo mejor es utilizar   <a href="http://getfirebug.com/ ">FireBug</a> que nos permite ver cómo están definidas pinchando sobre el diseño original.</p>
<p>Para eliminar el desplazamiento a la derecha de las entradas y hacer el texto más ancho, incluiremos lo siguiente:</p>
<pre class="brush: css; title: ;">
/* Eliminar el desplazamiento a la derecha de las entradas */
.entry {
    margin: 0 0 0 0px;
    width: 620px;
}

.post-footer {
    margin-left: 0px;
}
</pre>
<p>de esta forma eliminamos el margen que desplazaba la entrada y aumentamos su anchura.</p>
<p>Para aumentar el tamaño del título y cambiar el color:</p>
<pre class="brush: css; title: ;">
/* Aumentar tamaño del título del post y cambiar color a negro */
.post-header h2 {
    font-size: 3em;
}

.post-header h2 a {
    color: #000;
}
</pre>
<p>Y por último, para marcar más la separación entre posts, incluyendo un cambio del color de fondo de las entradas:</p>
<pre class="brush: css; title: ;">
/*Fondo blanco para los posts. Más padding y menos separación entre entradas */
.post {
    background-color:white;
    margin-bottom:20px;
    padding:0 10px 10px;
    border:1px solid #EFEAE4;
}
/* Borrar la línea de separación de entradas anterior */
.post-header {
    border-top: none;
}
</pre>
<p>Y ya está!. Sólo con estas líneas en el fichero <strong>style.css</strong> de  nuestro tema hijo hemos conseguido adaptar el tema a nuestras necesidades.</p>
<p><img class="aligncenter size-full wp-image-13" title="Titan Child" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/titanChild.png" alt="Tema hijo de Titan" width="595" height="391" /></p>
<h2>¿Sólo para pequeños cambios?</h2>
<p>En realidad no. Los temas hijo son perfectos para estos pequeños ajustes, pero permiten modificar prácticamente todo lo que queramos del tema original: css, imágenes, plantillas, funciones, etc.</p>
<p>Podemos crear un fichero functions.php para incluir funciones nuevas que aumenten las posibilidades de nuestro tema. Las funciones nuevas se <strong>sumarán</strong> a las que ya existen en el tema base.</p>
<p>Podemos definir plantillas nuevas para cualquiera de las partes de WordPress. Las plantillas que nosotros definamos <strong>sustituirán</strong> a la plantilla original del mismo nombre.</p>
<h2>Modificando una plantilla</h2>
<p>Para desarrollar un poco más nuestro ejemplo, vamos a modificar una de las plantillas de Titan.</p>
<p>La cabecera de este tema no incluye una caja de búsqueda:<br />
<img class="aligncenter size-full wp-image-19" title="Cabecera del tema por defecto" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/cabeceraSinSearch.png" alt="Cabecera del tema por defecto" width="600" height="111" /></p>
<p>Podemos modificar la plantilla de la cabecera (<em>header.php</em>) en nuestro tema hijo para incluirla.</p>
<p>Como las plantillas que creemos <strong>sustituyen</strong> a los ficheros originales, vamos a copiar</p>
<p>wp-content/themes/titan/header.php</p>
<p>en nuestro tema:</p>
<p>wp-content/themes/titan.child/header.php</p>
<p>Ya hora en este fichero hacemos la modificación para incluir la búsqueda.</p>
<p>Despues de la línea 71 añadimos el código que vemos entre los comentarios &lt;!&#8211;código nuevo&#8211;&gt; y &lt;!&#8211;fin código nuevo&#8211;&gt;:</p>
<pre class="brush: php; title: ;">

                &lt;?php bloginfo( 'description'); ?&gt;
            &lt;/div&gt;&lt;!--end description--&gt;

&lt;!--código nuevo--&gt;
        &lt;div id=&quot;header-search&quot;&gt;
            &lt;?php if (is_file(STYLESHEETPATH . '/searchform.php')) include (STYLESHEETPATH . '/searchform.php'); else include(TEMPLATEPATH . '/searchform.php'); ?&gt;
        &lt;/div&gt;&lt;!-- end search box --&gt;
&lt;!--fin código nuevo--&gt;

            &lt;div id=&quot;navigation&quot;&gt;
                &lt;ul id=&quot;nav&quot;&gt;
</pre>
<p>Esto ya nos añadiría la caja, pero un poco descolocada:</p>
<p><img class="aligncenter size-full wp-image-20" title="cabecera con búsqueda descolocada" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/cabeceraSearchDescolocado.png" alt="cabecera con búsqueda descolocada" width="600" height="112" /></p>
<p>Añadimos unos estilos en el fichero <em>style.css</em> para ajustarla:</p>
<pre class="brush: css; title: ;">
/*Search*/
#header-search #search_form input.search {
    margin:40px 0 0 95px;
}
</pre>
<p>Y el resultado es:</p>
<p><img class="aligncenter size-full wp-image-21" title="cabecera con búsqueda" src="http://www.quimeraazul.com/tutoriales/wp-content/uploads/cabeceraConSearch.png" alt="cabecera con búsqueda" width="600" height="110" /></p>
<p>Con la caja de búsqueda tal como la queríamos!. Para disfrutar de nuestros cambios sólo tenemos que seleccionar el tema que hemos creado como <em>Tema actual</em> en la pantalla de administración de WordPress.</p>
<h2>&#8230;Y mucho más</h2>
<p>Los temas hijo son una herramienta tan potente que incluso se han desarrollado temas especiales para ser utilizados únicamente como tema padre. Son temas muy completos, con un amplio abanico de funcionalidades, que dejan el diseño en manos del usuario/cliente para que lo personalice con el fichero style.css en un tema hijo.</p>
<p>Estos temas especiales a veces son considerados como un framework para desarrollo de temas. Proporcionan una base sólida y bien desarrollada sobre la que construir nuestro tema mediante los temas hijo. Esto puede hacer el desarrollo mucho más rápido y sencillo.</p>
<p>Ejemplos de este tipo de temas son: <a href="http://themeshaper.com/thematic/">Thematic</a>, <a href="http://www.zy.sg/the-buffet-framework/">The Buffet Framework</a>, <a href="http://wordpress.org/extend/themes/sandbox">SandBox</a>,  <a href="http://wpframework.com/">WP Framework</a> o  <a href="http://wordpress.org/extend/themes/hybrid">Hybrid</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quimeraazul.com/tutoriales/2010/10/temas-hijo-como-hacer-modificaciones-sencillas-en-un-tema-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

