<?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>Aikon &#187; Desarrollo Web</title>
	<atom:link href="http://aikon.com.ve/category/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://aikon.com.ve</link>
	<description>Otro Blog de WordPress</description>
	<lastBuildDate>Sat, 24 Apr 2010 18:46:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Todo lo que sabes sobre CSS está mal</title>
		<link>http://aikon.com.ve/todo-lo-que-sabes-sobre-css-esta-mal/</link>
		<comments>http://aikon.com.ve/todo-lo-que-sabes-sobre-css-esta-mal/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 01:28:04 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[estándares-web]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[internet-explorer]]></category>
		<category><![CDATA[opera]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=547</guid>
		<description><![CDATA[Otro libro de Sitepoint que agrego a mi colección. Este es recomendable tanto para quienes ya conocen sobre CSS como para los que apenas comienzan. Con este libro se aprende que CSS no es tan difícil.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/todo-lo-que-sabes-sobre-css-esta-mal/">Todo lo que sabes sobre CSS está mal</a></p>
]]></description>
			<content:encoded><![CDATA[<p>&#8220;Todo lo que sabes sobre CSS está mal&#8221; es un libro de Sitepoint que acabo de terminar de leer, este libro está dirigido  tanto a desarrolladores web con experiencia como a los que apenas estan ingresando a este mundo. Es un libro bastante corto (la mitad de lo que acostumbran en Sitepoint) que trata el tema de las formas avanzadas para maquetar (layout) el diseño de las paginas web.</p>
<h2>¿De que se trata?</h2>
<p>Como ya dije, el libro le presenta al lector los nuevos métodos de posicionamiento que estarán disponibles en todos los navegadores una vez que Internet Explorer 8 salga al mercado: &#8220;nuevos&#8221; valores para la propiedad <strong>display</strong> de CSS2.1 que permiten emular tablas, filas y celdas con otros elementos. Escribo &#8220;nuevos&#8221; (entre comillas) porque estos valores para la propiedad display estaban soportados por Firefox, Safari, Opera y otros desde hace mucho tiempo.</p>
<h2>¿Cuales son los valores para display?</h2>
<p>Los valores para hacer layouts tabulares con css son:</p>
<ul>
<li><strong>table:</strong> hace que un elemento se comporte como un elemento &lt;table&gt;</li>
<li><strong>table-row:</strong> hace que un elemento se comporte como un elemento &lt;tr&gt;</li>
<li><strong>table-cell:</strong> hace que un elemento se comporte como un elemento &lt;td&gt;</li>
<li><strong>otros: </strong>incluiye los no tan usados &lt;tbody&gt; (table-row-group), &lt;thead&gt; (table-header-group), &lt;tfoot&gt; (table-footer-group&gt;, &lt;caption&gt; (table-caption), &lt;col&gt; (table-column) y &lt;colgroup&gt; (table-column-group)</li>
</ul>
<p>Estas opciones permitirán a los desarrolladores web dejar en el pasado las técnicas que hasta ahora (también las explican así que los que no conocen nada del tema no se sentirán perdidos) hemos utilizado para el posicionamiento de los elementos en nuestros desarrollos web.</p>
<p>Por ejemplo, si tenemos elementos div seguidos con <strong>display:table-cell </strong>y<strong> width:80px</strong> estos aparecerán uno al lado del otro y, lo más importante, serán de la misma altura.</p>
<p>Aparte de esto, el libro presenta alternativas para dar soporte a los navegadores más viejos (IE7 e IE6) sin tener que abandonar estas nuevas opciones.</p>
<h2>¿Es CSS3?</h2>
<p>A pesar de que yo mismo <a href="http://aikon.com.ve/feliz-2009/">pensaba que este libro era una introducción a las técnicas de CSS3</a>, me equivoqué. Se centra en tecnología vieja que tan sólo ahora es posible poner en uso sin dejar por fuera a una gran parte de los usuarios. Sin embargo, el libro destina su capítulo final a las técnicas de distribución del texto en columnas (de manera automatica y sin requerir markup adicional), y los dos módulos para maquetación: grids y plantillas (los cuales no han sido implementados aún por ningún navegador) que estarán disponibles en CSS3.</p>
<h2>En resumen</h2>
<p>El libro es bastante sencillo de entender, con ejemplos claros y bién explicados que permitirán a quienes no conocen CSS ponerse a tono con lo básico de las técnicas utilizadas hoy en día para la diagramación y simulacion de grids en el diseño de páginas web (floats y posicionamiento relativo/absoluto). También ofrece un poco de historia sobre como fue la evolución de CSS y el soporte de los navegadores (para los que ni la historia conocen). Luego procede a presentar las nuevas técnicas que estarán disponibles dentro de poco. Y por último te da una mirada al futuro de lo que podremos empezar a utilizar una vez que CSS3 sea soportado por los navegadores (esperemos que Microsoft no se duerma en sus laureles nuevamente).</p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/todo-lo-que-sabes-sobre-css-esta-mal/">Todo lo que sabes sobre CSS está mal</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/cese-al-fuego-guerra-de-navegadores/" title="¿Cese al fuego en la guerra de los navegadores?">¿Cese al fuego en la guerra de los navegadores?</a></li><li><a href="http://aikon.com.ve/internet-explorer-y-su-compatibilidad-css/" title="Internet Explorer y su compatibilidad CSS">Internet Explorer y su compatibilidad CSS</a></li><li><a href="http://aikon.com.ve/la-escuela-de-html/" title="La escuela de HTML">La escuela de HTML</a></li><li><a href="http://aikon.com.ve/ie-fue-inseguro-en-284-dias-del-ano-pasado/" title="IE fue inseguro en 284 dias del año pasado">IE fue inseguro en 284 dias del año pasado</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/todo-lo-que-sabes-sobre-css-esta-mal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Precargar la base de datos utilizando el Shell Schema de CakePHP [Instalador]</title>
		<link>http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/</link>
		<comments>http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 06:32:27 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=511</guid>
		<description><![CDATA[Para quienes no desean escribir SQL y mucho menos desarrollar la lógica de un instalador en CakePHP, el shell Schema de la cónsola de CakePHP es una solución sencilla y facil de implementar al problema de inicializar una base de datos.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/">Precargar la base de datos utilizando el Shell Schema de CakePHP [Instalador]</a></p>
]]></description>
			<content:encoded><![CDATA[<p>A veces cuando desarrollamos aplicaciones, estas requieren de un instalador completo que le permita al administrador configurar elementos. Ejemplo de este tipo de aplicaciones (en PHP) son <a href="http://wordpress.org">wordpress</a> y <a title="Ósmosis Learning Management System" href="http://aikon.com.ve/category/osmosis/">ósmosis</a>. Sin embargo, cuando sabemos que una aplicación no será instalada por más nadie, el &#8220;instalador&#8221; puede ser tan sencillo como un script SQL o, mejor aún, un schema de CakePHP que puedes ejecutar desde la <a title="Configurando la nueva consola de CakePHP1.2 en PHPEclipse" href="http://aikon.com.ve/configurando-la-nueva-consola-de-cakephp12-en-phpeclipse/">cónsola</a>. A continuación les explico la manera de utilizar los schemas de CakePHP para cargar datos:</p>
<h2>Genera el schema de CakePHP</h2>
<p>Primero debemos generar el schema de la base de datos ejecutando el siguiente comando:</p>
<div class="dean_ch" style="white-space: wrap;">cake schema generate</div>
<p>Esto generará el archivo en APP/config/sql/schema.php el cual contiene dos funciones  las cuales son las que utilizaremos a continuación.</p>
<h2>La inserción de datos</h2>
<p>Las funciones before y after son las que podemos utilizar para este fin, estas se ejecutan antes y después (respectivamente) de la creación de <strong>cada tabla</strong>. Esto representa un problema ya que  evita que se puedan instanciar los modelos: las tablas de los modelos relacionados puede que no existan aún lo cual generará errores. Para superar esta dificultad utilizaremos las funciones de más bajo nivel de Cake, para acceso a la base de datos, de la siguiente manera:</p>
<p>Suponiendo que schema.php tiene la definición de una tabla users (por ejemplo) podemos crear el primer usuario de la aplicación de la siguiente manera:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
&#8230;<br />
<span class="kw2">function</span> after<span class="br0">&#40;</span><span class="re0">$event</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$inserts</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;users&quot;</span> =&gt; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;username&quot;</span>&nbsp; =&gt; <span class="st0">&quot;admin&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;password&quot;</span>&nbsp; =&gt; Security::<span class="me2">hash</span><span class="br0">&#40;</span><span class="st0">&quot;miPasswordSuperSecreto&quot;</span>, <span class="kw2">null</span>, <span class="kw2">true</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;group&quot;</span>&nbsp;&nbsp; &nbsp; =&gt; <span class="st0">&quot;Admin&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$event</span><span class="br0">&#91;</span><span class="st0">&quot;create&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &amp;&amp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$inserts</span><span class="br0">&#91;</span><span class="re0">$event</span><span class="br0">&#91;</span><span class="st0">&quot;create&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$db</span> =&amp; ConnectionManager::<span class="me2">getDataSource</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">connection</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span> = <span class="re0">$inserts</span><span class="br0">&#91;</span><span class="re0">$event</span><span class="br0">&#91;</span><span class="st0">&quot;create&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$values</span> = <span class="re0">$fields</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$data</span> <span class="kw1">as</span> <span class="re0">$row</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$fields</span> = <a href="http://www.php.net/array_keys"><span class="kw3">array_keys</span></a><span class="br0">&#40;</span><span class="re0">$row</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$values</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="st0">&quot;(&quot;</span> .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/implode"><span class="kw3">implode</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;, &quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array_map"><span class="kw3">array_map</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>&amp;<span class="re0">$db</span>, <span class="st0">&quot;value&quot;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array_values"><span class="kw3">array_values</span></a><span class="br0">&#40;</span><span class="re0">$row</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; . <span class="st0">&quot;)&quot;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$db</span>-&gt;<span class="me1">insertMulti</span><span class="br0">&#40;</span><span class="re0">$event</span><span class="br0">&#91;</span><span class="st0">&quot;create&quot;</span><span class="br0">&#93;</span>, <span class="re0">$fields</span>, <span class="re0">$values</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw2">?&gt;</span></div>
<p>De este modo insertamos el primer usuario (encriptando la clave con Security, aquí deben suar el método que prefieran), la misma técnica se puede utilizar para pre cargar otros datos &#8211; usando arreglos muy parecidos a los que usa CakePHP &#8211; para inicializar la aplicación sin necesidad de un instalador y todos los problemas de seguridad que conlleva.</p>
<p><strong>Nota:</strong> para cargar la base de datos se debe ejecutar el siguiente comando:</p>
<div class="dean_ch" style="white-space: wrap;">cake schema run create</div>
<p>Gracias a <a href="http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/#comment-680">Adrian por su comentario</a> al respecto</p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/">Precargar la base de datos utilizando el Shell Schema de CakePHP [Instalador]</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/detalles-de-la-semana-21-27-feb/" title="Detalles de la semana (21-27 feb)">Detalles de la semana (21-27 feb)</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li><li><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/" title="Sistema de autenticación simple en CakePHP">Sistema de autenticación simple en CakePHP</a></li><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/precargar-la-base-de-datos-utilizando-el-shell-schema-de-cakephp-instalador/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interesante comparativa entre CakePHP y Symfony</title>
		<link>http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/</link>
		<comments>http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 18:19:47 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=492</guid>
		<description><![CDATA[Una comparativa entre CakePHP y Symfony. Al principio parece declarar a Symfony como el ganador pero cuando hacen las mismas pruebas con la versión de desarrollo (la que hace poco fue liberada como 1.2final) resulta que CakePHP1.2 es el más rápido entre los framework para PHP.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/">Interesante comparativa entre CakePHP y Symfony</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Hoy salió disponible en Bakery un artículo que enlaza a los siguientes resultados comparativos entre los frameworks de desarrollo web para PHP: Symfony y CakePHP. El caso de prueba es bastante interesante porque no es una aplicación hecha para comparar los frameworks sino que tomaron una aplicación real (hecha en Symfony 1.0) y la escribieron en CakePHP (sólo la página principal). Los resultados:</p>
<p>En primer lugar apuntaron a que Symfony era más rápido hasta que probaron con la ultima versión de desarrollo (que es la estable actualmente). Acá les dejo el gráfico:</p>
<div class="mceTemp">
<dl id="attachment_493" class="wp-caption alignnone" style="width: 410px;">
<dt class="wp-caption-dt"><img class="size-medium wp-image-493" title="CakePHP Vs. Symfony" src="/uploads/2009/01/cake-symfony-300x184.png" alt="CakePHP vs Symfony results (requests per second)" width="400" height="245" /></dt>
<dd class="wp-caption-dd">CakePHP vs Symfony: solicitudes por segundo<br />
<strong>CakePHP1.1:</strong> 3.41<br />
<strong>CakePHP1.2Final:</strong> 2.28<br />
<strong>Symfony:</strong> 2.19<br />
<strong>CakePHP1.2RC2:</strong> 1.96 </dd>
</dl>
</div>
<p>Los resultados acá presentados provienen de esta <a href="http://puyo2.upper.jp/cake/download/confirm/20080929_CakePHP_performance(en).pdf">presentación por YusukeAndo</a>. La diferencia entre Cake1.1 y 1.2 es grande,  pero considerando la cantidad de mejoras entre las dos versiones es un precio justo que esperamos se haga cada vez menor <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por otro lado, y como dato curioso: la velocidad de una página HTML sóla es del orden de 10 veces comparada a los framework :S</p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/">Interesante comparativa entre CakePHP y Symfony</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/" title="Sistema de autenticación simple en CakePHP">Sistema de autenticación simple en CakePHP</a></li><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li><li><a href="http://aikon.com.ve/cakephp-12-final/" title="CakePHP 1.2 Final">CakePHP 1.2 Final</a></li><li><a href="http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/" title="1 aspecto importante al usar requestAction más AuthComponent">1 aspecto importante al usar requestAction más AuthComponent</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sistema de autenticación simple en CakePHP</title>
		<link>http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/</link>
		<comments>http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 21:53:15 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[autenticación]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=480</guid>
		<description><![CDATA[Un método sencillo para implementar el manejo de permisos dentro de una aplicación hecha con CakePHP. Este método implementa un sistema de permisos en cascada con usuarios perteneciendo a un sólo grupo<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/">Sistema de autenticación simple en CakePHP</a></p>
]]></description>
			<content:encoded><![CDATA[<p>CakePHP es un framework de PHP que tiene soporte para un sistema de permisos muy complejo en base a ACL. Sin embargo no todos los desarrollos web requieren de algo tan complejo. Para esos casos, con sólo usar el AuthComponent se puede manejar de manera sencilla. Esta es la manera en que lo he hecho yo:</p>
<p>Este método asume que cada usuario pertenece a un sólo grupo y pueden haber tantos grupos como se anecesario. Para lograrlo es necesario modificar el AppController para hacer que cargue el AuthComponent y un archivo en el que indicaremos los permisos.</p>
<h2>Archivo de definición de permisos (permissions.php)</h2>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
<span class="kw2">class</span> AppPermissions <span class="kw2">extends</span> Object <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Define the groups allowed, order matters</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$groups</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;Public&quot;</span>, <span class="st0">&quot;User&quot;</span>, <span class="st0">&quot;Admin&quot;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$Users</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;index&quot;</span>&nbsp;=&gt; <span class="st0">&quot;User&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;view&quot;</span>&nbsp; =&gt; <span class="st0">&quot;Public&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add&quot;</span>&nbsp; &nbsp;=&gt; <span class="st0">&quot;Admin&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;edit&quot;</span>&nbsp; =&gt; <span class="st0">&quot;Admin&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;delete&quot;</span>=&gt; <span class="st0">&quot;Admin&quot;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$Posts</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;index&quot;</span> =&gt; <span class="st0">&quot;Public&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;view&quot;</span>&nbsp; =&gt; <span class="st0">&quot;Public&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add&quot;</span>&nbsp; &nbsp;=&gt; <span class="st0">&quot;User&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;edit&quot;</span>&nbsp; =&gt; <span class="st0">&quot;User&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;delete&quot;</span>=&gt; <span class="st0">&quot;User&quot;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">function</span> __currentActionGroup<span class="br0">&#40;</span><span class="re0">$controller_name</span>, <span class="re0">$action</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="br0">&#123;</span><span class="re0">$controller_name</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="br0">&#123;</span><span class="re0">$controller_name</span><span class="br0">&#125;</span><span class="br0">&#91;</span><span class="re0">$action</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span>-&gt;<span class="br0">&#123;</span><span class="re0">$controller_name</span><span class="br0">&#125;</span><span class="br0">&#91;</span><span class="re0">$action</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">function</span> groupHasAccess<span class="br0">&#40;</span><span class="re0">$controller</span>, <span class="re0">$action</span>, <span class="re0">$group</span> = <span class="st0">&quot;Public&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$group_index</span> = <a href="http://www.php.net/array_search"><span class="kw3">array_search</span></a><span class="br0">&#40;</span><span class="re0">$group</span>, <span class="re0">$this</span>-&gt;<span class="me1">groups</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$allowedGroup</span> = <span class="re0">$this</span>-&gt;__currentActionGroup<span class="br0">&#40;</span><span class="re0">$controller</span>, <span class="re0">$action</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$allowedGroup_index</span> = <a href="http://www.php.net/array_search"><span class="kw3">array_search</span></a><span class="br0">&#40;</span><span class="re0">$allowedGroup</span>, <span class="re0">$this</span>-&gt;<span class="me1">groups</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$group_index</span> &gt;= <span class="re0">$allowedGroup_index</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>En este archivo, que debemos colocar en el directorio config de nuestra aplicación, definimos dos cosas:</p>
<ol>
<li>Los grupos permitidos en el sistema (en este caso User y Admin), el orden en que se definen los grupos es importante y determina una cascada de permisos (es decir, que como User tiene menor índice que Admin entonces Admin puede hacer todo lo que está permitido a los usuarios)</li>
<li>Por cada controlador, las acciones y el grupo que puede ejecutar dicha acción.</li>
</ol>
<p>Con este archivo ya definimos los permisos y si se agrega un nuevo controlador o una nueva acción será necesario incluirla en este archivo.</p>
<h2>Carga de la definición de los permiso y filtrado</h2>
<p>En el AppController se realiza todo el manejo de los permisos, de modo que los demás controladores queden libres de manejar esta lógica:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
App::<span class="me2">import</span><span class="br0">&#40;</span><span class="st0">&quot;File&quot;</span>, <span class="st0">&quot;permissions&quot;</span>, <span class="kw2">true</span>, CONFIGS<span class="br0">&#41;</span>;<br />
<span class="kw2">class</span> AppController <span class="kw2">extends</span> Controller <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$components</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;Auth&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$permissions</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> beforeFilter<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">permissions</span> = <span class="kw2">new</span> AppPermissions<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;_initializeAuth<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">function</span> _initializeAuth<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">authorize</span> = <span class="st0">&quot;controller&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">loginAction</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;controller&quot;</span> =&gt; <span class="st0">&quot;users&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;action&quot;</span> =&gt; <span class="st0">&quot;login&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;plugin&quot;</span> =&gt; <span class="st0">&quot;&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;admin&quot;</span> =&gt; <span class="kw2">false</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">loginError</span> = __<span class="br0">&#40;</span><span class="st0">&quot;Login or password incorrect&quot;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">user</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$actionIsPublic</span> = <span class="re0">$this</span>-&gt;<span class="me1">permissions</span>-&gt;<span class="me1">groupHasAccess</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">name</span>, <span class="re0">$this</span>-&gt;<span class="me1">action</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$actionIsPublic</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Session</span>-&gt;<span class="me1">setFlash</span><span class="br0">&#40;</span>__<span class="br0">&#40;</span><span class="st0">&quot;You must be logged in to access that action&quot;</span>, <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">function</span> isAuthorized<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$group</span> = <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">user</span><span class="br0">&#40;</span><span class="st0">&quot;group&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$groupHasAccess</span> = <span class="re0">$this</span>-&gt;<span class="me1">permissions</span>-&gt;<span class="me1">groupHasAccess</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">name</span>, <span class="re0">$this</span>-&gt;<span class="me1">action</span>, <span class="re0">$group</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="re0">$groupHasAccess</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Session</span>-&gt;<span class="me1">setFlash</span><span class="br0">&#40;</span>__<span class="br0">&#40;</span><span class="st0">&quot;You don<span class="es0">\&quot;</span>t have access to that action&quot;</span>, <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$groupHasAccess</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>Como se puede observar, lo primero que hace es cargar el archivo de permisos que creamos en la parte anterior. De modo que en la función beforeFilter (que CakePHP ejecuta automáticamente antes que cualquier otra parte del controlador) pueda ser instanciada la clase.</p>
<p>La función _initializeAuth configura algunas características del AuthComponent, entre ellas establece el método de autenticación en &#8220;controller&#8221; (para manejar los permisos por medio de la función isAuthorized del controlador). Es importante notar que esta función realiza parte del filtrado de permisos, debido a que en caso de que el usuario no esté autenticado (un visitante) la función isAuthorized no es ejecutada por el Auth Component.</p>
<p>Y por último, en isAuthorized se ejecuta el resto de la verificación de permisos que consiste en preguntar a la clase AppPermissions si el grupo al que pertenece el usuario actual está autorizado para acceder a la acción actual (en el controlador actual).</p>
<p>Como ven, la mayor parte de la acción se ejecuta en el AppController pero es la clase AppPermissions la que realiza la mágia de determinar quién tiene acceso a qué (por medio de la función groupHasAccess).</p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/">Sistema de autenticación simple en CakePHP</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li><li><a href="http://aikon.com.ve/cakephp-12-final/" title="CakePHP 1.2 Final">CakePHP 1.2 Final</a></li><li><a href="http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/" title="1 aspecto importante al usar requestAction más AuthComponent">1 aspecto importante al usar requestAction más AuthComponent</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Los componentes en CakePHP extienden a Object no a Component</title>
		<link>http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/</link>
		<comments>http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 21:52:25 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[dumb]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=453</guid>
		<description><![CDATA[<img class="alignnone size-full wp-image-457" title="banghead" src="/uploads/2008/12/banghead.gif" alt="banghead" width="150" height="107" />Un pequeño error durante la creación de un componente puede resultar en horas enteras perdidas.

Esta entrada es sólo una advertencia/recordatorio a mi mismo :)<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/">Los componentes en CakePHP extienden a Object no a Component</a></p>
]]></description>
			<content:encoded><![CDATA[<p>He pasado las últimas 4 horas peleando con CakePHP y nuevamente no es culpa del framework de desarrollo sino el desarrollador <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Eso es todo! El título lo explica claramente. De resto CakePHP sigue siendo el mejor framework de desarrollo para PHP <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><img class="alignnone size-full wp-image-455" title="Bang Head Here" src="/uploads/2008/12/bangheadhere.png" alt="Bang Head Here" width="264" height="320" />Más detalles:</strong> los componentes pueden implementar una función llamada beforeRedirect (la cual existe en la clase Component). Como yo tenía un componente al que hice heredar de Component (en lugar de Object &#8211; sí es raro, pero así es como debe ser) heredó esa función que no debía implementar. De ahí que cuando hacía un redirect las cosas se ponían espeluznantes <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/">Los componentes en CakePHP extienden a Object no a Component</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/cakephp-12-final/" title="CakePHP 1.2 Final">CakePHP 1.2 Final</a></li><li><a href="http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/" title="7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4">7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</a></li><li><a href="http://aikon.com.ve/cakephp12-rc4/" title="CakePHP 1.2 RC4">CakePHP 1.2 RC4</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 1.2 Final</title>
		<link>http://aikon.com.ve/cakephp-12-final/</link>
		<comments>http://aikon.com.ve/cakephp-12-final/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 17:14:11 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=447</guid>
		<description><![CDATA[Ya hace 2 días gwoo lo anunció por Bakery, ¡el mejor framework de desarrollo web con PHP llegó a su versión 1.2 estable! Y dentro del empaque hay muchas novedades que hacen palidecer de pena a la versión 1.1 de este framework de desarrollo web para PHP.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/cakephp-12-final/">CakePHP 1.2 Final</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Tremendo regalo de navidad para los desarrolladores web. Es interesante que sólo 7 días antes habían lanzado la <a href="http://aikon.com.ve/cakephp12-rc4/">cuarta versión de pre entrega</a>, pero ahora CakePHP 1.2 ha sido marcado estable. Yo llevo más de un año desarrollando sobre esta versión así que les aseguro que los cambios son fenomenales. Algunos de los beneficios que trae Cake PHP 1.2 son:</p>
<h2>Mejoras generales</h2>
<ul>
<li><strong>Suite de Pruebas Unitarias:</strong> todas las clases del core tienen sus pruebas y te permite hacer pruebas sobre las partes de tu aplicación.</li>
<li><strong>Infraestructura de línea de comandos: </strong><a href="http://aikon.com.ve/configurando-la-nueva-consola-de-cakephp12-en-phpeclipse/">la consola de cake</a> te permite generar código automáticamente para modelos, controladores, vistas y hasta los archivos de traducción.</li>
<li>Y hablando de <strong>traducciones</strong>: cakephp ofrece clases para <abbr title="En inglés: Internationalization">i18n</abbr> y <abbr title="En inglés: Localization">i10n</abbr> con soporte para caracteres unicode.</li>
<li><strong>Caching:</strong> basado en adaptadores, con soporte para APC/XCache/Memcache</li>
<li><strong>Clase Set:</strong> funciones muy útiles para manejo de arreglos, con soporte para XPath.</li>
<li>Clase <strong>Socket</strong> y <strong>HttpSocket</strong>: para hacer solicitudes remotas a servicios.</li>
<li>Clase <strong>App</strong> y <strong>Configure</strong>: para cargar configuraciones y reemplazar constantes y funciones globales, respectivamente.</li>
</ul>
<h2>Controlador y Componentes:</h2>
<ul>
<li>Componente para <strong>autenticación</strong>: manejo automático de sesiones y se asocia con ACL para aprobar y denegar acceso a las acciones.</li>
<li>Componente de <strong>email</strong>: para envío de correos electrónicos con HTML y texto. Varias partes de este componente tienen código mio <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  pero <a href="https://trac.cakephp.org/ticket/4687">desgraciadamente este no</a> <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>Componente de <strong>seguridad</strong>: para proteger la aplicación de ataques de Cross Site Request Forgery.</li>
<li>Componente de <strong>cookies</strong>: para manejarlas de manera segura.</li>
<li><strong>Paginación</strong>: de manera sencilla distribuye los resultados en varias páginas.</li>
</ul>
<h2>Modelos y Behaviors:</h2>
<ul>
<li><strong>Modelos join:</strong> para modelar las tablas de relaciones HABTM.</li>
<li><strong>Behaviors:</strong> para extender la funcionalidad básica de los modelos.</li>
<li><strong>Containable Behavior: </strong>simplifica las labores de optimización de consultas.</li>
<li><strong>Validación:</strong> nuevo sistema extendido que permite múltiples reglas de validación</li>
<li>Soporte para DB2 y Oracle</li>
</ul>
<h2>Vistas y Helpers:</h2>
<ul>
<li><strong>Form helper:</strong> creación de formularios es fácil gracias a que hace introspección par conocer los tipos de datos y generar los tipos de campo necesarios.</li>
<li><strong>Elementos:</strong> ahora con soporte para caching.</li>
</ul>
<p>Como ven son una gran cantidad de cambios. Tantos que yo diría que esta es la versión 2 en lugar de 1.2 <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Pero eso sólo genera más emoción de todo lo que vendrá.</p>
<p>¡Felicidades a los desarrolladores y bakers!</p>
<p><a href="http://bakery.cakephp.org/articles/view/the-gift-of-1-2-final">Via</a></p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/cakephp-12-final/">CakePHP 1.2 Final</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li><li><a href="http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/" title="7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4">7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</a></li><li><a href="http://aikon.com.ve/cakephp12-rc4/" title="CakePHP 1.2 RC4">CakePHP 1.2 RC4</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/cakephp-12-final/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1 aspecto importante al usar requestAction más AuthComponent</title>
		<link>http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/</link>
		<comments>http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 17:30:29 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[element]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[requestAction]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=416</guid>
		<description><![CDATA[Olvidar que utilizar requestAction es equivalente a realizar una solicitud aparte puede ser grave. ¡A mi me costó un par de horas!<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/">1 aspecto importante al usar requestAction más AuthComponent</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Hoy mientras desarrollaba un nuevo sitio me topé con problema que pensé que era un error del AuthComponent: una acción que debía estar accesible a un usuario no autenticado me redirigía a la página de login.</p>
<p>Luego de revisar el código del Auth component sin resultados me recordé que en esa vista hago uso de la técnica de <a title="Elementos reusables con requestAction" href="http://aikon.com.ve/elementos-reusables-con-requestaction/">elementos reusables con requestAction</a> y había olvidado agregar la solicitada por requestAction a la lista de acciones de acceso público. Por lo tanto me redirigía a la página de login nuevamente.</p>
<p>Con agregar la acción solicitada con requestAction a la lista de acciones permitidas se solucionó el problema. De esta experiencia puedo decirles que hay dos cosas importantes que recordar:</p>
<ol>
<li>Hacer una llamada a requestAction es equivalente a una solicitud completa al servidor: no abuses de requestAction o el servidor te demandará por maltrato. Usa el caché.</li>
<li>Al ser una solicitud completamente nueva todos los pasos de cake son ejecutados: desde el bootstraping (carga de las configuraciones de Cake), pasando por la carga de componentes, helpers y behaviors hasta la ejecución de la acción en el controlador. Eso incluye el Auth Component, lo cual se me olvidó a mi <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
<li>Sí, había dicho que eras sólo 2 pero este punto es adicional e interesante: la acción con requestAction tomaba 0.5 segundos en ser completada, al usar caching el tiempo disminuyó a 0.1 segundos (te dije que era interesante <img src='http://aikon.com.ve/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</li>
</ol>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/">1 aspecto importante al usar requestAction más AuthComponent</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/elementos-reusables-con-requestaction/" title="Elementos reusables con requestAction">Elementos reusables con requestAction</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li><li><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/" title="Sistema de autenticación simple en CakePHP">Sistema de autenticación simple en CakePHP</a></li><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Elementos reusables con requestAction</title>
		<link>http://aikon.com.ve/elementos-reusables-con-requestaction/</link>
		<comments>http://aikon.com.ve/elementos-reusables-con-requestaction/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 15:22:07 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[caché]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[requestAction]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=418</guid>
		<description><![CDATA[Esta técnica te permitirá hacer elementos que pueden ser utilizados sin necesidad de enviarle datos desde un controlador. Esto los hace realmente reusables y autocontenidos.

Esta técnica utiliza requestAction y caching de vistas para hacerla más eficiente.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/elementos-reusables-con-requestaction/">Elementos reusables con requestAction</a></p>
]]></description>
			<content:encoded><![CDATA[<p>En un proyecto que estoy desarrollando actualmente he decidido utilizar la técnica de elementos reusables. El gran beneficio de esta técnica es que el elemento puede ser reutilizado en otras vistas sin necesidad de enviarle datos desde el controlador ya que el elemento se encarga (por medio de requestAction) de obtener la información que requiere. <br />El único problema de esta técnica es que requestAction<a title="CakePHP Book: requestAction [es]" href="http://book.cakephp.org/es/view/434/requestAction"> representa un golpe fuerte a la velocidad de procesamiento de la página</a>, pero se puede solucionar de una manera sencilla:</p>
<p>Para usar requestAction sin temor de aumentar innecesariamente el número de request al servidor es necesario hacer uso del sistema de <a href="http://es.wikipedia.org/wiki/Cach%C3%A9">caching</a> que CakePHP ofrece.</p>
<p>La aplicación que estoy desarrollando tiene en la página principal un listado de categorías que son las que hacen uso de este método, veamos primero el código elemento (<strong>APP/views/elements/categories.ctp</strong>):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="re0">$categories</span> = <span class="re0">$this</span>-&gt;<span class="me1">requestAction</span><span class="br0">&#40;</span><span class="st0">&quot;categories/index&quot;</span><span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span><br />
&lt;ul <span class="kw2">class</span>=<span class="st0">&quot;top-category-list&quot;</span>&gt;<br />
<span class="kw2">&lt;?php</span> <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$categories</span> <span class="kw1">as</span> <span class="re0">$category</span><span class="br0">&#41;</span>: <span class="kw2">?&gt;</span><br />
&nbsp; &nbsp; &lt;li&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$html</span>-&gt;<span class="me1">link</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$category</span><span class="br0">&#91;</span><span class="st0">&quot;Category&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&quot;name&quot;</span><span class="br0">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;controller&quot;</span> =&gt; <span class="st0">&quot;categories&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;action&quot;</span> =&gt; <span class="st0">&quot;view&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$category</span><span class="br0">&#91;</span><span class="st0">&quot;Category&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">?&gt;</span><br />
&nbsp; &nbsp; &lt;/li&gt;<br />
<span class="kw2">&lt;?php</span> <span class="kw1">endforeach</span> <span class="kw2">?&gt;</span><br />
&lt;/ul&gt;</div>
<p>Como puedes ver, la lista de categorías provienen de una llamada a requestAction a CategoriesController::index el cual se comporta distinto (hace return) si el método fue solicitado por medio de requestAction (<strong>APP/controllers/categories_controller.php</strong>):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
<span class="kw2">class</span> CategoriesController <span class="kw2">extends</span> AppController <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$name</span> = <span class="st0">&quot;Categories&quot;</span>;<br />
&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$helpers</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;Html&quot;</span>, <span class="st0">&quot;Form&quot;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">function</span> index<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Category</span>-&gt;<span class="me1">recursive</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$categories</span> = <span class="re0">$this</span>-&gt;<span class="me1">paginate</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">params</span><span class="br0">&#91;</span><span class="st0">&quot;requested&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$categories</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">set</span><span class="br0">&#40;</span><a href="http://www.php.net/compact"><span class="kw3">compact</span></a><span class="br0">&#40;</span><span class="st0">&quot;categories&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw2">?&gt;</span></div>
<p>De este modo tenemos un elemento que sin importar en qué vista se encuentre va a mostrar los datos correctos ya que es él quien se encarga de obtenerlos. Por último, como les había dicho antes, les muestro la manera en que se puede usar el elemento utilizando el caching de CakePHP (<strong>cualquier vista</strong>):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$this</span>-&gt;<span class="me1">element</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;categories&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;cache&quot;</span> =&gt; <span class="st0">&quot;+365 days&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span></div>
<p>De este modo obtenemos la lista de categorías pero el requestAction se ejecuta sólo una vez hasta que el cache venza (en este caso 365 días ya que se que esa lista no cambiará en ese tiempo). El formato de tiempo para el caché es el mismo que la función de PHP <a href="http://ve.php.net/strtotime">strtotime</a>.</p>
<p>Artículo en inglés sobre elementos reusables: <a href="http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction">acá</a>.</p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/elementos-reusables-con-requestaction/">Elementos reusables con requestAction</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/1-aspecto-importante-al-usar-requestaction-mas-authcomponent/" title="1 aspecto importante al usar requestAction más AuthComponent">1 aspecto importante al usar requestAction más AuthComponent</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li><li><a href="http://aikon.com.ve/sistema-de-autenticacion-simple-en-cakephp/" title="Sistema de autenticación simple en CakePHP">Sistema de autenticación simple en CakePHP</a></li><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/elementos-reusables-con-requestaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</title>
		<link>http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/</link>
		<comments>http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 17:29:04 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[migración]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=407</guid>
		<description><![CDATA[Una pequeña guía con los puntos a considerar cuando estes migrando tus aplicaciones de CakePHP1.2 RC3 a RC4.

Los cambios son pequeños y probablemente no afecten a la mayoría de las aplicaciones pero son cambios al fin y hay que tenerlos en cuenta ;)<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/">7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Como lo indiqué ayer, <a title="CakePHP 1.2 RC4" href="http://aikon.com.ve/cakephp12-rc4/">CakePHP 1.2 RC4 está disponible</a> para ser descargado. Y hoy les traigo una pequeña lista de los cambios más importantes para realizar la migración de la entrega anterior (RC3):</p>
<ol>
<li>Sustituir el archivo &#8220;app/webroot/css.php&#8221; ya que fue actualizado en el camino.</li>
<li>ClassRegistry::_duplicate() ahora es privado.</li>
<li>El parámetro de la función XmlNode::toArray() (en cake/libs/xml.php) ha sido sustituido por &#8220;$camelize = true&#8221; (antes era  &#8220;$object = null&#8221;)</li>
<li>En el componente Acl los métodos setAro(), setAco(), getAro() y getAco() han sido eliminadas.</li>
<li>Model::normalizeFindParams() fue eliminada</li>
<li>El parámetro $safe  de JavascriptHelper::codeBlock() ha sido eliminado</li>
<li>El uso de Model::getDisplayField() ha sido desaconcejado pero aún no la eliminan. Se debe usar la propiedad $displayField</li>
</ol>
<p>La mayoría de estos cambios no afectarán muchos proyectos en desarrollo, excepto el primero que afectará a todos porque hay que cambiar el archivo.</p>
<p>Via: <a title="Migration from CakePHP 1.2 RC3 to RC4" href="http://cakebaker.42dh.com/2008/12/19/migration-from-cakephp-12-rc3-to-rc4/">cakebaker</a></p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/">7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li><li><a href="http://aikon.com.ve/cakephp-12-final/" title="CakePHP 1.2 Final">CakePHP 1.2 Final</a></li><li><a href="http://aikon.com.ve/cakephp12-rc4/" title="CakePHP 1.2 RC4">CakePHP 1.2 RC4</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP 1.2 RC4</title>
		<link>http://aikon.com.ve/cakephp12-rc4/</link>
		<comments>http://aikon.com.ve/cakephp12-rc4/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 03:57:01 +0000</pubDate>
		<dc:creator>Joaquín Windmüller</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://aikon.com.ve/?p=398</guid>
		<description><![CDATA[<img class="alignnone size-thumbnail wp-image-399" title="Hot Cakes" src="/uploads/2008/12/138-150x150.jpg" alt="Hot Cakes" width="150" height="150" /> CakePHP1.2 ha llegado a su cuarta versión de pre-lanzamiento y la versión final está a la vuelta de la esquina.

Si aún usas la versión 1.1 (por las razones que sean) ahora es un buen momento para empezar a migrar.<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/cakephp12-rc4/">CakePHP 1.2 RC4</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Acabo de recibir la noticia de que CakePHP1.2 (el frameword de desarrollo web de PHP) ha llegado a su 4 release candidate &#8211; Diría que es el último antes de la versión estable. Es momento de actualizar:</p>
<p><img class="textflow right" title="Hot Cakes" src="/uploads/2008/12/138-298x300.jpg" alt="Hot Cakes" width="267" height="268" />Ya está disponible para ser descargada del sitio oficial <a href="http://cakephp.org/">CakePHP.org</a>. Es muy recomendable a los desarrolladores actualizar inmediatamente (si no lo han hecho ya) ya que <a href="https://trac.cakephp.org/changeset/">los cambios son muchos</a>. Como recomendación personal, si estás desarrollando una aplicación en CakePHP <strong>1.2</strong> deberías usar el branch de desarrollo y no la versión que lanzan por el sitio web, de este modo obtienes constantemente las mejoras y adaptar la aplicación no se hace tan difícil.</p>
<p>Como segunda recomendación, si estás haciendo una aplicación en CakePHP <strong>1.1</strong> o estás usandolo para aprender: pasate a la versión 1.2 <strong>¡de inmediato!<br />
</strong></p>
<p>Post escrito por Joaquín Windmuller en <a href="http://aikon.com.ve">aikon.com.ve</a>, visita y deja tus comentarios.<br/><br/><a href="http://aikon.com.ve/cakephp12-rc4/">CakePHP 1.2 RC4</a></p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://aikon.com.ve/los-componentes-en-cakephp-extienden-a-object-no-a-component/" title="Los componentes en CakePHP extienden a Object no a Component">Los componentes en CakePHP extienden a Object no a Component</a></li><li><a href="http://aikon.com.ve/cakephp-12-final/" title="CakePHP 1.2 Final">CakePHP 1.2 Final</a></li><li><a href="http://aikon.com.ve/7-cambios-a-considerar-al-migrar-de-cakephp-12-rc3-a-rc4/" title="7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4">7 cambios a considerar al migrar de CakePHP 1.2 RC3 a RC4</a></li><li><a href="http://aikon.com.ve/interesante-comparativa-entre-cakephp-y-symfony/" title="Interesante comparativa entre CakePHP y Symfony">Interesante comparativa entre CakePHP y Symfony</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://aikon.com.ve/cakephp12-rc4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
