<?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>Blog cakephp en español por Hospedaxes &#187; Noticias</title>
	<atom:link href="http://cakephp.hospedaxes.com/category/noticias/feed" rel="self" type="application/rss+xml" />
	<link>http://cakephp.hospedaxes.com</link>
	<description>Blog sobre desarrollo web con cakephp en español por Hospedaxes</description>
	<lastBuildDate>Mon, 26 Apr 2010 07:11:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lanzada la versión 1.3.0 estable de CakePHP</title>
		<link>http://cakephp.hospedaxes.com/lanzada-la-version-1-3-0-estable-de-cakephp</link>
		<comments>http://cakephp.hospedaxes.com/lanzada-la-version-1-3-0-estable-de-cakephp#comments</comments>
		<pubDate>Mon, 26 Apr 2010 07:11:23 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=319</guid>
		<description><![CDATA[Después de la publicación el viernes pasado del lanzamiento de la versión 1.2.7, el sábado los desarrolladores de CakePHP anunciaban la nueva y esperada versión estable 1.3.0. En el propio anuncio en la bakery tenéis enlaces para conocer cómo realizar la migración desde versiones 1.2 a la 1.3, las nuevas funcionalidades añadidas, el changelog y, [...]]]></description>
			<content:encoded><![CDATA[<p>Después de la publicación el viernes pasado del lanzamiento de la versión 1.2.7, el sábado los desarrolladores de CakePHP <a title="Anuncio oficial del lanzamiento de CakePHP 1.3.0 estable" href="http://bakery.cakephp.org/articles/view/announcing-cakephp-1-3-0-stable">anunciaban</a> la nueva y esperada versión estable 1.3.0. En el propio anuncio en la bakery tenéis enlaces para conocer cómo realizar la <a title="Migrar CakePHP desde versiones 1.2 a 1.3" href="http://book.cakephp.org/view/1561/Migrating-from-CakePHP-1-2-to-1-3">migración desde versiones 1.2 a la 1.3</a>, las <a title="Nuevas funcionalidades de CakePHP 1.3" href="http://book.cakephp.org/view/1572/New-features-in-CakePHP-1-3">nuevas funcionalidades</a> añadidas, el <a title="Changelog 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/changelog-1-3-0">changelog</a> y, por supuesto, el <a title="Página de descarga de la versión 1.3 de CakePHP" href="http://github.com/cakephp/cakephp1x/downloads">enlace de descarga</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/lanzada-la-version-1-3-0-estable-de-cakephp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP Questions</title>
		<link>http://cakephp.hospedaxes.com/cakephp-questions</link>
		<comments>http://cakephp.hospedaxes.com/cakephp-questions#comments</comments>
		<pubDate>Wed, 11 Nov 2009 08:31:24 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=284</guid>
		<description><![CDATA[La Cake Software Foundation, nos sorprende con un nuevo producto pensado para ayudar a toda la comunidad de su framework.
Es una paǵina, llamada cakePHP Questions, en la que todos los usuarios que quieran, dejarán sus dudas para que el resto de la comunidad intenten resolverlas.
Es la misma idea que el grupo de google de cakephp, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-285 alignleft" title="cakephp_questions_logo" src="http://cakephp.hospedaxes.com/wp-content/uploads/2009/11/cakephp_questions_logo.png" alt="cakephp_questions_logo" width="251" height="105" />La Cake Software Foundation, nos sorprende con un nuevo producto pensado para ayudar a toda la comunidad de su framework.</p>
<p>Es una paǵina, llamada <a href="http://cakeqs.org/">cakePHP Questions</a>, en la que todos los usuarios que quieran, dejarán sus dudas para que el resto de la comunidad intenten resolverlas.</p>
<p>Es la misma idea que el grupo de <a href="http://groups.google.com/group/cake-php">google de cakephp</a>, en funcionamiento desde hace mucho tiempo, pero adaptándolo a sus propias necesidades.</p>
<p>La mayor parte de las dudas, por no decir todas, están en inglés, un pequeño problema para los no acostumbrados a la lengua de shakespeare. La falta de documentación en español sigue siendo uno de los grandes problemas de este framework. Por ello, desde este blog intentamos aportar nuestro granito de arena para hacer más fácil el acceso acceso a este mundo, a todos los usuarios de cake.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/cakephp-questions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar videos con FlowPlayer</title>
		<link>http://cakephp.hospedaxes.com/mostrar-videos-con-flowplayer</link>
		<comments>http://cakephp.hospedaxes.com/mostrar-videos-con-flowplayer#comments</comments>
		<pubDate>Wed, 28 Oct 2009 11:02:56 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=259</guid>
		<description><![CDATA[Primero descargamos el FlowPlayer. Para ello vamos a la página oficial de descarga de FlowPlayer y lo instalamos en la carpeta    /app/webroot/js.
En la vista donde queremos que se vea el video se añade
&#60;?php
// Librería necesaria para el Flowplayer
   echo $javascript-&#62;link('flowplayer/example/flowplayer-3.1.4.min');
?&#62;
&#60;?php
   echo $html-&#62;link('', '/files/ejemplo.flv' , array('id' =&#62; 'player1' , [...]]]></description>
			<content:encoded><![CDATA[<p>Primero descargamos el FlowPlayer. Para ello vamos a la página oficial de descarga de <a href="http://flowplayer.org/download/index.html" target="_blank">FlowPlayer</a> y lo instalamos en la carpeta    /app/webroot/js.</p>
<p>En la vista donde queremos que se vea el video se añade</p>
<pre class="prettyprint"><code>&lt;?php
// Librería necesaria para el Flowplayer
   echo $javascript-&gt;link('flowplayer/example/flowplayer-3.1.4.min');
?&gt;
&lt;?php
   echo $html-&gt;link('', '/files/ejemplo.flv' , array('id' =&gt; 'player1' , 'class' =&gt; 'video'));
?&gt;
&lt;script language="JavaScript"&gt;
   // Función para cargar el Flowplayer en la zona correspondiente
   flowplayer(
    "player1",
    "&lt;?php echo Router::url("/"); ?&gt;js/flowplayer/flowplayer-3.1.5.swf",
    {
      clip: {
               autoPlay: false,
	       autoBuffering: true
	     }
     }
    );
&lt;/script&gt;</code></pre>
<p>Hemos de tener en cuenta la versión de FlowPlayer que hemos descargado en estas dos líneas</p>
<pre class="prettyprint"><code>echo $javascript-&gt;link('flowplayer/example/flowplayer-3.1.4.min');</code></pre>
<p>y</p>
<pre class="prettyprint"><code>"&lt;?php echo Router::url("/"); ?&gt;js/flowplayer/flowplayer-3.1.5.swf"</code></pre>
<p>que en este caso se corresponden con la versión FlowPlayer 3.1.5</p>
<p>Lo de player1 es por si quieres meter varios videos en la misma página, con lo que el segundo pondría player2 y así sucesivamente (o lo que consideres oportuno)</p>
<p>Además hay que añadir al css</p>
<pre class="prettyprint"><code>.video{
	display:block;
	width:400px;
	height:300px;
}</code></pre>
<p>FlowPlayer muestra videos que estén en formato flv. Una buena herramienta para convertir nuestros videos avi, mpeg, &#8230; a este formato flv es <a href="http://ffmpeg.org/" target="_blank">ffmpeg</a>.<br />
Un ejemplo de uso :</p>
<pre class="prettyprint"><code>ffmpeg -i entrada.avi  salida.flv</code></pre>
<p>En este <a title="Demostración de funcionamiento de FlowPlayer" href="http://cakephp.hospedaxes.com/pruebas/mostrar_video">link</a> podéis ver una demostración.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/mostrar-videos-con-flowplayer/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tree Behavior o cómo crear una estructura jerárquica</title>
		<link>http://cakephp.hospedaxes.com/tree-behavior-o-como-crear-una-estructura-jerarquica</link>
		<comments>http://cakephp.hospedaxes.com/tree-behavior-o-como-crear-una-estructura-jerarquica#comments</comments>
		<pubDate>Wed, 14 Oct 2009 08:42:33 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[árbol]]></category>
		<category><![CDATA[cakephp 1.2]]></category>
		<category><![CDATA[organización jerárquica]]></category>
		<category><![CDATA[tree behavior]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=237</guid>
		<description><![CDATA[En esta ocasión hablaremos de cómo crear una estructura jerárquica utilizando el Tree Behavior de CakePHP. Este comportamiento facilita muchísimo las cosas a la hora de manipular árboles jerárquicos de datos.
Utilizaremos también la librería de Javascript Ext JS para poder manipular el árbol gráficamente de manera sencilla, utilizando drag and drop.
Lo primero que tendremos que [...]]]></description>
			<content:encoded><![CDATA[<p>En esta ocasión hablaremos de cómo crear una estructura jerárquica utilizando el <a title="CakePHP: Tree Behavior" href="http://api.cakephp.org/class/tree-behavior">Tree Behavior</a> de CakePHP. Este comportamiento facilita muchísimo las cosas a la hora de manipular árboles jerárquicos de datos.</p>
<p>Utilizaremos también la librería de Javascript <a title="Ext JS" href="http://www.extjs.com/">Ext JS</a> para poder manipular el árbol gráficamente de manera sencilla, utilizando <a title="Wikipedia: Arrastrar y soltar" href="http://es.wikipedia.org/wiki/Arrastrar_y_soltar"><em>drag and drop</em></a>.</p>
<p>Lo primero que tendremos que hacer será añadir en la tabla de la base de datos de la entidad. Utilizando los nombres por defecto de Cake, serían los siguientes campos:</p>
<ul>
<li><em>parent_id</em>: hace referencia al padre del elemento.</li>
<li><em>lft</em>: almacena el identificador del elemento de la izquierda en el mismo nivel.</li>
<li><em>rght</em>: almacena el identificador del elemento de la derecha en el mismo nivel.</li>
</ul>
<p>Incluiremos también los campos <em>id</em> y <em>nombre</em>, en una entidad denominada, por ejemplo, Categoria.</p>
<p>El modelo lo haríamos de la siguiente manera:</p>
<p>Este comportamiento tiene funciones muy útiles para la manipulación del árbol. Las más utilizadas quizás sean las siguientes:</p>
<ul>
<li><strong><em>children</em></strong>: devuelve los hijos de un nodo concreto, pudiendo seleccionar si deseamos obtener sólo los hijos directos o todos los hijos en el árbol.</li>
<li><strong><em>generatetreelist</em></strong>: función muy útil para obtener los elementos a introducir en un select de HTML.</li>
<li><strong>getpath</strong>: devuelve todo el path hasta el nodo especificado en un array.</li>
<li><strong>movedown</strong> y <strong>moveup</strong>: sirven para bajar o subir un nivel de un nodo del árbol.</li>
<li><strong>removefromtree</strong>: elimina un nodo del árbol sin perder la estructura, es decir, modificando el padre de sus hijos.</li>
<li><strong>reorder</strong>: reordena un nodo (arrastrando también a sus hijos) en función de los parámetros especificados.</li>
</ul>
<p>Para realizar la manipulación visual del árbol de categorías crearemos las siguientes funciones en el controlador <em>app/controllers/categorias_controller.php</em> sería:</p>
<pre class="prettyprint"><code>&lt;?php

class CategoriasController extends AppController{

var $helpers = array( 'Javascript');

// Función para organizar las categorías
function organizar() {}

function getnodes() {
   Configure::write('debug', 0);
   // obtener el identificador del padre que se envío por POST vía Ajax
   $parent = intval($this-&gt;params['form']['node']);
   // encontrar los hijos directos del nodo anterior
   $nodes = $this-&gt;Categoria-&gt;children($parent, true, null, 'Categoria.lft ASC');

   $this-&gt;set(compact('nodes'));

   $this-&gt;render('getnodes', 'ajax');
}

function reorder()
{
   Configure::write('debug', 0);

   // delta es la diferencia en la posición (1 = nodo siguiente, -1 = nod anterior)
   $node = intval($this-&gt;params['form']['node']);
   $delta = intval($this-&gt;params['form']['delta']);

   if ($delta &gt; 0) {
      $this-&gt;Categoria-&gt;movedown($node, abs($delta));
   } elseif ($delta &lt; 0) {
      $this-&gt;Categoria-&gt;moveup($node, abs($delta));
   }

   exit('1');
}

function reparent()
{
   Configure::write('debug', 0);

   $node = intval($this-&gt;params['form']['node']);
   $parent = intval($this-&gt;params['form']['parent']);
   $position = intval($this-&gt;params['form']['position']);

   // guardamos el nuevo padre de la categoría
   $this-&gt;Categoria-&gt;id = $node;
   $this-&gt;Categoria-&gt;saveField('parent_id', $parent);

   // Si position == 0, nos movemos al inicio.
   // En otro caso, calculamos la distancia que nos moveremos ($delta).
   if ($position == 0) {
      $this-&gt;Categoria-&gt;moveup($node, true);
   } else {
      $count = $this-&gt;Categoria-&gt;childcount($parent, true);
      $delta = $count - $position - 1;
      if ($delta &gt; 0) {
         $this-&gt;Categoria-&gt;moveup($node, $delta);
      }
   }

   exit('1');
}
}
?&gt;</code></pre>
<p>Sólo nos quedaría hacer las vistas. En este caso, necesitamos crear 2 vistas: organizar.ctp y getnodes.ctp.</p>
<pre class="prettyprint"><code>// app/views/categorias/organizar.ctp

&lt;?php echo $html-&gt;css('/js/ext-2.0.1/resources/css/ext-custom.css'); ?&gt;
&lt;?php echo $javascript-&gt;link('/js/ext-2.0.1/ext-custom.js'); ?&gt;

&lt;script type="text/javascript"&gt;
Ext.BLANK_IMAGE_URL = '&lt;?php echo $html-&gt;url('/js/ext-2.0.1/resources/images/default/s.gif') ?&gt;';

Ext.onReady(function(){

   var getnodesUrl = '&lt;?php echo $html-&gt;url('/categorias/getnodes') ?&gt;';
   var reorderUrl = '&lt;?php echo $html-&gt;url('/categorias/reorder') ?&gt;';
   var reparentUrl = '&lt;?php echo $html-&gt;url('/categorias/reparent') ?&gt;';

   var Tree = Ext.tree;

   var tree = new Tree.TreePanel({
      el:'tree-div',
      autoScroll:true,
      animate:true,
      enableDD:true,
      containerScroll: true,
      rootVisible: true,
      loader: new Ext.tree.TreeLoader({
         dataUrl:getnodesUrl
      })
    });

   var root = new Tree.AsyncTreeNode({
      text:'Categorías',
      draggable:false,
      id:'root'
   });

   tree.setRootNode(root);
   tree.setHeight('auto');

   var oldPosition = null;
   var oldNextSibling = null;

   tree.on('startdrag', function(tree, node, event){
      oldPosition = node.parentNode.indexOf(node);
      oldNextSibling = node.nextSibling;
   });

   tree.on('movenode', function(tree, node, oldParent, newParent, position){

   if (oldParent == newParent){
      var url = reorderUrl;
      var params = {'node':node.id, 'delta':(position-oldPosition)};
   } else {
      var url = reparentUrl;
      var params = {'node':node.id, 'parent':newParent.id, 'position':position};
   }

tree.disable();

Ext.Ajax.request({
   url:url,
   params:params,
   success:function(response, request) {
      // if the first char of our response is zero, then we fail the operation,
      // otherwise we re-enable the tree
      if (response.responseText.charAt(0) != 1){
         request.failure();
      } else {
         tree.enable();
      }
   },
   failure:function() {
      // we move the node back to where it was beforehand and
      // we suspendEvents() so that we don't get stuck in a possible infinite loop
      tree.suspendEvents();
      oldParent.appendChild(node);
      if (oldNextSibling){
         oldParent.insertBefore(node, oldNextSibling);
      }
      tree.resumeEvents();
      tree.enable();
      alert("Oh no! Your changes could not be saved!");
   }
});
});

tree.render();
root.expand();
});
&lt;/script&gt;

&lt;div id="tree-div"&gt;&lt;/div&gt;</code></pre>
<p>Y la última vista:</p>
<pre class="prettyprint"><code>&lt;?php
// app/views/categorias/getnodes.ctp
$data = array();
foreach ($nodes as $node)
{</code>   <code>$data[] = array(</code>      <code>"text" =&gt; $node['Categoria']['nombre'],</code>      <code>"id" =&gt; $node['Categoria']['id']</code>   <code>);
}
echo $javascript-&gt;object($data);
?&gt;</code></pre>
<p>Ya sólo nos quedaría descargarnos la librería <a title="Ext JS" href="http://www.extjs.com/" target="_blank">ExtJS</a> y copiarla en la carpeta /app/webroot/js. En el <a title="Demostración de funcionamiento de Ext JS" href="http://cakephp.hospedaxes.com/pruebas/tree_behavior">ejemplo</a>, se ha utilizado la versión 2.0.1.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 289px; width: 1px; height: 1px;">
<pre style="display: block;">Categoria</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/tree-behavior-o-como-crear-una-estructura-jerarquica/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuevas versiones de CakePHP</title>
		<link>http://cakephp.hospedaxes.com/nuevas-versiones-de-cakephp</link>
		<comments>http://cakephp.hospedaxes.com/nuevas-versiones-de-cakephp#comments</comments>
		<pubDate>Wed, 05 Aug 2009 08:47:31 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=229</guid>
		<description><![CDATA[El lunes 3 de agosto se anunciaba en la página web de CakePHP el lanzamiento de dos nuevas versiones: la versión estable de la release 1.2.4.8284, podemos ver el changelog para conocer los bugs corregidos, y la versión 1.3.0, todavía en desarrollo.

Los cambios más importantes introducidos en la versión 1.3.0 son:

compatibilidad con PHP 5.3
nuevo helper [...]]]></description>
			<content:encoded><![CDATA[<p>El lunes 3 de agosto se anunciaba en la página web de <a title="Release: CakePHP 1.2.4.8284" href="http://bakery.cakephp.org/articles/view/release-cakephp-1-2-4-8284" target="_blank">CakePHP</a> el lanzamiento de dos nuevas versiones: la versión estable de la release 1.2.4.8284, podemos ver el <a title="Changelog 1.2.4.8284" href="https://trac.cakephp.org/wiki/changelog/1.2.x.x/8284" target="_blank">changelog</a> para conocer los bugs corregidos, y la versión 1.3.0, todavía en desarrollo.</p>
<p style="text-align: center;"><a href="http://www.cakephp.org"><img class="size-full wp-image-230 aligncenter" title="cakephp12" src="http://cakephp.hospedaxes.com/wp-content/uploads/2009/08/cakephp12.png" alt="CakePHP 1.2" width="238" height="240" /></a></p>
<p>Los cambios más importantes introducidos en la versión 1.3.0 son:</p>
<ul>
<li>compatibilidad con PHP 5.3</li>
<li>nuevo helper de javascript incluyendo soporte para múltiples librerías js</li>
<li>mejora de la generación de código automática con mejor soporte para plugins y templates.</li>
</ul>
<p>Ahora mismo estamos metidos de lleno en la utilización de plugins, así que nos alegramos mucho de que le den importancia a esta línea de desarrollo. En cuanto tengamos un poquito de tiempo y las ideas totalmente claras, escribiremos una entrada referente a este tema.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h3>1.2.4.8284</h3>
</div>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/nuevas-versiones-de-cakephp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP debug kit</title>
		<link>http://cakephp.hospedaxes.com/cakephp-debug-kit</link>
		<comments>http://cakephp.hospedaxes.com/cakephp-debug-kit#comments</comments>
		<pubDate>Tue, 04 Aug 2009 10:13:34 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=222</guid>
		<description><![CDATA[Nos han preguntado en varias ocasiones cómo hacemos para debuggear las aplicaciones desarrolladas con CakePHP. Hemos probado, sin meternos a fondo, la utilización de Eclipse+XDebug, pero todavía no hemos obtenido resultados satisfactorios, por lo que hasta ahora seguíamos utilizando el debug de CakePHP, al que estamos muy acostumbrados y que nos resulta fácil y cómodo.
Hemos [...]]]></description>
			<content:encoded><![CDATA[<p>Nos han preguntado en varias ocasiones cómo hacemos para debuggear las aplicaciones desarrolladas con <a href="http://cakephp.org/">CakePHP</a>. Hemos probado, sin meternos a fondo, la utilización de <a href="http://www.eclipse.org/">Eclipse</a>+<a href="http://xdebug.org/">XDebug</a>, pero todavía no hemos obtenido resultados satisfactorios, por lo que hasta ahora seguíamos utilizando el debug de CakePHP, al que estamos muy acostumbrados y que nos resulta fácil y cómodo.<br />
Hemos encontrado una herramienta de debug que se basa en esta idea, pero que nos muestra las variables de una manera más cómoda y visualmente más atractiva. Se trata del plugin <a href="http://www.ohloh.net/p/cakephp-debugkit">CakePHP debug kit</a>. Lo podéis bajar directamente de la web y, por tratarse de un plugin, su instalación es verdaderamente sencilla.<br />
Una vez instalado, en la esquina superior derecha de la aplicación se nos mostrará un botón que nos permite visualizar u ocultar el debug:</p>
<p><img class="aligncenter size-full wp-image-225" title="debugKit" src="http://cakephp.hospedaxes.com/wp-content/uploads/2009/08/debugKit.png" alt="debugKit" width="680" height="138" /><br />
Podemos observar el historial de peticiones anteriores, las variables de la sesión, de la request y de la vista, información de log y estadísticas de memoria utilizada y tiempo de petición.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/cakephp-debug-kit/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Consultas complejas con cakephp</title>
		<link>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp</link>
		<comments>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:07:43 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[between]]></category>
		<category><![CDATA[busquedas complejas]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[in]]></category>
		<category><![CDATA[nor]]></category>
		<category><![CDATA[not]]></category>
		<category><![CDATA[or]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xor]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=151</guid>
		<description><![CDATA[El framework cakephp tiene una definición de los modelos muy potente, lo que hace que sea muy fácil acceder a los datos de la base de datos, realizando consultas todo lo complejas que se desee.
En esta entrada hablaremos de todas las posiblidades, que tal vez no conozcáis, de establecer las condiciones de una consulta en [...]]]></description>
			<content:encoded><![CDATA[<p>El framework cakephp tiene una definición de los modelos muy potente, lo que hace que sea muy fácil acceder a los datos de la base de datos, realizando consultas todo lo complejas que se desee.<br />
En esta entrada hablaremos de todas las posiblidades, que tal vez no conozcáis, de establecer las condiciones de una consulta en cakephp.</p>
<p><strong>Consulta sencilla</strong></p>
<p>Las consultas más simples, que afectan a una única columna son fáciles de realizar, se resuelven con un find y la condición pasada como un parámetro en la llamada a este método.</p>
<p>De esta manera:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>'Modelo.columna = valor'))</pre>
<p>se generará un select con una condición </p>
<pre class="prettyprint">where Modelo.columna = valor</pre>
<p><strong>Consulta con varias condiciones separadas por AND</strong></p>
<p>Surge la duda de ¿qué sucede si deseamos realizar una consulta con varias condiciones?, se podría hacer poniendo como segundo parámetro del array conditions una cadena con todas las condiciones concatenadas con AND entre ellas, pero cakephp ya pensó en eso y hay una manera más sencilla y más limpia de hacerlo, que es pasar un array con todas las condiciones que deseamos que cumpla la consulta, con el formato Modelo.columna =&gt; valor :</p>
<p>De esta manera:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('Modelo.columna' => 'valor','Modelo.columna2' => 'valor2')))</pre>
<p>Esta llamada generará una consulta con una condición</p>
<pre class="prettyprint">where Modelo.columna = valor1 AND Modelo.columna2 = valor2</pre>
<p><strong>Consulta utilizando <>, <=, >=, > o <</strong></p>
<p>Si en lugar de querer que todas las columnas coincidan con los valores que se les pasan en el array, queremos que alguna columna sea distinta del valor, la condición debería tener este formato</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('Modelo.columna <>' => 'valor','Modelo.columna2' => 'valor2')))</pre>
<p>Esta llamada generará una consulta con una condición </p>
<pre class="prettyprint">where Modelo.columna <> valor1 AND Modelo.columna2 = valor2</pre>
<p>Este formato también permitiría además de utilizar el distinto de (<>), utlizar mayor que (>) ,mayor o igual que (>=), menor que (<) o menor o igual que (<=).</p>
<p><strong>Consulta utilizando OR</strong></p>
<p>Una nueva duda surge cuando se nos plantea, ¿qué pasa si en lugar de realizar una consulta con condiciones separadas con AND queremos crear una consulta con las condiciones separada por OR?, pues cakephp también permite hacerlo de manera muy sencilla, creando un find con el siguiente formato:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('OR'=>array('Modelo.columna' => 'valor','Modelo.columna2' => 'valor2'))))</pre>
<p>Esto creará una consulta con una condición </p>
<pre class="prettyprint">where Modelo.columna = valor OR Modelo.columna2 => valor2</pre>
<p>Esta opción se puede utilizar con cualquiera de los operadores booleanos AND, OR, NOT, XOR.</p>
<p>Cakephp también permite otras opciones más complejas:</p>
<p><strong>Consulta utilizando IN</strong></p>
<p>¿Qué sucede si queremos utilizar una consulta en la que queramos que una columna coincida con una serie de valores?. Para esto, lo más sencillo sería utilizar la sentencia sql in.<br />
Instintivamente la primera idea que podemos tener para crear una consulta de este tipo es generar una cadena con todos los valores que deseamos pasarle a la consulta y esto concatenarlo con Modelo.columna IN.<br />
Cakephp ya había pensado en esto y ha hecho que sea mucho más sencillo que todo esto, para realizar una consulta con un IN como condición habrá que pasarle un array con los valores que queramos que se compruebe la coincidencia, de este modo:</p>
<pre class="prettyprint">
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',array('conditions'=>array('Modelo.columna' => $valores,'Modelo.columna2' => 'valor2')))</pre>
<pre class="prettyprint">where Modelo.columna in (1,2,3,4,5,6) AND Modelo.columna2 => valor2</pre>
<p><strong>Consulta utilizando NOT IN</strong></p>
<p>Si en lugar de que se compruebe la coincidencia con ciertos valores, se compruebe la no coincidencia <strong>(NOT IN)</strong>, haremos la llamada de esta manera:</p>
<pre class="prettyprint">
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',array('conditions'=>array('NOT'=>array('Modelo.columna' => $valores),'Modelo.columna2' => 'valor2')))</pre>
<pre class="prettyprint">where Modelo.columna in (1,2,3,4,5,6) AND Modelo.columna2 => valor2</pre>
<p><strong>Consulta utilizando BETWEEN</strong></p>
<p>Podría darse la posibilidad de tener que comprobar si el valor de un campo está contenido entre dos valores dados (BETWEEN), para esto igual que para la expresión in se nos ocurriría crear una cadena concatenando los valores y la sentencia sql, pero cakephp permite una forma mucho más sencilla de crearlo:</p>
<pre class="prettyprint">
$this->Modelo->find('all',array('conditions'=>array(array('Modelo.columna BETWEEN ? AND ?' => array(1,8)))))</pre>
<p>Esta llamada al find crearía una consulta sql con la siguiente condición:</p>
<pre class="prettyprint">where Modelo.columna between 1 AND 8</pre>
<p>Con todas estas opciones se podrían crear consultas tan complejas como deseemos sin tener que preocuparnos de generar cadenas con el código sql para concatenar a las condiciones, de una manera muy sencilla e intuitiva.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Plantéanos tus dudas.</title>
		<link>http://cakephp.hospedaxes.com/planteanos-tus-dudas</link>
		<comments>http://cakephp.hospedaxes.com/planteanos-tus-dudas#comments</comments>
		<pubDate>Fri, 13 Feb 2009 13:01:52 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=146</guid>
		<description><![CDATA[El objetivo principal de este blog era, aparte de compartir nuestros conocimientos de cakephp, intentar ayudar a todos los que se les presenta alguna dificultad que no son capaces de resolver.
Hace tiempo que no escribimos ninguna entrada en el blog, casi nos dedicamos únicamente a resolver posibles dudas sobre las entradas ya escritas, esto es [...]]]></description>
			<content:encoded><![CDATA[<p>El objetivo principal de este blog era, aparte de compartir nuestros conocimientos de cakephp, intentar ayudar a todos los que se les presenta alguna dificultad que no son capaces de resolver.</p>
<p>Hace tiempo que no escribimos ninguna entrada en el blog, casi nos dedicamos únicamente a resolver posibles dudas sobre las entradas ya escritas, esto es debido además de porque es una época en la que tenemos varios proyectos de <a href="http://www.hospedaxes.com">desarrollo web</a> activos, por la dificultad de encontrar algún tema interesante para vosotros que nos visitáis.</p>
<p>Por eso, desde aquí os invito a que nos plateéis vuestras dudas e ideas para nuevos artículos, ¡qué mejor para escribir un blog para nuestros visitantes que que sean ellos quienes nos indican los temas que más les interesan!</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/planteanos-tus-dudas/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Validación en CakePHP 1.2 (II)</title>
		<link>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii</link>
		<comments>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii#comments</comments>
		<pubDate>Wed, 12 Nov 2008 14:22:20 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Validación 1.2]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[personalizada]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=136</guid>
		<description><![CDATA[Continuando con el post Validación en CakePHP 1.2, explicaremos en esta ocasión cómo validar formatos de campos permitiendo que estén vacíos y cómo realizar una validación personalizada, introduciendo manualmente el código de validación.
Validaciones con campos vacíos
Hasta hoy, no habíamos encontrado la forma de validar formatos de campos, permitiendo que se encuentren vacíos, directamente en el [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el post <a title="Validación en CakePHP 1.2" href="http://cakephp.hospedaxes.com/validacion-en-cakephp-12">Validación en CakePHP 1.2</a>, explicaremos en esta ocasión cómo validar formatos de campos permitiendo que estén vacíos y cómo realizar una validación personalizada, introduciendo manualmente el código de validación.</p>
<p><strong>Validaciones con campos vacíos</strong></p>
<p>Hasta hoy, no habíamos encontrado la forma de validar formatos de campos, permitiendo que se encuentren vacíos, directamente en el modelo. Lo que hacíamos era hacer este tipo de comprobaciones manualmente, rompiendo un poco la flexibilidad que nos ofrece CakePHP para hacer las validaciones directamente en el modelo y sin volver a preocuparnos de ellas.</p>
<p>Ahora ya descubrimos la manera de hacerlo. Es una cosa muy simple que habíamos pasado por alto. Simplemente tenemos que pasar un parámetro a la función de validación, de la manera siguiente:</p>
<pre class="prettyprint"><code>var $validate = array(
   'email' =&gt; array(
   'valid' =&gt; array( 'rule' =&gt; array('email'),
                             <strong>'allowEmpty' =&gt; true</strong>,
                             'message' =&gt; 'Formato email inválido')
                             )
              );</code></pre>
<p><strong>Validación a medida</strong></p>
<p>En el modelo introduciremos el siguiente código:</p>
<pre class="prettyprint"><code>var $validate = array(
    'campo' =&gt; array(
                  'valid' =&gt; array( 'rule' =&gt; 'reglaPropia',
                              'param1'=&gt;'valor',
                              'message' =&gt; 'Mensaje de salida')
                              )
                    );

function reglaPropia($value, $params)
{
   $valid = false;
   if (!condicion){
      // Asignamos el valor a $valid en función de la condición que queramos establecer
   }
   return $valid;
}</code></pre>
<p>A la función creada le hemos pasado dos argumentos, aunque el segundo podríamos no ponerlo si no es necesario. Ambos serán arrays, de manera que si queremos acceder al valor del campo a validar tendremos que leer <em>$value['campo']</em> y para acceder a los parámetros <em>$params['param1']</em> , pudiendo introducir tantos parámetros como sea necesario.</p>
<p>En esta función podemos utilizar también las funciones de validación de CakePHP. Por ejemplo:</p>
<pre class="prettyprint">$valid = Validation::custom($value['campo'], $params['param1']);</pre>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nueva versión de Cakephp 1.2</title>
		<link>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-12-2</link>
		<comments>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-12-2#comments</comments>
		<pubDate>Fri, 10 Oct 2008 09:27:48 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=124</guid>
		<description><![CDATA[Hace unos días CakePHP lanzaba la tercera candidata de la beta de la versión 1.2 de su framework.
Todavía no sabemos si aporta algo nuevo. Como en versiones anteriores corrige bugs y por lo que se puede ver en la noticia del lanzamiento aumenta hasta 10 veces la velocidad de la anterior candidata.
Como siempre, iremos comentando [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días CakePHP lanzaba la <a href="http://cakeforge.org/frs/?group_id=23&amp;release_id=426" target="_blank">tercera candidata</a> de la beta de la versión 1.2 de su framework.</p>
<p>Todavía no sabemos si aporta algo nuevo. Como en versiones anteriores corrige bugs y por lo que se puede ver en la <a href="http://bakery.cakephp.org/articles/view/release-cakephp-rc3-the-rc-of-triumph" target="_blank">noticia del lanzamiento</a> aumenta hasta 10 veces la velocidad de la anterior candidata.</p>
<p>Como siempre, iremos comentando las nuevas características e impresiones que tengamos en el <a href="http://www.hospedaxes.com" target="_blank">desarrollo páginas web</a>, con esta nueva versión candidata.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-12-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
