<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Tutorial CakePHP informal, sobre la marcha. ¡Participa!</title>
	<atom:link href="http://tutorialcakephp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tutorialcakephp.wordpress.com</link>
	<description>Blog CakePHP</description>
	<lastBuildDate>Wed, 24 Jun 2009 18:59:43 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='tutorialcakephp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Tutorial CakePHP informal, sobre la marcha. ¡Participa!</title>
		<link>http://tutorialcakephp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://tutorialcakephp.wordpress.com/osd.xml" title="Tutorial CakePHP informal, sobre la marcha. ¡Participa!" />
	<atom:link rel='hub' href='http://tutorialcakephp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Ejercicio 8. Configura el componente Auth de CakePHP en un plisplás</title>
		<link>http://tutorialcakephp.wordpress.com/2009/06/02/ejercicio-8-configura-el-componente-auth-de-cakephp-en-un-plisplas/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/06/02/ejercicio-8-configura-el-componente-auth-de-cakephp-en-un-plisplas/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 09:48:05 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Ejercicios y ejemplos Cake PHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=1036</guid>
		<description><![CDATA[Ejercicio 8. Configuración del componente Auth Vamos a configurar el componente Auth de CakePHP en cinco pasos; es decir, en un plisplás. Este ejercicio supone que no hemos creado el modelo Usuario y su tabla correspondiente, así que lo haremos por el camino. Are you ready? Sí? 1, 2, 3&#8230; Go! 1. Copia el siguiente código. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=1036&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Ejercicio 8. Configuración del componente Auth</h3>
<p>Vamos a configurar el componente Auth de CakePHP en cinco pasos; es decir, en un plisplás. Este ejercicio supone que no hemos creado el modelo Usuario y su tabla correspondiente, así que lo haremos por el camino. Are you ready? Sí? 1, 2, 3&#8230; Go!</p>
<p><strong>1.</strong> Copia el siguiente código.</p>
<pre class="brush: php;">
function inicializarAuth(){
   $this-&gt;Auth-&gt;userModel = 'Usuario';
   $this-&gt;Auth-&gt;fields = array('username' =&gt; 'login', 'password' =&gt; 'password');
   $this-&gt;Auth-&gt;loginAction = array('controller' =&gt; 'usuarios', 'action' =&gt; 'login');
   $this-&gt;Auth-&gt;loginRedirect = array('controller' =&gt; 'usuarios', 'action' =&gt; 'index');
   $this-&gt;Auth-&gt;logoutRedirect = array('controller' =&gt; 'pages', 'action' =&gt; 'display');
   $this-&gt;Auth-&gt;loginError = 'El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez';
   $this-&gt;Auth-&gt;authError = 'Para entrar en la zona privada tienes que autenticarte';
   $this-&gt;Auth-&gt;allow('registro');
   $this-&gt;Auth-&gt;allow(array('display'));
   $this-&gt;Session-&gt;write('Auth.redirect', null);
} // fin de function inicializarAuth
function beforeFilter(){
   $this-&gt;inicializarAuth();
} // fin de function beforeFilter()
</pre>
<p><strong>2.</strong> Copia el archivo /cake/libs/controller/app_controller.php en /app/app_controller.php. Ahora, edita el recién creado /app/app_controller.php y pega el código que has copiado antes en el interior de la clase AppController. Cuando tu clase AppController quede como la del siguiente ejemplo, guárdala sin miedo. Date prisa.</p>
<pre class="brush: php;">

 class AppController extends Controller {
   var $components = array('Auth');
   function inicializarAuth(){
      $this-&gt;Auth-&gt;userModel = 'Usuario';
      $this-&gt;Auth-&gt;fields = array('username' =&gt; 'login', 'password' =&gt; 'password');
      $this-&gt;Auth-&gt;loginAction = array('controller' =&gt; 'usuarios', 'action' =&gt; 'login');
      $this-&gt;Auth-&gt;loginRedirect = array('controller' =&gt; 'usuarios', 'action' =&gt; 'index');
      $this-&gt;Auth-&gt;logoutRedirect = array('controller' =&gt; 'pages', 'action' =&gt; 'display');
      $this-&gt;Auth-&gt;loginError = 'El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez';
      $this-&gt;Auth-&gt;authError = 'Para entrar en la zona privada tienes que autenticarte';
      $this-&gt;Auth-&gt;allow('registro');
      $this-&gt;Auth-&gt;allow(array('display'));
      $this-&gt;Session-&gt;write('Auth.redirect', null);
   } // fin de function inicializarAuth
   function beforeFilter(){
      $this-&gt;inicializarAuth();
   } // fin de function beforeFilter()
}
</pre>
<p><strong>3.</strong> Ahora tenemos que crear el modelo Usuario. Para ello, ve a /app/models y crea el archivo usuario.php con el siguiente código. ¡Corre!</p>
<pre class="brush: php;">

class Usuario extends AppModel{
   var $name = 'Usuario';
   var $validate = array(  'login' =&gt;     array(
                                                'rule' =&gt; array('minLength', 1),
                                                'required' =&gt; true,
                                                'allowEmpty' =&gt; false,
                                                'message' =&gt; 'Por favor, introduce el login'
                                             ),
                           'password' =&gt;  array(
                                                'rule' =&gt; array('minLength', 1),
                                                'required' =&gt; true,
                                                'allowEmpty' =&gt; false,
                                                'message' =&gt; 'Por favor, introduce la contraseña'
                                             ),
                           'email' =&gt;     array(
                                                'rule' =&gt; 'email',
                                                'required' =&gt; true,
                                                'allowEmpty' =&gt; false,
                                                'message' =&gt; 'Por favor, introduce una dirección de correo válida'
                                             )
                     );

}
</pre>
<p><strong>4.</strong> Una vez tenemos el modelo Usuario, escribimos el SQL que crea usuarios, su tabla correspondiente. ¡Ya casi está!</p>
<pre class="brush: sql;">

create table usuarios(

id mediumint unsigned NOT NULL auto_increment,

login varchar(20) NOT NULL,

email varchar(100) NOT NULL,

data datetime NOT NULL,

password varchar(40) NOT NULL,

primary key(id)

);
</pre>
<p><strong>5.</strong> Finalmente, como estamos hechos unos campeones, nos tomamos un kit kat.</p>
<p> <span style="text-align:center; display: block;"><a href="http://tutorialcakephp.wordpress.com/2009/06/02/ejercicio-8-configura-el-componente-auth-de-cakephp-en-un-plisplas/"><img src="http://img.youtube.com/vi/tPaPrLuXcQI/2.jpg" alt="" /></a></span></p>
<h3>Qué hemos hecho?</h3>
<p>Working like a machine? Muy buenas de nuevo, hemos vuelto de la publicidad y ahora es el momento de ver qué hemos hecho exactamente.</p>
<h3>Paso 1</h3>
<p>Aquí sólo hemos copiado un trozo de código; luego veremos qué hace exactamente. De momento, empero, vamos a intentar desentrañarlo un poco.</p>
<p>Los componentes de CakePHP encapsulan lógica que van a compartir varios controladores. En particular, Cake viene de fábrica con el componente Auth, cuya razón de ser es autenticar a los usuarios de una aplicación CakePHP. Como veremos un poquito más adelante en esta explicación, cuando añadimos el componente Auth al programa, entonces, de forma predeterminada, se bloquean todas las acciones a excepción de login y logout.</p>
<h3>Paso 2</h3>
<p>Todos los controladores de la aplicación Cake extienden la clase AppController; en consecuencia, si queremos añadir algo que compartan todos ellos, debemos hacerlo aquí. Por eso, estimado visitante, primero nos hemos ido a /cake/libs/controller/app_controller.php, luego hemos copiado este archivo en /app/app_controller.php, y, finalmente, hemos pegado el código aquí. ¿Quieres saber por qué es necesaria esta copia de app_controller.php? <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  <a href="http://groups.google.es/group/cakephp-esp/browse_thread/thread/3d9332b0e89540e3" target="_blank">Haz clic aquí</a>, pues.</p>
<p>En efecto, querido Watson, en AppController hemos añadido el componente Auth y lo hemos configurado en el método beforeFilter(). Por cierto, recordemos que beforeFilter() es una acción callback que se ejecuta justo antes de llamar a cualquier acción del programa CakePHP. Elemental. Bueno, visitante, en realidad bromeo un poco <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  y puede que esto no sea tan elemental. Puedes echar un vistazo a las retrollamadas en <a href="http://book.cakephp.org/es/view/60/Callbacks">http://book.cakephp.org/es/view/60/Callbacks</a>.</p>
<p>Sin embargo, la dificultad de este paso número dos se encuentra en la función inicializarAuth porque es aquí donde debemos definir las propiedades del componente y esto implica que las conocemos. Quiero decir, que para escribir esta función tenemos que conocer un poco a Auth para decirle lo que queremos hacer con él. Vamos a hacerlo ahora.</p>
<p>Por defecto, la tabla donde se almacenan los usuarios se llama users, pero no siempre es así. Si quieres utilizar otra configuración puedes utilitzar los pasos 3 y 4 de este ejercicio, ¡pero recuerda decírselo a Auth en el beforeFilter! Por ejemplo, para utilizar el modelo Usuario, escribimos esto:</p>
<pre class="brush: php;">
$this-&gt;Auth-&gt;userModel = 'Usuario';
</pre>
<p>Por otra parte, Auth espera que los campos que almacenan el nombre de usuario y la constraseña se llamen username y password y para decirle, &#8220;Oye, por favor, Auth, fíjate que, en vez de username y password, mi tabla usuarios tiene los campos login y password. Gracias&#8221;, escribimos esta línea:</p>
<pre class="brush: php;">
$this-&gt;Auth-&gt;fields = array('username' =&gt; 'login', 'password' =&gt; 'password');
</pre>
<p><span>Esta línea le dice a Auth dónde está la acción que autentica a los usuarios:</span></p>
<pre class="brush: php;">$this-&gt;Auth-&gt;loginAction = array('controller'=&gt;'usuarios','action'=&gt;'login');
</pre>
<p> <span><span><span><span>Y esta otra, dónde debe redireccionar a los usuarios que salen correctamente del sistema:</span></span></span><span><span><span> </span></span></span></span></p>
<pre class="brush: php;">
$this-&gt;Auth-&gt;logoutRedirect = array('controller'=&gt;'pages', 'action'=&gt;'display');
</pre>
<p><span><span><span><span>Estas dos tienes que adivinarlas tú:</span></span></span></span><span><span><span><span> </span></span></span></span></p>
<pre class="brush: php;">

$this-&gt;Auth-&gt;loginError('El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez';
$this-&gt;Auth-&gt;authError('Para entrar en la zona privada tienes que autenticarte');
</pre>
<p>¿Recuerdas que decíamos que cuando añadimos el componente Auth en AppController se bloquean todas las acciones a excepción de login y logout? Pues bien, si nos interesa desbloquear otras acciones para hacerlas accesibles a todos los visitantes del sitio web, entonces utilizamos la variable allow. Un caso típico es el de la acción que permite que los usuarios se puedan registrar. Efectivamente, si queremos que todo el mundo pueda acceder, entonces escribimos esto:</p>
<pre class="brush: php;">
$this-&gt;Auth-&gt;allow('registro');
</pre>
<p>Si queremos que la vista /app/views/pages/home.ctp también esté disponible, escribimos:</p>
<pre class="brush: php;">

$this-&gt;Auth-&gt;allow(array('display'));
</pre>
<p>Auth se comporta de forma que recuerda y redirecciona al URL al que el usuario intentaba acceder antes de entrar correctamente en el sistema. Por ejemplo, si el usuario escribe www.miaplicacioncakephp.com, y, a continuación, entra en www.miaplicacióncakephp.com/usuarios/login y se autentica, Auth no le envía a la vista login.ctp, como muchos podríamos esperar, sino a index.ctp. Esta dirección se guarda en la variable de sesión Auth.redirect; para deshabilitar este comportamiento, escribimos esto (hay una discusión interesante al respecto en <a href="http://book.cakephp.org/comments/index/392">http://book.cakephp.org/comments/index/392</a>):</p>
<pre class="brush: php;">

$this-&gt;Session-&gt;write('Auth.redirect',null);
</pre>
<h3>Pasos 3 y 4</h3>
<p>En estos pasos hemos creado el modelo Usuario y la tabla usuarios porque en este ejemplo no nos interesa seguir las convenciones de CakePHP y utilizar el modelo User y su tabla correspondiente, users. Finalmente, recordamos otra vez que, haciendo esto, es necesario comunícarselo a Auth; en concreto, como hemos visto, esto se hace a través de las variables userModel y fields.</p>
<h3>Resumen</h3>
<p>En este post hemos visto que los controladores de CakePHP extienden la clase AppController y que si queremos que una lógica determinada esté disponible en todos los controladores de la aplicación entonces debemos añadirla a la clase /app/app_controller.php.</p>
<p>CakePHP viene de fábrica con el componente Auth, y cuando lo añadimos en AppController se bloquean todas las acciones de todos los controladores a excepción de login y logout.</p>
<p>Para configurar Auth debemos conocer los parámetros de que dispone: userModel, fields, loginAction, allow, etc. En cualquier caso, todos ellos se parametrizan enel método beforeFilter de AppController porque esta acción se ejecuta antes de cualquier acción de la aplicación CakePHP.</p>
<p>Nota:</p>
<p>Ha pasado un tiempo desde que escribí en este blog el post <a href="http://tutorialcakephp.wordpress.com/2008/11/20/20-de-noviembre-de-2008-de-cakephp-11-a-cakephp-12-el-baile-de-los-errores-parte-ii/">http://tutorialcakephp.wordpress.com/2008/11/20/20-de-noviembre-de-2008-de-cakephp-11-a-cakephp-12-el-baile-de-los-errores-parte-ii/</a>. Aquí explicaba mi primer acercamiento al componente Auth. ¡Espero que este otro lo encuentres un poco mejor y te sea más útil!</p>
<br />Posted in Ejercicios y ejemplos Cake PHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/1036/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/1036/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/1036/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=1036&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/06/02/ejercicio-8-configura-el-componente-auth-de-cakephp-en-un-plisplas/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>Ejercicio 7. Declara el tipo de tus documentos con Cake</title>
		<link>http://tutorialcakephp.wordpress.com/2009/05/19/ejercicio-7-declara-el-tipo-de-tus-documentos-con-cake/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/05/19/ejercicio-7-declara-el-tipo-de-tus-documentos-con-cake/#comments</comments>
		<pubDate>Tue, 19 May 2009 17:06:45 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Ejercicios y ejemplos Cake PHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=1007</guid>
		<description><![CDATA[No DOCTYPE found! Esta tarde me he dedicado a validar las páginas XHTML de mi aplicación CakePHP con http://validator.w3.org/, el servicio de validación de marcado del W3C (W3C Markup Validation Service) pero&#8230; ¡sorpresa!: resulta que, al principio, no podía hacerlo porque había olvidado añadir la declaración del tipo de documento justo al comienzo de éstas. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=1007&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="msg"><strong>No <code>DOCTYPE</code> found!</strong></span></p>
<p>Esta tarde me he dedicado a validar las páginas XHTML de mi aplicación CakePHP con <a href="http://validator.w3.org/" target="_blank">http://validator.w3.org/</a>, el servicio de validación de marcado del W3C (W3C Markup Validation Service) pero&#8230; ¡sorpresa!: resulta que, al principio, no podía hacerlo porque había olvidado añadir la declaración del tipo de documento justo al comienzo de éstas. Resultado: el mensaje de error del título de este párrafo.</p>
<p>Confieso, pues (no se lo digas a nadie), que hasta hace muy poco no tenía claro qué era el DOCTYPE. Aunque lo he añadido algunas veces (justo antes de validar el código de turno), siempre lo he dejado para el final y esta vez se me había olvidado. ¿Qué tal si rescatamos al DOCTYPE del olvido y lo ponemos siempre al principio del archivo a partir de ahora? Seguro que es una buena idea. Todo esto si tú hacías como yo, claro. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>En concreto, el mensaje que lanza el <a href="http://validator.w3.org/">http://validator.w3.org/es</a> es algo así como este: &#8220;No se ha podido encontrar o no se ha reconocido una declaración de tipo de documento en este archivo. Generalmente, esto significa que, al principio, el documento no declara su tipo de documento. También puede ser que haya un error en la declaración o que no esté utilizando la sintaxis correcta&#8221;.</p>
<p>A continuación, el programa verifica el documento como si se tratara de un HTML 4.01 Transitional.</p>
<p><strong>1. ¿Qué es el DOCTYPE?</strong></p>
<p>Dejando a un lado algunos aspectos más o menos técnicos y profundos que he encontrado en Internet (que no sé si comprendo del todo), según lo que muchos dicen y sí que entiendo, el DOCTYPE es algo así como una instrucción que tiene que ponerse al comienzo del documento (X)HTML para que el navegador sepa qué va a encontrarse a continuación y pueda interpretarlo en consecuencia. La mayoría de explicaciones que he leído coinciden en que el DOCTYPE no es una etiqueta, sino &#8220;una declaración&#8221;. A continuación, adjunto <a href="http://www.eslomas.com/index.php/archives/2005/03/22/que-es-el-xhtml-doctype/" target="_blank">esta explicación</a> de <a href="http://www.eslomas.com">www.eslomas.com</a>, que está muy bien:</p>
<p>&#8220;El DOCTYPE es una parte fundamental de todas aquellas páginas que quieran cumplir los estándares, tanto <acronym title="HyperText Markup Language">HTML</acronym> como <acronym title="eXtensible HyperText Markup Language - HTML reformulated as XML">XHTML</acronym>. Esta declaración indica que versión de (X)<acronym title="HyperText Markup Language">HTML</acronym> se usa en la página, de forma que los navegadores pueden saber qué sintaxis y gramática se usa, y los validadores puedan comprobar su validez.[...] Aparte de esto la declaración DOCTYPE se utiliza por los navegadores para activar su modo estándar o estricto, o su modo compatibilidad (quirk)&#8221;.</p>
<p>Esto mismo explica el mismo <a href="http://www.w3c.org/QA/Tips/Doctype" target="_blank">W3C en este documento</a>. Ciertamente, no debemos olvidar añadir el doctype porque las herramientas que procesan los documentos HTML necesitan conocer el DTD que utilizan los documentos. Esta es una información clave que necesitan los navegadores y las herramientas que procesan el documento; por ejemplo, el servicio de validación de marcado del W3C.</p>
<p>Por último, los navegadores interpretan el documento más rápidamente y de una forma más consistente cuando se define el doctype; es decir, analizan sintácticamente el archivo en modo estándar y no tienen que &#8220;hacer conjeturas&#8221;. El resultado: nos evitamos sorpresas.</p>
<p><strong>2. ¿Qué declaraciones de tipo de documento podemos utilizar?</strong></p>
<p>Hay una lista del W3C con todas ellas, <a href="http://www.w3.org/QA/2002/04/valid-dtd-list.html" target="_blank">http://www.w3.org/QA/2002/04/valid-dtd-list.html</a>.</p>
<p><strong>3. ¿Cómo se escribe una DTD en CakePHP?</strong></p>
<p>Se utiliza $html-&gt;docType() para escribir la declaración del tipo de documento. En función del DTD que queramos utilitzar, se usa el parámetro correspondiente: html, html4-strict, html4-trans, xhtml-strict, etc. Todos estos parámetros están en <a href="http://book.cakephp.org/view/206/Inserting-Well-Formatted-elements">http://book.cakephp.org/view/206/Inserting-Well-Formatted-elements</a>, el manual de CakePHP.</p>
<p>Por ejemplo, como la sintaxis que usan mis documentos es la XHTML 1.0 Strict, he escrito este código en el archivo /layout/default.ctp de mi aplicación CakePHP:</p>
<pre class="brush: php;">

&lt;?php 

echo $html-&gt;docType('xhtml-strict'); 

?&gt;
</pre>
<p>Si ahora ejectuo el programa y visualizo el código fuente de cualquier página, entonces ya aparece la DTD antes de la etiqueta &lt;html&gt;:</p>
<p><span class="doctype">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221; </span><span class="doctype">&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8221;&gt;</span></p>
<p>Finalmente, si vuelvo a validar el código de la página, en <a href="http://validator.w3.org/">http://validator.w3.org/</a>, me sale este otro mensaje:</p>
<p style="text-align:center;"><span class="doctype"><strong>Errors found while checking this document as XHTML 1.0 Strict!</strong></span></p>
<p>Es decir, el validador, que reconoce la sintaxis de mi archivo, encuentra varios errores en él. No obstante, como diría Michael Ende en La Historia Interminable, esa es otra historia que debe ser contada en otra ocasión.</p>
<br />Posted in Ejercicios y ejemplos Cake PHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/1007/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/1007/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/1007/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=1007&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/05/19/ejercicio-7-declara-el-tipo-de-tus-documentos-con-cake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>17. Juegos multiusuario. AJAX polling con CakePHP y Couperin</title>
		<link>http://tutorialcakephp.wordpress.com/2009/04/30/17-ajax-polling-con-cakephp-y-couperin/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/04/30/17-ajax-polling-con-cakephp-y-couperin/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 14:40:29 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Primeros pasos con CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=959</guid>
		<description><![CDATA[¡Hola, compi! He empezado a dar mis primeros pasos con AJAX hace poco y por momentos me pierdo porque no tengo muy bien asimilados algunos de los conceptos. Proceso de cliente por aquí, tiempo de espera por acá, proceso de servidor por allá&#8230; Todo un lío, vaya. Sé que hay que ordenar todas estas cosas de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=959&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>¡Hola, compi! He empezado a dar mis primeros pasos con AJAX hace poco y por momentos me pierdo porque no tengo muy bien asimilados algunos de los conceptos. Proceso de cliente por aquí, tiempo de espera por acá, proceso de servidor por allá&#8230; Todo un lío, vaya. Sé que hay que ordenar todas estas cosas de algún modo; de hecho, me ha dado por pensar que una aplicación AJAX es algo así como una orquesta cuyo director somos nosotros, los programadores. ¿Te gusta esta analogía?</p>
<p>Sí, como también coincide que últimamente me ha dado por escuchar a <a href="http://es.wikipedia.org/wiki/Fran%C3%A7ois_Couperin" target="_blank">Couperin</a> (a quien recién descubrí, por cierto), inserto a continuación este video que espero que te guste. A ver si su música nos ayuda a estimular el sistema cognitivo y nuestras aplicaciones AJAX dejan de lanzar errores por todas partes, como las mías ahora.</p>
<span style="text-align:center; display: block;"><a href="http://tutorialcakephp.wordpress.com/2009/04/30/17-ajax-polling-con-cakephp-y-couperin/"><img src="http://img.youtube.com/vi/Va54RvJM7Fc/2.jpg" alt="" /></a></span>
<p>Pero vayamos al grano. Resulta que estoy trabajando en un juego multiusuario que implementa la técnica AJAX polling. Por cierto, estoy casi convencido de que sería mejor utilizar otras técnicas -long polling, sockets o COMET- pero finalmente utilizo esta porque para mí es la más sencilla. Bueno, también me tranquilizó un poco <a href="http://groups.google.es/group/cakephp-esp/browse_thread/thread/64262cdfce15d471#" target="_blank">saber que esto puede hacerse así </a>y que está muy bien para acercarse a AJAX long polling y a COMET.</p>
<p><strong>¿Qué es AJAX polling?</strong></p>
<p>AJAX polling es una técnica de programación que consiste en solicitar a intervalos de tiempo regulares la ejecución de la lógica determinada que implementa el servidor. El principal inconvieniente de esta técnica es su escalabilidad porque el número de peticiones puede llegar a incrementarse drásticamente si ese intervalo regular de tiempo es pequeño. Por ejemplo, si hay 1000 usuarios conectados a la aplicación y cada uno de ellos hace una petición por segundo, entonces el servidor recibe 2000 peticiones por segundo.</p>
<p>Además de esto, otra de las desventajas de AJAX polling es que el servidor siempre responde a las peticiones que recibe de los clientes, independientemente de si tiene alguna información nueva que entregarles. En otras palabras, los clientes siempre ejecutan la lógica de turno (actualizan la página cada segundo, por ejemplo) cada n segundos aunque no sea necesario.</p>
<p><strong>Implementación de AJAX polling con CakePHP</strong></p>
<p>Finalmente, mi aplicación multiusuario tiene varias tablas a las que acceden los jugadores de forma dinámica. Además de consultar y actualizar estas tablas, los jugadores calculan sus puntuaciones a partir de ellas y las visualizan en su pantalla en tiempo real. He implementado esta idea utilizando el método remoteTimer:</p>
<pre class="brush: php;">

   echo $ajax-&gt;remoteTimer (  array(   'url' =&gt; array('controller' =&gt; 'multijugadores', 'action' =&gt; 'preguntar_sistema'),
                                       'update' =&gt; 'aciertos',
                                       'frequency' =&gt; 1
                                    )
                           );
</pre>
<p>Este método, envoltorio de los objetos Prototype PeriodicalExecuter y Ajax.Updater, pide cada segundo la ejecución de la acción preguntar_sistema. Esta acción es la que se encarga de realizar las consultas a las tablas comunes (un conjunto de tablas que todos los usuarios comparten) e imprimir las puntuaciones, calculadas a partir de éstas.</p>
<p>Estoy trabajando en local, la aplicación funciona y de momento no sé qué consecuencias puede tener esta implementación en el rendimiento del servidor compartido al que estoy a punto de subirla. ¿Tienes alguna experiencia con aplicaciones de este tipo? Si es así, cuéntanos&#8230; ;-)</p>
<p><strong>¿Y la música&#8230; De dónde sale?</strong></p>
<p>Bueno, compi, pues <a href="http://es.wikipedia.org/wiki/Fran%C3%A7ois_Couperin" target="_blank">Couperin</a> aparece para ayudarme a abordar el problema de una forma no racional. Me refiero al problema de definir la idea de la aplicación multiusuario. Sí, <a href="http://es.wikipedia.org/wiki/Fran%C3%A7ois_Couperin" target="_blank">Couperin </a>es la fuente de inspiración que ha derribado las barreras lógica, hipotética y deductiva de la perspectiva izquierda de mi pensamiento y me ha ayudado a crear la idea. Seguro que las hay mejores (¡explícanos alguna, si las conoces!), pero estoy contento porque esta funciona. Espero que te animes a probarla y, si quieres, la comentamos aquí.</p>
<br />Posted in Primeros pasos con CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/959/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=959&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/04/30/17-ajax-polling-con-cakephp-y-couperin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>3 de marzo de 2009. ¡Hola mundo!</title>
		<link>http://tutorialcakephp.wordpress.com/2009/03/03/3-de-marzo-de-2009-%c2%a1hola-mundo/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/03/03/3-de-marzo-de-2009-%c2%a1hola-mundo/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 19:38:27 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Curiosea en el diario de jordicakephp]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=956</guid>
		<description><![CDATA[Hola visitante, ¿cómo va todo? Ahora mismo estoy ocupado en otros frentes y durante este tiempo no he escrito más experiencias Cake , aunque he dedicado algún tiempecito, eso sí, a traducir algunos espacios de http://book.cakephp.org/ al español. Bueno, visitante, ¡espero volver a verte pronto por aquí! Posted in Curiosea en el diario de jordicakephp<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=956&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hola visitante, ¿cómo va todo? Ahora mismo estoy ocupado en otros frentes y durante este tiempo no he escrito más experiencias Cake <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> , aunque he dedicado algún tiempecito, eso sí, a traducir algunos espacios de <a href="http://book.cakephp.org/">http://book.cakephp.org/</a> al español. Bueno, visitante, ¡espero volver a verte pronto por aquí! <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<br />Posted in Curiosea en el diario de jordicakephp  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/956/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=956&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/03/03/3-de-marzo-de-2009-%c2%a1hola-mundo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>Ejercicio 6. Mi primer datasource. Consultas al API de YouTube</title>
		<link>http://tutorialcakephp.wordpress.com/2009/02/02/ejercicio-6-mi-primer-datasource-consultas-al-api-de-youtube/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/02/02/ejercicio-6-mi-primer-datasource-consultas-al-api-de-youtube/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 15:23:58 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Ejercicios y ejemplos Cake PHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=933</guid>
		<description><![CDATA[Hola visitante, ¿qué tal la semana? En este post vamos a hacer lo mismo que hicimos en 5. Listado de YouTube con SimpleXML de esta categoría, YouTube y CakePHP. Esta vez, sin embargo, en vez de implementar la lógica en un controlador, como hicimos aquella vez, abstraeremos el servicio web de YouTube en un datasource. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=933&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hola visitante, ¿qué tal la semana? En este post vamos a hacer lo mismo que hicimos en <a href="http://tutorialcakephp.wordpress.com/2009/01/21/5-saliendo-del-jurasico-listado-de-youtube-con-simplexml/" target="_blank">5. Listado de YouTube con SimpleXML</a> de esta categoría, <a href="http://tutorialcakephp.wordpress.com/category/youtube-y-cakephp/" target="_blank">YouTube y CakePHP</a>. Esta vez, sin embargo, en vez de implementar la lógica en un controlador, como hicimos aquella vez, abstraeremos el servicio web de YouTube en un datasource. Esta idea nace del artículo <a href="http://debuggable.com/posts/datasources,-models,-components,-behaviors:48bd3025-2c44-40b6-a6e7-35674834cda3" target="_blank">Datasources, Models, Components, Behaviors </a>de Felix Geisendörfer, gracias a la respuesta que obtuve <a href="http://groups.google.es/group/cakephp-esp/browse_thread/thread/fd4504fe9e3f0e98/a37fea1e0f3c5536?lnk=gst&amp;q=helper+videos#a37fea1e0f3c5536" target="_blank">en este hilo del Grupo Google CakePHP en español</a>.</p>
<p><strong>¿Qué es un datasource?</strong></p>
<p>Los desarrolladores de CakePHP han creado varios recursos que sirven para extender la funcionalidad de las diferentes partes de una estructura MVC con el objetivo de mantener bien organizado el código de los modelos, las vistas y los controladores.</p>
<p>En efecto, cuánto más crece la complejidad de una aplicación, es más difícil mantener bien organizado el código de los archivos. Los helpers, por lo tanto, ayudan a mantener bien organizado el código de las vistas; los componentes, el de los controladores; finalmente, los datasources y los behaviors nos ayudan con los modelos.</p>
<p><strong>Funcionamiento de los datasources</strong></p>
<p>Como hemos dicho, los datasources extienden la funcionalidad de los modelos para que estos últimos no tengan que preocuparse de montar las consultas SQL y de realizar las operaciones de conexión con la base de datos. En otras palabras, los datasources actúan como una capa situada entre el modelo y la fuente de datos (MySQL, PostgreSQL, Oracle, XML, etc).</p>
<p>Veamos cómo trabajan juntos el modelo y el datasource a través de un ejemplo concreto en que la fuente de datos es una base de datos MySQL. En este caso, el modelo ejectua una de sus  funciones (find, por ejemplo); el datasource la recoge, arma una cadena SQL y se conecta a la base de datos; a continuación, el datasource recoge el conjunto resultado de MySQL, le da formato y devuelve el resultado al modelo.</p>
<p><strong>Creación del datasource YoutubeSource</strong></p>
<p>Del mismo modo que los helpers se crean en la carepta <strong>app/views/helpers</strong> y los controladores se crean en <strong>app/controllers/components</strong>, los datasources se crean en la carpeta <strong>app/models/datasources</strong>.</p>
<p>Nuestro datasource para YouTube es este:</p>
<pre class="brush: php;">

class YoutubeSource extends DataSource{
   var $description = 'Fuente de datos YouTube';
   var $respuestaYoutube;
   function __construct($config=null){
      parent::__construct($config);
      $this-&gt;connected = $this-&gt;connect();
      return $config;
   }
   function __destruct(){
      $this-&gt;connected = $this-&gt;close();
      parent::__destruct();
   }
   function connect(){
      $apiURL = 'http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed';
      $ch = curl_init();
      $timeout = 0;
      curl_setopt($ch, CURLOPT_URL, $apiURL);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
      $this-&gt;respuestaYoutube = curl_exec($ch);
      curl_close($ch);
      if (!$this-&gt;respuestaYoutube){
         return false;
      } else {
         return true;
      }
   }
   function close(){
   }
   function read(){
   }
   function query(){
   }
   function describe(){
   }
   function column(){
   }
   function isConnected(){
   }
   function showLog(){
   }
   function videosMasVistos(){
      App::import('Core','Xml');
      return Set::reverse(new Xml($this-&gt;respuestaYoutube));
   }
}
</pre>
<p>He seguido el capítulo 14 del libro <a href="http://www.apress.com/book/view/1430209771" target="_blank">Beginning CakePHP From Novice to Professional </a>de <a href="http://www.davidgolding.net/" target="_blank">David Golding</a> para hacer este ejercicio. En él, David Golding nos indica que es necesario definir un esqueleto mínimo con las funciones __construct(), __destruct(), connect(), close(), read(), query(), describe(), column(), isConnected() y showLog().</p>
<p>YoutubeSource implementa el método connect() y hace una llamada al API REST de YouTube para obtener el feed Atom con la información de los vídeos más vistos. Por otra parte, como veremos un poco más adelante cuando creemos el modelo YouTube, también implementa el método videosMasVistos(). </p>
<p>La clase del datasource se llama YoutubeSorce y tiene que guardarse en el archivo youtube_source.php de la carpeta app/models/datasources.</p>
<p><strong>Incluir nuestro datasource en app/config/database.php</strong></p>
<p>Del mismo modo que los ayudantes y los componentes se incluyen en las matrices $helpers y $components del controlador, respectivamente, los datasources se definen en la clase DATABASE_CONFIG de app/config/database.php.</p>
<p>Efectivamente, para incluir el datasource que acabamos de crear en nuestra aplicación CakePHP podemos escribir lo siguiente justo después de la declaración de $default:</p>
<pre class="brush: php;">

var $youtube = array(
  'datasource' =&gt; 'youtube'
 );
</pre>
<p><strong>Creación del modelo Youtube y del método feedsMasVistos()</strong></p>
<p>Ahora tenemos que crear la tabla youtubes en nuestra base de datos y el modelo YouTube en app/models/youtube.php.</p>
<pre class="brush: php;">

class Youtube extends AppModel{
   var $name = 'Youtube';
   function videosMasVistos(){
      $this-&gt;setDataSource('youtube');
      $youtube = $this-&gt;getDataSource();
      return $youtube-&gt;videosMasVistos();
   }
}
</pre>
<p><strong>Último paso: llamar al método videosMasVistos en el controlador y crear la vista</strong></p>
<p>Finalmente, ya podemos probar nuestro datasource. Para ello tenemos que llamar desde el controlador al método videosMasVistos() del modelo YouTube:</p>
<pre class="brush: php;">

$this-&gt;set('feedAtom', $this-&gt;Youtube-&gt;videosMasVistos());
</pre>
<p>También hay que crear la vista app/views/youtube/mas_vistos.ctp para mostrar el resultado en la pantalla:</p>
<p>[/sourcecode language='php']</p>
<p>echo &#8216;&lt;h3&gt;Los videos más vistos son&#8230;&lt;/h3&gt;&#8217;;<br />
foreach ($feedAtom-&gt;entry as $entry){<br />
echo $entry-&gt;title.&#8217;&lt;br/&gt;&#8217;;<br />
}</p>
<p>[/sourcecode]</p>
<p>¡Y esto es todo! Espero que este post te haya gustado, lo encuentres útil, y te sirva para dar tus primeros pasos con los datasources.</p>
<br />Posted in Ejercicios y ejemplos Cake PHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/933/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/933/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/933/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=933&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/02/02/ejercicio-6-mi-primer-datasource-consultas-al-api-de-youtube/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>10. Diagrama de flujo del proceso de autenticación OAuth</title>
		<link>http://tutorialcakephp.wordpress.com/2009/01/28/10-diagrama-de-flujo-del-proceso-de-autenticacion-oauth/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/01/28/10-diagrama-de-flujo-del-proceso-de-autenticacion-oauth/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 19:08:47 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[YouTube y CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=930</guid>
		<description><![CDATA[Estoy echando un vistazo a dos recursos que explican desde diferentes ángulos el diagrama de flujo del proceso de autenticación OAuth. He tomado algunas notas y he hecho un pequeño resumen de lo que creo haber entendido. El primer enlace es La guía de iniciación a OAuth, de Hueniverse; el segundo, La guía del desarrollador de Google. ¿Qué [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=930&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estoy echando un vistazo a dos recursos que explican desde diferentes ángulos el diagrama de flujo del proceso de autenticación OAuth. He tomado algunas notas y he hecho un pequeño resumen de lo que creo haber entendido. El primer enlace es <a href="http://www.hueniverse.com/hueniverse/2007/10/beginners-gui-1.html" target="_blank">La guía de iniciación a OAuth</a>, de Hueniverse; el segundo, <a href="http://code.google.com/intl/es/apis/youtube/2.0/developers_guide_protocol_oauth.html#Signing_Requests" target="_blank">La guía del desarrollador de Google</a>.</p>
<p>¿Qué tal si hacemos clic en los dos y los vemos al mismo tiempo? <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  A mí me ha ido muy bien leer lo que dice uno y compararlo en el otro. Hueniverse explica, a través de los programas de ejemplo <em>faji</em> y <em>beppa, </em>cómo ve el usuario el proceso OAuth (personalmente me ha gustado mucho y lo encuentro muy práctico y sencillo). Por otra parte, el enlace de La guía del desarrollador de Google es bastante más técnico y presenta, en 14 pasos, el diagrama de flujo del proceso OAuth. En un contexto CakePHP y YouTube, mi resumen sería este:</p>
<p>El programa CakePHP pide a Google un token de autorización; éste nos lo envía, pero antes comprueba que estamos registrados; nuestra aplicación web redirecciona al usuario a la página de YouTube y el usuario se autentica; el token de autorización se convierte entonces en un token de acceso y YouTube redirecciona al usuario a nuestra página CakePHP; CakePHP se conecta a YouTube para intercambiar el token de autorización por el de acceso y YouTube se lo devuelve; finalmente, cuando se asocia el token de acceso a la cuenta de YouTube del usuario, el programa ya puede enviar peticiones API autenticadas en nombre del usuario. ¡Puf! ¡Parece la jugada de un partido de fútbol!</p>
<br />Posted in YouTube y CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/930/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=930&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/01/28/10-diagrama-de-flujo-del-proceso-de-autenticacion-oauth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>9. Entendiendo OAuth. Definiciones básicas.</title>
		<link>http://tutorialcakephp.wordpress.com/2009/01/28/9-entendiendo-oauth-definiciones-basicas/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/01/28/9-entendiendo-oauth-definiciones-basicas/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 18:14:00 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[YouTube y CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=922</guid>
		<description><![CDATA[La Guía de OAuth para principiantes, escrita por Eran Hammer-Lahav y publicada por Hueniverse, cubre muchos de los temas que se necesitan para entender e implementar este protocolo. En la primera parte, visión general, define algunos conceptos básicos necesarios para entender OAuth. Esta obra tiene una licencia Creative Commons 3.0 de reconocimiento, no comercial y sin obras [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=922&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://oauth.net/documentation/getting-started" target="_blank">La Guía de OAuth para principiantes</a>, escrita por Eran Hammer-Lahav y publicada por <a href="http://www.hueniverse.com/hueniverse/" target="_blank">Hueniverse</a>, cubre muchos de los temas que se necesitan para entender e implementar este protocolo. En la primera parte, <a href="http://www.hueniverse.com/hueniverse/2007/10/beginners-guide.html" target="_blank">visión general</a>, define algunos conceptos básicos necesarios para entender OAuth. Esta obra tiene una <a href="http://creativecommons.org/licenses/by-nc-nd/3.0/us/deed.es_CO" target="_blank">licencia Creative Commons 3.0</a> de reconocimiento, no comercial y sin obras derivadas.</p>
<p>Estas son algunas definiciones de los conceptos básicos que maneja OAuth según <a href="http://oauth.net/documentation/getting-started" target="_blank">la Guía de OAuth para principiantes</a>. Estos conceptos son los mismos que trata la <a href="http://oauth.net/core/1.0/" target="_blank">especificación técnica del protocolo OAuth 1.0</a>, publicada el 4 de diciembre de 2007.</p>
<p><strong>Proveedor del servicio</strong>. El <em>proveedor del servicio</em> controla todos los aspectos de la implementación OAuth. Este término se utiliza para describir el sitio o servicio web donde se encuentran los recursos restringidos. Puede tratarse de un sitio para compartir fotos donde los <em>usuarios</em> guardan sus álbumes, un servicio de banca en línea, un sitio de microblogging, o cualquier otro servicio que almacene material privado del <em>usuario</em>.</p>
<p><strong>Usuario.</strong> Es la razón de ser de OAuth. Si no hay <em>usuarios</em>, no hay necesidad de OAuth. Los <em>usuarios</em> tienen material privado en el <em>proveedor del servicio</em> pero quieren compartirlo con otro sitio. En OAuth, el protocolo se detiene, sin intervención manual con el <em>usuario</em>, al menos una vez, para recibir el permiso que otorga el acceso.</p>
<p><strong>Consumidor.</strong> Un nombre curioso para una aplicación que intenta acceder a los <em>recursos</em> del <em>usuario</em>. Puede ser un sitio web, un programa de escritorio, un dispositivo móvil o cualquier cosa conectada a Internet. El <em>consumidor</em> es el que pide permiso para acceder a los <em>recursos</em> y es aquí donde se lleva a cabo la parte más útil de OAuth. OAuth define un <em>desarrolador de consumidor</em> como la entidad que escribe código que interactúa con el<em> proveedor del servicio</em>.</p>
<p><strong>Recursos protegidos.</strong> Es el material que protege OAuth y al que permite el acceso. Pueden ser datos (fotos, documentos, contactos), actividades (el post de un blog, fondos de transferencia) o cualquier URL que necesite restringir el acceso.</p>
<p><strong>Tokens.</strong> Para acceder a los <em>recursos</em> se utilizan tokens en vez de credenciales de <em>usuario</em>. Generalmente, un <em>token</em> es una cadena aleatoria, única, de letras y números, difícil de adivinar, que forma pareja con un <em>secreto</em> que protege al <em>token</em> de los malos usos. OAuth define dos tipos diferentes de <em>tokens</em>: <em>tokens </em>de petición y <em>tokens</em> de acceso.</p>
<br />Posted in YouTube y CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/922/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/922/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/922/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=922&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/01/28/9-entendiendo-oauth-definiciones-basicas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>8. OAuth, CakePHP y YouTube</title>
		<link>http://tutorialcakephp.wordpress.com/2009/01/27/8-oauth-cakephp-y-youtube/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/01/27/8-oauth-cakephp-y-youtube/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 18:06:31 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[YouTube y CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=917</guid>
		<description><![CDATA[¿Qué es OAuth? La autenticación OAuth es el proceso mediante el que los usuarios de nuestra aplicación CakePHP conceden acceso a sus recursos protegidos de YouTube sin compartir sus credenciales con nosotros. Gracias a este protocolo, los programas pueden acceder a través de una API a los recursos protegidos que sus usuarios tienen en otros [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=917&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>¿Qué es OAuth?</strong></p>
<p>La autenticación OAuth es el proceso mediante el que los usuarios de nuestra aplicación CakePHP conceden acceso a sus recursos protegidos de YouTube sin compartir sus credenciales con nosotros. Gracias a este protocolo, los programas pueden acceder a través de una API a los recursos protegidos que sus usuarios tienen en otros sitios.</p>
<p><strong>Funcionamiento de OAuth desde el punto de vista del usuario</strong></p>
<p>Supongamos, por ejemplo, que nuestro sitio CakePHP, www.fotosyvideos.com, accede a las fotos que tienen sus usuarios en www.flickr.com, o a los vídeos que tienen en www.youtube.com. Con OAuth los usuarios no tienen que darnos sus credenciales, mientras que sin un protocolo como este el programa pediría el login y password para poder acceder a los datos protegidos proporcionados por Flickr o YouTube.</p>
<p>Todo esto se traduce en más seguridad. Como explica la <a href="http://oauth.net/documentation/getting-started" target="_blank">Guía OAuth para principiantes</a>, dar nuestro nombre de usuario y contraseña a un sitio web para que obtenga de otro sitio web nuestra lista de contactos, es lo mismo que ir a cenar y dar nuestro código al camarero en el momento de pagar con la tarjeta. Ciertamente, los usuarios se arriesgan cuando comparten su información privada con otros sitios o personas. Todo esto y más lo explica muy bien <a href="http://oauth.net/" target="_blank">el sitio oficial de OAuth</a> (en inglés).</p>
<p>En resumen, este post presenta el protocolo OAuth, gracias al cual las aplicaciones de escritorio, móviles y web interactúan de forma segura con datos protegidos. Hemos descubierto que este protocolo permite autorizaciones API de forma sencilla, abierta, estándar y segura. Finalmente, al preguntarnos por el funcionamiento de OAuth desde el punto de vista del usuario, hemos visto que es seguro porque éstos no tienen que darnos sus credenciales.</p>
<p><strong>Información de OAuth en español aquí:</strong></p>
<p><a href="http://www.error500.net/oauth-identificacion-abierta">http://www.error500.net/oauth-identificacion-abierta</a></p>
<p><a href="http://www.econectados.com/2007/10/oauth-protocolo-de-autentificacion-segura-para-apis/">http://www.econectados.com/2007/10/oauth-protocolo-de-autentificacion-segura-para-apis/</a></p>
<p><a href="http://www.lacofa.es/index.php/tecnologias/futuro-de-internet/oauth-primer-paso-hacia-el-control-de-la-informacion-de-personalizacion">http://www.lacofa.es/index.php/tecnologias/futuro-de-internet/oauth-primer-paso-hacia-el-control-de-la-informacion-de-personalizacion</a></p>
<p><a href="http://www.webmasterlibre.com/2008/06/30/oauth-autenticacion-segura-para-apis/">http://www.webmasterlibre.com/2008/06/30/oauth-autenticacion-segura-para-apis/</a></p>
<br />Posted in YouTube y CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/917/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/917/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/917/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=917&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/01/27/8-oauth-cakephp-y-youtube/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>7. Servicios Web en Internet y algo más sobre REST</title>
		<link>http://tutorialcakephp.wordpress.com/2009/01/23/7-servicios-web-en-internet/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/01/23/7-servicios-web-en-internet/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 11:53:57 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[Curiosea en el diario de jordicakephp]]></category>
		<category><![CDATA[YouTube y CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=881</guid>
		<description><![CDATA[Google nos explica en qué consiste la tecnología REST: Otras explicaciones muy buenas sobre este tema: una es es de Nokrosis y el enlace es este; también adjunto este artículo, Servicios Web con PHP, de www.malditainternet.com. Posted in Curiosea en el diario de jordicakephp, YouTube y CakePHP<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=881&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Google nos explica en qué consiste la tecnología REST:</p>
<span style="text-align:center; display: block;"><a href="http://tutorialcakephp.wordpress.com/2009/01/23/7-servicios-web-en-internet/"><img src="http://img.youtube.com/vi/YCcAE2SCQ6k/2.jpg" alt="" /></a></span>
<p>Otras explicaciones muy buenas sobre este tema: una es <a href="http://nokrosis.com/" target="_blank">es de Nokrosis </a>y <a href="http://nokrosis.com/category/conociendo-las-apis/" target="_blank">el enlace es este</a>; también adjunto este artículo, <a href="http://www.malditainternet.com/node/1169" target="_blank">Servicios Web con PHP</a>, de <a href="http://www.malditainternet.com" target="_blank">www.malditainternet.com</a>.</p>
<br />Posted in Curiosea en el diario de jordicakephp, YouTube y CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/881/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=881&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/01/23/7-servicios-web-en-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
		<item>
		<title>6. He descubierto que el API de YouTube es REST</title>
		<link>http://tutorialcakephp.wordpress.com/2009/01/22/6-%c2%bfes-la-api-de-youtube-una-api-si-pero-con-pinta-de-rest/</link>
		<comments>http://tutorialcakephp.wordpress.com/2009/01/22/6-%c2%bfes-la-api-de-youtube-una-api-si-pero-con-pinta-de-rest/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 11:43:58 +0000</pubDate>
		<dc:creator>tutorialcakephp</dc:creator>
				<category><![CDATA[YouTube y CakePHP]]></category>

		<guid isPermaLink="false">http://tutorialcakephp.wordpress.com/?p=858</guid>
		<description><![CDATA[&#8220;Una interfaz de programación de aplicaciones o API (del inglés Application Programming Interface) es el conjunto de funciones y procedimientos (o métodos si se refiere a programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción&#8221;. - Wikipedia. La enciclopedia libre Según esta definición, como la [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=858&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;Una interfaz de programación de aplicaciones o API (del inglés Application Programming Interface) es el conjunto de funciones y procedimientos (o métodos si se refiere a programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción&#8221;.</em></p>
<p style="text-align:right;">- Wikipedia. La enciclopedia libre</p>
<p>Según esta definición, como la entendía antes de descubrir las APIs Web, me preguntaba lo siguiente: ¿Dónde están las funciones y los procedimientos cuando armo un listado de vídeos de YouTube?, ¿dónde están estas funciones cuando obtengo un Google Maps?</p>
<p><strong>Roy Thomas Fielding y REST</strong></p>
<p><a href="http://es.wikipedia.org/wiki/Roy_Fielding" target="_blank">Roy Thomas Fielding</a> es uno de los principales autores de la especificación HTTP (<a href="http://www.ietf.org/rfc/rfc2616.txt" target="_blank">RFC 2616</a>) y obtuvo su doctorado hace nueve años, en 2000, en la Universidad de California, con su tesis <em>Estilos Arquitecturales y el Diseño de Arquitecturas Software basadas en Red</em>. En este trabajo, Fielding presenta la <strong>Transferencia de Estado Representacional</strong>, o REST (<em>Representational State Transfer</em>).</p>
<p><strong>Para qué sirve REST</strong></p>
<p>Actualmente, el término REST hace referencia a un enfoque para desarrollar y proporcionar servicios web y es una alternativa a los servicios web SOAP. No tengo ninguna experiencia en SOAP y hablaré poco de él para no meter mucho la pata.</p>
<p>Por lo que creo haber entendido, hay muchas diferencias en el funcionamiento de estas dos tecnologías. Por ejemplo, con SOAP, que se basa en RPC, tenemos un conjunto de métodos que hacen algo, mientras que en REST los que hacen algo son los recursos, identificados por un URL.</p>
<p><strong>Qué es un servicio web</strong></p>
<p>Según el W3C: &#8220;Un conjunto de aplicaciones o tecnologías con capacidad para interoperar en la Web. Estas aplicaciones o tecnologías intercambian datos entre sí con el objetivo de ofrecer unos servicios. <strong>Los proveedores ofrecen sus servicios como procedimientos remotos y los usuarios solicitan un servicio llamando a estos procedimientos a través de la Web</strong>&#8220;.</p>
<p><strong>Cómo funcionan las APIs basadas en REST</strong></p>
<p>Bueno, pues las funciones o métodos que yo buscaba ¡son los URL! Si en RPC teníamos métodos como getUser(), addUser() o removeUser(), ahora, en REST, tenemos recursos identificados con URLs. Como explica muy bien la Wikipedia:  &#8220;<strong>Los clientes trabajan con estos recursos a través de las operaciones estándar de HTTP, como GET para descargar una copia del recurso</strong>&#8220;.</p>
<p>Más concretamente, <a href="http://tutorialcakephp.wordpress.com/2008/12/22/geocodificacion-con-php-y-el-api-google-maps-3/" target="_blank">esto es lo que se hace aquí</a>, por ejemplo, cuando le pedimos al geocodificador de Google que nos mande un mapa. Esto es lo que hicimos, también, <a href="http://tutorialcakephp.wordpress.com/2009/01/21/5-saliendo-del-jurasico-listado-de-youtube-con-simplexml/" target="_blank">aquí</a>, cuando le pedimos a YouTube que nos mandara un listado con los vídeos más vistos. En ambos casos, la respuesta que recibimos de este recurso es un XML, aunque esto se puede parametrizar en el URL de consulta para que sea, por ejemplo, otra, como JSON.</p>
<p><strong>¿Entonces, qué es el API de YouTube?</strong></p>
<p>No hace mucho, algunas compañías comenzaron a liberar sus APIs: Amazon, Yahoo!, Google, etc. En otras palabras, expusieron sus servicios web en forma de recursos REST, a través de un URL, para que los consumidores de estos servicios (los programadores) pudieran acceder a este procesamiento a través del protocolo HTTP.  El API de YouTube es, pues, un servicio web basado en REST.</p>
<p><strong>Dónde está REST</strong></p>
<p>¿Recuerdas que estos días descubrimos el funcionamiento de los blogs y de los feeds RSS, <a href="http://tutorialcakephp.wordpress.com/2009/01/20/4-el-meollo-del-asunto-xml-y-la-sindicacion-de-contenidos-web-rss-y-atom/" target="_blank">gracias al videotutorial RSS hablando en plata</a>? ¡Pues resulta que la tecnología que hay detrás de ellos es REST! Ciertamente, los lectores de feeds consultan un URL, el del feed, que devuelve un XML.</p>
<p><strong>Hasta otra</strong></p>
<p>Espero que este post te haya gustado y lo encuentres útil. Ya conocemos un poco mejor qué es esto que andamos tocando (¡APIs REST!) y cómo utilizarlas, que es de lo que se trata; si encuentras algún fallo, ¡deja aquí algún comentario!</p>
<p><strong>Más información de todo este asunto aquí&#8230;</strong></p>
<p><a href="http://es.wikipedia.org/wiki/Representational_State_Transfer">http://es.wikipedia.org/wiki/Representational_State_Transfer</a></p>
<p><a href="http://www.ibm.com/developerworks/xml/library/x-youtubeapi/">http://www.ibm.com/developerworks/xml/library/x-youtubeapi/</a></p>
<p><a href="http://phpwebservices.blogspot.com/2008/01/rest-with-php_20.html">http://phpwebservices.blogspot.com/2008/01/rest-with-php_20.html</a></p>
<p><span style="color:#008000;"><a href="www.di.uniovi.es/~cueva/asignaturas/doctorado/2006/trabajos/Ponencia%20REST.pdf" target="_blank">www.di.uniovi.es/~cueva/asignaturas/doctorado/2006/trabajos/Ponencia%20REST.pdf</a></span></p>
<p><a href="http://es.wikipedia.org/wiki/Roy_Fielding">http://es.wikipedia.org/wiki/Roy_Fielding</a></p>
<p><a href="http://www.sematopia.com/?p=153">http://www.sematopia.com/?p=153</a></p>
<br />Posted in YouTube y CakePHP  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tutorialcakephp.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tutorialcakephp.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tutorialcakephp.wordpress.com/858/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tutorialcakephp.wordpress.com&amp;blog=5195488&amp;post=858&amp;subd=tutorialcakephp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tutorialcakephp.wordpress.com/2009/01/22/6-%c2%bfes-la-api-de-youtube-una-api-si-pero-con-pinta-de-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2098570406dd46cd6c65e4200e69a6d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tutorialcakephp</media:title>
		</media:content>
	</item>
	</channel>
</rss>
