<?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>Thu, 05 Aug 2010 10:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</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>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[XSL PHP]]></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>
		<item>
		<title>Instalando sfDoctrineGuardPlugin</title>
		<link>http://www.osukaru.es/programacion/instalando-sfdoctrineguardplugin/</link>
		<comments>http://www.osukaru.es/programacion/instalando-sfdoctrineguardplugin/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:43:11 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=66</guid>
		<description><![CDATA[Una de las características más habituales de cualquier aplicación es la autentificación de usuarios para asegurar diferentes partes de la aplicación. El plugin sfDoctrineGuardPlugin nos facilita la implementación de esta tarea. Para instalar y habilitar este plugin tenemos que seguir estos sencillos pasos: Lo primero que tenemos que hacer es instalar el plugin en nuestro [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Una de las características más habituales de cualquier aplicación es la autentificación de usuarios para asegurar diferentes partes de la aplicación. El plugin sfDoctrineGuardPlugin nos facilita la implementación de esta tarea. Para instalar y habilitar este plugin tenemos que seguir estos sencillos pasos:<br />
<span id="more-66"></span></p>
<ul style="text-align: justify;">
<li>Lo primero que tenemos que hacer es instalar el plugin en nuestro proyecto. Podemos ejecutar la tarea de instalación:<br />
<code>symfony plugin:install sfDoctrineGuardPlugin</code><br />
para lo que tenemos que tener instalado PEAR, pero como últimamente PEAR y yo no nos hablamos, pues vamos a descargarnos el <a href="http://plugins.symfony-project.org/get/sfDoctrineGuardPlugin/sfDoctrineGuardPlugin-4.0.1.tgz">paquete</a> y lo descomprimimos en la carpeta plugins de nuestro proyecto (lo renombramos quitándole la numeración de la versión: sfDoctrineGuarPlugin).</li>
<li>Ahora activamos el plugin en el <em>archivo config/ProjectConfiguration.class.php</em> de nuestro proyecto:<br />
[php]<br />
class ProjectConfiguration extends sfProjectConfiguration<br />
{<br />
public function setup()<br />
{<br />
$this-&gt;enablePlugins(array(<br />
&#8216;sfDoctrinePlugin&#8217;,<br />
&#8216;sfDoctrineGuardPlugin&#8217;,<br />
&#8216;&#8230;&#8217;<br />
));<br />
}<br />
}<br />
[/php]</li>
<li>Reconstruimos el modelo y actualizamos la base de datos:<br />
<code>symfony doctrine:build --all</code></li>
</ul>
<p style="text-align: justify;">Ahora ya tenemos el plugin instalado. Lo siguiente que vamos a hacer es cargar los datos de prueba (que consisten en un usuario administrador):</p>
<ul style="text-align: justify;">
<li>Copiamos el fichero <em>plugins/sfDoctrineGuardPlugin/data/fixtures/fixtures.yml.sample</em> en <em>data/fixtures/sfGuard.yml</em> y cargamos los datos:<br />
<code>symfony doctrine:data-load</code></li>
</ul>
<p style="text-align: justify;">Bien, ya sólo nos queda habilitar los módulos que vayamos a utilizar y configurarlos correctamente.</p>
<ul style="text-align: justify;">
<li>En el frontend, abrimos el archivo <em>settings.yml</em> y añadimos el módulo sfGuardAuth y lo configuramos:<br />
[css]<br />
all:<br />
.settings:<br />
enabled_modules:      [default, sfGuardAuth]<br />
login_module:           sfGuardAuth<br />
login_action:           signin<br />
secure_module:          sfGuardAuth<br />
secure_action:          secure<br />
[/css]</li>
<li>Editamos la clase myUser.class.php para cambiar la clase de la que hereda:<br />
[php]<br />
class myUser extends sfGuardSecurityUser<br />
{<br />
}<br />
[/php]</li>
<li>Opcionalmente podemos cambiar el archivo routing.yml añadiendo la siguiente configuración al comienzo del archivo:<br />
[css]<br />
sf_guard_signin:<br />
url:   /login<br />
param: { module: sfGuardAuth, action: signin }</p>
<p>sf_guard_signout:<br />
url:   /logout<br />
param: { module: sfGuardAuth, action: signout }</p>
<p>sf_guard_password:<br />
url:   /request_password<br />
param: { module: sfGuardAuth, action: password }<br />
[/css]</li>
<li>En el archivo security.yml podemos asegurar los módulos que queramos o la aplicación completa:<br />
[css]<br />
default:<br />
is_secure: true<br />
[/css]</li>
</ul>
<p style="text-align: justify;">Y ya está!!! Ahora si accedemos a cualquier módulo de la aplicación y no estamos autentificados nos pedirá el usuario y el password:<br />
<a href="http://www.osukaru.es/wp-content/uploads/2009/12/login.jpg"><img class="size-full wp-image-84" title="login" src="http://www.osukaru.es/wp-content/uploads/2009/12/login.jpg" alt="login" width="265" height="129" /></a></p>
<p style="text-align: justify;">Para el backend podemos habilitar los módulos sfGuardGroup, sfGuardPermission, sfGuardUser que nos permitirán manejar usuarios, grupos y permisos.</p>
<img style='display:none' id="post-66-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/instalando-sfdoctrineguardplugin/',title:'Instalando sfDoctrineGuardPlugin',tweet:'Una de las características más habituales de cualquier aplicación es la autentificación de usuar',description:'Una de las características más habituales de cualquier aplicación es la autentificación de usuar'})"><script type='text/javascript'>document.getElementById("post-66-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/instalando-sfdoctrineguardplugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nos pasamos a Symfony 1.4!!!</title>
		<link>http://www.osukaru.es/programacion/nos-pasamos-a-symfony-1-4/</link>
		<comments>http://www.osukaru.es/programacion/nos-pasamos-a-symfony-1-4/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 20:05:15 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=64</guid>
		<description><![CDATA[Ya se han publicado las versiones estables de Symfony 1.3 y 1.4. Estas dos versiones tienen exactamente las mismas características, salvo que la versión 1.3 tiene una capa de retro-compatibilidad con las versiones anteriores. Este hecho hace que precisamente la versión 1.4 sea más mucho más limpia y algo más rápida. Para empezar nuevos proyectos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ya se han publicado las versiones estables de Symfony 1.3 y 1.4. Estas dos versiones tienen exactamente las mismas características, salvo que la versión 1.3 tiene una capa de retro-compatibilidad con las versiones anteriores. Este hecho hace que precisamente la versión 1.4 sea más mucho más limpia y algo más rápida. Para empezar nuevos proyectos lo recomendable es utilizar la versión 1.4, que además será mantenido durante 3 años (hasta Noviembre de 2012) por el equipo de desarrollo de Symfony, mientras que la versión 1.3 sólo será mantenida durante un año.<br />
<span id="more-64"></span><br />
Como habíamos utilizado PEAR para instalar Symfony, pasarnos a esta nueva versión es muy sencillo, basta con desinstalar la versión actual:</p>
<p style="text-align: justify;">[shell]pear uninstall symfony/symfony[/shell]</p>
<p style="text-align: justify;">y posteriormente instalar la versión 1.4:</p>
<p style="text-align: justify;">[shell]pear install symfony/symfony-1.4.0[/shell]</p>
<p style="text-align: justify;">Como elegimos Netbeans 6.8 con soporte para Symfony como IDE para desarrollar nuestros proyectos no tenemos nada más que hacer, ya que ahora Netbeans utilizará la nueva instalación de Symfony a la hora de crear un nuevo proyecto. Entre otras cosas, veremos que al crear un nuevo proyecto ya no tenemos que habilitar el plugin para usar Doctrine, ya que éste es el que viene activado por defecto.</p>
<img style='display:none' id="post-64-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/nos-pasamos-a-symfony-1-4/',title:'Nos pasamos a Symfony 1.4!!!',tweet:'Ya se han publicado las versiones estables de Symfony 1.3 y 1.4. Estas dos versiones tienen exactame',description:'Ya se han publicado las versiones estables de Symfony 1.3 y 1.4. Estas dos versiones tienen exactame'})"><script type='text/javascript'>document.getElementById("post-64-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/nos-pasamos-a-symfony-1-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando XDebug en PHP 5.3</title>
		<link>http://www.osukaru.es/programacion/instalando-xdebug-en-php-5-3/</link>
		<comments>http://www.osukaru.es/programacion/instalando-xdebug-en-php-5-3/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:32:09 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=56</guid>
		<description><![CDATA[Uno de los buenos hábitos que se cogen al trabajar con Symfony es el desarrollo de pruebas automáticas para nuestros proyectos. Symfony nos proporciona Lime, una librería para pruebas muy simple que está basada en PHPUnit. Al escribir pruebas para nuestro código es fácil olvidar alguna porción del mismo, por eso Symfony nos proporciona la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Uno de los buenos hábitos que se cogen al trabajar con Symfony es el desarrollo de pruebas automáticas para nuestros proyectos. Symfony nos proporciona Lime, una librería para pruebas muy simple que está basada en PHPUnit. Al escribir pruebas para nuestro código es fácil olvidar alguna porción del mismo, por eso Symfony nos proporciona la tarea <em>test:coverage</em>, que nos dirá qué porcentaje de nuestro código está cubierto por las pruebas (aunque esto no garantice que están probadas todas las posibilidades, sólo que cada línea de nuestro código ha sido ejecutada por alguna prueba). Sin embargo, para que esta tarea funcione tenemos que tener instalado y habilitado XDebug.</p>
<p style="text-align: justify;"><span id="more-56"></span></p>
<p style="text-align: justify;">Para instalar XDebug debemos ir a a la <a href="http://xdebug.org/index.php" target="_blank">página oficial</a>, descargar los <a href="http://xdebug.org/download.php" target="_blank">archivos necesarios</a> y seguir las <a href="http://xdebug.org/docs/install" target="_blank">instrucciones de instalación</a>. En nuestro caso estamos trabajando bajo Windows y con PHP 5.3 , por lo que nos tendremos que descargar la dll correspondiente y colocarla en algún lugar de nuestro disco duro (por ejemplo bajo el directorio <em>ext</em> de la instalación de PHP). Ahora sólo tenemos que editar el archivo php.ini de la instalación de PHP 5.3 y añadir la siguiente línea al final:</p>
<pre style="text-align: justify;"><strong>zend_extension="(ruta completa a php5.3.0)\ext\php_xdebug-2.0.5-5.3-vc6.dll"</strong></pre>
<p style="text-align: justify;">Ahora sólo tenemos que asegurarnos de que la ruta al ejecutable <em>php.exe</em> está incluida en la variable de entorno <em>Path</em> y ya podemos ejecutar la tarea <em>test:coverage</em>.</p>
<img style='display:none' id="post-56-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/instalando-xdebug-en-php-5-3/',title:'Instalando XDebug en PHP 5.3',tweet:'Uno de los buenos hábitos que se cogen al trabajar con Symfony es el desarrollo de pruebas automát',description:'Uno de los buenos hábitos que se cogen al trabajar con Symfony es el desarrollo de pruebas automát'})"><script type='text/javascript'>document.getElementById("post-56-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/instalando-xdebug-en-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuración de Apache para un proyecto Symfony</title>
		<link>http://www.osukaru.es/programacion/configuracion-de-apache-para-un-proyecto-symfony/</link>
		<comments>http://www.osukaru.es/programacion/configuracion-de-apache-para-un-proyecto-symfony/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 22:27:24 +0000</pubDate>
		<dc:creator>Osukaru</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.osukaru.es/?p=48</guid>
		<description><![CDATA[Una vez que hemos creado un proyecto Symfony con Netbeans tenemos que configurar nuestro servidor Apache para que tengamos acceso a él, y lo haremos añadiendo un host virtual. Básicamente tenemos dos opciones: Añadir un host virtual que escuche por un puerto determinado. Añadir un host virtual que tenga un nombre dedicado de dominio. Para [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Una vez que hemos creado un <a href="http://www.osukaru.es/2009/11/11/soporte-para-symfony-a-partir-de-netbeans-6-8/">proyecto Symfony con Netbeans</a> tenemos que configurar nuestro servidor Apache para que tengamos acceso a él, y lo haremos añadiendo un host virtual. Básicamente tenemos dos opciones:</p>
<ol style="text-align: justify;">
<li>Añadir un host virtual que escuche por un puerto determinado.</li>
<li>Añadir un host virtual que tenga un nombre dedicado de dominio.</li>
</ol>
<p style="text-align: justify;"><span id="more-48"></span>Para la primera opción simplemente tenemos que añadir las siguientes líneas al archivo <em>httpd.conf</em>:<br />
[xml]<br />
NameVirtualHost 127.0.0.1:8080</p>
<p style="text-align: justify;">Listen 127.0.0.1:8080</p>
<p style="text-align: justify;">&lt;VirtualHost 127.0.0.1:8080&gt;<br />
DocumentRoot &#8220;(1)&#8221;<br />
DirectoryIndex index.php<br />
&lt;Directory &#8220;(1)&#8221;&gt;<br />
AllowOverride All<br />
Allow from All<br />
&lt;/Directory&gt;</p>
<p style="text-align: justify;">Alias /sf &#8220;(2)&#8221;<br />
&lt;Directory &#8220;(2)&#8221;&gt;<br />
AllowOverride All<br />
Allow from All<br />
&lt;/Directory&gt;<br />
&lt;/VirtualHost&gt;<br />
[/xml]<br />
Donde (1) es la ruta de la carpeta <em>web</em> de nuestro proyecto symfony y (2) es la ruta de la carpeta <em>web/sf</em> en nuestra instalación de symfony.</p>
<p style="text-align: justify;">Con esto, ya podríamos acceder a nuestro proyecto en nuestro navegador mediante <a href="http://localhost:8080/index.php" target="_blank">http://localhost:8080/index.php</a>.</p>
<p style="text-align: justify;">Sin embargo, si somos administradores del equipo, es mucho más interesante acceder mediante un nombre de dominio dedicado. Para ello, basta eliminar la declaración <em>Listen </em>y añadir la declaración <em>ServerName </em>al <em>VirtualHost</em>:<br />
[xml]<br />
NameVirtualHost 127.0.0.1:80</p>
<p style="text-align: justify;">&lt;VirtualHost 127.0.0.1:80&gt;<br />
ServerName nombreproyecto.localhost<br />
DocumentRoot &#8220;(1)&#8221;<br />
DirectoryIndex index.php<br />
&lt;Directory &#8220;(1)&#8221;&gt;<br />
AllowOverride All<br />
Allow from All<br />
&lt;/Directory&gt;</p>
<p style="text-align: justify;">Alias /sf &#8220;(2)&#8221;<br />
&lt;Directory &#8220;(2)&#8221;&gt;<br />
AllowOverride All<br />
Allow from All<br />
&lt;/Directory&gt;<br />
&lt;/VirtualHost&gt;<br />
[/xml]<br />
Después tenemos que acceder al fichero <em>hosts </em>que se encuentra en &#8220;C:\WINDOWS\system32\drivers\etc\&#8221; y añadir la línea:<br />
[xml]<br />
127.0.0.1         nombreproyecto.localhost<br />
[/xml]<br />
(¡OJO! Si tenemos Windows Vista o Windows 7, para editar el archivo <em>hosts </em>tendremos que ejecutar nuestro editor de textos como administradores).</p>
<p style="text-align: justify;">Ahora podemos acceder a nuestro proyecto mediante <a href="http://nombreproyecto.localhost/index.php" target="_blank">http://nombreproyecto.localhost/index.php</a>.</p>
<p style="text-align: justify;">Si además hemos activado el módulo<em> mod_rewrite</em> en nuestro servidor Apache (descomentando la línea correspondiente en el archivo <em>httpd.conf</em>), entonces únicamente tendremos que teclear <a href="http://nombreproyecto.localhost" target="_blank">http://nombreproyecto.localhost</a>.</p>
<p style="text-align: justify;">Una vez que hemos realizado la configuración en Apache, sólo nos queda ir a las propiedades de nuestro proyecto en Netbeans y añadir el <em>Project URL</em> dentro de la opción <em>Run Configuration</em> para que cuando ejecutemos el proyecto (F6) se abra el navegador con la URL que acabamos de configurar.</p>
<img style='display:none' id="post-48-blankimage" onload="Meebo('discoverSharable', {element: ((this.parentNode.className.match('post')) ? this.parentNode : this.parentNode.parentNode) ,url:'http://www.osukaru.es/programacion/configuracion-de-apache-para-un-proyecto-symfony/',title:'Configuración de Apache para un proyecto Symfony',tweet:'Una vez que hemos creado un proyecto Symfony con Netbeans tenemos que configurar nuestro servidor Ap',description:'Una vez que hemos creado un proyecto Symfony con Netbeans tenemos que configurar nuestro servidor Ap'})"><script type='text/javascript'>document.getElementById("post-48-blankimage").onload();</script>]]></content:encoded>
			<wfw:commentRss>http://www.osukaru.es/programacion/configuracion-de-apache-para-un-proyecto-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
