<?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; Programación</title>
	<atom:link href="http://www.osukaru.es/category/programacion/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>Generar documentación de Symfony2</title>
		<link>http://www.osukaru.es/programacion/generar-documentacion-de-symfony2/</link>
		<comments>http://www.osukaru.es/programacion/generar-documentacion-de-symfony2/#comments</comments>
		<pubDate>Tue, 10 May 2011 22:10:44 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Symfony2]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=248</guid>
		<description><![CDATA[Si queremos aprender a trabajar con Symfony no hay nada como acceder a la documentación oficial. Sin embargo, puede que no estemos online en un momento dado o que simplemente querramos disponer de la documentación en un formato portable para visualizarla cómodamente en una tablet o un ebook. En estas breves líneas aprenderemos a generarnos [...]]]></description>
			<content:encoded><![CDATA[<p>Si queremos aprender a trabajar con Symfony no hay nada como acceder a la <a href="http://symfony.com/doc/current/">documentación oficial</a>. Sin embargo, puede que no estemos online en un momento dado o que simplemente querramos disponer de la documentación en un formato portable para visualizarla cómodamente en una tablet o un ebook. En estas breves líneas aprenderemos a generarnos la documentación en formato HTML o PDF a partir del <a href="https://github.com/symfony/symfony-docs">repositorio Github</a><span id="more-248"></span><br />
Para empezar, mencionar que todo esto lo estoy realizando desde Ubuntu 11.04. Bien, lo primero que haremos será instalar las herramientas necesarias: Sphinx y Tex Live.<br />
[Bash]<br />
sudo apt-get install python-setuptools<br />
sudo easy_install -U Sphinx<br />
sudo apt-get install texlive-full<br />
[/Bash]<br />
Una vez hecho esto, nos descargamos la documentación de Symfony2 y la extensión de Sphinx creada por Fabien Potencier.<br />
[Bash]<br />
git clone https://github.com/symfony/symfony-docs.git<br />
git clone https://github.com/fabpot/sphinx-php.git<br />
[/Bash]<br />
Ahora tenemos que ejecutar el asistente de configuración de Sphinx, pero antes de eso, vamos a renombrar el fichero <em>index.rst</em> dentro de <em>symfony-docs</em> con cualquier otro nombre, ya que el asistente nos va a generar otro fichero index.rst.<br />
[Bash]<br />
sphinx-quickstart<br />
[/Bash]<br />
Dejamos todas las opciones por defecto, excepto la extensión <strong>autodoc</strong>, que deberemos activarla. Una vez completado el asistente, borramos el fichero index.rst y volvemos a renombrar el fichero original.<br />
Ya sólo nos queda instalar la extensión para Sphinx creada por Fabien: <em>configuration-block</em>. Para ello, dentro del directorio <em>symfony-docs</em> creamos un nuevo directorio <em>_exts</em> y copiamos dentro el fichero <em>configurationblock.py</em>. Ahora buscamos el fichero <em>conf.py</em> y justo después de <em></em> añadimos<br />
[Bash]<br />
sys.path.append(os.path.abspath(&#8216;_exts&#8217;))<br />
[/Bash]<br />
después buscamos el array de extensiones y añadimos el <em>configurationblock</em><br />
[Bash]<br />
extensions = ['sphinx.ext.autodoc', 'configurationblock']<br />
[/Bash]<br />
Bien, todo listo, ahora sólo hay que generar la documentación<br />
[Bash]<br />
make html<br />
make latexpdf<br />
[/Bash]<br />
y buscarla en el directorio <em>_build</em>.</p>
<img style='display:none' id="post-248-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/generar-documentacion-de-symfony2/',title:'Generar documentación de Symfony2',tweet:'Si queremos aprender a trabajar con Symfony no hay nada como acceder a la documentación oficial. Si',description:'Si queremos aprender a trabajar con Symfony no hay nada como acceder a la documentación oficial. Si'})"><script type='text/javascript'>document.getElementById("post-248-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/generar-documentacion-de-symfony2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony2 ya está aquí</title>
		<link>http://www.osukaru.es/programacion/symfony2-ya-esta-aqui/</link>
		<comments>http://www.osukaru.es/programacion/symfony2-ya-esta-aqui/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 12:58:58 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[XSL PHP]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=230</guid>
		<description><![CDATA[En el pasado evento Symfony Live 2011 de París se dio a conocer el nuevo sitio web del proyecto:  symfony.com y el Lunes día 7  de Marzo se habilitó la descarga de la distribución Symfony Standard 2.0.0 PR7.   Al ser una Preview Realease todavía no se puede garantizar la estabilidad del framework, pero ya [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En el pasado evento <a href="http://www.symfony.es/2011/03/06/sflive2011-resumen-de-todas-las-presentaciones/" target="_blank">Symfony Live 2011 de París</a> se dio a conocer el nuevo sitio web del proyecto:  <a href="http://symfony.com" target="_blank">symfony.com</a> y el Lunes día 7  de Marzo se habilitó la descarga de la distribución <a href="http://symfony.com/download" target="_blank">Symfony Standard 2.0.0 PR7</a>.   Al ser una <em>Preview Realease</em> todavía no se puede garantizar la estabilidad del framework, pero ya se puede ir probando esta versión con bastantes garantías.<br />
<span id="more-230"></span><br />
Una de las novedades de Symfony2 es que se basará en distribuciones, al más puro estilo Linux.  Actualmente sólo existe la distribución estándar de forma oficial, pero es de esperar que salgan otras distribuciones oficiales, cada una con su propia selección de Bundles y configuración inicial básica, y por supuesto, muchas distribuciones &#8220;no oficiales&#8221;.</p>
<p style="text-align: justify;">Para probar esta nueva versión de forma rápida, basta con bajarnos el archivo comprimido y descomprimirlo en el directorio web de nuestro servidor Apache (redordad que esta no es una forma segura de desplegar una aplicación en Apache) y si cumplimos todos los requisitos se nos mostrará una bonita página de bienvenida accediendo a: <a href="http://localhost/Symfony/web/app_dev.php/" target="_blank">http://localhost/Symfony/web/app_dev.php/</a>:</p>
<p><a href="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyWelcome.jpg"></a><a href="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyWelcome.jpg"><img class="aligncenter size-medium wp-image-236" title="SymfonyWelcome" src="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyWelcome-300x209.jpg" alt="Pantalla de bienvenida de Symfony" width="600" height="418" /></a></p>
<p>En esta nueva versión, tenemos una demo básica &#8220;Hola Mundo&#8221;:</p>
<p><a href="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyHello.jpg"><img class="aligncenter size-medium wp-image-238" title="SymfonyHello" src="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyHello-300x208.jpg" alt="Hola mundo" width="600" height="416" /></a></p>
<p>y un configurador gráfico de la base de datos:</p>
<p><a href="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyConfiguration.jpg"><img class="aligncenter size-medium wp-image-239" title="SymfonyConfiguration" src="http://www.osukaru.es/wp-content/uploads/2011/03/SymfonyConfiguration-300x191.jpg" alt="Configurador gráfico de base de datos" width="600" height="382" /></a></p>
<img style='display:none' id="post-230-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/symfony2-ya-esta-aqui/',title:'Symfony2 ya está aquí',tweet:'En el pasado evento Symfony Live 2011 de París se dio a conocer el nuevo sitio web del proyecto:  ',description:'En el pasado evento Symfony Live 2011 de París se dio a conocer el nuevo sitio web del proyecto:  '})"><script type='text/javascript'>document.getElementById("post-230-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/symfony2-ya-esta-aqui/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Preparandonos para la llegada de Symfony2</title>
		<link>http://www.osukaru.es/programacion/preparandonos-para-la-llegada-de-symfony2/</link>
		<comments>http://www.osukaru.es/programacion/preparandonos-para-la-llegada-de-symfony2/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 09:36:21 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Symfony2]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=219</guid>
		<description><![CDATA[El próximo 5 de Marzo de 2011, si todo va bien, se publicará la versión final de Symfony2 (se anunciará durante el evento Symfony Live 2011 que tendrá lugar en París del 2 al 5 de Marzo). Mientras tanto, ¿qué podemos ir haciendo? A pesar de que Symfony2 aún está en su fase de desarrollo [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El próximo 5 de Marzo de 2011, si todo va bien, se publicará la versión final de <a href="http://symfony-reloaded.org/" target="_blank">Symfony2</a> (se anunciará durante el evento <a href="http://www.symfony-live.com/paris" target="_blank">Symfony Live 2011</a> que tendrá lugar en París del 2 al 5 de Marzo). Mientras tanto, ¿qué podemos ir haciendo?<br />
<span id="more-219"></span><br />
A pesar de que Symfony2 aún está en su fase de desarrollo la versión que nos ofrecen actualmente es bastante estable y completamente funcional. Además existe ya mucha <a href="http://docs.symfony-reloaded.org/?page=learn" target="_blank">documentación</a>, eso sí, en inglés y a veces sin actualizar con los últimos cambios (aún así la documentación es mejor de la que nos ofrecen algunos otros frameworks que se supone que están terminados).</p>
<p style="text-align: justify;">Si queremos iniciarnos con este framework, lo más fácil es echar una ojeada al <a href="http://docs.symfony-reloaded.org/quick_tour/index.html" target="_blank">Quick Tour</a> (<a href="http://parasitovirtual.wordpress.com/2011/02/22/quick-tour-por-symfony2-primeros-pasos/" target="_blank">aquí</a> lo tenéis en castellano, cortesía de Francisco Belmonte Ruiz), que comienza con la descarga del <a href="http://symfony-reloaded.org/downloads/sandbox_2_0_PR6.zip" target="_blank">Sandbox</a>, un pequeño proyecto con el típico &#8220;Hola Mundo&#8221;.</p>
<p style="text-align: justify;">Para ponernos a trabajar es necesario tener una versión de PHP superior a la 5.3.2 (en mi caso he instalado la última versión de <a href="http://www.wampserver.com/en/" target="_blank">WampServer2</a>). Si trabajáis en Windows, recordad poner la ruta al ejecutable de PHP en el Path para poder ejecutar los comandos desde la consola. Y para ser más productivos, seguiremos utilizando <a href="http://netbeans.org/downloads/index.html" target="_blank">NetBeans</a> como IDE de desarrollo. De momento Netbeans no trae incorporado el soporte a Symfony2 como sí hacía con la versión anterior, pero no notaremos mucha diferencia salvo que tendremos que salir del IDE para ejecutar los comandos por consola, tan sólo tenemos que crear un nuevo proyecto desde el código fuente existente del Sandbox y ya podremos ponernos a trabajar.</p>
<p style="text-align: justify;">Para acostumbrarnos a las buenas prácticas desde un principio, es aconsejable que nos familiaricemos con dos herramientas vitales para el desarrollo: <a href="http://git-scm.com/" target="_blank">Git</a> (echa un vistazo a <a href="http://progit.org/book/es/" target="_blank">esta documentación</a>) y <a href="https://github.com/sebastianbergmann/phpunit/" target="_blank">PHPUnit</a> (que además podremos integrarlo en Netbeans). Si ya venías utilizando Subversion para el versionado de código y Lime para la realización de las pruebas automáticas, el cambio no te supondrá demasiado esfuerzo y si nunca habías utilizado herramientas de este estilo, ¿a qué estabas esperando?</p>
<p style="text-align: justify;">Ya tenemos nuestro entorno preparado para ser lo más productivos posibles desde el primer día, así que lo mejor será que empecemos a estudiar algunos de los conceptos clave de nuestro nuevo framework. Desde mi punto de vista, lo más destacable de Symfony2 es su nueva arquitectura con la organización en Bundles (echa un vistazo a <a href="http://symfony2bundles.org/" target="_blank">esta página</a>) y el contenedor de inyección de dependencias (DIC, <a href="http://components.symfony-project.org/dependency-injection/documentation" target="_blank">aquí</a> puedes introducirte al este concepto). Si dominamos estos dos conceptos, el desarrollo con Symfony2 se nos hará mucho más sencillo.</p>
<p style="text-align: justify;">Y para el final dejo otras dos de las características que van a dar un salto de calidad (tanto en rendimiento como en productividad) a nuestros desarrollos: <a href="http://www.twig-project.org/" target="_blank">Twig</a> y <a href="http://docs.symfony-reloaded.org/guides/doctrine/index.html" target="_blank">Doctrine2</a>.</p>
<p style="text-align: justify;">Twig es un motor de plantillas que es el que se va a utilizar por defecto en Symfony2, aunque siempre tendremos la posibilidad de seguir utilizando nuestras plantillas en PHP. Si vamos a trabajar con Netbeans sería interesante que asocies la extensión .twig con el tipo de archivos HTML para que te funcione el resaltador de sintaxis.</p>
<p style="text-align: justify;">Por su parte, Doctrine2 es la nueva versión del ORM que ya se convirtió en el preferido por los desarrolladores de Symfony en su versión anterior.</p>
<p style="text-align: justify;">Esto es todo, de aquí al 5 de Marzo hay muchas cosas que aprender, ¿no te parece?</p>
<img style='display:none' id="post-219-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/preparandonos-para-la-llegada-de-symfony2/',title:'Preparandonos para la llegada de Symfony2',tweet:'El próximo 5 de Marzo de 2011, si todo va bien, se publicará la versión final de Symfony2 (se anu',description:'El próximo 5 de Marzo de 2011, si todo va bien, se publicará la versión final de Symfony2 (se anu'})"><script type='text/javascript'>document.getElementById("post-219-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/preparandonos-para-la-llegada-de-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diseño de aplicaciones web con Symfony</title>
		<link>http://www.osukaru.es/programacion/diseno-de-aplicaciones-web-con-symfony/</link>
		<comments>http://www.osukaru.es/programacion/diseno-de-aplicaciones-web-con-symfony/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 10:06:53 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=209</guid>
		<description><![CDATA[Symfony es uno de los frameworks orientados al desarrollo web que mejor documentado está. Disponemos de un manual de introducción muy completo, el tutorial Jobeet, una guía de referencia para los archivos de configuración, un libro con conceptos más avanzados y una API de referencia. Además, la mayoría de la documentación está en varios idiomas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Symfony es uno de los frameworks orientados al desarrollo web que mejor documentado está. Disponemos de un <a href="http://www.symfony-project.org/gentle-introduction/1_4/en/" target="_blank">manual de introducción</a> muy completo, el <a href="http://www.symfony-project.org/gentle-introduction/1_4/en/" target="_blank">tutorial Jobeet,</a> una <a href="http://www.symfony-project.org/reference/1_4/en/" target="_blank">guía de referencia</a> para los archivos de configuración,  un <a href="http://www.symfony-project.org/more-with-symfony/1_4/es/" target="_blank">libro con conceptos más avanzados</a> y una <a href="http://www.symfony-project.org/api/1_4/" target="_blank">API</a> de referencia. Además, la mayoría de la documentación está en varios idiomas (incluido el castellano) o podemos conseguirla a través de <a href="http://www.librosweb.es/symfony/index.html" target="_self">otras webs</a>.</p>
<p style="text-align: justify;">Sin embargo, esto no impide que el aprendizaje del framework por cuenta propia sea una tarea que requiere mucho esfuerzo y dedicación. Por ello, poder realizar un curso en el que te ofrezcan una documentación menos técnica y más pedagógica con un tutor que te oriente y te resuelva las dudas es una gran oportunidad para muchos, y es lo que nos ofrece la plataforma <a href="https://centrovirtual.educacion.es/mentor/inicio.html" target="_blank">Aula Mentor</a> con el curso de reciente creación <em>&#8220;Diseño de aplicaciones web con Symfony&#8221;</em>.<span id="more-209"></span><strong></strong></p>
<p style="text-align: justify;"><strong>¿Qué es Aula Mentor?</strong></p>
<p style="text-align: justify;">Aula Mentor es un sistema de formación abierta, libre y a través de Internet promovido por el Ministerio de Educación. Aula Mentor se caracteriza por su flexibilidad, ya que los cursos son completamente online y podemos marcarnos nuestro propio ritmo (podemos terminar en 2 meses o en 10, según el tiempo que queramos dedicar).</p>
<p style="text-align: justify;">Cada 2 meses (aproximadamente) tendremos una convocatoria para realizar el examen de certificación, que será presencial, y que podremos realizar en cualquiera de las aulas dispuestas para ello distribuidas a lo largo de toda la geografía española y de latinoamérica. También podremos acudir a estas aulas en cualquier otro momento para utilizar el material y los equipos que hacen falta para el curso si así lo requerimos.</p>
<p style="text-align: justify;">Para formalizar la matrícula únicamente tenemos que abonar el importe de los dos primeros meses (son 22€ por mes) y acudir a alguna de las aulas para rellenar los impresos correspondientes y recibir las claves para acceder a la plataforma. Si transcurridos los 2 meses no se ha completado el curso y se quiere renovar, sólo hay que hacer un nuevo ingreso (esta vez sólo de un mes) y solicitar la renovación.</p>
<p style="text-align: justify;"><strong>¿Qué aprenderé en el curso?</strong></p>
<p style="text-align: justify;">Para conseguir los objetivos propuestos se ha optado por un planteamiento completamente práctico en el que se está “picando código” funcional desde el principio del curso, que estará compuesto de 10 unidades.</p>
<p style="text-align: justify;">En la unidad 1 se da una visión general a todo lo que conlleva realizar una aplicación web y los beneficios de una buena arquitectura y unas buenas prácticas, además de enumerar las ventajas que nos reportará Symfony para este propósito.</p>
<p style="text-align: justify;">En la unidad 2, sin utilizar symfony para nada, se desarrollará una sencilla aplicación web en PHP. El objetivo de esta unidad es mostrar como se puede organizar el código para que siga los planteamientos del patrón de diseño Modelo – Vista – Controlador (MVC), gracias al cual separamos completamente la lógica de negocio de la presentación de la información. Es importante comprender los fundamentos de esta organización ya que symfony, como se verá más adelante, la utiliza en su implementación. Además en esta unidad se introducen los conceptos de controlador frontal, acción, plantilla y layout, ampliamente usados en el resto del curso.</p>
<p style="text-align: justify;">En la unidad 3 se hará una presentación panorámica de symfony, exponiendo los conceptos fundamentales. En esta unidad se volverá a escribir, esta vez utilizando symfony, la aplicación de la unidad 2. Dicho ejercicio ayudará a realizar la presentación del framework a la vez que servirá como referencia de los conceptos de base.</p>
<p style="text-align: justify;">En la unidad 4 se planteará el análisis de una aplicación, que aún siendo concebida con criterios pedagógicos, es suficientemente amplia como para ser considerada una aplicación profesional. Se trata de un gestor documental y su desarrollo nos servirá como vehículo para penetrar al interior de symfony durante el resto del curso.</p>
<p style="text-align: justify;">En las siguientes unidades se construyen progresivamente las distintas funcionalidades de la aplicación analizada en la unidad 4. Cada unidad incide sobre algún aspecto fundamental de symfony.</p>
<p style="text-align: justify;">En la unidad 5 se profundizará en el concepto de modelo y de capa de abstracción de acceso a datos (ORM4). Aquí se tratan con bastante profundidad los aspectos relacionados con el acceso a bases datos.</p>
<p style="text-align: justify;">En la unidad 6 se describe el mecanismo para el manejo de la sesión de usuario en el servidor que proporciona symfony, mediante el cual se trata la seguridad a los niveles de autentificación y autorización. En esta unidad se construye un procedimiento para que los usuarios inicien sesión en la aplicación que puede ser reutilizado en cualquier otra aplicación web construida con symfony.</p>
<p style="text-align: justify;">En la unidad 7 se profundiza en la arquitectura MVC de symfony. Esta unidad ofrece un buen número de detalles, tanto del controlador como de la vista, mediante los cuales se enriquecen las aplicaciones web desarrolladas con symfony.</p>
<p style="text-align: justify;">En la unidad 8 se presenta el fabuloso framework de formularios de symfony. Este sistema, por sí solo, constituye una poderosa herramienta para la definición de formularios y la validación de los datos que son enviados en las peticiones HTTP al servidor web. También se estudian los formularios que son generados automáticamente por symfony para la gestión de cada una de las tablas de la base de datos.</p>
<p style="text-align: justify;">En la unidad 9 se construye completamente y de manera automática la parte de administración de la aplicación analizada en el tema 4. Además se construye un plugin con el fin de reutilizar código.</p>
<p style="text-align: justify;">Por último, la unidad 10 presenta los conceptos de internacionalización y enrutamiento y la manera en que symfony los trata.</p>
<img style='display:none' id="post-209-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/diseno-de-aplicaciones-web-con-symfony/',title:'Diseño de aplicaciones web con Symfony',tweet:'Symfony es uno de los frameworks orientados al desarrollo web que mejor documentado está. Disponemo',description:'Symfony es uno de los frameworks orientados al desarrollo web que mejor documentado está. Disponemo'})"><script type='text/javascript'>document.getElementById("post-209-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/diseno-de-aplicaciones-web-con-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jornadas sobre Symfony en Castellón</title>
		<link>http://www.osukaru.es/programacion/jornadas-sobre-symfony-en-castellon/</link>
		<comments>http://www.osukaru.es/programacion/jornadas-sobre-symfony-en-castellon/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 08:37:38 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=188</guid>
		<description><![CDATA[Los pasados 5 y 6 de Julio he tenido el placer de asistir a las Jornadas sobre Symfony celebradas en la Universidad Jaume I de Castellón. Mi intención era hacer un pequeño resumen de cada una de las charlas, pero siguiendo la máxima del framework de no reinventar la rueda os invito a que leáis [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Los pasados 5 y 6 de Julio he tenido el placer de asistir a las <a href="http://decharlas.uji.es/symfony/">Jornadas sobre Symfony</a> celebradas en la Universidad Jaume I de Castellón.</p>
<p style="text-align: justify;">Mi intención era hacer un pequeño resumen de cada una de las charlas, pero siguiendo la máxima del framework de no reinventar la rueda os invito a que leáis la <a href="http://www.symfony.es/2010/07/06/cronica-de-las-primeras-jornadas-de-symfony/">crónica</a> de mi cada vez más admirado Javier Eguiluz (su charla sobre Symfony2 fue magistral).</p>
<p style="text-align: justify;">En cada una de las charlas se mostraron unas diapositivas y se grabó el audio, por lo que pronto podremos ver colgadas en internet todas las charlas, una vez más en el <a href="http://www.symfony.es/2010/07/06/todas-las-presentaciones-de-las-jornadas-symfony/">blog de Symfony.es</a>.</p>
<p style="text-align: justify;">Me gustaría agradecer el esfuerzo realizado por David Castelló para organizar estas jornadas, creo que puede sentirse muy orgulloso del resultado.</p>
<p style="text-align: justify;">Y ya un poco al margen de las jornadas en sí mismas, pues decir que me lo he pasado genial, 5 días en Castellón con sol y playa.</p>
<p style="text-align: justify;">Para acabar, dejo los vídeos de cada una de las charlas para que las podáis ver con detenimiento:<span id="more-188"></span></p>
<ul>
<li><a href='http://vimeo.com/13297305' >Introducción a Symfony</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13297305&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13297305&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13324354' >El ORM Doctrine</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13324354&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13324354&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13324539' >Domesticando las vistas</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13324539&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13324539&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13325576' >Admin generator</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13325576&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13325576&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13325855' >Arquitectura y diseño de un entorno de desarrollo</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13325855&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13325855&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13325958' >Caso práctico I: voota.es</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13325958&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13325958&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326079' >Caso práctico II: Symfony en CETA-CIEMAT</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326079&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326079&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326172' >Domesticando los formularios</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326256' >Plugins, no reinventes la rueda</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326256&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326256&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326324' >MongoDB y symfony</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326324&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326324&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326483' >Symfony, cloud computing y web escalables</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326483&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326483&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<li><a href='http://vimeo.com/13326625' >Symfony2</a></li>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13326625&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed wmode="transparent" src="http://vimeo.com/moogaloop.swf?clip_id=13326625&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
</ul>
<img style='display:none' id="post-188-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/jornadas-sobre-symfony-en-castellon/',title:'Jornadas sobre Symfony en Castellón',tweet:'Los pasados 5 y 6 de Julio he tenido el placer de asistir a las Jornadas sobre Symfony celebradas en',description:'Los pasados 5 y 6 de Julio he tenido el placer de asistir a las Jornadas sobre Symfony celebradas en'})"><script type='text/javascript'>document.getElementById("post-188-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/jornadas-sobre-symfony-en-castellon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu en VirtualBox</title>
		<link>http://www.osukaru.es/programacion/ubuntu-en-virtualbox/</link>
		<comments>http://www.osukaru.es/programacion/ubuntu-en-virtualbox/#comments</comments>
		<pubDate>Sun, 16 May 2010 20:48:49 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=137</guid>
		<description><![CDATA[Ya estamos a mediados de Mayo y todavía no he probado la última versión de una de las más populares distribuciones Linux: Ubuntu. Esta última versión es la 10.04 LTS y su nombre en código es Lucid Lynx. Recordemos que sale una versión de Ubuntu cada 6 meses y que la numeración de la versión [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ya estamos a mediados de Mayo y todavía no he probado la última versión de una de las más populares distribuciones Linux: Ubuntu. Esta última versión es la 10.04 LTS y su nombre en código es Lucid Lynx. Recordemos que sale una versión de Ubuntu cada 6 meses y que la numeración de la versión corresponde al año y mes del lanzamiento de la versión (en nuestro caso, la 10.04 es la versión de Abril de 2010), mientras que el nombre en código es un nombre no oficial que se le da a la versión y que se compone del nombre de un animal y un adjetivo (ahora tenemos un Lince Lúcido) que comienzan por una misma letra que en cada versión crece alfabéticamente. Además, cada 4 versiones (2 años) la versión de Ubuntu ofrece un soporte técnico extendido (LTS = Long Term Support) que nos asegura que contará con actualizaciones de seguridad durante un período de 3 años (frente a los 18 meses del resto de versiones). Podemos descargarnos una <a href="http://www.ubuntu.com/getubuntu/download">imagen ISO</a> directamente de la página oficial de Ubuntu.<br />
<span id="more-137"></span><br />
Una de las bondades de Ubuntu es que podemos probar una demo de la distribución únicamente arrancando nuestro PC con el CD de instalación, ya que Ubuntu se carga en memoria con los paquetes básicos sin necesidad de instalar nada en nuestro ordenador. Esto está muy bien para probar la distribución en líneas generales y poder realizar una pequeña evaluación, pero si realmente queremos probar esta distribución o incluso utilizarla diariamente (por ejemplo para disponer un entorno de desarrollo completamente virgen), y queremos seguir sin tener que instalarlo en nuestro ordenador, tenemos una mejor opción: virtualizarlo en VirtualBox.</p>
<p style="text-align: justify;">La virtualización en VirtualBox es realmente sencilla y muy potente. La instalación de VirtualBox no tiene ningún problema, simplemente lo descargamos de la <a href="http://www.virtualbox.org/wiki/Downloads">página web</a> y lo instalamos siguiendo los pasos del asistente.</p>
<p style="text-align: justify;">Una vez tenemos VirtualBox instalado en nuestro sistema, jugar con él es bastante intuitivo. Para nuestro propósito únicamente tenemos que crear una nueva máquina virtual (elegimos el S.O. adecuado, creamos el disco duro, etc.), montar la ISO de Ubuntu en la unidad de CD/DVD y arrancar la máquina. Una vez hecho esto, seguimos los pasos de instalación de Ubuntu. Después instalaremos <em>Guest Additions</em> que es un paquete especial de software que forma parte de VirtualBox  y que debe instalarse en cada una de las máquinas virtuales para mejorar el rendimiento y añadir nuevas funciones (integración del cursor del ratón, mejor soporte de vídeo, carpetas compartidas, etc.). Para ello sólo tenemos que descargar y montar la imagen <em>VBoxGuestAdditions.iso</em> (esto lo automatiza VirtualBox desde el menú <em>Dispositivos&#8211;&gt;Instalar Guest Additions&#8230;</em>) y ejecutar el autorun.sh (si es que no se inicia automáticamente).</p>
<p style="text-align: justify;">Una vez que ya tenemos nuestra máquina virtual lista para darle el uso que deseemos podemos hacer una cosa más: <a href="http://www.feitam.es/DocumentacionTAGs/faces/pages/index.jspx?filtro=1641&amp;modoBusqueda=id&amp;idIMC=1641">clonar el disco duro virtual</a>. De esta forma podremos crear una nueva máquina virtual sin tener que volver a instalar el sistema operativo, las guest additions y los programas básicos que siempre instalamos.</p>
<p style="text-align: justify;">El siguiente paso es poder acceder a los ficheros y directorios del sistema anfitrión. Para ello (y con la máquina virtual apagada) sólo tenemos que ir al apartado de &#8220;Carpetas compartidas&#8221; de la configuración de VirtualBox y crear las carpetas compartidas que deseemos, con la opción de hacerlas permanentes y también de sólo lectura.</p>
<p style="text-align: justify;">Una vez hecho esto, tenemos que montar la carpeta compartida dentro de nuestro sistema de Ubuntu. Supongamos que le hemos dado el nombre vBox a la carpeta compartida y que vamos a montar dicha carpeta en /media/compartida. Las instrucciones para realizar esto son:</p>
<p>[shell]<br />
sudo mkdir /media/compartida<br />
sudo mount -t vboxsf VBox /media/compartida<br />
[/shell]</p>
<p style="text-align: justify;">Y si queremos tener montado este directorio cada vez que iniciemos nuestra máquina virtual, tendremos que editar el archivo fstab:</p>
<p>[shell]<br />
sudo vim /etc/fstab<br />
[/shell]</p>
<p style="text-align: justify;">Y añadirle una línea:</p>
<p>[shell]<br />
VBox /media/compartida vboxsf rw,gid=1000,uid=1000,auto 0 0<br />
[/shell]</p>
<img style='display:none' id="post-137-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/ubuntu-en-virtualbox/',title:'Ubuntu en VirtualBox',tweet:'Ya estamos a mediados de Mayo y todavía no he probado la última versión de una de las más popula',description:'Ya estamos a mediados de Mayo y todavía no he probado la última versión de una de las más popula'})"><script type='text/javascript'>document.getElementById("post-137-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/ubuntu-en-virtualbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>Añadir información extra a SfGuardUser</title>
		<link>http://www.osukaru.es/programacion/anadir-informacion-extra-a-sfguarduser/</link>
		<comments>http://www.osukaru.es/programacion/anadir-informacion-extra-a-sfguarduser/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 11:56:55 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=93</guid>
		<description><![CDATA[Hace mucho que no escribo nada, en parte por las excusas típicas de cualquier blogger (falta de tiempo y ganas, básicamente) y en parte también porque no tenía nada relevante que contar. Y la verdad es que el asunto sigue igual, pero acabo de leer un pequeño post de mi primo que además de ser [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hace mucho que no escribo nada, en parte por las excusas típicas de cualquier blogger (falta de tiempo y ganas, básicamente) y en parte también porque no tenía nada relevante que contar. Y la verdad es que el asunto sigue igual, pero acabo de leer un pequeño post de <a href="http://www.flai.es/">mi primo</a> que además de ser muy interesante e instructivo, parece que es el paso lógico posterior a la instalación del plugin SfDoctrineGuardPlugin, que era la última entrada que había hecho en el blog. Así, que sin más dilación, enlazo el post:</p>
<p style="text-align: justify;"><a href="http://networkedblogs.com/p26040835">Relaciones 1:1 transparentes en Doctrine</a></p>
<img style='display:none' id="post-93-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/anadir-informacion-extra-a-sfguarduser/',title:'Añadir información extra a SfGuardUser',tweet:'Hace mucho que no escribo nada, en parte por las excusas típicas de cualquier blogger (falta de tie',description:'Hace mucho que no escribo nada, en parte por las excusas típicas de cualquier blogger (falta de tie'})"><script type='text/javascript'>document.getElementById("post-93-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/anadir-informacion-extra-a-sfguarduser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

