<?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; cakephp-1.2</title>
	<atom:link href="http://cakephp.hospedaxes.com/tag/cakephp-12/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>Validación en CakePHP 1.2 (III): Internacionalización de mensajes en el modelo</title>
		<link>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo</link>
		<comments>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo#comments</comments>
		<pubDate>Thu, 16 Apr 2009 10:37:46 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Validación 1.2]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[internacionalizacion]]></category>
		<category><![CDATA[mensajes de error]]></category>
		<category><![CDATA[modelo]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=141</guid>
		<description><![CDATA[Continuando con los posts anteriores relativos a la validación y relacionado con el post en el que se trata la localización e internacionalización de nuestras aplicaciones, explicaremos en éste cómo realizar la internacionalización de los mensajes de error. Tenemos dos opciones para implementar este funcionamiento:

Utilizar la función error del FormHelper (realizando la llamada desde la [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con los posts anteriores relativos a la <a title="Validación en CakePHP 1.2 (I)" href="http://cakephp.hospedaxes.com/validacion-en-cakephp-12">validación</a> y relacionado con el post en el que se trata la <a title="Localización e internacionalización" href="http://cakephp.hospedaxes.com/localizacion-e-internacionalizacion" target="_blank">localización e internacionalización</a> de nuestras aplicaciones, explicaremos en éste cómo realizar la internacionalización de los mensajes de error. Tenemos dos opciones para implementar este funcionamiento:</p>
<ol>
<li>Utilizar la función <a title="Función error del FormHelper de CakePHP" href="http://api.cakephp.org/class/form-helper#method-FormHelpererror" target="_blank">error</a> del <a title="Form Helper (API CakePHP)" href="http://api.cakephp.org/class/form-helper" target="_blank">FormHelper</a> (realizando la llamada desde la vista) o la función <a title="Función invalidate del modelo de CakePHP" href="http://api.cakephp.org/class/model#method-Modelinvalidate" target="_blank">invalidate</a> del <a title="Clase Modelo de CakePHP" href="http://api.cakephp.org/class/model" target="_blank">modelo</a> (si realizamos la validación manual desde el controlador).</li>
<li>Utilizar el propio modelo como fuente de estos mensajes de error.</li>
</ol>
<p>En el primero de los casos utilizaríamos el siguiente código para la vista y el controlador respectivamente:</p>
<pre class="prettyprint">$form->error('campo', __('MENSAJE_ERROR', true));
$this->Modelo->invalidate('campo', __('MENSAJE_ERROR', true));</pre>
<p>y de esta forma buscaría esa clave del mensaje en el fichero de idioma.</p>
<p>La ventaja de hacerlo desde el modelo y no desde las vistas es que nos permite unificar los mensajes de error en cada campo y evitar la repetición de este código cuando estemos en formularios distintos que incluyan los mismos campos. El inconveniente es que en el modelo no se permite la utilización de la función __() de <a title="CakePHP" href="http://cakephp.org/" target="_blank">CakePHP</a>.</p>
<p>Para solucionar este problema será necesario modificar la clase <a title="AppModel de CakePHP" href="http://api.cakephp.org/class/app-model" target="_blank">AppModel</a> de la que extienden todos los modelos y que a su vez extiende de <a title="Clase Model en CakePHP" href="http://api.cakephp.org/class/model" target="_blank">Model</a> para redefinir la función <a title="Función invalidate del modelo de CakePHP" href="http://api.cakephp.org/class/model#method-Modelinvalidate" target="_blank">invalidate</a> (podemos ver la definición original en el <a href="http://api.cakephp.org/view_source/model/#line-2466">api de CakePHP</a>). Así, el fichero cake/libs/model/app_model.php quedaría como se muestra a continuación:</p>
<pre class="prettyprint"><code>&lt;?php
class AppModel extends Model {
   function invalidate($field, $value = true) {
      if (!is_array($this-&gt;validationErrors)) {
         $this-&gt;validationErrors = array();
      }
      $this-&gt;validationErrors[$field] = <strong>__($value, true)</strong>;
   }
}
?&gt;</code></pre>
<p>Con este simple cambio, tenemos los mensajes de error del modelo internacionalizados.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo/feed</wfw:commentRss>
		<slash:comments>3</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>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>Conexiones HTTP seguras (https) en CakePHP 1.2</title>
		<link>http://cakephp.hospedaxes.com/conexiones-http-seguras-https-en-cakephp-12</link>
		<comments>http://cakephp.hospedaxes.com/conexiones-http-seguras-https-en-cakephp-12#comments</comments>
		<pubDate>Thu, 09 Oct 2008 07:13:04 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[conexiones seguras]]></category>
		<category><![CDATA[http seguro]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=65</guid>
		<description><![CDATA[Para el desarrollo de conexiones seguras de nuestra página web, vamos a utilizar un método que hemos visto en el weblog de Tanveer. Lo normal es que necesitemos que algunas de las páginas de la web sean seguras, como pueden ser formularios de contratación de servicios, y otras no lo sean, por ejemplo páginas simples [...]]]></description>
			<content:encoded><![CDATA[<p>Para el desarrollo de conexiones seguras de nuestra página web, vamos a utilizar un método que hemos visto en el <a title="Creatiing a route usage https ssl connection" href="http://neeocis.wordpress.com/2008/07/09/cakephp-creating-a-route-usage-https-ssl-connection/">weblog de Tanveer</a>. Lo normal es que necesitemos que algunas de las páginas de la web sean seguras, como pueden ser formularios de contratación de servicios, y otras no lo sean, por ejemplo páginas simples de información de dichos servicios. Por lo que desarrollaremos un sistema que nos permita hacer el cambio entre unas y otras.</p>
<p>Utilizamos para implementar este mecanismo el <a title="Componenete para forzar conexiones seguras" href="http://bakery.cakephp.org/articles/view/component-for-forcing-a-secure-connection">componente de la Bakery de CakePHP para forzar conexiones seguras</a>, y lo utilizaremos de la misma manera que se explica en este artículo, pero añadiéndole la funcionalidad inversa. Lo explicaremos paso a paso:</p>
<p>- Añadimos el componente ssl.php, en la carpeta app/controllers/components/ con el siguiente contenido:</p>
<pre class="prettyprint"><code>&lt;?php
class SslComponent extends Object {

   var $components = array('RequestHandler');

   var $Controller = null;

   function initialize(&amp;$Controller) {
      $this-&gt;Controller = $Controller;
   }

   function force() {
      if(!$this-&gt;RequestHandler-&gt;isSSL()) {
        $this-&gt;Controller-&gt;redirect('https://'.$this-&gt;__url());
      }
   }

   function unforce() {
      if($this-&gt;RequestHandler-&gt;isSSL()) {
         $this-&gt;Controller-&gt;redirect('http://'.$this-&gt;__urll());
      }
   }

   function __url() {
      $port = env('SERVER_PORT') == 80 ? '' : ':'.env('SERVER_PORT');
      return env('SERVER_NAME').$port.env('REQUEST_URI');
   }

   function __urll() {
      $port = env('SERVER_PORT') == 443 ? '' : ':'.env('SERVER_PORT');
      return env('SERVER_NAME').$port.env('REQUEST_URI');
   }

}
?&gt;</code></pre>
<p>- Añadimos en el app_controller (cake/libs/controlller/app_controller.php) la redirección a conexión segura para aquellas acciones que nos interese. Ésta es otra diferencia con el artículo de la Bakery, ya que en ésta se hace esa redirección desde cada acción de cada controlador.</p>
<pre class="prettyprint"><code>&lt;?php
class AppController extends Controller {

   var $components = array( 'Ssl' );

   public function beforeRender(){
      $action = array( 'action1', 'action2' );
      if( in_array( $this-&gt;params['action'] , $action ) ){
         $this-&gt;Ssl-&gt;force();
      }else{
         $this-&gt;Ssl-&gt;unforce();
      }
   }

}
?&gt;</code></pre>
<p>Podríamos cambiar en este punto la condición por la que nos interese para nuestro caso, por ejemplo, que sean controladores (todas las acciones de ese controlador) los que necesiten añadir este tipo de conexión.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/conexiones-http-seguras-https-en-cakephp-12/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear pdfs en cakephp utilizando TCPDF</title>
		<link>http://cakephp.hospedaxes.com/crear-pdf</link>
		<comments>http://cakephp.hospedaxes.com/crear-pdf#comments</comments>
		<pubDate>Fri, 05 Sep 2008 09:43:33 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[generar pdf]]></category>
		<category><![CDATA[tcpdf]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=9</guid>
		<description><![CDATA[En nuestra experiencia en desarrollo web, se nos ha planteado proyectos que tenían como uno de sus requisitos la creación de un archivo pdf generado automáticamente, por ejemplo una factura de compra o un informe de ventas.
En un principio, comenzamos utilizando fpdf, una clase en php, totalmente gratuíta, que permite crear automáticamente archivos pdf y [...]]]></description>
			<content:encoded><![CDATA[<p>En nuestra experiencia en <a href="http://www.hospedaxes.com">desarrollo web</a>, se nos ha planteado proyectos que tenían como uno de sus requisitos la creación de un archivo pdf generado automáticamente, por ejemplo una factura de compra o un informe de ventas.</p>
<p>En un principio, comenzamos utilizando <a href="http://www.fpdf.org">fpdf</a>, una clase en php, totalmente gratuíta, que permite crear automáticamente archivos pdf y que además tenía un helper para cakephp 1.1.</p>
<p>Esta clase funcionaba increíblemente bien, pero como todos los proyectos que no se actualizan regularmente (hasta hace poco llevaban más de 4 años sin realizar cambios), se quedan desfasados.</p>
<p>Tenía un gran número de desventajas como que no aceptaba codificación UTF-8, o lo complejo que resultaba su uso.</p>
<p>De este proyecto surgió en 2002 una rama, <a href="http://tcpdf.sf.net">TCPDF</a>. Este proyecto ,también libre y gratuíto, en un principio solucionaba carencias del <a href="http://www.fpdf.org">fpdf</a>, pero finalmente se ha convertido en una versión mucho más potente, con gran cantidad de posibilidades como por ejemplo el soporte de UTF-8 o idiomas de derecha-izquierda, permite la utilización de códigos html e incluye una lista bastante amplia de fuentes libres, que podremos utilizar en nuestro pdf.</p>
<p>Para incluirlo en uno de nuestros proyectos y empezar a utilizarlo hay que llevar a cabo una serie de pasos bastante sencillos (añadir nuevas funcionalidades a un proyecto cakePHP se ha facilitado en la versión 1.2), en primer lugar bajar la última versión de TCPDF, descomprimirla en el directorio /app/vendors de nuestra aplicación.</p>
<p>El resultado debería ser /app/vendors/tcpdf/ conteniendo al menos, tcpdf.php y los directorios tcpdf/config y tcpdf/fonts</p>
<p>En segundo lugar tendremos que crear un layout para los pdf&#8217;s en /app/views/layouts/pdf.ctp, con este contenido</p>
<pre class="prettyprint">header("Content-type: application/pdf");
echo $content_for_layout;</pre>
<p>En el controlador que queramos crear los pdf&#8217;s, crearemos una función para ello</p>
<pre class="prettyprint">function pdf()
{
      Configure::write('debug',0);
      $this->layout = 'pdf'; //this will use the pdf.ctp layout
      // Operaciones que deseamos realizar y variables que pasaremos a la vista.
      $this->render();
}</pre>
<p>Por último una vista para esta función, con el siguiente contenido:</p>
<pre class="prettyprint">App::import('Vendor','tcpdf');
$tcpdf = new TCPDF();
$textfont = 'freesans';
$tcpdf->SetCreator(PDF_CREATOR);
$tcpdf->SetAuthor("autor");
$tcpdf->SetTitle("Título");
$tcpdf->SetSubject("Tutorial TCPDF en cakePHP");
$tcpdf->SetKeywords("TCPDF, PDF, cakePHP, ejemplo");
$tcpdf->setPrintHeader(false);
$tcpdf->setPrintFooter(false);
$tcpdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$tcpdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$tcpdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$tcpdf->setLanguageArray($l);
$tcpdf->AliasNbPages();
$tcpdf->AddPage();
$tcpdf->SetFont("freesans", "BI", 20);
$tcpdf->Cell(0,10,"Hola mundo",1,1,'C');
$tcpdf->Output("ejemplo.pdf", "I");</pre>
<p>En este ejemplo se creará un pdf muy sencillo con un cuadrado con el texto hola mundo dentro.<br />
Las posibilidades de TCPDF son muchas, para comprobar lo que es capaz de hacer, es recomendable ojear los ejemplos contenidos en la <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples">página</a> y la documentación de la <a href="http://www.tecnick.com/pagefiles/tcpdf/doc/com-tecnick-tcpdf/TCPDF.html">clase</a>, que explica el funcionamiento de todos sus métodos.</p>
<p>En nuestra página de <a href="http://cakephp.hospedaxes.com/pruebas">pruebas de cakephp</a> hay un <a href="http://cakephp.hospedaxes.com/pruebas/ejemplo_pdf">ejemplo sencillo</a> de funcionamiento.</p>
<p><strong>Actualización (9/2/2009) :</strong></p>
<p><strong>Errores frecuentes:</strong></p>
<p>“TCPDF error: Some data has already been output to browser, can’t send PDF file”: Este error se produce cuando cakePHP envía algún dato antes de crear el pdf y enviarlo, esto puede ocurrir por una serie de razones que habrá que comprobar:</p>
<ul>
<li>Realizar un debug o un echo, en la vista o controlador.Esto crea salida de datos por lo que se genera el error, para eso añadimos en la primera línea de la función del controlador Configure::write(&#8217;debug&#8217;,0); , función que lo que hace es cambiar el nivel de debug a modo producción, donde no se muestra ningún mensaje, ni de error ni warnings.</li>
<li>Existencia de caracteres de salto de línea o espacios después del símbolo de fín de archivo php, ?&gt;. Para esto hay que comprobar todos los ficheros de nuestro proyecto y borrar todos los caracteres o saltos de línea que haya al final del fichero. Esta suele ser la razón más habitual para este error por lo que debemos comprobar todos los ficheros antes de tirar la toalla con tcpdf.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/crear-pdf/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Integración de FCKeditor con CakePHP 1.2</title>
		<link>http://cakephp.hospedaxes.com/integracion-de-fckeditor-con-cakephp-12</link>
		<comments>http://cakephp.hospedaxes.com/integracion-de-fckeditor-con-cakephp-12#comments</comments>
		<pubDate>Wed, 27 Aug 2008 11:20:55 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[fck]]></category>
		<category><![CDATA[fckeditor]]></category>
		<category><![CDATA[integración]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=67</guid>
		<description><![CDATA[En el desarrollo de páginas web muchas veces tenemos la necesidad de introducir un editor de texto, sobre todo cuando es un usuario que no tiene conocimientos de html y css el que tiene que editar un campo o valor que será visible en una página web.
Para ello utilizaremos el editor FCKeditor. Es un software [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a title="Hospedaxes" href="http://www.hospedaxes.com">desarrollo de páginas web</a> muchas veces tenemos la necesidad de introducir un editor de texto, sobre todo cuando es un usuario que no tiene conocimientos de <a title="HTML Wikipedia" href="http://es.wikipedia.org/wiki/C%C3%B3digo_HTML">html</a> y <a title="CSS Guía Breve W3C" href="http://www.w3c.es/divulgacion/guiasbreves/HojasEstilo">css</a> el que tiene que editar un campo o valor que será visible en una página web.</p>
<p>Para ello utilizaremos el editor <a title="FCKeditor" href="http://www.fckeditor.net">FCKeditor.</a> Es un software gratuito, aunque también existe versión comercial, y que permite manipular el texto como si se tratase de MS Word o OpenOffice Writer, conocidos por la mayoría de los usuarios.</p>
<p>Haremos la integración de la siguiente manera:</p>
<p>1. Descargamos de la página web de <a title="Descarga FCKeditor" href="http://www.fckeditor.net/download">FCKEditor</a> el editor, lo descomprimimos y copiamos su contenido en /app/webroot/js. No es necesario copiar la carpeta <em>samples</em>, si no queremos. De esta manera hemos copiado en <em>/app/webroot/js</em> varios ficheros y una carpeta llamada <em>editor</em>.</p>
<p>2. Copiamos en <em>/app/views/helpers</em> el <a href="http://cakephp.hospedaxes.com/wp-content/uploads/2008/08/fck.php.tar.gz">FckHelper</a> y lo importamos en el controlador en el que queramos que se vea el editor. Necesitamos también importar el helper Ajax.</p>
<p>- <strong>FCKHelper</strong> (<em>/app/views/helpers/fck.php</em>):</p>
<pre class="prettyprint"><code >class FckHelper extends HtmlHelper {

var $Width = 500;
var $Height = 300;

function load($id, $width=null, $height=null, $toolbar = 'Default') {
$did = Inflector::camelize(str_replace('/', '_', $id));
if($width){ $this-&gt;Width = $width; }
if($height){ $this-&gt;Height = $height; }
$js = $this-&gt;webroot.'js/';
return&lt;&lt;&lt;FCK_CODE
&lt;script type="text/javascript"&gt;
fckLoader_$did = function () {
var bFCKeditor_$did = new FCKeditor('$did');
bFCKeditor_$did.BasePath = '$js';
bFCKeditor_$did.ToolbarSet = '$toolbar';
bFCKeditor_$did.Width = $this-&gt;Width;
bFCKeditor_$did.Height = $this-&gt;Height;
bFCKeditor_$did.ReplaceTextarea();
}
fckLoader_$did();
&lt;/script&gt;
FCK_CODE;
}
function fileBrowserInput($fieldName, $htmlAttributes = array(), $return = false) {
$output = $this-&gt;input($fieldName, $htmlAttributes, $return);
if (!isset($htmlAttributes['id'])) {
$htmlAttributes['id'] = $this-&gt;model . Inflector::camelize($this-&gt;field);
}
$output .= '&lt;script type="text/javascript"&gt;';
$output .= "//&lt;![CDATA[\n";
$output .= "function openFileBrowser(id){\n";
$output .= "var fck = new FCKeditor(id);\n";
$output .= "fck.BasePath = '".$this-&gt;webroot."js/'\n";
$output .= "var url = fck.BasePath + 'editor/filemanager/browser/default/browser.html?Type=Image&amp;amp;Connector=connectors/php/connector.php';\n";
$output .= "var sOptions = 'toolbar=no,status=no,resizable=yes,dependent=yes,scrollbars=yes';\n";
$output .= "sOptions += ',width=640';\n";
$output .= "sOptions += ',height=480';\n";
$output .= "window.SetUrl = function(fileUrl){\n";
$output .= "\$(id).value = fileUrl;\n";
$output .= "}\n";
$output .= "var oWindow = window.open( url, 'FCKBrowseWindow', sOptions ) ;\n";
$output .= "}\n";
$output .= "//]]&gt;\n";
$output .= '&lt;/script&gt;';
$output .= '&lt;a href="#" onclick="openFileBrowser(\''.$htmlAttributes['id'].'\'); return false;"&gt;select an image...&lt;/a&gt;';
return $output;
}
}</code></pre>
<p>- <strong>En el controlador</strong>:</p>
<pre class="prettyprint">var $helpers = array('Fck', 'Ajax');</pre>
<p>3. Y en la <strong>vista</strong>, lo asociamos con el input que queramos a través de su identificador, enlazando previamente el fichero javascript correspondiente:</p>
<pre class="prettyprint">echo $javascript->link('fckeditor');
echo <code >'&lt;h1&gt;Integración de FCKeditor con CakePHP 1.2&lt;/h1&gt;'</code>;
echo $form->create('Cliente',array('action'=>''));
	echo $form->input('contenido',array('type'=>'textarea', 'label'=>'', 'id' => 'Contenido'));
	echo $fck->load('Contenido', 600, 300);
echo $form->end();</pre>
<p>Ya tenemos nuestro editor, que podemos ver en este <a href="/pruebas/editor">ejemplo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/integracion-de-fckeditor-con-cakephp-12/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Múltiples conexiones a bases de datos</title>
		<link>http://cakephp.hospedaxes.com/multiples-conexiones-a-bases-de-datos</link>
		<comments>http://cakephp.hospedaxes.com/multiples-conexiones-a-bases-de-datos#comments</comments>
		<pubDate>Tue, 22 Jul 2008 11:04:19 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[multiples bases de datos]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=19</guid>
		<description><![CDATA[En cakephp existen gran cantidad de posibilidades desconocidas que, en algunos casos, pueden resultar útiles.
Una de ellas es la posibilidad de declarar más de una conexión a base de datos, pudiendo elegir en cada momento cuál de ellas deseamos utilizar.
Puede resultar muy cómodo para organizar nuestros proyectos, para acceder a diferentes servidores de bases de [...]]]></description>
			<content:encoded><![CDATA[<p>En cakephp existen gran cantidad de posibilidades desconocidas que, en algunos casos, pueden resultar útiles.<br />
Una de ellas es la posibilidad de declarar más de una conexión a base de datos, pudiendo elegir en cada momento cuál de ellas deseamos utilizar.</p>
<p>Puede resultar muy cómodo para organizar nuestros proyectos, para acceder a diferentes servidores de bases de datos o acceder a diferentes gestores de bases de datos.</p>
<p>El proceso es sencillo, en primer lugar añadiremos al archivo database.php situado en /app/config/ una nueva configuración de base de datos.<br />
Podremos copiar la configuración por defecto, llamada default, y cambiarle el nombre.<br />
El fichero database.php quedará así</p>
<pre class="prettyprint">class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database',
		'prefix' => '',
	);

	var $nueva_conexion = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database_2',
		'prefix' => '',
	);

	var $test = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'test_database_name',
		'prefix' => '',
	);
}</pre>
<p>Con esto habremos declarado otra conexión a la base de datos llamada nueva_conexion.<br />
Una de las opciones que tiene la configuración de la base de datos, es la de utilizar un prefijo, es decir, que todas las tablas de la configuración de la base de datos comiencen con una palabra, también puede ser utilizado para organizar las bases de datos.</p>
<p>Para utilizar la configuración de la base de datos que hemos creado, tendremos que añadir en el modelo desde donde queremos acceder a esas tablas la siguiente línea:</p>
<pre class="prettyprint">	var $useDbConfig ='nueva_conexion';</pre>
<p>A partir de este momento, cada vez que accedamos a este modelo, cakephp utilizará las tablas existentes en la base de datos de esa conexión.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/multiples-conexiones-a-bases-de-datos/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Actualizar el contenido de un select con ajax.</title>
		<link>http://cakephp.hospedaxes.com/actualizar-el-contenido-de-un-select-con-ajax</link>
		<comments>http://cakephp.hospedaxes.com/actualizar-el-contenido-de-un-select-con-ajax#comments</comments>
		<pubDate>Wed, 11 Jun 2008 07:44:11 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[actualizar selects]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=5</guid>
		<description><![CDATA[En esta entrada vamos a explicar como asociar dos selects mediante ajax y al modificar el elemento seleccionado en uno de ellos  cambie el contenido del otro.
Podemos ver el ejemplo de funcionamiento aquí.
Un ejemplo muy claro para esta situación sería dos selects, uno con provincias y el otro con localidades, lo que queremos es [...]]]></description>
			<content:encoded><![CDATA[<p>En esta entrada vamos a explicar como asociar dos selects mediante ajax y al modificar el elemento seleccionado en uno de ellos  cambie el contenido del otro.</p>
<p>Podemos ver el ejemplo de funcionamiento <a href="http://www.hospedaxes.com/blog-cakephp/pruebas" target="_blank">aquí.</a></p>
<p>Un ejemplo muy claro para esta situación sería dos selects, uno con provincias y el otro con localidades, lo que queremos es que al cambiar de provincia varíe la lista de localidades y muestre las que están en la provincia seleccionada.</p>
<p>Lo haremos utilizando el ajaxHelper, para que no sea necesario la recarga de la página y quede más atractivo.</p>
<p>Lo primero que haremos será definir los modelos de provincias ,localidades y un tercer modelo en el que usaremos los selects, por ejemplo podría ser un modelo de cliente, en el que al insertar un nuevo cliente tendríamos que elegir la provincia y localidad a la que pertenece.</p>
<h1><span style="text-decoration: underline;">Modelos</span></h1>
<p><strong>Modelo de provincia.</strong></p>
<pre class="prettyprint">/app/models/provincia.php

class Provincia extends AppModel
{
    var $name = 'Provincia';
}</pre>
<p><strong>Modelo de localidad.</strong></p>
<pre class="prettyprint">/app/models/localidade.php

class Localidade extends AppModel
{
    var $name = 'localidade';
}</pre>
<p><strong>Modelo de cliente.</strong></p>
<pre class="prettyprint">/app/models/cliente.php

class Cliente extends AppModel
{
    var $name = 'Cliente';
}</pre>
<h1><span style="text-decoration: underline;">Controladores</span></h1>
<p>Después de esto tendremos que definir los controladores.</p>
<p><strong>Controlador de localidad.</strong></p>
<pre class="prettyprint">/app/controllers/localidades_controller.php

class LocalidadesController extends AppController
{
	var $name = 'Localidades';
}</pre>
<p><strong>Controlador de provincia.</strong></p>
<pre class="prettyprint">/app/controllers/provincias_controller.php

class ProvinciasController extends AppController
{
	var $name = 'Provincias';
}</pre>
<p>Y por últino el controlador de clientes que será el que implementará la funcionalidad.</p>
<p><strong>Controlador de cliente.</strong></p>
<pre class="prettyprint">/app/controllers/clientes_controller.php

class ClientesController extends AppController
{
	var $name = 'Clientes';
	var $helpers = array('Ajax');
	var $uses = array('Cliente','Provincia','Localidade');

	function insertar()
	{
		$listadoProvincias = $this->Provincia->find('all', array('fields'=>array('id','nombre'),'order'=>'nombre ASC'));
		$this->set('provincias', Set::combine($listadoProvincias, "{n}.Provincia.id","{n}.Provincia.nombre"));
		$primera_provincia = $this->Provincia->find(null,null,'nombre ASC');
		$listadoLocalidades = $this->Localidade->find('all', array('fields'=>array('id','nombre'),'order'=>'nombre ASC','conditions'=>'Localidade.provincia_id='.$primera_provincia['Provincia']['id']));
		$this->set('localidades', Set::combine($listadoLocalidades, "{n}.Localidade.id","{n}.Localidade.nombre"));

		// RESTO DE LA FUNCIONALIDAD DE INSERCIÓN DE CLIENTES
	}

	function update_select()
	{
		if (!empty($this->data['Localidade']['provincia_id']))
		{
			$provincia_id = $this->data['Localidade']['provincia_id'];
			$localidades = $this->Localidade->find('all', array('fields'=>array('id','nombre'),'order'=>'nombre ASC','conditions'=>array('provincia_id'=>$provincia_id)));
		}
		else
		{
			$localidades = $this->Localidade->find('all', array('fields'=>array('id','nombre'),'order'=>'nombre ASC'));
		}
		$this->set('options', Set::combine($localidades, "{n}.Localidade.id","{n}.Localidade.nombre"));
		$this->render('/elements/update_select', 'ajax');
	}
}</pre>
<p>Por un lado tenemos la <strong>función insertar</strong>, que será una función genérica de inserción de clientes. La parte que a nosotros nos interesa es en la que se inicializan las variables que después utilizaremos en los selects, estas deberán ser arrays en los que cada elemento tenda un identificador y su valor, para que el select pueda utilizarlos en la vista.</p>
<p>En la versión 1.1 de cakephp, esto se podía hacer mediante la función generateList del modelo, función que se ha eliminado en la 1.2.<br />
Por ello ahora es necesario hacerlo en dos pasos, por un lado realizar la búsqueda con un findAll y después utilizar la función combine de la clase Set que genera un array con la estructura deseada, que será el que le pasemos a la vista.</p>
<pre class="prettyprint">$listadoProvincias = $this->Provincia->find('all', array('fields'=>array('id','nombre'),'order'=>'nombre ASC'));
$this->set('provincias', Set::combine($listadoProvincias, "{n}.Provincia.id","{n}.Provincia.nombre"));</pre>
<p>La segunda función <strong>update_select</strong>, es a la que llamará el ajax para actualizar el listado de localidades a partir de un identificador de provincia.</p>
<p>Como se puede ver en el código, la función coge el identificador de provincia del select y envía a la vista los arrays actualizados de provincias y localidades.</p>
<h1><span style="text-decoration: underline;">Vistas</span></h1>
<p>Localidades y provincias no tendrán vistas asociadas, ya que no hay ninguna operación en el controlador.</p>
<p>En clientes tendremos que crear la vista para la operación insertar del controlador, esta podría ser algo como esto:</p>
<pre class="prettyprint">/app/views/clientes/insertar.ctp

echo $form->create('Inscripcione',array('action'=>'insertar'));
echo $form->inputs(array('legend'=>'Actualizar Provincias',
		'Localidade.provincia_id' => array('label'=> 'Provincia','showEmpty'=>'false','id'=>'provincias'),
		'Alumno.localidade_id' => array('label'=> 'Localidad','showEmpty'=>'false','id'=>'localidades'),
			));
echo $form->end();

$options = array('url' => 'update_select','update' => 'localidades');
echo $ajax->observeField('provincias',$options);</pre>
<p>La vista será muy sencilla, un formulario con dos selects, uno de localidades y otro de provincias y una llamada al ajaxHelper en la que se indica que cada vez que se modifique el valor del select provincias, se llame a la función update_select y actualice el select de localidades.</p>
<p>Este select se actualizará con los valores devueltos por la vista de update_select, que lo único que hace es imprimir todos los nombres de localidades devueltos por la función del controlador.</p>
<pre class="prettyprint">/app/views/elements/update_select.ctp
if(!empty($options)) {
  foreach($options as $k => $v) {
    echo <code >"&lt;option value='$k'&gt;$v&lt;/option&gt;";</code>
  }
 }</pre>
<p>En este enlace se puede ver un ejemplo de <a href="http://www.hospedaxes.com/blog-cakephp/pruebas" target="_blank">funcionamiento</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/actualizar-el-contenido-de-un-select-con-ajax/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Nueva versión de cakephp disponible.</title>
		<link>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-disponible</link>
		<comments>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-disponible#comments</comments>
		<pubDate>Tue, 10 Jun 2008 10:16:40 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[candidata]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[hospedaxes]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=18</guid>
		<description><![CDATA[
Desde hace unos días está disponible en la página de cakephp, una nueva versión, la 1.2.0.7125 RC1, de este framework de desarrollo escrito en php, del que hablamos en nuestro blog y en el que desarrollamos la gran mayoría de las webs que se crean en nuestra empresa.
Lo importante de esta noticia es que el [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cakeforge.org/frs/?group_id=23&amp;release_id=395" target="_blank"><img class="alignleft" style="float: left; margin-left: 12px; margin-right: 12px;" src="http://cakephp.org/img/new.png" alt="" width="230" height="225" /></a></p>
<p>Desde hace unos días está disponible en la página de <a title="cakephp" href="http://cakephp.org" target="_blank">cakephp</a>, una nueva versión, la <a href="http://cakeforge.org/frs/?group_id=23&amp;release_id=395" target="_blank">1.2.0.7125</a> RC1, de este framework de desarrollo escrito en php, del que hablamos en nuestro blog y en el que desarrollamos la gran mayoría de las <a href="http://www.hospedaxes.com" target="_blank">webs</a> que se crean en nuestra empresa.</p>
<p>Lo importante de esta noticia es que el framework ha abandonado la categoría de beta, pasando a ser una versión candidata, cada vez está más cerca el lanzamiento de la versión final.</p>
<p>En esta versión se eliminan gran cantidad de métodos <a href="https://trac.cakephp.org/changeset/4981" target="_blank">deprecados</a> y se corrigen multitud de errores.</p>
<p>A partir de ahora siempre que hablemos de funcionalidades del cakephp 1.2 nos referiremos a la versión RC1.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/nueva-version-de-cakephp-disponible/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sindicación de noticias</title>
		<link>http://cakephp.hospedaxes.com/sindicacion-de-noticias</link>
		<comments>http://cakephp.hospedaxes.com/sindicacion-de-noticias#comments</comments>
		<pubDate>Tue, 06 May 2008 14:51:16 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Sindicación de noticias]]></category>
		<category><![CDATA[sindicación web]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=16</guid>
		<description><![CDATA[Hoy vamos a explicar cómo hacer en CakePHP 1.2 un canal de sindicación de noticias o sindicación web. Es una funcionalidad que utilizamos con mucha frecuencia en nuestros diseños web y para la que Cake nos ofrece un buen soporte.
Cake nos proporciona un helper, RSSHelper, que nos permite hacer en muy pocas líneas de código [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy vamos a explicar cómo hacer en <a title="CakePHP" href="http://www.cakephp.org/">CakePHP 1.2</a> un canal de <a title="Artículo acerca de la sindicación web" href="http://es.wikipedia.org/wiki/Sindicación_web">sindicación de noticias o sindicación web</a>. Es una funcionalidad que utilizamos con mucha frecuencia en nuestros <a title="Hospedaxes" href="http://www.hospedaxes.com">diseños web</a> y para la que Cake nos ofrece un buen soporte.</p>
<p>Cake nos proporciona un helper, <a title="API del RSS Helper" href="http://api.cakephp.org/1.2/class_rss_helper.html">RSSHelper</a>, que nos permite hacer en muy pocas líneas de código un RSS.</p>
<p>Lo primero que tenemos que hacer es una función en el controlador o bien utilizar la misma función index del controlador que queramos sindicar:</p>
<div class="igBar"><span id="lphp-6"><a href="#" onclick="javascript:showPlainTxt('php-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-6">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">class</span> NoticiasController extends AppController</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">var</span> <span style="color:#0000FF;">$helpers</span> = <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'Rss'</span>, <span style="color:#FF0000;">'Xml'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">var</span> <span style="color:#0000FF;">$components</span> = <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'RequestHandler'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> index<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">RequestHandler</span>-&gt;<span style="color:#006600;">prefers</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'rss'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">layout</span> = <span style="color:#FF0000;">'default'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">set</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'channel'</span>,<a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'title'</span> =&gt; <span style="color:#FF0000;">'Portal web - Noticias'</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'description'</span> =&gt; <span style="color:#FF0000;">'Sindicación de noticias de nuestro portal web'</span>,</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'link'</span> =&gt; <span style="color:#FF0000;">'http://url_al_portal.com'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">set</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'data'</span>, <span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">Noticia</span>-&gt;<span style="color:#006600;">findAll</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#000000; font-weight:bold;">null</span>, <span style="color:#000000; font-weight:bold;">null</span>, <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'Noticia.fecha DESC'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#CC66CC;color:#800000;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">else</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF9933; font-style:italic;">// Si no es un RSS, ponemos aquí cómo queremos que se comporte el index</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$this</span>-&gt;<span style="color:#006600;">redirect</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"otra_funcion"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Vemos que tuvimos que importar algunos helpers y componentes. Establecemos aquí ya el título, descripción y enlace del canal, y los datos que queremos sindicar.</p>
<p>En la capa de la vista, tenemos que definir el layout <em>default.ctp</em>, que estará en la carpeta <em>views/layout/rss</em> y será de una manera tan simple como la siguiente:</p>
<div class="igBar"><span id="lphp-7"><a href="#" onclick="javascript:showPlainTxt('php-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-7">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">&lt;?php</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$content_for_layout</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">?&gt;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Y también definir la vista en si, que estará en nuestro caso en la carpeta views/noticias/rss y se llamará index.ctp, y que tendrá la forma:</p>
<div class="igBar"><span id="lphp-8"><a href="#" onclick="javascript:showPlainTxt('php-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-8">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> convertirRSS<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">return</span> <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'title'</span> =&gt; <span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'Noticia'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'titulo'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'link'</span>&nbsp; =&gt; <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'action'</span> =&gt; <span style="color:#FF0000;">'ver'</span>, <span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'Noticia'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'url'</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'Noticia'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'id'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'description'</span> =&gt; <span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'Noticia'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'texto'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF0000;">'pubDate'</span> =&gt; <span style="color:#0000FF;">$data</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'Noticia'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'fecha'</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$xml</span>-&gt;<span style="color:#006600;">header</span><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'version'</span>=&gt;<span style="color:#FF0000;">'1.0'</span>, <span style="color:#FF0000;">'encoding'</span>=&gt;<span style="color:#FF0000;">'utf-8'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$document</span> = <span style="color:#0000FF;">$rss</span>-&gt;<span style="color:#006600;">channel</span><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#0000FF;">$channel</span>, <span style="color:#0000FF;">$rss</span>-&gt;<span style="color:#006600;">items</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$data</span>, <span style="color:#FF0000;">'convertirRSS'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#0000FF;">$rss</span>-&gt;<span style="color:#006600;">document</span><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'version'</span>=&gt;<span style="color:#FF0000;">'2.0'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#0000FF;">$document</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">?&gt;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ya por último, lo único que tenemos que hacer es meter en la cabecera de nuestro código html, el link, para que nos ponga en la barra del navegador el enlace a nuestro rss:</p>
<div class="igBar"><span id="lphp-9"><a href="#" onclick="javascript:showPlainTxt('php-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-9">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;link rel=<span style="color:#FF0000;">"alternate"</span> type=<span style="color:#FF0000;">"application/rss+xml"</span> title=<span style="color:#FF0000;">"Nuestro portal web RSS Feed"</span> href=<span style="color:#FF0000;">"/noticias/index.rss"</span> /&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Y, como vemos, esta url no sigue el formato estándar de las urls que utiliza Cake, por lo que tenemos que definir en el archivo config/routes.php una regla para ello:</p>
<div class="igBar"><span id="lphp-10"><a href="#" onclick="javascript:showPlainTxt('php-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-10">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Router::<span style="color:#006600;">parseExtensions</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Con esto ya tendríamos definido el RSS para nuestra aplicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/sindicacion-de-noticias/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

