<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Osukaru &#187; XSL</title>
	<atom:link href="http://www.osukaru.es/tag/xsl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.osukaru.es</link>
	<description>Desarrollo web y Tecnología</description>
	<lastBuildDate>Wed, 27 Jul 2011 12:10:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<script type="text/javascript">

if (typeof Meebo == 'undefined') {

Meebo=function(){(Meebo._=Meebo._||[]).push(arguments)};
(function(q){

	var args = arguments;
	if (!document.body) { return setTimeout(function(){ args.callee.apply(this, args) }, 100); }
	var d=document, b=d.body, m=b.insertBefore(d.createElement('div'), b.firstChild); s=d.createElement('script');
	m.id='meebo'; m.style.display='none'; m.innerHTML='<iframe id="meebo-iframe"></iframe>';
	s.src='http'+(q.https?'s':'')+'://'+(q.stage?'stage-':'')+'cim.meebo.com/cim/cim.php?network='+q.network;
	b.insertBefore(s, b.firstChild);

})({network:'mundoosukaru_xa39vo'});	}</script>	<item>
		<title>Creando un plugin para Symfony</title>
		<link>http://www.osukaru.es/programacion/creando-un-plugin-para-symfony/</link>
		<comments>http://www.osukaru.es/programacion/creando-un-plugin-para-symfony/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 17:40:05 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=123</guid>
		<description><![CDATA[En el último post hemos implementado una nueva funcionalidad para un proyecto Symfony. Si queremos utilizar esta nueva funcionalidad en otro proyecto tendríamos que volver a realizar todos los pasos que se especifican en el post. Sin embargo, existe una forma de añadir esta funcionalidad de manera que nos podamos ahorrar gran parte de estos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En el último post hemos implementado una nueva funcionalidad para un proyecto Symfony. Si queremos utilizar esta nueva funcionalidad en otro proyecto tendríamos que volver a realizar todos los pasos que se especifican en el post. Sin embargo, existe una forma de añadir esta funcionalidad de manera que nos podamos ahorrar gran parte de estos pasos: crear un plugin.<br />
<span id="more-123"></span><br />
Los plugins permiten encapsular clases, filtros, event listeners, helpers, archivos de configuración, tareas, módulos, esquemas y extensiones para el modelo, fixtures, archivos estáticos, etc. En nuestro caso, crearemos un plugin que contenga el helper, los archivos de configuración, el módulo de ejemplo y la hoja de estilos XSL. El plugin se llamará <em>sfXSLTransformerPlugin</em>.</p>
<p style="text-align: justify;">Lo único que tenemos que hacer es crear un directorio que se llame <em>sfXSLTransformerPlugin</em> y crear allí la estructura de directorios que necesitamos, es decir, la carpeta <em>config</em> con el archivo <em>settings.yml</em>, la carpeta <em>lib/helper</em> donde incluiremos nuestro helper <em>XSLHelper.php</em>, la carpeta <em>modules</em> donde estará nuestro módulo de prueba y la carpeta <em>web/xsl</em> donde se encontrará nuestra hoja de estilos XSL.</p>
<p style="text-align: justify;">El archivo <em>settings.yml</em> contendrá el siguiente código:</p>
<p style="text-align: justify;">[css]<br />
all:<br />
.settings:<br />
standard_helpers: [XSL]<br />
xsl_doc:  sfXSLTransformerPlugin/xsl/collection.xsl<br />
[/css]</p>
<p style="text-align: justify;">El plugin quedaría <a href="http://www.osukaru.es/wp-content/uploads/2010/04/sfXSLTransformerPlugin.zip">así</a>. Para instalarlo en cualquier proyecto, sólo tenemos que descargarlo y descomprimirlo en el directorio <em>plugins</em>. Después, en el <em>ProjectConfiguration.class.php</em> habilitamos el plugin:</p>
<p style="text-align: justify;">[php]<br />
$this-&gt;enablePlugins(&#8216;sfDoctrinePlugin&#8217;, &#8216;sfXSLTransformerPlugin&#8217;);<br />
[/php]</p>
<p style="text-align: justify;">Con esto ya podríamos usar el plugin. Si queremos verlo en funcionamiento en el módulo de prueba, sólo tenemos que habilitar este módulo en el <em>settings.yml</em>:</p>
<p style="text-align: justify;">[css]<br />
all:<br />
.settings:<br />
enabled_modules: [prueba]<br />
[/css]</p>
<p style="text-align: justify;">Limpiamos la caché y ejecutamos la tarea <em>plugin:publish-assets</em> (para que los archivos de la carpeta web del plugin se publiquen en la carpeta web del proyecto) y listo.</p>
<p style="text-align: justify;">Evidentemente, la hoja de estilos XSL que viene por defecto en el plugin no nos sirve de mucho, ya que en nuestro proyecto querremos utilizar nuestra propia hoja de estilos. Podríamos editar la hoja de estilos del plugin, pero no es una buena práctica editar los archivos de un plugin, ya que si lo actualizásemos se sobreescribirían nuestros cambios. Así que lo que tenemos que hacer es crear nuestra propia hoja de estilos en el directorio <em>web/xsl</em> de nuestro proyecto y después editar el archivo settings.yml (el de nuestra aplicación, no el del plugin):</p>
<p style="text-align: justify;">[css]<br />
all:<br />
.settings:<br />
xsl_doc:  xsl/mi_hoja_de_estilos.xsl<br />
[/css]</p>
<p style="text-align: justify;">Una vez que tenemos realizado nuestro plugin, podemos subirlo a un repositorio subversion para poder llevar un control de versiones y poder actualizarlo estemos donde estemos. Por ejemplo, en <a href="http://code.google.com/hosting/">Google Code</a> se puede crear de forma gratuita un repositorio de subversion. Si tenemos instalado Tortoise en nuestro equipo, hacer un checkout del proyecto, añadir archivos al repositorio y realizar un commit es bastante intuitivo (para subir cambios al repositorio tenemos que tener permisos, por lo que se nos pedirá una contraseña que podremos encontrar en la página de configuración del proyecto de Google Code). Nuestro plugin está subido en http://osukaru-plugins.googlecode.com/svn/trunk/sfXSLTransformerPlugin.</p>
<p style="text-align: justify;">Si quisieramos distribuir nuestro plugin desde el sitio web del proyecto Symfony tendríamos un poco más de trabajo, ya que deberíamos crearlo como un paquete PEAR, escribir el archico <em>package.xml</em>, el archivo README (con sintáxis Markdown) y el archivo LICENSE y después crearnos una cuenta de usuario en Symfony y crear allí nuestro plugin.</p>
<img style='display:none' id="post-123-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/creando-un-plugin-para-symfony/',title:'Creando un plugin para Symfony',tweet:'En el último post hemos implementado una nueva funcionalidad para un proyecto Symfony. Si queremos ',description:'En el último post hemos implementado una nueva funcionalidad para un proyecto Symfony. Si queremos '})"><script type='text/javascript'>document.getElementById("post-123-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/creando-un-plugin-para-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transformaciones XSL en Symfony</title>
		<link>http://www.osukaru.es/programacion/transformaciones-xsl-en-symfony/</link>
		<comments>http://www.osukaru.es/programacion/transformaciones-xsl-en-symfony/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 15:58:32 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=102</guid>
		<description><![CDATA[Ya hemos visto cómo realizar transformaciones XSL con PHP 5, pero ¿cómo aplicamos esto en Symfony? Lo que podemos hacer es que las vistas generen XML y después en el layout transformamos este XML en XHTML mediante nuestra hoja de estilos XSL. Vamos a utilizar el mismo ejemplo que en el post anterior. Lo primero [...]]]></description>
			<content:encoded><![CDATA[<p>Ya hemos visto cómo realizar transformaciones XSL con PHP 5, pero ¿cómo aplicamos esto en Symfony?</p>
<p>Lo que podemos hacer es que las vistas generen XML y después en el layout transformamos este XML en XHTML mediante nuestra hoja de estilos XSL.<br />
<span id="more-102"></span></p>
<p>Vamos a utilizar el mismo ejemplo que en el post anterior. Lo primero que haremos es crear una carpeta 	<em>xsl</em> dentro del directorio <em>web</em>. Ahora metemos ahí los archivos de ejemplo (collection.xsl y collection.xml). En el layout, en el lugar que queramos (total, es sólo para probar) incrustamos el código de ejemplo:<br />
[php]<br />
<?php<br />
   $xslDoc = new DOMDocument();<br />
   $xslDoc->load(&#8220;xsl/collection.xsl&#8221;);</p>
<p>   $xmlDoc = new DOMDocument();<br />
   $xmlDoc->load(&#8220;xsl/collection.xml&#8221;);</p>
<p>   $proc = new XSLTProcessor();<br />
   $proc->importStylesheet($xslDoc);<br />
   echo $proc->transformToXML($xmlDoc);<br />
?><br />
[/php]<br />
Si ahora ejecutamos nuestro proyecto veremos que la transformación se realiza correctamente. Pero esto no es lo que queríamos, ya que estamos cargando el XML de ejemplo directamente desde un archivo y lo que queremos es cogerlo de una vista. Bien, creemos entonces un nuevo módulo y en el <em>indexSuccess.php</em> metamos el XML de ejemplo. Ahora sólo tenemos que cambiar el código de ejemplo del layout y utilizar la función <em>loadXML</em> y la variable <em>$sf_content</em>:<br />
[php]<br />
<?php<br />
   $xslDoc = new DOMDocument();<br />
   $xslDoc->load(&#8220;xsl/collection.xsl&#8221;);</p>
<p>   $xmlDoc = new DOMDocument();<br />
   $xmlDoc->loadXML($sf_content);</p>
<p>   $proc = new XSLTProcessor();<br />
   $proc->importStylesheet($xslDoc);<br />
   echo $proc->transformToXML($xmlDoc);<br />
?><br />
[/php]<br />
Con esto ya hemos conseguido lo que queríamos, aunque es un poco engorroso poner todo ese trozo de código en el layout, así que podemos crear un helper que nos ayude a simplificar la tarea. Para ello, dentro de la carpeta <em>lib</em> (por ejemplo, dentro de la aplicación <em>frontend</em>) creamos un nuevo directorio <em>helper</em> y dentro de él nuestro helper <em>XSLHelper.php</em> que contendrá el siguiente código:<br />
[php]<br />
<?php<br />
function XSLTransform($xmlString)<br />
{<br />
    $xslDoc = new DOMDocument();<br />
    $xslDoc->load(&#8220;xsl/collection.xsl&#8221;);</p>
<p>    $xmlDoc = new DOMDocument();<br />
    $xmlDoc->loadXML($xmlString);</p>
<p>    $proc = new XSLTProcessor();<br />
    $proc->importStylesheet($xslDoc);</p>
<p>    return $proc->transformToXML($xmlDoc);<br />
}<br />
?><br />
[/php]<br />
Ahora en nuestro <em>layout</em> sólo tenemos que poner el siguiente código:<br />
[php]<br />
<?php<br />
    <?php use_helper('XSL') ?><br />
    <?php echo XSLTransform($sf_content) ?><br />
?><br />
[/php]<br />
Y si queremos simplificar aún más, podemos hacer que nuestro nuevo helper se cargue por defecto y así no tener que incluirlo manualmente. Para ello, en el archivo <em>settings.yml</em> dentro de la carpeta <em>config</em> de nuestra aplicación <em>frontend</em> lo incluimos en una lista de helpers por defecto:<br />
[css]<br />
all:<br />
  .settings:<br />
    standard_helpers: [XSL]<br />
[/css]<br />
Así, en nuestro layout ya sólo tendremos que escribir:<br />
[php]<br />
<?php<br />
    <?php echo XSLTransform($sf_content) ?><br />
?><br />
[/php]<br />
Bien, ahora sólo nos quedaría solucionar un pequeño problema de la forma más elegante que se nos ocurra, y es que la hoja de estilos XSL con la que realizaremos las transformaciones la hemos puesto directamente en la función de nuestro helper. Podríamos incluir un nuevo parámetro en nuestra función para especificar la hoja de estilos, pero esto no sería muy ágil si hacemos muchas llamadas al helper y en un futuro cambiamos de nombre o de ruta la hoja de estilos, así que lo mejor sería que pudiésemos obtener este dato de un archivo de configuración, por ejemplo del <em>settings.yml</em>. Lo que tenemos que hacer es definir una constante en ese archivo:<br />
[css]<br />
all:<br />
  xsl_doc:    xsl/collection.xsl<br />
[/css]<br />
Y después utilizar la clase sfConfig de Symfony para recuperar el valor en nuestro helper:<br />
[php]<br />
<?php<br />
function XSLTransform($xmlString)<br />
{<br />
    $xslDoc = new DOMDocument();<br />
    $xslDoc->load(sfConfig::get(&#8216;sf_xsl_doc&#8217;));</p>
<p>    $xmlDoc = new DOMDocument();<br />
    $xmlDoc->loadXML($xmlString);</p>
<p>    $proc = new XSLTProcessor();<br />
    $proc->importStylesheet($xslDoc);</p>
<p>    return $proc->transformToXML($xmlDoc);<br />
}<br />
?><br />
[/php]</p>
<img style='display:none' id="post-102-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/transformaciones-xsl-en-symfony/',title:'Transformaciones XSL en Symfony',tweet:'Ya hemos visto cómo realizar transformaciones XSL con PHP 5, pero ¿cómo aplicamos esto en Symfony',description:'Ya hemos visto cómo realizar transformaciones XSL con PHP 5, pero ¿cómo aplicamos esto en Symfony'})"><script type='text/javascript'>document.getElementById("post-102-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/transformaciones-xsl-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transformaciones XSL desde PHP 5</title>
		<link>http://www.osukaru.es/programacion/transformaciones-xsl-desde-php-5/</link>
		<comments>http://www.osukaru.es/programacion/transformaciones-xsl-desde-php-5/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 11:46:56 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=95</guid>
		<description><![CDATA[En mi trabajo actual estamos adaptando todas las aplicaciones web para que en vez de generar código HTML generen un XML y se transformen en HTML mediante una plantilla XSL que es común a todas. De esta forma se pueden realizar cambios en la presentación de todas las aplicaciones sin que los responsables de cada [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En mi trabajo actual estamos adaptando todas las aplicaciones web para que en vez de generar código HTML generen un XML y se transformen en HTML mediante una plantilla XSL que es común a todas. De esta forma se pueden realizar cambios en la presentación de todas las aplicaciones sin que los responsables de cada aplicación tengan que tocar nada.<br />
<span id="more-95"></span><br />
En mi cliente trabajamos varias empresas y cada una de ellas emplea tecnologías diferentes (unos realizan las webs en .Net, otros en Java y nosotros lo hacemos directamente desde Oracle). En las 3 tecnologías hemos encontrado la forma de realizar las transformaciones XSL (en Oracle me ha dado algún quebradero de cabeza y a los de .NET me consta que también) y poder realizar una aplicación web completa utilizando esta metodología.</p>
<p style="text-align: justify;">Y ahora lo que me pregunto es lo siguiente: ¿será sencillo realizar eso mismo en PHP? Bueno, la respuesta es que sí (no entro a valorar si es la forma más correcta de desarrollar una aplicación web). Lo único que tenemos que hacer es habilitar la extensión <em>php_xsl</em> (si trabajamos en Windows basta con descomentar la línea <em>extension=php_xsl.dll</em> en nuestro <em>php.ini</em>).</p>
<p style="text-align: justify;">Podemos probar con este <a href="http://es2.php.net/manual/en/xsl.examples.php">ejemplo </a>y con sus respctivos <a href="http://es2.php.net/manual/en/xsl.examples-collection.php">archivos</a> xml y xsl.</p>
<img style='display:none' id="post-95-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/transformaciones-xsl-desde-php-5/',title:'Transformaciones XSL desde PHP 5',tweet:'En mi trabajo actual estamos adaptando todas las aplicaciones web para que en vez de generar código',description:'En mi trabajo actual estamos adaptando todas las aplicaciones web para que en vez de generar código'})"><script type='text/javascript'>document.getElementById("post-95-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/transformaciones-xsl-desde-php-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

