<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.5" -->
<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/"
	>

<channel>
	<title>Syntax Error</title>
	<link>http://www.syntaxerror.es</link>
	<description></description>
	<pubDate>Thu, 12 Feb 2009 09:38:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.5</generator>
	<language>en</language>
			<item>
		<title>CSS: DIV Contenedor de DIVs con Float: IE &#038; FF</title>
		<link>http://www.syntaxerror.es/2008/10/08/css-div-contenedor-de-divs-con-float-ie-ff/</link>
		<comments>http://www.syntaxerror.es/2008/10/08/css-div-contenedor-de-divs-con-float-ie-ff/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 11:40:35 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Html</category>

		<category>Programación</category>
<category>CSS</category><category>Html</category><category>Programación</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/10/08/css-div-contenedor-de-divs-con-float-ie-ff/</guid>
		<description><![CDATA[<style>.newl {display:none}</style><div class=newl></div>Con este nombre críptico se esconde uno de mis quebraderos de cabeza que estoy teniendo para maquetar de forma que Internet Explorer 6, 7 y Firefox trabajen de la misma forma.
Imaginemos que tenemos un div que contiene un par de divs con float:left. El problema que nos aparece es que el fondo gris no se [...]]]></description>
			<content:encoded><![CDATA[<p>Con este nombre críptico se esconde uno de mis quebraderos de cabeza que estoy teniendo para <strong>maquetar de forma que Internet Explorer 6, 7 y Firefox trabajen de la misma forma</strong>.</p>
<p>Imaginemos que tenemos un <em>div</em> que contiene un par de <em>div</em>s con <em>float:left</em>. El problema que nos aparece es que el fondo gris no se estira para recoger los elementos que contiene, ya que los <em>div</em>s internos son flotantes. </p>
<div class="igBar"><span id="lhtml-6"><a href="#" onclick="javascript:showPlainTxt('html-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-6">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"background-color: grey;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">&lt;img</span></a> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"images/avatar.jpg"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; Nombre del Usuario<br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></div>
</div>
</div>
<p></p>
<p>Como corregimos ésto? Bién, he dado con la solución!<br />
<strong>Editado</strong>: Gracias a los comentarios, ahora la solución es mejor!</p>
<p><a id="more-199"></a></p>
<p><strong>La forma común</strong></p>
<p>Hasta ahora lo que venía haciendo con Firefox era agregar un elemento <em>HTML</em> justo después del último elemento <em>div</em> interno, antes de cerrar el <em>div</em> contenedor, con un <em>clear:both</em>. La teoría es fácil y funciona: El <em>clear:both</em> se encarga de limpiar de elementos a derecha e izquierda para que el contenedor sepa hasta dónde llega él mismo.</p>
<div class="igBar"><span id="lhtml-7"><a href="#" onclick="javascript:showPlainTxt('html-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-7">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"background-color: grey;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">&lt;img</span></a> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"images/avatar.jpg"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; Nombre del Usuario<br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">&lt;br</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"clear: both;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></div>
</div>
</div>
<p></p>
<p>Pero en Internet Explorer 6 y 7 ésto no funciona. El navegador lee el <em>BR</em> pero parece que el <em>clear:both</em> no se aplica. La única forma que encontré era poner dos veces el <em>BR</em>. Así parece que sí que funciona pero por contra nos hace dos saltos de línea, con lo que si teníamos la maquetación cuadrada con tamaños y posiciones, veremos como se descolocan con el nuevo espacio inferior.</p>
<p><strong>La nueva solución</strong></p>
<p>Rebuscando por internet he encontrado la solución que plantean en <a href="http://www.quirksmode.org/css/clearing.html" target="_blank">Quircksmode</a>. Se trata de usar la instrucción <em>overflow</em> junto con un <em>width</em>. El primero soluciona el problema en Internet Explorer 7 y el segundo es para que internamente se llame al <em>hasLayout</em> de Internet Explorer 6:</p>
<div class="igBar"><span id="lhtml-8"><a href="#" onclick="javascript:showPlainTxt('html-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-8">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"background-color: grey; overflow: hidden;width: 100%;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">&lt;img</span></a> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"images/avatar.jpg"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; Nombre del Usuario<br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></div>
</div>
</div>
<p></p>
<p>El problema aquí es el <em>width</em>, porque el resto de navegadores también lo entienden y lo aplican, desmontando la maquetación que teníamos (por ejemplo, un <em>padding</em>).</p>
<p>Entonces, pensando un poco, necesitamos una instrucción que sólo funcione para Internet Explorer 6 y que active su <em>hasLayout</em>... y aquí entra otro truco que he visto en <a href="http://www.positioniseverything.net/easyclearing.html" target="_blank">PositionisEverithing</a>, que aunque su método no me gusta nada, usa la instrucción <em>zoom</em> para activar el <em>hasLayout</em>.</p>
<p>Así que la forma que he visto que funciona en los tres navegadores es una fusión de las 3 soluciones: Por un lado mantenemos el <em>BR</em> con el <em>clear:both</em> y además añadimos al <em>DIV</em> contenedor un par de instrucciones <em>CSS</em> para que en los otros navegadores funcione, dejándolo de la siguiente manera:</p>
<div class="igBar"><span id="lhtml-9"><a href="#" onclick="javascript:showPlainTxt('html-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-9">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"background-color: grey; overflow: hidden;zoom:1;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">&lt;img</span></a> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"images/avatar.jpg"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; Nombre del Usuario<br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">&lt;br</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"clear: both;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></div>
</div>
</div>
<p></p>
<p><strong>Editado</strong>: He probado la soluciónes de los comentarios y la fórmula que funciona en los tres casos es la siguiente: <strong>Añadir al contenedor el binomio <em>overflow</em> y <em>zoom</em> sin el salto de línea con <em>clear:both</em></strong>.</p>
<div class="igBar"><span id="lhtml-10"><a href="#" onclick="javascript:showPlainTxt('html-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-10">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"background-color: grey; overflow: hidden;zoom:1;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">&lt;img</span></a> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"images/avatar.jpg"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">&lt;div</span></a> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"float: left;"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp; Nombre del Usuario<br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></div>
</div>
</div>
<p></p>
<p>Ala, problema resuelto. Y si estáis cuadrando maquetación entre navegadores... paciencia!</p>
<p>Salu10
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/10/08/css-div-contenedor-de-divs-con-float-ie-ff/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Saltando de PHP a Ruby on Rails</title>
		<link>http://www.syntaxerror.es/2008/09/24/saltando-de-php-a-ruby-on-rails/</link>
		<comments>http://www.syntaxerror.es/2008/09/24/saltando-de-php-a-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 10:11:34 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>Ruby on Rails</category>
<category>General</category><category>Programación</category><category>Ruby on Rails</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/09/24/saltando-de-php-a-ruby-on-rails/</guid>
		<description><![CDATA[Ha pasado mucho tiempo desde el último post, lo sé, y tiene un porqué: acabo de dar el salto a Ruby on Rails.
¿Cómo? ¿Y porqué? Si justamente ahora empezaba a ser senior en PHP!
Habéis probado Ruby? Habéis jugado con lo que permite este lenguaje de objetos?
Ya desde que Bruno, un amigo motero y programador, me [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image196" src="http://www.syntaxerror.es/wp-content/uploads/2008/09/ruby_on_rails_logo.miniatura.jpg" alt="Ruby on Rails" style="float:left" />Ha pasado mucho tiempo desde el último post, lo sé, y tiene un porqué: acabo de dar el salto a Ruby on Rails.</p>
<p>¿Cómo? ¿Y porqué? Si justamente ahora empezaba a ser senior en PHP!<br />
Habéis probado Ruby? Habéis jugado con lo que permite este lenguaje de objetos?</p>
<p>Ya desde que Bruno, un amigo motero y programador, me convenciese para que le echara un vistazo me gustó, pero claro, es "un lenguaje nuevo" y "aún le falta mucho" y "no tengo tiempo para jugar". Luego conocí a los creadores de <a href="http://www.moterus.es" target="_blank">moterus.es</a>, red social al estilo <a href="http://www.facebook.com">facebook</a> pero enfocada a moteros, escrita también en Ruby on Rails. Salimos varias veces en moto y en las paradas... bueno... somos unos frikis y nos gusta programar, hablamos y hablamos hasta que un día de principios de agosto me hicieron una propuesta formal: asumiendo que empezaba de cero con Rails, me querían en el equipo.</p>
<p>Yo estaba en plena fase de salida de producción del nuevo front y back de Privalia. Como buen profesional debía quedarme hasta el final así que la entrada la haría a principios de setiembre. Me tiré todo el agosto haciendo más horas que un reloj en Privalia y en los pocos ratos libres que me quedaron estuve estudiando Ruby on Rails. Con la coña casi no he tenido vacaciones pero ha valido la pena. Ya estoy metido de lleno. </p>
<p>Éste ha sido el motivo de mi larga ausencia. Con ello he caído de los rankings y <a href="http://www.syntaxerror.es">Syntax Error</a> a vuelto a ser un blog del montón (si es que nunca a pasado de aquí). Y para intentar remediarlo, aquí vengo con este post, en el que voy a intentar juntar la información y documentación que he usado para ponerme manos a la obra.</p>
<p><a id="more-195"></a></p>
<p><strong>Qué es Ruby on Rails?</strong></p>
<p>Ruby on Rails no es sólo un lenguaje, es un conjunto de un lenguaje (Ruby) sobre el que trabaja un framework (Rails). En comparación con PHP, Ruby sería el lenguaje como lo es PHP, y Rails sería la arquitectura que se levanta encima como lo podría ser el framework Zend. </p>
<p><strong>En qué se diferencian Ruby y PHP?</strong></p>
<p>La diferencia principal es la potencia. Si PHP es un lenguaje procedural (basado en funciones) al que paulatinamente le han dado soporte y potencia con la orientación a objetos, Ruby ya es de por si un lenguaje dónde absolutamente todo es un objeto, con lo que las posibilidades son casi infinitas. Gracias a éso, aparece una nueva diferencia a nivel de concepto: en PHP lo usual es tener algo (un string, un integer, un objeto) que pasas a una función o método para que haga el trabajo y te devuelve el resultado (otro integer, otro string, otro objeto). El Ruby lo usual es que el propio objeto (porque todo es un objeto) lleve los métodos con los que trabajar. </p>
<p><strong>Pero PHP ya tiene soporte de objetos!</strong></p>
<p>Si, y no va nada mal cuando te acostumbras a usarlo. En Atrapalo usábamos un framework propio que hacía un uso intensivo de los objetos. En Privalia el framework usado era Zend y en muchos aspechos se optimizaba el uso de los objetos. Pero hay conceptos que el PHP no tiene, como los <em>code blocks</em> de Ruby (snippets de código que puedes adjuntar a un método) o redeclarar una clase para agregarle funcionalidad (éso en PHP produce un <em>Fatal Error</em>), de forma que puedes hacer que una clase abra a otra y le agregue un par de métodos nuevos.</p>
<p><strong>No me estás diciendo nada nuevo</strong></p>
<p>Hay dos tipos de programadores: los reacios a los cambios y los que les gusta aprender. Si eres uno de los reacios tranquilo, PHP seguirá evolucionando y tendrás mayores opciones con las que jugar. Siempre lo ha hecho. Si eres uno de los segundos encontrarás una potencia de lenguaje sorprendente con la que el concepto de aplicación la enfocas desde otros puntos de vista, como plugins a un core principal, módulos atómicos que se interrelacionan entre ellos...</p>
<p><strong>Vale, quiero empezar con algo</strong></p>
<p>Primero de todo debo decir las versiones que actualmente se están moviendo en RoR.</p>
<blockquote><p>
Versión de Ruby: 1.8.6<br />
Versión de Rails: 2.1.1</p>
</blockquote>
<p>Sería interesante que instalaras un entorno para las pruebas que quieras hacer mientras lees los manuales. La instalación básica es muy fácil. Todas las instalaciones de RoR que he hecho (incluso en mi eeePC) han sido usando este pequeño y efectivo tutorial: <a href="http://agileweb.wordpress.com/2008/07/18/how-to-install-rails-21-on-ubuntu-in-5-steps/" target="_blank">How to install Rails 2.1 on Ubuntu in 5 steps</a>, aunque voy a poner las pasos rápidamente a continuación:</p>
<p>1.- Instalar ruby</p>
<blockquote><p>
sudo apt-get install ruby rdoc irb ruby1.8-dev rubygems libopenssl-ruby
</p></blockquote>
<p>2.- Actualizar el gestor de paquetes Gem a la última versión</p>
<blockquote><p>
sudo gem update --system
</p></blockquote>
<p>3.- Eliminar la versión antígua de Gem</p>
<blockquote><p>
sudo apt-get remove rubygems
</p></blockquote>
<p>4.- Creamos un enlace para que los programas que busquen el Gem eliminado ejecuten el Gem nuevo</p>
<blockquote><p>
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
</p></blockquote>
<p>5.- Instalar Rails</p>
<blockquote><p>
sudo gem install rails
</p></blockquote>
<p>Además, lo suyo es ejecutar Ruby on Rails sobre MySQL, así que deberíamos instalar el servidor MySQL con la librería de Ruby correspondiente:</p>
<blockquote><p>
sudo apt-get install mysql-server libmysql-ruby
</p></blockquote>
<p>Una vez se tiene el entorno montado simplemente es cuestión de seguir algun manual. Qué manuales deberíamos seguir? Bueno, aquí la cosa depende de los gustos de cada uno. Voy a dar una lista de manuales que valdria la pena seguir desde mi punto de vesita.</p>
<ul>
<li><a href="http://www.amazon.com/Programming-Ruby-Pragmatic-Programmers-Second/dp/0974514055" target="_blank">Pargmatic Bookshelf - Programming Ruby (2nd edition)</a>. Ideal para aprender el lenguaje Ruby. No se toca nada de Rails. Genial para coger base en el lenguaje</li>
<li><a href="http://www.amazon.com/Rails-Way-Addison-Wesley-Professional-Ruby/dp/0321445619" target="_blank">The Rails Way</a>. Enseña la forma de trabajade Rails, explicando las capas de abstracción que Rails usa. Según mis compañeros de moterus.es, "indispensable"</li>
<li><a href="http://www.amazon.com/Rails-PHP-Developers-Pragmatic-Programmers/dp/1934356042" target="_blank">Rails for PHP developers</a>. Genial libro dónde da por supuesto que sabemos programar en PHP, usando ésto para enseñarnos Rails. Se avanza muy rápido, y no sustituye los dos anteriores.</li>
</ul>
<p>He puesto lo enlaces de Amazon para tener claro qué libros son, pero supongo que no tendréis problemas para encontrar sus versiones en PDF por internet <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Qué otros recursos son interesantes?</strong></p>
<p><a href="http://www.moterus.es/usuarios/isaac"  target="_blank">Isaac</a> y <a href="http://www.moterus.es/usuarios/francesc"  target="_blank">Francesc</a> me pasaron un listado de enlaces interesantes. Simplemente los voy a reproducir aquí:</p>
<ul>
<li><a href="http://api.rubyonrails.org" target="_blank">http://api.rubyonrails.org</a>: Toda la API de Rails</li>
<li><a href="http://www.ruby-doc.org/" target="_blank">http://www.ruby-doc.org/</a>: Documentación de Ruby</li>
<li><a href="http://railscasts.com/" target="_blank">http://railscasts.com/</a>: Imprescindible para iniciarse en las best-practices</li>
<li><a href="http://buildingwebapps.com/site/home" target="_blank">http://buildingwebapps.com/site/home</a>: Lleno de artículos, podcast interesantes</li>
<li><a href="http://www.ruby-forum.com/" target="_blank">http://www.ruby-forum.com/</a>: Foro de Ruby</li>
<li><a href="http://www.railsenvy.com/" target="_blank">http://www.railsenvy.com/</a>: Podcast semanal, algo más avanzado</li>
<li><a href="http://www.caboo.se/" target="_blank">http://www.caboo.se/</a>: Buena calidad de artículos</li>
</ul>
<p>A medida  que vaya aprendiendo más sobre este entorno escribiré más. Ahora en <a href="http://www.syntaxerror.es">SyntaxError</a> tenemos un nuevo tag <strong>Ruby on Rails</strong> <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Salu10.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/09/24/saltando-de-php-a-ruby-on-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP: Comprimir la salida del servidor para ahorrar ancho de banda</title>
		<link>http://www.syntaxerror.es/2008/07/23/php-comprimir-la-salida-del-servidor-para-ahorrar-ancho-de-banda/</link>
		<comments>http://www.syntaxerror.es/2008/07/23/php-comprimir-la-salida-del-servidor-para-ahorrar-ancho-de-banda/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 10:22:43 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>PHP</category>
<category>Comunicación</category><category>Optimización</category><category>PHP</category><category>Programación</category><category>Server</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/07/23/php-comprimir-la-salida-del-servidor-para-ahorrar-ancho-de-banda/</guid>
		<description><![CDATA[En un proyecto en el que estoy trabajando actualmente se requiere generar un XML con datos tratados, para que un código Javascript monte un grid a modo de Excel online. 
El problema viene cuando la cantidad de registros se vuelve grande... En unas pruebas con registros de producción nos encontramos que el grid se demoraba [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image194" src="http://www.syntaxerror.es/wp-content/uploads/2008/07/zlib_screen.miniatura.PNG" alt="zlib" style="float:left;" />En un proyecto en el que estoy trabajando actualmente se requiere generar un <em>XML</em> con datos tratados, para que un código <em>Javascript</em> monte un <a href="http://www.treegrid.com/TreeGrid5_6/Html/EJSTreeGrid.html#Home" target="_blank">grid</a> a modo de <em>Excel online</em>. </p>
<p>El problema viene cuando la cantidad de registros se vuelve grande... En unas pruebas con registros de producción nos encontramos que el <em>grid </em>se demoraba mucho en mostrarse... Pusimos algunas alertas y llegamos a la conclusión que de 20 segundos que tardaba en montarse el <em>grid</em>, sólo 5 correspondían a la generación del <em>XML</em> y el resto era tráfico de red y proceso <em>javascript</em>.</p>
<p>Pero cuánto pesa el <em>XML</em>? Un mega y medio de <em>XML</em>? Y cómo lo hacemos más pequeño para generar menos tráfico y ganar tiempo? Comprimiendo el <em>XML</em> de salida...</p>
<p><a id="more-192"></a></p>
<p><strong>¿De qué se trata?</strong></p>
<p>Los datos que se encargan de montar una página web son básicamente imágenes y diferentes tipos de datos en texto plano. Las imágenes habitualmente ya vienen comprimidas (<em>JPG</em>, <em>PNG</em>, <em>GIF</em>,...), pero el texto plano (<em>HTML</em>, <em>XML</em>, <em>CSS</em>, ...) es altamente comprimible... Simplemente es código <em>ASCII</em> que se repite y repite en el mismo archivo. Si enviamos el texto plano comprimido estamos enviando realmente menos datos por la red, consiguiendo que la totalidad de los datos llegue antes al navegador, quien descomprime los datos y obtiene el código <em>HTML</em>, <em>XML</em>, <em>CSS</em> o lo que sea como si se hubiese enviado así directamente.</p>
<p><strong>¿Y los navegadors lo soportan?</strong></p>
<p>Casi la totalidad de navegadores actuales soportan la compressión de datos <em>HTTP</em>. De hecho, desde 1998 los navegadores han ido soportando el protocolo <em>HTTP 1.1</em>, que esencialmente indica que el navegador soporta "content encoding".</p>
<p>Internet Explorer soporta compresión <em>HTTP</em> desde la versión 4 (teniendo que activar <em>HTTP 1.1</em> en sus propiedades) aunque las versiones para <em>Mac 4.5/5</em> no lo soportan. Netscape lo soporta desde la versión 4 aunque da bastantes fallos. Su versión 4.5 empieza a ser más interesante y la 6 funciona ya plenamente. Opera soporta la compresión desde su versión 5. Firefox desde su versión 1.</p>
<p>Para asegurarte que tu navegador soporta compresión puedes usar el test <a href="http://www.schroepl.net/cgi-bin/http_trace.pl" target="_blank">HTTP trace</a>. Si aparece una línea dentro del cuadro "<em>HTTP request received from browser</em>" con un texto similar al siguiente es que sí que lo soporta:</p>
<blockquote><p>
ACCEPT_ENCODING: gzip,deflate
</p></blockquote>
<p>¿Cómo implementarlo?</p>
<p>Se puede hacer de 3 formas:</p>
<ol>
<li>Activar a nivel TOTAL del ámbito del php del servidor (editar <em>php.ini</em>)</li>
<li>Activar a nivel LOCAL para un sólo site de todo el ámbito del PHP (<em>.htaccess</em>)</li>
<li>Activar a nivel de SCRIPT (un sólo archivo<em>.php</em>)</li>
</ol>
<p><strong>1.- TOTAL</strong></p>
<ol>
<li>Editar el <em>php.ini</em> de apache<br />
<blockquote><p>$ vim /etc/php5/apache2/php.ini</p></blockquote>
</li>
<li>Cambiar el valor de los parámetros siguientes:<br />
<blockquote><p>zlib.output_compression = On<br />
		zlib.output_compression_level = 7</p></blockquote>
</li>
<li>Guardar y salir</li>
<li>Reiniciar apache<br />
<blockquote><p>$ /etc/init.d/apache2 restart</p></blockquote>
</li>
</ol>
<p><strong>2.- LOCAL</strong></p>
<ol>
<li>Editar o crear el archivo <em>.htaccess</em> en el directorio del sitio a aplicar<br />
<blockquote><p>$ vim /var/www/misitio/.htaccess</p></blockquote>
</li>
<li>Insertar las siguientes líneas:<br />
<blockquote><p>php_flag zlib.output_compression on<br />
		php_value zlib.output_compression_level 7</p></blockquote>
</li>
<li>Guardar y salir (no es necesario reiniciar)</li>
</ol>
<p><strong>3.- SCRIPT</strong><br />
Hay dos formas de hacerlo:</p>
<ol>
<li>Insertar al inicio del <em>script</em> la siguiente línea<br />
<blockquote><p>ini_set('zlib.output_compression', 'On');</p></blockquote>
<p>	NOTA: Según el <a href="http://es.php.net/manual/es/ref.zlib.php#82310" target="_blank">comentario en <em>php.net</em></a> esta forma no funciona.<br />
		Personalmente yo no lo he probado.</li>
<li>Insertar al inicio del <em>script</em> la siguiente línea<br />
<blockquote><p>ob_start("ob_gzhandler");</p></blockquote>
<p>	NOTA: Sin haber activado el <em>zlib</em> desde <em>php.ini</em>, al ejecutar ésta línea me causaba un error.</li>
</ol>
<p><strong>Niveles de compresión:</strong></p>
<p>Van de 0 a 9 indicando de menos a más compresión respectivamente. A menos compresión más rápido es y menos <em>CPU</em> consume, pero menos comprime. A más compresión se tarda más en comprimir y consume más <em>CPU</em>, pero la compresión es mejor. Establecer el valor a -1 hace que se deje a elección del propio <em>PHP</em> el nivel de compresión (generalmente 6).</p>
<p><strong>¿Cómo saber si está funcionando?</strong></p>
<p>Se pueden usar herramientas de testeo como <a href="http://www.port80software.com/support/p80tools" target="_blank">HTTP Analysis Tools</a>. Para este caso, probar la primera herramienta "<em>Compression Check</em>"</p>
<p><strong>Experiencia personal</strong></p>
<p>En el proyecto que he descrito, el <em>XML</em> medio pesaba sobre 1,5 MB. Al comprimir la salida se queda en unos 35 KB, una muy buena mejora. La solución que tomé fué aplicar la compresión a todo el site setando los parámetros directamente en el <em>php.ini</em>. La generación del <em>XML</em> sigue tardando lo mismo pero el tiempo total para tener el XML listo en el navegador descendió de 25 segundos a unos 10 segundos... una muy buena mejora <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Luego, quise hacer lo mismo en este blog. Como está alojado en un servidor compartido no tengo acceso al <em>php.ini</em>, así que probé de hacer el setado por <em>.htaccess</em>, pero obtuve siempre un <em>error 500</em>. La única forma de hacerlo funcionar fué editar el archivo <em>index.php</em> y colocar en la primera línea el <em>ob_start("ob_gzhandler")</em>. La compresión funcionó y los registros mejoraron, pero la experiencia del usuario empeora debido a que el el navegador no renderiza hasta que no le han llegado todos los datos... y cómo hay algunos scripts de publicidad que se llaman y demoran todo el conjunto, la web se queda unos segundos (que se hacen eternos) en blanco. Así que lo quité dejándolo sin comprimir. Así, almenos, el usuario ve que se le va renderizando la web sobre la marcha y no tiene la sensación de que el sitio está colgado.</p>
<p><strong>Más información:</strong></p>
<ul>
<li><a href="http://es.php.net/manual/es/ref.zlib.php" target="_blank">http://es.php.net/manual/es/ref.zlib.php</a></li>
<li><a href="http://www.pmichaud.com/wiki/Cookbook/OutputCompression"  target="_blank">http://www.pmichaud.com/wiki/Cookbook/OutputCompression</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/07/23/php-comprimir-la-salida-del-servidor-para-ahorrar-ancho-de-banda/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Autonombrado Ordenado: Ordenar y renombrar masivamente fotos, para Windows</title>
		<link>http://www.syntaxerror.es/2008/06/20/autonombrado-ordenado-ordenar-y-renombrar-masivamente-fotos-para-windows/</link>
		<comments>http://www.syntaxerror.es/2008/06/20/autonombrado-ordenado-ordenar-y-renombrar-masivamente-fotos-para-windows/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 08:27:34 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>Herramientas</category>

		<category>Windows</category>
<category>autonombrado ordenado</category><category>Fotos</category><category>Herramientas</category><category>Programación</category><category>Windows</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/06/20/autonombrado-ordenado-ordenar-y-renombrar-masivamente-fotos-para-windows/</guid>
		<description><![CDATA[Una de mis otras aficiones es la fotografía. Supongo que viendo mis proyectos de scripts y demás se nota un claro enfoque en hacerme la vida algo más fácil a la hora de organizar y publicar mis fotos.
Uno de los problemas más habituales aparece cuando tengo muchas fotos de varias cámaras tomadas del mismo viaje. [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image190" src="http://www.syntaxerror.es/wp-content/uploads/2008/06/autonombrado1.miniatura.jpg" alt="Autonombrado Ordenado" style="float:left;" />Una de mis otras aficiones es la fotografía. Supongo que viendo <a href="http://www.syntaxerror.es/proyectos/">mis proyectos</a> de scripts y demás se nota un claro enfoque en hacerme la vida algo más fácil a la hora de organizar y publicar mis fotos.</p>
<p>Uno de los problemas más habituales aparece cuando tengo muchas fotos de varias cámaras tomadas del mismo viaje. Al juntar las fotos y tratar de verlas me encuentro en que (obviamente) es casi imposible verlas respetando un órden cronológico. <em>Windows</em> permite ordenar por fecha de captura y luego visualizarlas correctamente, pero a la hora de hacer un redimensionado masivo se pierde la información de la ordenación y del <em>EXIF </em>(dónde se guarda la fecha de captura).</p>
<p>El sencillo programa que presento aquí recoge todas las fotos de una carpeta, las ordena por fecha de captura, y las renombra con un nombre general dado y un número de foto para hacerlas consecutivas. Así, una vez realizado el proceso podremos usar cualquier programa de tratamiento masivo, aunque pierda la información <em>EXIF</em>, porque ya las tendremos en el orden correcto.</p>
<p>Para más información y descargas del programa, visitad la página del proyecto: <a href="http://www.syntaxerror.es/proyectos/autonombrado-ordenado/"><strong>Autonombrado Ordenado</strong></a> <strong>v1.0</strong>, dónde también se encuentra el <strong>código fuente</strong> para <em>Visual Basic 2005</em>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/06/20/autonombrado-ordenado-ordenar-y-renombrar-masivamente-fotos-para-windows/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL: Problemas con JOINs entre versión 4 y 5</title>
		<link>http://www.syntaxerror.es/2008/04/11/mysql-problemas-con-joins-entre-version-4-y-5/</link>
		<comments>http://www.syntaxerror.es/2008/04/11/mysql-problemas-con-joins-entre-version-4-y-5/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 07:30:02 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>SQL</category>
<category>MySQL</category><category>Programación</category><category>SQL</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/04/11/mysql-problemas-con-joins-entre-version-4-y-5/</guid>
		<description><![CDATA[Este artículo puede sonar más bién a una llamada desesperada. Llevo unas semanas (por no decir un par de meses) liado con un proyecto que me consume más de lo que quisiera pero por respeto a la empresa no puedo desvelar casi nada. Y para colofón me aparece este problema que me está llevando de [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image183" src="http://www.syntaxerror.es/wp-content/uploads/2008/04/mysql.miniatura.jpg" alt="MySQL" style="float:left;" />Este artículo puede sonar más bién a una llamada desesperada. Llevo unas semanas (por no decir un par de meses) liado con un proyecto que me consume más de lo que quisiera pero por respeto a la empresa no puedo desvelar casi nada. Y para colofón me aparece este problema que me está llevando de cabeza.</p>
<p>Resulta que tengo una query... sencilla en concepto, un par de joins cruzados... La construyo en local contra MySQL 4 y funciona perfectamente... y al subirla al servidor de producción con MySQL 5 simplemente me devuelve <em>0 rows</em>. Estoy literalmente alucinando.</p>
<p><a id="more-182"></a></p>
<h2>Explicación del escenario</h2>
<p>Se trata de tres tablas con relación N:M, es decir, dos tablas principales y una que las une:</p>
<blockquote><p>
variables<br />
---------<br />
id (pk)<br />
name</p>
<p>var_questions<br />
-------------<br />
id (pk)<br />
id_variable (fk)<br />
id_language (fk)<br />
question</p>
<p>languages<br />
----------<br />
id (pk)<br />
name<br />
enabled
</p></blockquote>
<p>La tabla de variables contiene todas las <em>variables</em> registradas en el programa. La tabla <em>languages</em> contiene todos los idiomas disponibles en el programa. La tabla var_questions relaciona <em>variables</em> con <em>languages</em> y presenta el campo <em>question</em> que viene a ser el <em>texto de la variable en el idioma determinado</em>, es decir, para cada variable e idioma debe haber un texto.</p>
<p>Entonces yo necesito una <em>query</em> <strong>que me saque las inconsistencias</strong> (no las coincidencias), porque se trata de tablas <em>MyISAM</em> y en el proceso de desarrollo se puede haber creado un idioma sin haber generado ningún texto para él y para todas las variables. Mi query debe encontrar "lo que queda suelto".</p>
<h2>La query</h2>
<p>Usando la lógica (la mía, claro...) pensé: teniendo la lista de variables y la lista de idiomas, lo que debe presentar inconsistencias es la tabla intermedia. Entonces, podría hacer una query enlazando las <em>variables</em> con <em>var_questions</em> con un <em>left join</em> i la última con <em>languages</em> con un <em>right join</em>, para encontrar los <em>null</em>s en la tabla intermedia <em>var_questions</em>. Luego le digo en el where que sólo quiero los nulls <em>et violà</em>.</p>
<div class="igBar"><span id="lsql-14"><a href="#" onclick="javascript:showPlainTxt('sql-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">SQL:</span>
<div id="sql-14">
<div class="sql"><span style="color: #993333; font-weight: bold;">SELECT</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">VARIABLES</span>.name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> var_name,<br />
&nbsp; <span style="color: #993333; font-weight: bold;">VARIABLES</span>.id&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> var_id,<br />
&nbsp; var_questions.question&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> question,<br />
&nbsp; languages.name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> lang<br />
<span style="color: #993333; font-weight: bold;">FROM</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">VARIABLES</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> var_questions <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">VARIABLES</span>.id = var_questions.id_variable<br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">RIGHT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> languages <span style="color: #993333; font-weight: bold;">ON</span> var_questions.id_language = languages.id<br />
<span style="color: #993333; font-weight: bold;">WHERE</span><br />
&nbsp; &nbsp; var_questions.question <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
<span style="color: #993333; font-weight: bold;">AND</span> languages.enabled = <span style="color: #cc66cc;">1</span></div>
</div>
</div>
<p></p>
<p>La ejecuto en MySQL 4 y perfecto. Me saca justamente la información que necesito. Subo la query a producción, con un servidor MySQL 5 y me devuelve (con los mismos datos) <em>0 rows</em>. Y justo ahí empieza mi odisea.</p>
<h2>Investigando</h2>
<p>La verdad es que poco más puedo investigar a parte de lo que haríamos todos: Googlear mucho, buscar problemas de compatibilidad, buscar documentación de JOINs, preguntar a cracks en el tema, dejar <a href="http://www.forosdelweb.com/f86/problema-compatibilidad-joins-mysql4-mysql5-573653/" target="_blank" title="Foros del web: Problema de compatibilidad JOINS MySQL4 - MySQL5?">mensajes en foros</a>, ...</p>
<p>Las versiones con las que juego son, en local, un <strong>MySQL 4.1.22-community-nt</strong> sobre <em>Windows Vista</em>, y en producción un <strong>MySQL 5.0.24a</strong> sobre <em>Linux 2.6.9-023stab046.2-enterprise (Red Hat 3.4.5-2)</em>. </p>
<p>Durante las pruebas he encontrado una query que parece devolver los mismos resultados, pero no me gusta por el simple hecho que usa una <em>CROSS JOIN</em> que no podría explicar exactamente qué hace, pero parece hacer una producto cartesiano de las tablas enlazadas y no acepta un <em>ON</em>:</p>
<div class="igBar"><span id="lsql-15"><a href="#" onclick="javascript:showPlainTxt('sql-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">SQL:</span>
<div id="sql-15">
<div class="sql"><span style="color: #993333; font-weight: bold;">SELECT</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">VARIABLES</span>.name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> var_name,<br />
&nbsp; var_questions.question&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> question,<br />
&nbsp; languages.name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AS</span> lang<br />
<span style="color: #993333; font-weight: bold;">FROM</span><br />
&nbsp; languages<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">CROSS</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #993333; font-weight: bold;">VARIABLES</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> var_questions <span style="color: #993333; font-weight: bold;">ON</span> var_questions.id_language = languages.id<br />
<span style="color: #993333; font-weight: bold;">WHERE</span><br />
&nbsp; &nbsp; var_questions.question <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
<span style="color: #993333; font-weight: bold;">AND</span> languages.enabled = <span style="color: #cc66cc;">1</span></div>
</div>
</div>
<p></p>
<h2>Cómo probar?</h2>
<p>Tengo unos datos preparados por si alguien quiere hacer algunas pruebas (que serán agradecidas profundamente):</p>
<div class="igBar"><span id="lsql-16"><a href="#" onclick="javascript:showPlainTxt('sql-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">SQL:</span>
<div id="sql-16">
<div class="sql"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`variables`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><br />
&nbsp; <span style="color: #ff0000;">`id`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span>,<br />
&nbsp; <span style="color: #ff0000;">`name`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span> collate latin1_spanish_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span>,<br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>&nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">&#41;</span> ENGINE=MyISAM <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET=latin1 COLLATE=latin1_spanish_ci;</p>
<p><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`languages`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><br />
&nbsp; <span style="color: #ff0000;">`id`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span>,<br />
&nbsp; <span style="color: #ff0000;">`name`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span> collate latin1_spanish_ci <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span>,<br />
&nbsp; <span style="color: #ff0000;">`enabled`</span> tinyint<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span>,<br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>&nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">&#41;</span> ENGINE=MyISAM <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET=latin1 COLLATE=latin1_spanish_ci;</p>
<p><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`var_questions`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><br />
&nbsp; <span style="color: #ff0000;">`id`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span>,<br />
&nbsp; <span style="color: #ff0000;">`id_variable`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span>,<br />
&nbsp; <span style="color: #ff0000;">`id_language`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span>,<br />
&nbsp; <span style="color: #ff0000;">`question`</span> text collate latin1_spanish_ci,<br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>&nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">&#41;</span> ENGINE=MyISAM <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span>=<span style="color: #cc66cc;">163</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET=latin1 COLLATE=latin1_spanish_ci;</p>
<p><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`languages`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span>, <span style="color: #ff0000;">`enabled`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #ff0000;">'es'</span>, <span style="color: #cc66cc;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`languages`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span>, <span style="color: #ff0000;">`enabled`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">4</span>, <span style="color: #ff0000;">'ca'</span>, <span style="color: #cc66cc;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`languages`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span>, <span style="color: #ff0000;">`enabled`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">5</span>, <span style="color: #ff0000;">'en'</span>, <span style="color: #cc66cc;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`variables`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">56</span>, <span style="color: #ff0000;">'var_1'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`variables`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">60</span>, <span style="color: #ff0000;">'var_2'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`variables`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`name`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">61</span>, <span style="color: #ff0000;">'var_3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`var_questions`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`id_variable`</span>, <span style="color: #ff0000;">`id_language`</span>, <span style="color: #ff0000;">`question`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">157</span>, <span style="color: #cc66cc;">56</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #ff0000;">'Variable 1'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`var_questions`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`id_variable`</span>, <span style="color: #ff0000;">`id_language`</span>, <span style="color: #ff0000;">`question`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">158</span>, <span style="color: #cc66cc;">60</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #ff0000;">'Variable 2'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`var_questions`</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff0000;">`id`</span>, <span style="color: #ff0000;">`id_variable`</span>, <span style="color: #ff0000;">`id_language`</span>, <span style="color: #ff0000;">`question`</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">159</span>, <span style="color: #cc66cc;">61</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #ff0000;">'Variable 3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>El resultado correcto debería ser el siguiente:</p>
<table>
<tr>
<td><b>var_name</b></td>
<td><b>var_id</b></td>
<td><b>question</b></td>
<td><b>lang</b></td>
</tr>
<tr>
<td>var_1</td>
<td>56</td>
<td>null</td>
<td>ca</td>
</tr>
<tr>
<td>var_2</td>
<td>60</td>
<td>null</td>
<td>ca</td>
</tr>
<tr>
<td>var_3</td>
<td>61</td>
<td>null</td>
<td>ca</td>
</tr>
</table>
<h2>Colofón</h2>
<p>Vale. No soy capaz de encontrar el problema. Será un problema de algún bug en la versión que uso para producción? Está mal planteada la query? A alguien se le ocurre algo?</p>
<p>Una cervecita para quien dé con la solución <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Salu10
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/04/11/mysql-problemas-con-joins-entre-version-4-y-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SimpleXML para PHP4</title>
		<link>http://www.syntaxerror.es/2008/02/11/simplexml-para-php4/</link>
		<comments>http://www.syntaxerror.es/2008/02/11/simplexml-para-php4/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:33:20 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>PHP</category>
<category>Backport</category><category>PHP</category><category>Programación</category><category>SimpleXML</category><category>XML</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/02/11/simplexml-para-php4/</guid>
		<description><![CDATA[De un tiempo a ésta parte el formato XML se ha vuelto imprescindible para implementar protocolos de intercambio de datos entre sistemas y lenguajes.
Todos los lenguajes incorporan parsers con los que poder leer y generar XMLs de una forma más o menos amena. Con la evolución de PHP a su versión 5 apareció una extensión [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image173" src="http://www.syntaxerror.es/wp-content/uploads/2008/02/xml_200.miniatura.gif" alt="XML" style="float:left;" />De un tiempo a ésta parte el formato <em>XML</em> se ha vuelto imprescindible para implementar protocolos de intercambio de datos entre sistemas y lenguajes.</p>
<p>Todos los lenguajes incorporan <em>parser</em>s con los que poder leer y generar <em>XML</em>s de una forma más o menos amena. Con la evolución de <em>PHP</em> a su versión 5 apareció una extensión llamada <em><a href="http://es.php.net/simplexml" target="_blank"><strong>SimpleXML</strong></a></em> que, con un funcionamiento al estilo de objetos, simplificaba el acceso a los datos abandonando el método de llamadas a ciertas funciones al encontrar tags de apertura y cierre en el archivo <em>XML</em>.</p>
<p>Es una forma muy cómoda de trabajar es muy fácil acostumbrarse, pero a veces nos encontramos con hostings sólo en <em>PHP </em>4 y nos vemos obligados a programar <em>parsers </em>a la vieja usanza. </p>
<p>Recientemente encontré una portabilidad de <a href="http://www.ister.org/code/simplexml44/index.html" target="_blank"><em><strong>SimpleXML</strong></em> para <em>PHP 4</em></a> que, aunque no dispone de absolutamente toda la funcionalidad de la extensión original (sobretodo al generar <em>XML</em> de salida), suple perfectamente la necesidad.</p>
<p><a id="more-154"></a></p>
<p><strong>SimpleXML44</strong> es el nombre de este <em>backport</em> de la extensión <em>SimpleXML</em> (escrito en <em>PHP5</em>) a <em>PHP4</em>. Según la web del autor, simplifica y optimiza el acceso a los datos y permite cambios en nodos <em>CDATA</em> y atributos, pero no es posible agregar o borrar ciertos nodos del árbol <em>DOM</em>. En mi toma de contacto (sólo lectura) cumplió perfectamente mis expectativas y ya lo tengo en mi biblioteca de paquetes de programación PHP.</p>
<p>Está escrito íntegramente en <em>PHP</em>. <strong>Requiere la versión de PHP 4.4.2 o superior y tener instalada la extensión XML Parser (Expat)</strong>. La licencia es de tipo <em>BSD</em>. Actualmente forma parte del <a href="http://www.ister.org/code/ister/index.html" target="_blank">Ister PHP4 Framework</a> aunque es posible descargarlo atómicamente, con lo que facilita nuestro desarrollo en nuestro propio framework.</p>
<p>Se puede <a href="http://prdownloads.sourceforge.net/ister4framework/simplexml44-0_4_4.tar.gz?download" target="_blank">descargar desde SourgeForge</a>. La <a href="http://www.ister.org/code/simplexml44/doc.html" target="_blank">documentación del SimpleXML44</a> es algo limitada, pues se dan pocos ejemplos, pero habiendo usado el <em>SimpleXML</em> original nos hacemos una idea rápida de su funcionamiento.</p>
<p><strong>Ejemplo de funcionamiento</strong></p>
<p>Vamos a suponer un ejemplo rápido para ver lo simple que es. Pongamos que tenemos un archivo XML de la siguiente forma, guardado como '<em>clientes.xml</em>' en la raíz:</p>
<div class="igBar"><span id="lxml-21"><a href="#" onclick="javascript:showPlainTxt('xml-21'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-21">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">"1.0"</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">"utf-8"</span> <span style="color: #000066;">standalone</span>=<span style="color: #ff0000;">"yes"</span>?<span style="font-weight: bold; color: black;">&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;clientes<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;cartera<span style="font-weight: bold; color: black;">&gt;</span></span></span>50011<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/cartera<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;cliente</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"101"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;nombre<span style="font-weight: bold; color: black;">&gt;</span></span></span>Pepito<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/nombre<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;apellidos<span style="font-weight: bold; color: black;">&gt;</span></span></span>Perez Garcia<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/apellidos<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;mail<span style="font-weight: bold; color: black;">&gt;</span></span></span>pepito@hotmail.com<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/mail<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/cliente<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;cliente</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"201"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;nombre<span style="font-weight: bold; color: black;">&gt;</span></span></span>Juan<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/nombre<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;apellidos<span style="font-weight: bold; color: black;">&gt;</span></span></span>Apellido1 Apellido2<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/apellidos<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;mail<span style="font-weight: bold; color: black;">&gt;</span></span></span>juan@hotmail.com<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/mail<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/cliente<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/clientes<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<p>Pues bién, lo primero es descomprimir el archivo bajado en un directorio, donde queramos, por ejemplo en <em>/simplexml44</em>. En el script PHP pondremos lo siguiente:</p>
<div class="igBar"><span id="lphp-22"><a href="#" onclick="javascript:showPlainTxt('php-22'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-22">
<div class="php"><span style="color:#FF9933; font-style:italic;">//Incluimos el paquete SimpleXML44</span><br />
<span style="color:#616100;">require_once</span> <span style="color:#FF0000;">'simplexml44/IsterXmlSimpleXMLImpl.php'</span>;</p>
<p><span style="color:#FF9933; font-style:italic;">//Creamos el objeto principal</span><br />
<span style="color:#0000FF;">$xml_object</span> = <span style="color:#000000; font-weight:bold;">new</span> IsterXmlSimpleXMLImpl;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<span style="color:#FF9933; font-style:italic;">//Cargamos el documento a parsear</span><br />
<span style="color:#0000FF;">$doc</span> = <span style="color:#0000FF;">$xml_object</span>-&gt;<span style="color:#006600;">load_file</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'clientes.xml'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p><span style="color:#FF9933; font-style:italic;">//Printamos la cartera</span><br />
<a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Cartera: '</span>.<span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cartera</span>-&gt;<span style="color:#006600;">CDATA</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">'&lt;br&gt;'</span>;</p>
<p><span style="color:#FF9933; font-style:italic;">//Recorremos los clientes y printamos su info</span><br />
<span style="color:#616100;">foreach</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cliente</span> <span style="color:#616100;">as</span> <span style="color:#0000FF;">$cliente</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">//Atributo ID</span><br />
&nbsp; &nbsp; <span style="color:#0000FF;">$atributos</span> = <span style="color:#0000FF;">$cliente</span>-&gt;<span style="color:#006600;">attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'ID: '</span>.<span style="color:#0000FF;">$atributos</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'id'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#FF0000;">'&lt;br&gt;'</span>;</p>
<p>&nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">//Campos</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Nombre Completo: '</span>.<span style="color:#0000FF;">$cliente</span>-&gt;<span style="color:#006600;">nombre</span>-&gt;<span style="color:#006600;">CDATA</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">' '</span>.<span style="color:#0000FF;">$cliente</span>-&gt;<span style="color:#006600;">apellidos</span>-&gt;<span style="color:#006600;">CDATA</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">'&lt;br&gt;'</span>;<br />
&nbsp; &nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'e-mail: '</span>.<span style="color:#0000FF;">$cliente</span>-&gt;<span style="color:#006600;">mail</span>-&gt;<span style="color:#006600;">CDATA</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">'&lt;br&gt;'</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Como vemos, es una forma de trabajar similar al <em>SimpleXML</em> original, muy sencilla e intuitiva.</p>
<p><strong>Notas a tener en cuenta</strong></p>
<ul>
<li>Cada elemento hijo es un objeto.</li>
<li>Para extraer la información de un elemento se usa <em>$elemento->CDATA()</em>, aunque el campo no esté definido como CDATA.</li>
<li>Si un elemento tiene atributos, usando <em>$elemento->attributes()</em> obtenemos un array asociativo dónde la clave es el nombre del atributo y el valor es el valor del atributo.</li>
<li>Si un elemento está repetido (en nuestro caso el elemento 'cliente') en vez de un objeto se devuelve un <em>array </em>de objetos (en nuestro caso, un array de objetos 'cliente').</li>
<li>Si esperábamos un <em>array</em> de elementos pero sólo tenemos un sólo elemento, no se nos devuelve el <em>array</em> (lógico) y nuestro script puede fallar al esperar un <em>array</em> que no existe. La forma de manejarlo es mirando si es un <em>array</em> y si no lo es, poner el elemento dentro de un <em>array</em>:
<div class="igBar"><span id="lphp-23"><a href="#" onclick="javascript:showPlainTxt('php-23'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-23">
<div class="php"><span style="color:#616100;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>!<a href="http://www.php.net/is_array"><span style="color:#000066;">is_array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cliente</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#0000FF;">$aux</span> = <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cliente</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#616100;">else</span> <span style="color:#0000FF;">$aux</span> = <span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cliente</span>;</div>
</div>
</div>
<p></li>
<li>Si no es seguro que un elemento venga dado en el <em>XML</em> de origen, podemos preguntar si existe con <em>isset()</em>:
<div class="igBar"><span id="lphp-24"><a href="#" onclick="javascript:showPlainTxt('php-24'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-24">
<div class="php"><span style="color:#616100;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/isset"><span style="color:#000066;">isset</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$doc</span>-&gt;<span style="color:#006600;">clientes</span>-&gt;<span style="color:#006600;">cartera</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> ...</div>
</div>
</div>
<p></li>
</ul>
<p><strong>Los errores que devuelve SimpleXML44</strong></p>
<p><em>SimpleXML44</em> devuelve errores si los encuentra. Tanto si el archivo de entrada no existe, como si hay algun fallo en el <em>XML</em>, devuelve un error al estilo <em>Warning</em> que no es enviado al <em>log</em>, sino que se muestra por pantalla en una forma un tanto peculiar. </p>
<p>Si no encuentra el archivo muestra por pantalla la ruta dónde debería estar, sin más, algo cómo:</p>
<blockquote><p>
/ruta/al/archivo.xml
</p></blockquote>
<p>Si el código del script hacer referencia a un elemento que no existe y no lo hemos protegido con el isset() se quejará devolviendo un <em>Fatal Error</em> así:</p>
<blockquote><p>
Fatal error: Call to a member function on a non-object in /var/www/script.php on line xx
</p></blockquote>
<p>Si el XML no está bién formado devolverá un <em>Warning</em> propio al estilo:</p>
<blockquote><p>
WARNING isterxmlexpatnonvalid->parse(): expat: mismatched tag [217021/43/1846]
</p></blockquote>
<p>dónde los números entre los corchetes significan lo siguiente:</p>
<ul>
<li>El primero: Posición del Byte dónde está el error</li>
<li>El segundo: Columna en el archivo XML donde está el error</li>
<li>El tercero: Línia en el archivo XML donde está el error</li>
</ul>
<p><strong>Conclusión</strong></p>
<p><strong><em>SimpleXML44</em></strong> es una portabilidad a <em>PHP4</em> que nos permite la comodidad de la extensión <em>SimpleXML</em> de <em>PHP5</em>. Algo limitada y sufrida con los errores, pero versátil y fácil de usar. Si debes portar una aplicación a <em>PHP4</em> a causa de las limitaciones que el servidor dónde te hospedas, usas <em>XML</em> y estás acostumbrado al <em>SimpleXML</em> original, dále un vistazo que puede ser muy útil.</p>
<p>Salu10
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/02/11/simplexml-para-php4/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHPBarcelona.org se estrena en la blogosfera</title>
		<link>http://www.syntaxerror.es/2008/01/17/phpbarcelonaorg-se-estrena-en-la-blogosfera/</link>
		<comments>http://www.syntaxerror.es/2008/01/17/phpbarcelonaorg-se-estrena-en-la-blogosfera/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 09:18:27 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>General</category>

		<category>Programación</category>

		<category>PHP</category>
<category>General</category><category>PHP</category><category>PHPBarcelona.org</category><category>Programación</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/01/17/phpbarcelonaorg-se-estrena-en-la-blogosfera/</guid>
		<description><![CDATA[El pasado lunes recibimos el anuncio de Oriol que el portal PHPBarcelona.org abría ya sus puertas.
PHPBarcelona.org se convierte así en la parte visible del grupo que nos estamos juntando poco a poco, con un par de puntos en común: ser de Barcelona y programar en PHP. 
Después de un tiempo comunicándonos mediante la lista de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phpbarcelona.org" target="_blank"><img id="image171" src="http://www.syntaxerror.es/wp-content/uploads/2008/01/phpbarcelona.jpg" alt="PHPBarcelona.org" style="float:left;" /></a>El pasado lunes recibimos el anuncio de <a href="http://www.phpbsd.net" target="_blank">Oriol</a> que el portal <a href="http://phpbarcelona.org" target="_blank"><strong>PHPBarcelona.org</strong></a> abría ya sus puertas.<br />
<strong>PHPBarcelona.org</strong> se convierte así en la parte visible del grupo que nos estamos juntando poco a poco, con un par de puntos en común: <strong>ser de Barcelona y programar en PHP</strong>. </p>
<p>Después de un tiempo comunicándonos mediante la lista de correo, un par de quedadas birreras para romper el hielo y una primera conferencia en el horizonte, uno se alegra de tener por fin una web en el aire y le deseo un buen SEO para el 2008 <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Si programas en PHP y eres de Barcelona no puedes dejar escapar ésta oportunidad de conocer más programadores como tú e intercambiar opiniones y métodos.</p>
<p>Salu10.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/01/17/phpbarcelonaorg-se-estrena-en-la-blogosfera/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Joomla: Títulos HTML personalizables por página</title>
		<link>http://www.syntaxerror.es/2008/01/14/joomla-titulos-html-personalizables-por-pagina/</link>
		<comments>http://www.syntaxerror.es/2008/01/14/joomla-titulos-html-personalizables-por-pagina/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 14:02:31 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>PHP</category>

		<category>Joomla</category>
<category>General</category><category>Joomla</category><category>patch</category><category>PHP</category><category>Programación</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/01/14/joomla-titulos-html-personalizables-por-pagina/</guid>
		<description><![CDATA[Siguiendo con los artículos de customización de Joomla entramos en otro tema controvertido: los títulos HTML en las páginas. Estos títulos que normalmente incluiríamos en la sección HEAD de una página web se determina automáticamente según el título del artículo o de la sección en la que estemos. Como mucho podemos especificar que Joomla agregue [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image170" src="http://www.syntaxerror.es/wp-content/uploads/2008/01/que-es-joomla_joomla_tra.miniatura.jpg" alt="Joomla" style="float:left;" />Siguiendo con los artículos de customización de Joomla entramos en otro tema controvertido: los <em>títulos HTML</em> en las páginas. Estos títulos que normalmente incluiríamos en la sección <em>HEAD</em> de una página web se determina automáticamente según el título del artículo o de la sección en la que estemos. Como mucho podemos especificar que Joomla agregue el título del sitio después del título del contenido, pero en ningún caso es completamente editable.<br />
Éso comporta algún problema a nivel de <em>SEO</em>, no mucho si no nos preocupa, pero en mi caso el cliente quiere tener el <strong>control total sobre el título HTML que se muestra</strong>.<br />
Así que siguiendo <a href="http://forum.joomla.org/index.php?topic=36681.0" target="_blank">un pequeño tutorial en el foro de Joomla.org</a> y algunas pinceladas mías he escrito un <em>HowTo</em> en castellano para poder personalizar totalmente dicho título HTML... y encima añadir su soporte al componente <em>JoomFish</em> de traducciones.</p>
<p><a id="more-169"></a></p>
<p>En primer lugar cabe decir que antes de meterme con ésto intenté la solución de Joomla SEF Patch creyendo (erróneamente) que me permitiría tener el control sobre los títulos HTML, así que puede que los números de línea sean incorrectos y es por éso que hago referencia a los nombres de las funciones y métodos, con su estado inicial.</p>
<p><strong>1.- Crear un campo nuevo en la lista de parámetros</strong><br />
El primer paso es añadir un parámetro nuevo a la lista de parámetros de los componentes que nos interesen para poder personalizar el título. El texto a introducir es la definición del nuevo campo que se añadirá:</p>
<blockquote><p>
&lt;param name="title_cust" type="text" size="20" default="" label="Título de la página" description="Un título personalizado a aplicar a la página, ésto permite títulos individuales por página" /&gt;
</p></blockquote>
<p>Los archivos que deberemos editar son los <em>XML</em>s de configuración de los componentes a los que querremos personalizar el título <em>HTML</em>. En mi caso he pecado de "lo hago en todos", pero normalmente se querrá editar solamente los <em>XML</em>s de los contenidos dinámicos (<em>com_content</em>) y estáticos (<em>com_typedcontent</em>). La lista entera es la siguiente:</p>
<blockquote><p>
-> administrator/components/com_menus/component_item_link/component_item_link.xml<br />
-> administrator/components/com_banners/banners.xml<br />
-> administrator/components/com_banners/com_contact/contact.xml<br />
-> administrator/components/com_banners/com_contact/contact_items.xml<br />
-> administrator/components/com_content/content.xml<br />
-> administrator/components/com_frontpage/frontpage.xml<br />
-> administrator/components/com_login/login.xml<br />
-> administrator/components/com_massmail/massmail.xml<br />
-> administrator/components/com_media/media.xml<br />
-> administrator/components/com_menumanager/menumanager.xml<br />
-> administrator/components/com_newsfeeds/newsfeeds.xml<br />
-> administrator/components/com_poll/poll.xml<br />
-> administrator/components/com_search/search.xml<br />
-> administrator/components/com_syndicate/syndicate.xml<br />
-> administrator/components/com_trash/trash.xml<br />
-> administrator/components/com_typedcontent/typedcontent.xml<br />
-> administrator/components/com_users/users.xml<br />
-> administrator/components/com_weblinks/weblinks.xml<br />
-> administrator/components/com_weblinks/weblinks_item.xml<br />
En principio en todos los componentes de administrator/components que tengan un archivo de configuración XML
</p></blockquote>
<p>Ahora aparecerá un campo más en los parámetros de los componentes editados, pero aún no hará nada <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>2.- Editar la llamada al setado del título</strong><br />
El setado del título se hace llamando a un método del objeto que construye la página. Este método se llama simplemente pasándole el título pero ahora necesitamos que reciba también la lista de parámetros para que recoja el título que le hemos especificado.<br />
Para ello tenemos que editar el archivo <em>components/com_content/content.php</em> y sobre la línea 1676 encontramos el siguiente código:</p>
<div class="igBar"><span id="lphp-31"><a href="#" onclick="javascript:showPlainTxt('php-31'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-31">
<div class="php"><span style="color:#FF9933; font-style:italic;">// page title</span><br />
<span style="color:#0000FF;">$mainframe</span>-&gt;<span style="color:#006600;">setPageTitle</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p>
Debemos modificarlo para que acepte también los parámetros:</p>
<div class="igBar"><span id="lphp-32"><a href="#" onclick="javascript:showPlainTxt('php-32'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-32">
<div class="php"><span style="color:#FF9933; font-style:italic;">// page title</span><br />
<span style="color:#0000FF;">$mainframe</span>-&gt;<span style="color:#006600;">setPageTitle</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span>, <span style="color:#0000FF;">$params</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p><strong>3.- Editar la función de setado del título</strong><br />
Ahora la función recibirá los parámetros. Debemos modificarla para que los acepte correctamente y recoja el posible título setado, si existe, y lo defina como tal. Para ello editamos el archivo <em>includes/joomla.php</em> y buscamos la declaración del método <em>setPageTitle()</em> que está dentro de la clase <em>mosMainFrame</em> sobre la línea 507:</p>
<div class="igBar"><span id="lphp-33"><a href="#" onclick="javascript:showPlainTxt('php-33'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-33">
<div class="php"><span style="color:#000000; font-weight:bold;">function</span> setPageTitle<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$title</span>=<span style="color:#000000; font-weight:bold;">null</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>@<span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_pagetitles'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$title</span> = <a href="http://www.php.net/trim"><span style="color:#000066;">trim</span></a><span style="color:#006600; font-weight:bold;">&#40;</span> <a href="http://www.php.net/htmlspecialchars"><span style="color:#000066;">htmlspecialchars</span></a><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$title</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$title</span> = <a href="http://www.php.net/stripslashes"><span style="color:#000066;">stripslashes</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$title</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$this</span>-&gt;_head<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'title'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF;">$title</span> ? <span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_sitename'</span><span style="color:#006600; font-weight:bold;">&#93;</span> . <span style="color:#FF0000;">' - '</span>. <span style="color:#0000FF;">$title</span> : <span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_sitename'</span><span style="color:#006600; font-weight:bold;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p>
Sustituiremos la función por la siguiente. Debemos poner especial atención en la propia declaración del método, que ahora debe aceptar un segundo parámetro, que serán los parámetros definidos en la administración (valga la redundancia):</p>
<div class="igBar"><span id="lphp-34"><a href="#" onclick="javascript:showPlainTxt('php-34'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-34">
<div class="php"><span style="color:#000000; font-weight:bold;">function</span> setPageTitle<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$title</span>=<span style="color:#000000; font-weight:bold;">null</span>, <span style="color:#0000FF;">$params</span>=<span style="color:#000000; font-weight:bold;">null</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>@<span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_pagetitles'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$params</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$custom_title</span> = <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">def</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'title_cust'</span>, <span style="color:#FF0000;">''</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/global"><span style="color:#000066;">global</span></a> <span style="color:#0000FF;">$database</span>, <span style="color:#0000FF;">$mainframe</span>, <span style="color:#0000FF;">$Itemid</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$params</span> = <span style="color:#000000; font-weight:bold;">new</span> stdClass<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$Itemid</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$menu</span> = <span style="color:#000000; font-weight:bold;">new</span> mosMenu<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$database</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$menu</span>-&gt;<span style="color:#006600;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$Itemid</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$params</span> = <span style="color:#000000; font-weight:bold;">new</span> mosParameters<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$menu</span>-&gt;<span style="color:#006600;">params</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$menu</span> = <span style="color:#FF0000;">""</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$params</span> = <span style="color:#000000; font-weight:bold;">new</span> mosParameters<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">''</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$custom_title</span> = <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">def</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'title_cust'</span>, <span style="color:#FF0000;">''</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$title</span> = <span style="color:#0000FF;">$custom_title</span> ? <span style="color:#0000FF;">$custom_title</span> : <span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_sitename'</span><span style="color:#006600; font-weight:bold;">&#93;</span> . <span style="color:#FF0000;">' - '</span>. <span style="color:#0000FF;">$title</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$title</span> = <a href="http://www.php.net/trim"><span style="color:#000066;">trim</span></a><span style="color:#006600; font-weight:bold;">&#40;</span> <a href="http://www.php.net/htmlspecialchars"><span style="color:#000066;">htmlspecialchars</span></a><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$title</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$title</span> = <a href="http://www.php.net/stripslashes"><span style="color:#000066;">stripslashes</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$title</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$this</span>-&gt;_head<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'title'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF;">$title</span> ? <span style="color:#0000FF;">$title</span> : <span style="color:#0000FF;">$GLOBALS</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'mosConfig_sitename'</span><span style="color:#006600; font-weight:bold;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p>
Si nos fijamos, lo que hemos añadido es un checkeo para ver si recibimos el nuevo parámetro <em>$params</em>, y si es así recogemos el parámetro '<em>title_cust</em>'. Si no intentará generar los parámetros según el estado actual del <em>Item</em> a mostrar para recoger el título definido. Y si aún así no hay título, pues setará el título que <em>Joomla</em> ya hacía de por sí.</p>
<p><strong>4.- Asegurarnos que siempre se sete el título</strong><br />
Siguiendo el threat del tutorial original ví que no siempre se setaba el título. La forma para obligar siempre a setar el título pasa por llamar al método <em>setPageTitle()</em> justo después de crear el objeto que se encarga de montar la página. Así, editamos el archivo <em>index.php</em> situado en la raíz del Joomla (ojo, no el de la plantilla!) y sobre la línea 105 tenemos la inicialización del objeto <em>MainFrame</em>:</p>
<div class="igBar"><span id="lphp-35"><a href="#" onclick="javascript:showPlainTxt('php-35'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-35">
<div class="php"><span style="color:#FF9933; font-style:italic;">// mainframe is an API workhorse, lots of 'core' interaction routines</span><br />
<span style="color:#0000FF;">$mainframe</span> = <span style="color:#000000; font-weight:bold;">new</span> mosMainFrame<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$database</span>, <span style="color:#0000FF;">$option</span>, <span style="color:#FF0000;">'.'</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#0000FF;">$mainframe</span>-&gt;<span style="color:#006600;">initSession</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p>
Justo debajo añadiremos la siguiente línea:</p>
<div class="igBar"><span id="lphp-36"><a href="#" onclick="javascript:showPlainTxt('php-36'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-36">
<div class="php"><span style="color:#0000FF;">$mainframe</span>-&gt;<span style="color:#006600;">setPageTitle</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Una vez realizado ésto ya podremos personalizar los títulos <em>HTML</em> de nuestras páginas.</p>
<p><strong>5.- Añadir soporte para JoomFish</strong><br />
Si tenemos una web multilingüe nos daremos cuenta que no es correcto tener el contenido en un idioma y el título en otro... Para solucionar ésto debemos dar soporte a la traducción de los parámetros en la pantalla de traducción del <em>JoomFish</em>. Deacuerdo, no es muy correcto poder "traducir" todo el objeto de parámetros, pero digamos que es la forma fácil/rápida de darle soporte.<br />
Para ello debemos añadir un nuevo campo en el archivo de configuración de la plantilla de traducción de contenido de <em>JoomFish</em>, editando el archivo <em>XML administrator/components/com_joomfish/contentelements/content.xml</em> y añadiendo la línea siguiente:</p>
<blockquote><p>
&lt;field type="textarea" name="attribs" translate="1"&gt;Attributes (inc. Title Custom)&lt;/field&gt;
</p></blockquote>
<p>Y dado que no sólo hemos editado los componentes de contenido sino que también otros componentes (ver paso 1) deberemos dar soporte también a ésos tipos de elementos en las traducciones añadiendo la siguiente línea:</p>
<blockquote><p>
&lt;field type="textarea" name="params" translate="1"&gt;Atributos (inc. Title Custom)&lt;/field&gt;
</p></blockquote>
<p>en los siguientes archivos:</p>
<blockquote><p>
-> administrator/components/com_joomfish/contentelements/category.xml<br />
-> administrator/components/com_joomfish/contentelements/contact.xml<br />
-> administrator/components/com_joomfish/contentelements/newsfeeds.xml<br />
-> administrator/components/com_joomfish/contentelements/polls.xml<br />
-> administrator/components/com_joomfish/contentelements/section.xml<br />
-> administrator/components/com_joomfish/contentelements/weblinks.xml
</p></blockquote>
<p>Y ya tenemos soporte para la traducción del título. ¿Cómo lo traduciremos? Pues bién, al entrar en la traducción de un elemento, por ejemplo, un contenido, veremos una sección más debajo de todo dónde se vuelca todo el contenido de los parámetros. Uno de ellos es el título llamado <em>title_cust</em>. Debemos copiar <strong>TODO EL OBJETO</strong> y pegarlo en la caja de texto, <strong>separando cada parámetro por un salto de línea</strong>, y luego procedemos a traducir el título al idioma deseado.<br />
Guardamos y listo!</p>
<p>Saludos.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/01/14/joomla-titulos-html-personalizables-por-pagina/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Joomla: Imágenes con atributo title personalizado</title>
		<link>http://www.syntaxerror.es/2008/01/06/joomla-imagenes-con-atributo-title-personalizado/</link>
		<comments>http://www.syntaxerror.es/2008/01/06/joomla-imagenes-con-atributo-title-personalizado/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 22:22:42 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Javascript</category>

		<category>Programación</category>

		<category>PHP</category>

		<category>Joomla</category>
<category>Javascript</category><category>Joomla</category><category>patch</category><category>PHP</category><category>Programación</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/01/06/joomla-imagenes-con-atributo-title-personalizado/</guid>
		<description><![CDATA[Las imágenes en el contenido de Joomla se insertan mediante un tag {mosimage}. En las propiedades de la imagen que podemos ajustar desde una de las pestañas del panel de la derecha podemos ajustar muchos parámetros, que se guardarán todos en un mismo campo de la base de datos separados por el carácter "pipe". Desgraciadamente [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image167" src="http://www.syntaxerror.es/wp-content/uploads/2008/01/joomla1.miniatura.jpg" alt="Joomla" style="float:left;" />Las imágenes en el contenido de Joomla se insertan mediante un tag {mosimage}. En las propiedades de la imagen que podemos ajustar desde una de las pestañas del panel de la derecha podemos ajustar muchos parámetros, que se guardarán todos en un mismo campo de la base de datos separados por el carácter "<em>pipe</em>". Desgraciadamente sólo se guarda un sólo texto descriptivo para la imagen propiamente, que se usará tanto para el atributo <em>alt</em> como para el atributo <em>title</em>.<br />
A continuación voy a explicar qué modificaciones internas son necesarias para tener el campo <em>title</em> y <em>alt</em> separados y personalizables.</p>
<p><a id="more-168"></a></p>
<p><strong>1.- Modificación de las plantillas</strong></p>
<p>Primero de todo debemos modificar las plantillas de la administración para insertar un campo de texto nuevo que será el que controle el atributo <em>title</em>. Debemos hacerlo tanto para el contenido normal como para el contenido estático:</p>
<p><em>Contenido normal</em>:<br />
Editamos el archivo <em>administrator/components/com_content/admin.content.html.php</em> y sobre la línea 890, debajo del <em>TR</em> del texto de la etiqueta, insertar:</p>
<div class="igBar"><span id="lphp-46"><a href="#" onclick="javascript:showPlainTxt('php-46'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-46">
<div class="php">&lt;tr&gt;<br />
&nbsp; &nbsp; &lt;td align=<span style="color:#FF0000;">"right"</span>&gt;<br />
&nbsp; &nbsp; Texto del t&amp;iacute;tulo<br />
&nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &lt;td&gt;<br />
&nbsp; &nbsp; &lt;input <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"text_area"</span> type=<span style="color:#FF0000;">"text"</span> name=<span style="color:#FF0000;">"_title"</span> value=<span style="color:#FF0000;">""</span> /&gt;<br />
&nbsp; &nbsp; &lt;/td&gt;<br />
&lt;/tr&gt;</div>
</div>
</div>
<p></p>
<p><em>Contenido estático</em>:<br />
Editamos el archivo <em>administrator/components/com_typedcontent/admin.typedcontent.html.php</em> y sobre la línea 636, debajo del <em>TR</em> del texto de la etiqueta, insertar:</p>
<div class="igBar"><span id="lphp-47"><a href="#" onclick="javascript:showPlainTxt('php-47'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-47">
<div class="php">&lt;tr&gt;<br />
&nbsp; &nbsp; &lt;td align=<span style="color:#FF0000;">"right"</span>&gt;<br />
&nbsp; &nbsp; Texto del t&amp;iacute;tulo<br />
&nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &lt;td&gt;<br />
&nbsp; &nbsp; &lt;input type=<span style="color:#FF0000;">"text"</span> name=<span style="color:#FF0000;">"_title"</span> value=<span style="color:#FF0000;">""</span> /&gt;<br />
&nbsp; &nbsp; &lt;/td&gt;<br />
&lt;/tr&gt;</div>
</div>
</div>
<p></p>
<p><strong>2.- Modificar la función Javascript</strong></p>
<p>Debemos modificar la función Javascript que aplica los cambios introducidos, para que tenga en cuenta el nuevo campo que hemos insertado. Para ello debemos editar el archivo <em>includes/js/joomla.javascript.js</em>, y sobre la línea 250 encontramos la función:</p>
<div class="igBar"><span id="ljavascript-48"><a href="#" onclick="javascript:showPlainTxt('javascript-48'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JavaScript:</span>
<div id="javascript-48">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> applyImageProps<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; form = document.<span style="color: #006600;">adminForm</span>;<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>!getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">"Select and image from the list"</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; value = form._source.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_align'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._alt.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + parseInt<span style="color: #66cc66;">&#40;</span> form._border.<span style="color: #006600;">value</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._caption.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_position'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_align'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._width.<span style="color: #006600;">value</span>;<br />
&nbsp; &nbsp; chgSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span>, value <span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Aquí debemos añadir el nuevo campo <em>title</em> al final de todo, dejando la función de la siguiente manera:</p>
<div class="igBar"><span id="ljavascript-49"><a href="#" onclick="javascript:showPlainTxt('javascript-49'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JavaScript:</span>
<div id="javascript-49">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> applyImageProps<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; form = document.<span style="color: #006600;">adminForm</span>;<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>!getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">"Select and image from the list"</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; value = form._source.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_align'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._alt.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + parseInt<span style="color: #66cc66;">&#40;</span> form._border.<span style="color: #006600;">value</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._caption.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_position'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_align'</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._width.<span style="color: #006600;">value</span> + <span style="color: #3366CC;">'|'</span><br />
&nbsp; &nbsp; + form._title.<span style="color: #006600;">value</span>;<br />
&nbsp; &nbsp; chgSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span>, value <span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Notar que después del <em>form._width.value</em> hemos añadido un separador más y justo debajo una línea nueva con el valor del campo <em>title</em>.</p>
<p>También debemos modificar la función que muestra las propiedades de la imagen cuando pinchamos sobre una de las imágenes de la lista. En el mismo archivo, sobre la línea 232 tenemos la función <em>showImageProps()</em>:</p>
<div class="igBar"><span id="ljavascript-50"><a href="#" onclick="javascript:showPlainTxt('javascript-50'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JavaScript:</span>
<div id="javascript-50">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> showImageProps<span style="color: #66cc66;">&#40;</span>base_path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; form = document.<span style="color: #006600;">adminForm</span>;<br />
&nbsp; &nbsp; value = getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; parts = value.<span style="color: #006600;">split</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'|'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._source.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#93;</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_align'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._alt.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;<br />
&nbsp; &nbsp; form._border.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">'0'</span>;<br />
&nbsp; &nbsp; form._caption.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_position'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">5</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_align'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">6</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._width.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">7</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//previewImage( 'imagelist', 'view_imagelist', base_path );</span><br />
&nbsp; &nbsp; srcImage = <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">"document."</span> + <span style="color: #3366CC;">'view_imagelist'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; srcImage.<span style="color: #006600;">src</span> = base_path + parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#93;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
La debemos modificar, incluyendo el nuevo campo <em>title</em>. Para ello añadimos una línea más justo después del <em>form._width.value</em> que adquiera el valor del <em>title</em>, quedando la función de la siguiente manera:</p>
<div class="igBar"><span id="ljavascript-51"><a href="#" onclick="javascript:showPlainTxt('javascript-51'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JavaScript:</span>
<div id="javascript-51">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> showImageProps<span style="color: #66cc66;">&#40;</span>base_path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; form = document.<span style="color: #006600;">adminForm</span>;<br />
&nbsp; &nbsp; value = getSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'imagelist'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; parts = value.<span style="color: #006600;">split</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'|'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._source.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#93;</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_align'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._alt.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;<br />
&nbsp; &nbsp; form._border.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">'0'</span>;<br />
&nbsp; &nbsp; form._caption.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_position'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">5</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; setSelectedValue<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'adminForm'</span>, <span style="color: #3366CC;">'_caption_align'</span>, parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">6</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; form._width.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">7</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;<br />
&nbsp; &nbsp; form._title.<span style="color: #006600;">value</span> = parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">8</span><span style="color: #66cc66;">&#93;</span> || <span style="color: #3366CC;">''</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//previewImage( 'imagelist', 'view_imagelist', base_path );</span><br />
&nbsp; &nbsp; srcImage = <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">"document."</span> + <span style="color: #3366CC;">'view_imagelist'</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; srcImage.<span style="color: #006600;">src</span> = base_path + parts<span style="color: #66cc66;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#93;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p><strong>3.- Modificación del Mambot</strong></p>
<p><em>Joomla</em> sustituye en tiempo de ejecución el tag <em>{mosimage}</em> por la imagen que hemos definido y le aplica las propiedades que hemos puesto. Así que será ahí dónde debemos tocar el código <em>PHP</em> para que recoja el nuevo campo y lo aplique como <em>title</em>. Para ello debemos editar el archivo <em>mambots/contents/mosimage.php</em> y, sobre la línea 99 encontramos la declaración de la función <em>processImages()</em>. Dentro de ella se recoge el <em>string </em>que contiene los parámetros de la imagen separados por un "<em>pipe</em>" y lo convierte en un <em>array</em>, por lo que como en el paso anterior hemos añadido nuestro <em>title</em> al final, será la última iteración del <em>array</em>.<br />
Así que sobre la línea 159, justo debajo del <em>IF</em> que comprueba y seta el atributo 7 (la anchura o <em>width</em>) debemos insertar el siguiente código:</p>
<div class="igBar"><span id="lphp-52"><a href="#" onclick="javascript:showPlainTxt('php-52'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-52">
<div class="php"><span style="color:#FF9933; font-style:italic;">// $attrib[8] title</span><br />
<span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> !<a href="http://www.php.net/isset"><span style="color:#000066;">isset</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> || !<span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#FF0000;">'Image'</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <a href="http://www.php.net/htmlspecialchars"><span style="color:#000066;">htmlspecialchars</span></a><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p>
Este código hace el mismo trabajo que para el atributo 2 (el <em>alt</em>) pero trabajando sobre el nuevo campo <em>title</em>.<br />
Finalmente, en la línea 186 (después de haber insertado el código anterior) encontramos la siguiente línea:</p>
<div class="igBar"><span id="lphp-53"><a href="#" onclick="javascript:showPlainTxt('php-53'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-53">
<div class="php"><span style="color:#0000FF;">$image</span> .=<span style="color:#FF0000;">' hspace=&quot;6&quot; alt=&quot;'</span>. <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span> .<span style="color:#FF0000;">'&quot; title=&quot;'</span>. <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span> .<span style="color:#FF0000;">'&quot; border=&quot;'</span>. <span style="color:#0000FF;">$border</span> .<span style="color:#FF0000;">'&quot; /&gt;'</span>;</div>
</div>
</div>
<p>
Como vemos, <em>Joomla</em> usa el mismo texto del <em>alt</em> para el <em>alt</em> y para el <em>title</em>. Como ahora tenemos un atributo nuevo para el <em>title</em>, simplemente tenemos que cambiar el atributo al que se hacer referencia para el <em>title</em>, de 2 a 8, quedando la línea de la siguiente forma:</p>
<div class="igBar"><span id="lphp-54"><a href="#" onclick="javascript:showPlainTxt('php-54'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-54">
<div class="php"><span style="color:#0000FF;">$image</span> .=<span style="color:#FF0000;">' hspace=&quot;6&quot; alt=&quot;'</span>. <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span> .<span style="color:#FF0000;">'&quot; title=&quot;'</span>. <span style="color:#0000FF;">$attrib</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">8</span><span style="color:#006600; font-weight:bold;">&#93;</span> .<span style="color:#FF0000;">'&quot; border=&quot;'</span>. <span style="color:#0000FF;">$border</span> .<span style="color:#FF0000;">'&quot; /&gt;'</span>;</div>
</div>
</div>
<p></p>
<p>Y ya tenemos soporte para los dos atributos por separado <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Saludos!
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/01/06/joomla-imagenes-con-atributo-title-personalizado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Joomla: Títulos de artículos en H1</title>
		<link>http://www.syntaxerror.es/2008/01/02/joomla-titulos-de-articulos-en-h1/</link>
		<comments>http://www.syntaxerror.es/2008/01/02/joomla-titulos-de-articulos-en-h1/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 15:42:36 +0000</pubDate>
		<dc:creator>Xavi</dc:creator>
		
		<category>Programación</category>

		<category>PHP</category>

		<category>Joomla</category>
<category>Joomla</category><category>patch</category><category>PHP</category><category>Programación</category>
		<guid isPermaLink="false">http://www.syntaxerror.es/2008/01/02/joomla-titulos-de-articulos-en-h1/</guid>
		<description><![CDATA[Ahora que es tan importante para el SEO determinar perfectamente los tags HTML, me encuentro que Joomla, que pinta ciertas cosas en la página pasando de la plantilla, dibuja los títulos de los artículos en una columna de una tabla con un estilo determinado en vez de usar el H1. Que dibuje el contenido propiamente [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image166" src="http://www.syntaxerror.es/wp-content/uploads/2008/01/joomla.miniatura.jpg" alt="Joomla" style="float:left;" />Ahora que es tan importante para el <em>SEO </em>determinar perfectamente los tags <em>HTML</em>, me encuentro que <strong>Joomla</strong>, que pinta ciertas cosas en la página pasando de la plantilla, <strong>dibuja los títulos de los artículos en una columna de una tabla con un estilo determinado en vez de usar el <em>H1</em></strong>. Que dibuje el contenido propiamente a base de tablas es feo, pero lo acepto. Lo que no acepto es que los títulos no sean definidos como tal. En este pequeño HowTo explico qué tocar para que los títulos sean definidos como <em>H1</em>.<br />
<a id="more-164"></a><br />
La parte interna que se dedica a la maquetación del contenido es el componente <em>Content</em>. El archivo a editar es <em>components/com_content/content.html.php</em> y sobre la línea <em>617</em> está la funcion Title que construye el título:</p>
<div class="igBar"><span id="lphp-57"><a href="#" onclick="javascript:showPlainTxt('php-57'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-57">
<div class="php"><span style="color:#000000; font-weight:bold;">function</span> Title<span style="color:#006600; font-weight:bold;">&#40;</span> &amp;<span style="color:#0000FF;">$row</span>, &amp;<span style="color:#0000FF;">$params</span>, &amp;<span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'item_title'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'link_titles'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> &amp;&amp; <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">link_on</span> != <span style="color:#FF0000;">''</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span> width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=<span style="color:#FF0000;">"&lt;?php echo $row-&gt;link_on;?&gt;"</span> <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentpagetitle&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> <a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span>;?&gt;&lt;/a&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span> width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> <a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span>;?&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;td <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span> width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Realmente no nos vamos a meter a modificar la forma en que se maqueta el contenido (de momento <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) así que sencillamente mantendremos la columna pero añadiremos un <em>H1</em> rodeando el echo del título y moveremos la declaración de la clase que le da el estilo al <em>H1</em>. Dejaremos la función de la siguiente manera:</p>
<div class="igBar"><span id="lphp-58"><a href="#" onclick="javascript:showPlainTxt('php-58'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-58">
<div class="php"><span style="color:#000000; font-weight:bold;">function</span> Title<span style="color:#006600; font-weight:bold;">&#40;</span> &amp;<span style="color:#0000FF;">$row</span>, &amp;<span style="color:#0000FF;">$params</span>, &amp;<span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'item_title'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$params</span>-&gt;<span style="color:#006600;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#FF0000;">'link_titles'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> &amp;&amp; <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">link_on</span> != <span style="color:#FF0000;">''</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=<span style="color:#FF0000;">"&lt;?php echo $row-&gt;link_on;?&gt;"</span> <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentpagetitle&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;h1 <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span>&gt;&lt;?php <a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span>;?&gt;&lt;/h1&gt;&lt;/a&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;h1 <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span>&gt;&lt;?php <a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$row</span>-&gt;<span style="color:#006600;">title</span>;?&gt;&lt;/h1&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#616100;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;td <span style="color:#000000; font-weight:bold;">class</span>=<span style="color:#FF0000;">"contentheading&lt;?php echo $params-&gt;get( 'pageclass_sfx' ); ?&gt;"</span> width=<span style="color:#FF0000;">"100%"</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span> HTML_content::<span style="color:#006600;">EditIcon</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0000FF;">$row</span>, <span style="color:#0000FF;">$params</span>, <span style="color:#0000FF;">$access</span> <span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#000000; font-weight:bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000000; font-weight:bold;">&lt;?php</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>En mi caso no ha sido necesario, pero puede que debamos ajustar un poco la hoja de estilos. Éso es todo <img src='http://www.syntaxerror.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syntaxerror.es/2008/01/02/joomla-titulos-de-articulos-en-h1/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
