<?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>Ajaxman &#187; Programacion</title>
	<atom:link href="http://www.ajaxman.net/tag/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxman.net</link>
	<description>Servicios Web, Desarrollo de aplicaciones, tutoriales sobre software</description>
	<lastBuildDate>Sun, 01 Apr 2012 06:18:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[PHP] Usando el modulo de autenticación Kohana A1</title>
		<link>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html</link>
		<comments>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html#comments</comments>
		<pubDate>Tue, 15 Nov 2011 05:40:11 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Autenticación]]></category>
		<category><![CDATA[Kohana A1]]></category>
		<category><![CDATA[Recursos]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2155</guid>
		<description><![CDATA[<p>Kohana A1, es un modulo de kohana el cual nos permite implementar de una forma efectiva, potente y clara, un sistema de autenticación, de una forma fácil y sencilla. Antes de empezar a usarlo es importante considerar que el modulo usa la el constructor crypt de PHP pero usando como hash CRYPT_BLOWFISH, esto no afecta [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Kohana A1, es un modulo de kohana el cual nos permite implementar de una forma efectiva, potente y clara, un sistema de autenticación, de una forma fácil y sencilla.</p>
<blockquote><p><strong>Antes de empezar a usarlo es importante considerar que el modulo usa la el constructor crypt de PHP pero usando como hash CRYPT_BLOWFISH, esto no afecta si estas usando PHP 5.3, pero si tienes este inconveniente al final del post pondré como solucionarlo(o cambiarte de hosting a uno mas actualizado).</strong></p></blockquote>
<p>Vamos a ver como usarlo para hacer un login.</p>
<p>Requisitos:</p>
<ul>
<li>Kohana 3.2</li>
<li>Kohana A1 module</li>
<li>
Kohana ORM</li>
<li>Kohana Database</li>
</ul>
<p>Como dicen los requisitos para usar A1 debemos de estar conectados a una base de datos, también debemos de tener un modulo que abstraiga dicha base de datos, para esto podemos usar Kohana ORM, Automodeler, Jelly, Sprig o entre otros, si estamos haciendo pruebas yo recomiendo usar Kohana ORM, y ya en base a sus requerimientos y necesidades usar el que mas les agrade.</p>
<p>Instalamos kohana de modo que quede en http://localhost/kohana1/ ,creamos una base de datos yo la llamare, &#8220;<strong>system</strong>&#8221; y le pondré  como datos de conexión ultra-seguros user:<strong>root</strong> password:<strong>root</strong>, recuerden activar el modulo database y ORM.</p>
<p>Y posteriormente nos toca, agregar el siguiente código SQL a nuestra base de datos, obviamente lo pueden modificar a su gusto, aunque de momento dejémoslo así.</p>
<div id="gist-1353924" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>&nbsp;<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">IF</span> <span class="k">NOT</span> <span class="k">EXISTS</span> <span class="o">`</span><span class="n">users</span><span class="o">`</span> <span class="p">(</span></div><div class='line' id='LC2'>	  <span class="o">`</span><span class="n">id</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span> <span class="n">UNSIGNED</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="n">AUTO_INCREMENT</span><span class="p">,</span></div><div class='line' id='LC3'>	  <span class="o">`</span><span class="n">email</span><span class="o">`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">127</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span></div><div class='line' id='LC4'>	  <span class="o">`</span><span class="n">username</span><span class="o">`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;&#39;</span><span class="p">,</span></div><div class='line' id='LC5'>	  <span class="o">`</span><span class="n">password</span><span class="o">`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">`</span><span class="n">token</span><span class="o">`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;&#39;</span><span class="p">,</span></div><div class='line' id='LC7'>	  <span class="o">`</span><span class="n">logins</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">UNSIGNED</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span></div><div class='line' id='LC8'>	  <span class="o">`</span><span class="n">last_login</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">UNSIGNED</span><span class="p">,</span></div><div class='line' id='LC9'>	  <span class="k">PRIMARY</span> <span class="k">KEY</span>  <span class="p">(</span><span class="o">`</span><span class="n">id</span><span class="o">`</span><span class="p">)</span></div><div class='line' id='LC10'><span class="p">)</span> <span class="n">ENGINE</span><span class="o">=</span><span class="n">InnoDB</span>  <span class="k">DEFAULT</span> <span class="n">CHARSET</span><span class="o">=</span><span class="n">utf8</span><span class="p">;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1353924/42d633389d83c04aba081e70fd61226708ce97a4/users.sql" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1353924#file_users.sql" style="float:right;margin-right:10px;color:#666">users.sql</a>
            <a href="https://gist.github.com/1353924">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Ahora procedemos a bajar el modulo A1, que esta aquí: <a href="https://github.com/Wouterrr/A1/ " title="Kohana A1">https://github.com/Wouterrr/A1/ </a></p>
<p>Y lo ponemos en nuestro carpeta modules nombrando a la carpeta A1 de modo que quedara asi &#8220;modules/A1&#8243;.Dentro de dicha &#8220;modules/A1&#8243; hay una carpeta config y dentro de ella un archivo llamado a1.php, bien este archivo es el archivo de configuración del modulo Kohana A1, de igual forma que se hace con todos los módulos hay que copiar este archivo a &#8220;application/config/&#8221; para poder editarlo y que no afecte directamente al modulo.</p>
<p>El archivo se ve de la siguiente forma:</p>
<div id="gist-1353957" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="k">return</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>	<span class="s1">&#39;driver&#39;</span>     <span class="o">=&gt;</span> <span class="s1">&#39;ORM&#39;</span><span class="p">,</span> <span class="c1">// orm/jelly/mango/sprig</span></div><div class='line' id='LC6'>	<span class="s1">&#39;user_model&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;user&#39;</span><span class="p">,</span></div><div class='line' id='LC7'>	<span class="s1">&#39;cost&#39;</span>       <span class="o">=&gt;</span> <span class="mi">12</span><span class="p">,</span>    <span class="c1">// Bcrypt Cost - any number between 4 and 31 -&gt; higher = stronger hash</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'>	<span class="s1">&#39;cookie&#39;</span>     <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC10'>		<span class="s1">&#39;key&#39;</span>         <span class="o">=&gt;</span> <span class="s1">&#39;a1_{name}_autologin&#39;</span><span class="p">,</span></div><div class='line' id='LC11'>		<span class="s1">&#39;lifetime&#39;</span>    <span class="o">=&gt;</span> <span class="mi">1209600</span><span class="p">,</span> <span class="c1">// two weeks</span></div><div class='line' id='LC12'>	<span class="p">),</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>	<span class="s1">&#39;columns&#39;</span>   <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC15'>		<span class="s1">&#39;username&#39;</span>    <span class="o">=&gt;</span> <span class="s1">&#39;username&#39;</span><span class="p">,</span></div><div class='line' id='LC16'>		<span class="s1">&#39;password&#39;</span>    <span class="o">=&gt;</span> <span class="s1">&#39;password&#39;</span><span class="p">,</span></div><div class='line' id='LC17'>		<span class="s1">&#39;token&#39;</span>       <span class="o">=&gt;</span> <span class="s1">&#39;token&#39;</span><span class="p">,</span></div><div class='line' id='LC18'>		<span class="c1">//&#39;last_login&#39;=&gt; &#39;last_login&#39;, // (optional)</span></div><div class='line' id='LC19'>		<span class="c1">//&#39;logins&#39;    =&gt; &#39;logins&#39;      // (optional)</span></div><div class='line' id='LC20'>	<span class="p">),</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>	<span class="s1">&#39;session&#39;</span>  <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC23'>		<span class="s1">&#39;type&#39;</span>        <span class="o">=&gt;</span> <span class="s1">&#39;native&#39;</span> <span class="c1">// native or database</span></div><div class='line' id='LC24'>	<span class="p">)</span></div><div class='line' id='LC25'><span class="p">);</span></div><div class='line' id='LC26'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1353957/033cdfc081efa08539b97d548b8e91a72e347a6c/a1.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1353957#file_a1.php" style="float:right;margin-right:10px;color:#666">a1.php</a>
            <a href="https://gist.github.com/1353957">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Aquí pongo la descripción de cada elemento:</p>
<ul>
<li><strong>driver</strong>: EL ORM que usara (ORM,jelly,mango,sprig[se pueden agregar mas pero hay que modificar el modulo o extenderlo])</li>
<li><strong>user_model</strong>: tabla(modelo) que se usara &#8216;user&#8217;</li>
<li><strong>cost</strong>: fuerza (tamaño de la clave) entre 4 y 31, lo ideal es  12, si ponen un numero muy grande tomar en cuenta que consumirá mas recursos.</li>
<li><strong>cookie</strong>: los datos de la cookie que generara a1, para hacer el login(nombre y duración)</li>
<li><strong>columns</strong>: aquí le estamos asignando a los items de A1, las columnas de la base de datos, es decir si en su base de datos el nombre de usuarios están en el campo nombre, tendrán que poner &#8216;username&#8217; => &#8216;nombre&#8217;, modificando lo que esta en el array, los campos opcionales de momento no los usaremos, aunque cabe señalar que solo guardan información extra.</li>
<li><strong>session</strong>: Aquí es donde definimos el tipo de sesión, de momento y regularmente bastara con dejarlo como esta, si su aplicación correrá en varios servidores conviene ponerlo en modo database(aunque en este caso hay que hacer un par de cosas mas, espero postear pronto sobre esto)</li>
<p>.</ul>
<p>No se les olvide activar le modulo en el bootstrap, el cual en la sección módulos debería verse así:<br />
<span id="more-2155"></span><br />
<div id="gist-1354170" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><span class="c1">//more code</span></div><div class='line' id='LC3'><span class="sd">/**</span></div><div class='line' id='LC4'><span class="sd"> * Enable modules. Modules are referenced by a relative or absolute path.</span></div><div class='line' id='LC5'><span class="sd"> */</span></div><div class='line' id='LC6'><span class="nx">Kohana</span><span class="o">::</span><span class="na">modules</span><span class="p">(</span><span class="k">array</span><span class="p">(</span></div><div class='line' id='LC7'>	<span class="c1">// &#39;auth&#39;       =&gt; MODPATH.&#39;auth&#39;,       // Basic authentication</span></div><div class='line' id='LC8'>	<span class="c1">// &#39;cache&#39;      =&gt; MODPATH.&#39;cache&#39;,      // Caching with multiple backends</span></div><div class='line' id='LC9'>	<span class="c1">// &#39;codebench&#39;  =&gt; MODPATH.&#39;codebench&#39;,  // Benchmarking tool</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s1">&#39;A1&#39;</span>         <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;A1&#39;</span><span class="p">,</span>           <span class="c1">//A1 authentication</span></div><div class='line' id='LC11'>	 <span class="s1">&#39;database&#39;</span>   <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;database&#39;</span><span class="p">,</span>   <span class="c1">// Database access</span></div><div class='line' id='LC12'>	<span class="c1">// &#39;image&#39;      =&gt; MODPATH.&#39;image&#39;,      // Image manipulation</span></div><div class='line' id='LC13'>	 <span class="s1">&#39;orm&#39;</span>        <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;orm&#39;</span><span class="p">,</span>        <span class="c1">// Object Relationship Mapping</span></div><div class='line' id='LC14'>	<span class="c1">// &#39;unittest&#39;   =&gt; MODPATH.&#39;unittest&#39;,   // Unit testing</span></div><div class='line' id='LC15'>	<span class="c1">// &#39;userguide&#39;  =&gt; MODPATH.&#39;userguide&#39;,  // User guide and API documentation</span></div><div class='line' id='LC16'>	<span class="p">));</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354170/10f6dc8ae106e3bdeb34c471c9ca49e17c73f33f/bootstrap.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354170#file_bootstrap.php" style="float:right;margin-right:10px;color:#666">bootstrap.php</a>
            <a href="https://gist.github.com/1354170">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<p>Ahora vamos a crear un controlador que sera en este caso el backend, el cual verificara que si estas logueado te deja entrar a ejecutar cualquier acción, si no te re-direccionara a un controlador &#8220;account&#8221; y al action &#8220;login&#8221; que tendra la vista del formulario de login, y también tendrá un link a registrarse usando este modulo A1.</p>
<p>En este controlador &#8220;backend&#8221; tenemos una action, llamada index que cargara un vista, en donde mostraremos un mensaje que dirá &#8220;bienvenido Nombre_de_usuario&#8221;</p>
<div id="gist-1354210" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * Controller_Backend </span></div><div class='line' id='LC4'><span class="sd"> * </span></div><div class='line' id='LC5'><span class="sd"> * Este es el backend de una aplicacion que esta usando A1 como metodo de autenticación</span></div><div class='line' id='LC6'><span class="sd"> * </span></div><div class='line' id='LC7'><span class="sd"> * @author Javier</span></div><div class='line' id='LC8'><span class="sd"> * @package Backend</span></div><div class='line' id='LC9'><span class="sd"> * </span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Controller_Backend</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">     *</span></div><div class='line' id='LC15'><span class="sd">     * @var User $auth contains object a1 user </span></div><div class='line' id='LC16'><span class="sd">     */</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$auth</span><span class="p">;</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC20'><span class="sd">     * (non-PHPdoc)</span></div><div class='line' id='LC21'><span class="sd">     * @see system/classes/kohana/Kohana_Controller::before()</span></div><div class='line' id='LC22'><span class="sd">     */</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">()</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">before</span><span class="p">();</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span> <span class="o">=</span> <span class="nx">A1</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_prevent_back</span><span class="p">();</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">logged_in</span><span class="p">()</span><span class="o">===</span> <span class="k">FALSE</span><span class="p">)</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)));</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span><span class="p">;</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">view</span><span class="o">::</span><span class="na">set_global</span><span class="p">(</span><span class="s1">&#39;logout&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;logout&#39;</span><span class="p">)));</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s2">&quot;backend/home&quot;</span><span class="p">)</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s2">&quot;auth&quot;</span><span class="p">,</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="p">);</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">(</span><span class="nv">$view</span><span class="p">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="k">function</span> <span class="nf">_prevent_back</span><span class="p">()</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">headers</span><span class="p">(</span><span class="s2">&quot;Cache-Control&quot;</span><span class="p">,</span><span class="s2">&quot;no-store, no-cache, must-revalidate&quot;</span><span class="p">);</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC48'><span class="p">}</span> <span class="c1">// End Welcome</span></div><div class='line' id='LC49'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354210/d4ae1cbf4b119cdc79325599c075335d0910eb70/backend.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354210#file_backend.php" style="float:right;margin-right:10px;color:#666">backend.php</a>
            <a href="https://gist.github.com/1354210">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Las partes importantes a destacar son:</p>
<ul>
<li>En el método before asignamos a $this->auth (variable publica) una instancia de A1, que es el modulo que hará el login.</li>
<li>Luego preguntamos mediante el método $this->auth->logged_in() que seria lo mismo que usar A1::instance()->logged_in(), que si es FALSE, significa que no esta logeado entonces lo redirecciona a la siguiente url:</li>
<li>Route::url(&#8216;default&#8217;,array(&#8216;controller&#8217; => &#8216;account&#8217;, &#8216;action&#8217; => &#8216;login&#8217;) la cual dice: que usando el route llamado default construya un url basada en cierto controlador, cierta acción y cierto id.</li>
<li>Tenemos un action (metodo) index que mostrara una vista que estará en la carpeta backend, la vista se llama home y le digo que envié los datos de autenticación usando la variable auth.</li>
</ul>
<div id="gist-1359633" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="x">&lt;!DOCTYPE html&gt;</span></div><div class='line' id='LC2'><span class="x">&lt;html&gt;</span></div><div class='line' id='LC3'><span class="x">    &lt;head&gt;</span></div><div class='line' id='LC4'><span class="x">        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;</span></div><div class='line' id='LC5'><span class="x">        &lt;title&gt;&lt;/title&gt;</span></div><div class='line' id='LC6'><span class="x">    &lt;/head&gt;</span></div><div class='line' id='LC7'><span class="x">    &lt;body&gt;</span></div><div class='line' id='LC8'><span class="x">        &lt;div&gt;</span></div><div class='line' id='LC9'><span class="x">            &lt;p&gt;Bienvenido al sistema &lt;strong&gt;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$auth</span><span class="o">-&gt;</span><span class="na">get_user</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">email</span><span class="p">;</span> <span class="cp">?&gt;</span><span class="x">&lt;/strong&gt;&lt;/p&gt;</span></div><div class='line' id='LC10'><span class="x">            &lt;p style=&quot;float:right;&quot;&gt;</span></div><div class='line' id='LC11'><span class="x">            	&lt;a href=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$logout</span> <span class="cp">?&gt;</span><span class="x">&quot; &gt;Salir&lt;/a&gt;</span></div><div class='line' id='LC12'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC13'><span class="x">        &lt;/div&gt;</span></div><div class='line' id='LC14'><span class="x">    &lt;/body&gt;</span></div><div class='line' id='LC15'><span class="x">&lt;/html&gt;</span></div><div class='line' id='LC16'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1359633/fbb995d48ef6bf0186137317ee2b952dacf0637d/home.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1359633#file_home.php" style="float:right;margin-right:10px;color:#666">home.php</a>
            <a href="https://gist.github.com/1359633">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Este es el código del controlador account, con sus metodos/acciones de registro y login.</p>
<div id="gist-1354245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * Controller_Account</span></div><div class='line' id='LC4'><span class="sd"> * </span></div><div class='line' id='LC5'><span class="sd"> * Aqui estaran las funcionalidades de login y registro</span></div><div class='line' id='LC6'><span class="sd"> * </span></div><div class='line' id='LC7'><span class="sd"> * @author Javier</span></div><div class='line' id='LC8'><span class="sd"> * @package Backend</span></div><div class='line' id='LC9'><span class="sd"> * </span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Controller_Account</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">     *</span></div><div class='line' id='LC15'><span class="sd">     * @var User $auth contains object a1 user </span></div><div class='line' id='LC16'><span class="sd">     */</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$auth</span><span class="p">;</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC20'><span class="sd">     * </span></div><div class='line' id='LC21'><span class="sd">     * Variable que guardara la sesión</span></div><div class='line' id='LC22'><span class="sd">     * @var Session $session</span></div><div class='line' id='LC23'><span class="sd">     */</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$session</span><span class="p">;</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC27'><span class="sd">     * </span></div><div class='line' id='LC28'><span class="sd">     * Vista que usara el sistema</span></div><div class='line' id='LC29'><span class="sd">     * @var View|String $view</span></div><div class='line' id='LC30'><span class="sd">     */</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$view</span><span class="p">;</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC34'><span class="sd">     * </span></div><div class='line' id='LC35'><span class="sd">     * Aqui se cargara el modelo users</span></div><div class='line' id='LC36'><span class="sd">     * @var Model_Users $users</span></div><div class='line' id='LC37'><span class="sd">     */</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$users</span><span class="p">;</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC41'><span class="sd">     * (non-PHPdoc)</span></div><div class='line' id='LC42'><span class="sd">     * @see system/classes/kohana/Kohana_Controller::before()</span></div><div class='line' id='LC43'><span class="sd">     */</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">()</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">before</span><span class="p">();</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span> <span class="o">=</span> <span class="nx">A1</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span> <span class="o">=</span>  <span class="nx">Session</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span>   <span class="o">=</span> <span class="k">new</span> <span class="nx">Model_Users</span><span class="p">();</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">action_login</span><span class="p">();</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_login</span><span class="p">()</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span> <span class="o">=</span>  <span class="k">array</span><span class="p">();</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">method</span><span class="p">()</span><span class="o">==</span><span class="s2">&quot;POST&quot;</span><span class="p">)</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span> </div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$username</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;username&#39;</span><span class="p">);</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$password</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">);</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$remember</span> <span class="o">=</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;remember&#39;</span><span class="p">]))</span><span class="o">?</span><span class="k">TRUE</span><span class="o">:</span><span class="k">FALSE</span><span class="p">;</span></div><div class='line' id='LC66'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC67'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">login</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span><span class="nv">$password</span><span class="p">,</span><span class="nv">$remember</span><span class="p">))</span></div><div class='line' id='LC68'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span>      </div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$session</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">session</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">as_array</span><span class="p">();</span></div><div class='line' id='LC70'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$session</span><span class="p">[</span><span class="s2">&quot;user&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">get_user</span><span class="p">();</span></div><div class='line' id='LC71'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span> <span class="o">=</span> <span class="nv">$session</span><span class="p">;</span></div><div class='line' id='LC72'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;backend&#39;</span><span class="p">,</span><span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="k">FALSE</span><span class="p">)));</span> </div><div class='line' id='LC73'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC74'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span></div><div class='line' id='LC75'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC76'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Datos no validos&quot;</span><span class="p">;</span></div><div class='line' id='LC77'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC78'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC79'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s1">&#39;backend/login&#39;</span><span class="p">)</span></div><div class='line' id='LC80'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;posturl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)))</span></div><div class='line' id='LC81'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;registerurl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;register&#39;</span><span class="p">)))</span></div><div class='line' id='LC82'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s2">&quot;errors&quot;</span><span class="p">,</span><span class="nv">$errors</span><span class="p">);</span></div><div class='line' id='LC83'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC84'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC85'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_register</span><span class="p">()</span></div><div class='line' id='LC86'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC87'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$errors</span> <span class="o">=</span>  <span class="k">array</span><span class="p">();</span></div><div class='line' id='LC88'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">method</span><span class="p">()</span><span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">)</span></div><div class='line' id='LC89'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC90'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$username</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;username&#39;</span><span class="p">);</span></div><div class='line' id='LC91'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$password</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">);</span></div><div class='line' id='LC92'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;register&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Error al intentar registrarse&quot;</span><span class="p">;</span></div><div class='line' id='LC93'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span><span class="o">-&gt;</span><span class="na">unique_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">)</span><span class="o">===</span> <span class="k">FALSE</span><span class="p">)</span></div><div class='line' id='LC94'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC95'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="nv">$new_user</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span><span class="o">-&gt;</span><span class="na">save_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span><span class="nv">$password</span><span class="p">,</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="p">);</span></div><div class='line' id='LC96'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="k">if</span><span class="p">(</span><span class="nv">$new_user</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">())</span></div><div class='line' id='LC97'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="p">{</span></div><div class='line' id='LC98'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">complete_login</span><span class="p">(</span><span class="nv">$new_user</span><span class="p">);</span></div><div class='line' id='LC99'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">))</span><span class="o">.</span><span class="s1">&#39;?saved&#39;</span><span class="p">);</span></div><div class='line' id='LC100'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="p">}</span></div><div class='line' id='LC101'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="nv">$errors</span><span class="p">[</span><span class="s2">&quot;register&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;No se pudo guardar el nuevo registro&quot;</span><span class="p">;</span></div><div class='line' id='LC102'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC103'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;register&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;El usuario </span><span class="si">{</span><span class="nv">$username</span><span class="si">}</span><span class="s2"> ya existe en la base de datos&quot;</span><span class="p">;</span></div><div class='line' id='LC104'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC105'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s1">&#39;backend/register&#39;</span><span class="p">)</span></div><div class='line' id='LC106'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;						<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;errors&#39;</span><span class="p">,</span><span class="nv">$errors</span><span class="p">)</span></div><div class='line' id='LC107'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;posturl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)))</span></div><div class='line' id='LC108'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;						<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;registerurl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;register&#39;</span><span class="p">)));</span>    </div><div class='line' id='LC109'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC110'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC111'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_logout</span><span class="p">()</span></div><div class='line' id='LC112'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC113'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">logout</span><span class="p">();</span></div><div class='line' id='LC114'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;backend&#39;</span><span class="p">,</span><span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="k">FALSE</span><span class="p">)));</span></div><div class='line' id='LC115'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC116'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC117'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">after</span><span class="p">()</span></div><div class='line' id='LC118'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC119'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span><span class="p">);</span></div><div class='line' id='LC120'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">after</span><span class="p">();</span></div><div class='line' id='LC121'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC122'><br/></div><div class='line' id='LC123'><span class="p">}</span> <span class="c1">// End Account</span></div><div class='line' id='LC124'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354245/dba5e427ce1e019cc23e6b64e9d3b643cae56b75/account.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354245#file_account.php" style="float:right;margin-right:10px;color:#666">account.php</a>
            <a href="https://gist.github.com/1354245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Como vemos este controlador, tenemos el método before que se ejecuta antes de cualquier &#8220;action&#8221; en donde establecemos el valor de algunas propiedades de la clase como la autenticación, la sesión y el modelo (entidad).</p>
<p>También le indico que si recibo el método action_index, en realidad ejecute el método action_login, que es el que hará el trabajo.</p>
<p>El método action_login, lo que hace es mostrar la vista login, la cual tiene esta estructura.</p>
<div id="gist-1359634" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="x">&lt;!DOCTYPE html&gt;</span></div><div class='line' id='LC2'><span class="x">&lt;html&gt;</span></div><div class='line' id='LC3'><span class="x">    &lt;head&gt;</span></div><div class='line' id='LC4'><span class="x">        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;</span></div><div class='line' id='LC5'><span class="x">        &lt;title&gt;&lt;/title&gt;</span></div><div class='line' id='LC6'><span class="x">    &lt;/head&gt;</span></div><div class='line' id='LC7'><span class="x">    &lt;body&gt;</span></div><div class='line' id='LC8'><span class="x">        &lt;div&gt;</span></div><div class='line' id='LC9'><span class="x">        &lt;h2&gt;Iniciar sesión&lt;/h2&gt;</span></div><div class='line' id='LC10'><span class="x">        </span><span class="cp">&lt;?php</span> <span class="k">if</span><span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]))</span><span class="o">:?&gt;</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">&lt;</span><span class="nx">p</span> <span class="nx">style</span><span class="o">=</span><span class="s2">&quot;border:#F00 1px solid;background:#dd0000;color:#fff;width:auto;&quot;</span><span class="o">&gt;</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	<span class="o">&lt;?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]</span> <span class="cp">?&gt;</span><span class="x"></span></div><div class='line' id='LC13'><span class="x">        &lt;/p&gt;</span></div><div class='line' id='LC14'><span class="x">        </span><span class="cp">&lt;?php</span> <span class="k">endif</span><span class="p">;</span> <span class="cp">?&gt;</span><span class="x"></span></div><div class='line' id='LC15'><span class="x">        &lt;form action=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$posturl</span> <span class="cp">?&gt;</span><span class="x">&quot; method=&quot;POST&quot;&gt;</span></div><div class='line' id='LC16'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC17'><span class="x">                &lt;label&gt;Usuario&lt;/label&gt;</span></div><div class='line' id='LC18'><span class="x">                &lt;input type=&quot;text&quot; value=&quot;&quot; name=&quot;username&quot; /&gt;</span></div><div class='line' id='LC19'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC20'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC21'><span class="x">                &lt;label&gt;Password&lt;/label&gt;</span></div><div class='line' id='LC22'><span class="x">                &lt;input type=&quot;password&quot; value=&quot;&quot; name=&quot;password&quot; /&gt;</span></div><div class='line' id='LC23'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC24'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC25'><span class="x">                &lt;input type=&quot;checkbox&quot; name=&quot;remember&quot; /&gt;</span></div><div class='line' id='LC26'><span class="x">                &lt;label&gt;Recordar password&lt;/label&gt;</span></div><div class='line' id='LC27'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC28'><span class="x">                &lt;input type=&quot;submit&quot; value=&quot;Iniciar sesión&quot; name=&quot;login&quot; &gt;            </span></div><div class='line' id='LC29'><span class="x">            &lt;/p&gt;            </span></div><div class='line' id='LC30'><span class="x">        &lt;/form&gt;</span></div><div class='line' id='LC31'><span class="x">        &lt;p&gt;</span></div><div class='line' id='LC32'><span class="x">            &lt;a href=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$registerurl</span> <span class="cp">?&gt;</span><span class="x">&quot;&gt;Registrarse&lt;/a&gt;</span></div><div class='line' id='LC33'><span class="x">        &lt;/p&gt;</span></div><div class='line' id='LC34'><span class="x">        &lt;/div&gt;</span></div><div class='line' id='LC35'><span class="x">    &lt;/body&gt;</span></div><div class='line' id='LC36'><span class="x">&lt;/html&gt;</span></div><div class='line' id='LC37'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1359634/bbb935e5e538abacee0014247829f98b7ce23eb9/login.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1359634#file_login.php" style="float:right;margin-right:10px;color:#666">login.php</a>
            <a href="https://gist.github.com/1359634">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Que como vemos, es un simple formulario.</p>
<p>En el mismo método action_index, tiene un if que comprueba si recibe una petición POST, si es así extraemos las variables usando Arr::get de kohana, también verificamos si existe la variable remember, la cual actúa como una FLAG, que en caso de ser verdadero lo usaremos para recordar los datos del usuario.</p>
<p>Aquí es donde ocurre, toda la &#8220;magia&#8221;, y haremos hincapié en esto.</p>
<p><strong> if($this->auth->login($username,$password,$remember)) </strong>:</p>
<p>Este código lo que hace es hacer el login, y el ultimo parámetro remember tiene la capacidad de generar el recordatorio del password.</p>
<p>Si el login es correcto, se creara un sesión y hará la lógica de asignación de variables del usuario a la sesión, posteriormente se redirecciona a el backend del sistema.</p>
<p>En caso de no hacer el login, tenemos anteriormente un array, que en este caso asignara a una clave llamada login, un mensaje de error., el cual se mostrara en la vista login.</p>
<p>También tenemos un método action_register, que posee, un formulario similar al de login, y que en este caso hace el registro de un usuario, usando el modelo users, el cual también hace validación de que no exista un usuario con el mismo nombre(obviamente la validación puede ser diferente).</p>
<p>Y también tenemos el método save_user que es encargado de hacer el insert del nuevo usuario, aquí vemos que usamos para el password, $auth->hash(), que es un método de A1, que lo estamos inyectando como dependencia (DI), y es importante usar este método ya que con esto generamos el password usando el algoritmo de cifrado que incluye A1, aunque lo podremos modificar, pero es indispensable convertir el password al guardarlo, al hacer el login no es necesario convertirlo A1 lo hace en automático.</p>
<div id="gist-1365997" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * </span></div><div class='line' id='LC4'><span class="sd"> * Model_Users </span></div><div class='line' id='LC5'><span class="sd"> * </span></div><div class='line' id='LC6'><span class="sd"> * Modelo/entidad de la tabla users</span></div><div class='line' id='LC7'><span class="sd"> * </span></div><div class='line' id='LC8'><span class="sd"> * @author Javier</span></div><div class='line' id='LC9'><span class="sd"> * @package backend</span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Model_Users</span> <span class="k">extends</span> <span class="nx">ORM</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>	<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">	 * </span></div><div class='line' id='LC15'><span class="sd">	 * Evitamos que convierta mi tabla a plural</span></div><div class='line' id='LC16'><span class="sd">	 * @var boolean $_table_names_plural</span></div><div class='line' id='LC17'><span class="sd">	 */</span></div><div class='line' id='LC18'>	<span class="k">protected</span> <span class="nv">$_table_names_plural</span> <span class="o">=</span> <span class="k">FALSE</span><span class="p">;</span></div><div class='line' id='LC19'><br/></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'>	<span class="sd">/**</span></div><div class='line' id='LC22'><span class="sd">	 * </span></div><div class='line' id='LC23'><span class="sd">	 * Comprueba que no exista en la base de datos(evita duplicados)</span></div><div class='line' id='LC24'><span class="sd">	 * @param String $username</span></div><div class='line' id='LC25'><span class="sd">	 * @return boolean </span></div><div class='line' id='LC26'><span class="sd">	 * </span></div><div class='line' id='LC27'><span class="sd">	 */</span></div><div class='line' id='LC28'>	<span class="k">public</span> <span class="k">function</span> <span class="nf">unique_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">)</span></div><div class='line' id='LC29'>	<span class="p">{</span></div><div class='line' id='LC30'>		<span class="nv">$user</span> <span class="o">=</span> <span class="nx">ORM</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_table_name</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">where</span><span class="p">(</span><span class="s1">&#39;email&#39;</span><span class="p">,</span><span class="s1">&#39;=&#39;</span><span class="p">,</span><span class="nv">$username</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">find</span><span class="p">();</span></div><div class='line' id='LC31'>		<span class="k">return</span> <span class="p">(</span><span class="nx">bool</span><span class="p">)</span> <span class="nv">$user</span><span class="o">-&gt;</span><span class="na">loaded</span><span class="p">();</span></div><div class='line' id='LC32'>	<span class="p">}</span></div><div class='line' id='LC33'><br/></div><div class='line' id='LC34'>	<span class="sd">/**</span></div><div class='line' id='LC35'><span class="sd">	 * </span></div><div class='line' id='LC36'><span class="sd">	 * Inserta un nuevo usuario</span></div><div class='line' id='LC37'><span class="sd">	 * @param String $username</span></div><div class='line' id='LC38'><span class="sd">	 * @param String $password</span></div><div class='line' id='LC39'><span class="sd">	 * @param A1 $auth</span></div><div class='line' id='LC40'><span class="sd">	 * @return Model_Users $user</span></div><div class='line' id='LC41'><span class="sd">	 * </span></div><div class='line' id='LC42'><span class="sd">	 */</span></div><div class='line' id='LC43'>	<span class="k">public</span> <span class="k">function</span> <span class="nf">save_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span> <span class="nv">$password</span><span class="p">,</span> <span class="nx">A1</span> <span class="nv">$auth</span><span class="p">)</span></div><div class='line' id='LC44'>	<span class="p">{</span></div><div class='line' id='LC45'>		<span class="nv">$user</span> <span class="o">=</span> <span class="nx">ORM</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_table_name</span><span class="p">);</span></div><div class='line' id='LC46'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">email</span> <span class="o">=</span> <span class="nv">$username</span><span class="p">;</span></div><div class='line' id='LC47'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="nv">$auth</span><span class="o">-&gt;</span><span class="na">hash</span><span class="p">(</span><span class="nv">$password</span><span class="p">);</span></div><div class='line' id='LC48'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">();</span></div><div class='line' id='LC49'>		<span class="k">return</span> <span class="nv">$user</span><span class="p">;</span></div><div class='line' id='LC50'>	<span class="p">}</span></div><div class='line' id='LC51'><br/></div><div class='line' id='LC52'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1365997/d2e9efff9ec24a7d04995956081ceceedeab69c5/users.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1365997#file_users.php" style="float:right;margin-right:10px;color:#666">users.php</a>
            <a href="https://gist.github.com/1365997">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Regresando al controlador, después de que el nuevo usuario se haya registrado, se redirecciona al login, si no simplemente avisa del error, mandando esta información, a la vista.</p>
<p>En el mismo controlador tenemos un método action_logout, que lo que hace es cerrar la sesión, y redireccionar, aquí creo que no hace falta mas explicación.</p>
<p>En el método after lo que hago es lanzar la vista a la pantalla usando $this->response->body</p>
<p>Quizá un poco larga la explicación pero es mejor que quede claro.</p>
<p>En resumen, creamos nuestro controlador que haga el login, y otro que cree las cuentas, usamos A1, para manejar el password, para registrar el usuario y para hacer el login, evitando volver a reescribir este proceso cada vez que necesitemos hacer un login.<br />
<strong><br />
Como nota adicional, verán en el controlador backend un método privado que se llama: _prevent_back(), este método evita que cuando hagamos logout, al dar clic en el botón atrás, no regrese a la sesión como si nunca hubiéramos salido por que esta cacheado, aunque realmente hayamos finalizado la sesión y no permita hacer nada. Estoy en contacto con el creador del modulo y mande la propuesta de agregar este control de cache al core del modulo, y la parecer en breve ya vendrá por default y ya no tendrán que agregar este método(sera configurable desde el archivo de configuración del modulo).</strong></p>
<p>Tambien me falto agregar que el campo de la base de datos para el password, debe de ser de al menos 70-80 caracteres, o más, por que las cadenas que genera A1, para los passwords son muy grandes, y si aumentan el cost en el config, aun seran mas grandes.</p>
<p>Aparte de los gists, dejo el proyecto en github, para que quien guste lo puede tomarlo y bajarlo:</p>
<p>Hasta el próximo post.</p>
<p>Github: <strong><a href="https://github.com/Ajaxman/kohana1" title="Implementación Kohana A1">kohana A1 implementación</a></strong>.<br />
Parche para usar A1 pero con <strong>sha1</strong> si necesidad de usar bcrypt: <a href="https://gist.github.com/1352205" title="Hack Kohana A1">https://gist.github.com/1352205</a><br />
Colocar el archivo del parche (a1.php) en application/classes/ y ahora sus password que generen o usen usaran sha1 y no brcypt con CRYPT_BLOWFISH</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Kohana PHP] EL QueryBuilder de Kohana PHP Parte I, Uso de DB::Query()</title>
		<link>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html</link>
		<comments>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html#comments</comments>
		<pubDate>Sat, 21 May 2011 01:22:48 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Kohana Framework]]></category>
		<category><![CDATA[QueryBuilder Kohana]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2109</guid>
		<description><![CDATA[<p>El framework Kohana PHP, aparte de poseer un interesante y muy completo ORM, tiene otra opción que nos permite mejorar nuestras consultas a la base de datos. Este se llama QueryBuilder, el cual como su nombre lo indica es un constructor de consultas. En el post anterior, comente como usar el ORM de kohana, el [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>El framework Kohana PHP, aparte de poseer un interesante y muy completo ORM, tiene otra opción que nos permite mejorar nuestras consultas a la base de datos.</p>
<p>Este se llama QueryBuilder, el cual como su nombre lo indica es un constructor de consultas.</p>
<p>En el post anterior, comente como usar el ORM de kohana, el cual como vemos nos ahorra mucho trabajo y nos permite hacer consultas complejas mediante el uso de la orientación a objetos, sin embargo no todo es tan maravilloso como suena, una de las cosas mas contraproducentes que tiene este y la mayoría de ORM&#8217;s es la siguiente.</p>
<p>Ejemplo de lo que sucede al hacer una consulta usando el ORM</p>
<p></p><pre class="crayon-plain-tag">//Consulta ORM
$result = ORM::factory('users')-&gt;find_all();

//Consulta generada
$sql = 'select * from users';</pre><p></p>
<p>Como vemos por default, nos esta haciendo un select *, esta consulta puede afectar seriamente nuestro rendimiento cuando nuestra tabla contiene muchos registro o muchos campos, además de que cuando tenemos tablas con un campo ambiguo, hacer funcionar bien el ORM puede darnos varios dolores de cabeza.</p>
<p>Los desarrolladores de kohana, antes de lanzar el ORM, crearon un constructor de consultas, el cual nos da toda la potencia de el lenguaje SQL, pero usando técnicas de orientación a objetos usando PHP.</p>
<p>Para usarla lo haremos configurando todo lo necesario como lo hicimos en el post anterior, y crearemos los querys de la siguiente forma.</p>
<p>* Uso de método estático DB::query()</p>
<p></p><pre class="crayon-plain-tag">//Sintaxis
$query = DB::query(integer $type,String $sql);</pre><p></p>
<p>Esta es una de las herramientas mas completas que tenemos dentro del QueryBuilder, básicamente es un método estático en donde recibe dos parámetros, el primero de tipo integer que en realidad es una constante de la clase Database, en donde le indicamos que tipo de consulta haremos( select, delete, insert, update), veamos su equivalencia.</p>
<p></p><pre class="crayon-plain-tag">Database::SELECT;&nbsp; // corresponde a 1
Database::INSERT;&nbsp; // corresponde a 2
Database::UPDATE;&nbsp; // corresponde a 3
Database::DELETE;&nbsp; // corresponde a 4</pre><p></p>
<p>El segundo parámetro es string donde indicamos la consulta que necesitemos hacer la cual puede incluir algunas variables las cuales estarán indicadas mediante dos puntos y el nombre de variable, el cual no tiene nada que ver con las variables de PHP, y posteriormente se le puede indicar el valor de dicha variable mediante el método param, parameters o bind.</p>
<p>Veamos como quedarí­a una consulta normal</p>
<p></p><pre class="crayon-plain-tag">$user = 'ajaxman';

//N&oacute;tese la variable :user

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user');

//Asignaci&oacute;n de la variable :user a variable PHP $user.

$query-&gt;param(':user',$user);

/***&nbsp; Ejemplo de como seria en modo normal de PHP y MySQL ***/

$query = 'SELECT id,username FROM users WHERE username = '.$user;</pre><p></p>
<p>Pero aun no tenemos terminada nuestra consulta, para que se ejecute debemos especificarlo explícitamente mediante el método execute.<br />
Veamos algunos ejemplos de como usar lo que hemos visto en un query complejo y algunas variantes de como hacer esto.</p>
<p><span id="more-2109"></span></p>
<p></p><pre class="crayon-plain-tag">//Declaraci&oacute;n de variables en hardcode, esto debe de ser de otra forma,
// dentro de una clase (Modelo) y un m&eacute;todo correspondiente
// Solo esta as&iacute; por que es ejemplo
$user = 'ajaxman';
$password = 'passworddificil001';

//Forma 1

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass');
$query-&gt;param(':user',$user);
$query-&gt;param(':pass',$password);
$query-&gt;execute();

//Forma 2
//Tambi&eacute;n podemos hacer el query de esta forma, y podemos usar la que mas nos guste

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass')
             -&gt;param(':user',$user);
             -&gt;param(':pass',$password);
             -&gt;execute();
//N&oacute;tese que son m&eacute;todos que se adhieren al mismo m&eacute;todo est&aacute;tico (luego veremos como usar esta t&eacute;cnica)
//ya que nos permite un c&oacute;digo mas claro

//Forma 3
//Los par&aacute;metros podemos pasarlos como un array,veamos el tercer ejemplo

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass')
$query-&gt;parameters(array(
               ':user' =&gt; $user,
               ':pass' =&gt; $pass,
));
$query-&gt;execute();

//Forma 4
//Esta forma es mediante el uso de el m&eacute;todo bind y es &uacute;til para hacer muchos inserts ya que se apoya de
//El uso de arrays, y foreach para hacer los inserts

$users =&nbsp; array(
    'ajaxman' =&gt; 'passworddificil002',
    'javier' =&gt; 'passworddificil003'
 );

$query = DB::query(Database::INSERT, 'INSERT INTO users (username, password) VALUES (:user, :pass)')
             -&gt;bind(':user', $username)
             -&gt;bind(':pass', $password);
foreach ($users as $username =&gt; $password)
{
     $query-&gt;execute();
}

//El ejemplo anterior vemos que con el foreach se esta ejecutando el query pero adem&aacute;s antes de ejecutarse reemplaza :user y :pass
//por cada uno de los elementos del array que definimos arriba</pre><p></p>
<p>Como vemos hay muchas formas de usar DB::query(), y podemos hacer la mayoría de consultas con este método estático.</p>
<p>Cuando empecé este post, pensaba abarcar otros métodos del QueryBuilder como DB::select, DB::expr, entre otros, sin embargo creo que se extendió demasiado este método, asi que esta sera la parte I, en la próxima parte veremos si acabo el post, si no de todas formas, ahí les aviso, de momento esperen la parte 2.</p>
<p>Toda esta información fue basada en mi experiencia con kohana y documentación de las siguientes API&#8217;s</p>
<p>API:<a title="Database" href="http://kohanaframework.org/3.1/guide/api/Database">Database</a><br />
API: <a title="Database_Query" href="http://kohanaframework.org/3.1/guide/api/Database_Query">Database_Query </a></p>
<p>Y la documentación de kohana framework (Version 3.1.x): <a title="Prepared Statements" href="http://kohanaframework.org/3.1/guide/database/query/prepared">Prepared Statements</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Javascript] simpleValidate Jquery Plugin</title>
		<link>http://www.ajaxman.net/javascript-simplevalidate-jquery-plugin.html</link>
		<comments>http://www.ajaxman.net/javascript-simplevalidate-jquery-plugin.html#comments</comments>
		<pubDate>Sat, 30 Apr 2011 05:02:40 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javier]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[simpleValidate]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2082</guid>
		<description><![CDATA[<p>Pues les cuento un preámbulo Una de las cosas que menos me gusta es estar repitiendo código (recordemos -DRY-) entonces, pues cuando deseaba validar un formulario siempre andaba buscando cual opción era la mejor, y hay muchas opciones y son excelentes en lo que hacen, sin embargo todas tenían un punto débil, por ejemplo que [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Pues les cuento un preámbulo</p>
<p>Una de las cosas que menos me gusta es estar repitiendo código (recordemos -DRY-) entonces, pues cuando deseaba validar un formulario siempre andaba buscando cual opción era la mejor, y hay muchas opciones y son excelentes en lo que hacen, sin embargo todas tenían un punto débil, por ejemplo que no soportaban ajax, es decir terminaban de validar y se seguían (enviaban el formulario), otros me mandaban mensajes de errores de validación en ciertos colores y en cierto lugar que si bien es correcto, a veces en muchos proyectos no va el estilo o simplemente quieren ponerle un alert o similar.</p>
<p>Bajo ese preámbulo y recordando que siempre quise hacer un validado de formularios con Javascript (hace años hice uno chafita con Javascript).</p>
<p>Entonces pensé por que no hacer uno que fuera muy simple de usar y que no fuera obtrusivo, y así fue como desarrolle simpleValidate que es un plugin el cual como su nombre lo dice solo es un validador de formularios y nada mas.</p>
<p>Les presento a<strong>:</strong></p>
<h3><strong>simpleValidate &#8211; Jquery Plugin</strong></h3>
<p>A continuación pongo las características.<br />
<strong><br />
</strong></p>
<ul>
<li><strong>Fácil de usar </strong></li>
<li><strong>Extremadamente Ligero 2kb (minifed)</strong></li>
<li><strong>Compatible con Jquery 1.5.2</strong></li>
<li><strong>No requiere CSS especial</strong></li>
<li><strong>No obtrusivo</strong></li>
<li><strong>Posibilidad de inyectar algún tipo de alert especial mediante sus settings</strong></li>
<li><strong>Completamente personalizable</strong></li>
<li><strong>Soporta expresiones regulares</strong></li>
<li><strong>Y valida checkboxes</strong></li>
</ul>
<p>Su uso es muy simple, solo necesitamos de Jquery y del plugin</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;script src=&amp;quot;jquery.1.5.2.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;script src=&amp;quot;simpleValidate.1.6.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;</pre><p></p>
<p>Y ejecutamos el plugin donde indicamos el id del Formulario en cuestión</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&amp;gt;
&amp;lt;html&amp;gt;
 &amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
 &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot;&amp;gt;
 &amp;lt;script src=&amp;quot;jquery.1.5.2.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;script src=&amp;quot;simpleValidate.1.6.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
 $(document).ready(function(){
    $(&amp;quot;#testForm&amp;quot;).simpleValidate();
 });

 &amp;lt;/script&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
 &amp;lt;form action=&amp;quot;try.php&amp;quot; method=&amp;quot;post&amp;quot; id=&amp;quot;testForm&amp;quot;&amp;gt;
 &amp;lt;label&amp;gt;Name&amp;lt;/label&amp;gt;
 &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot; title=&amp;quot;valid[Ingrese un nombre valido]&amp;quot; /&amp;gt;&amp;lt;hr /&amp;gt;
 &amp;lt;label&amp;gt;Ingrese una cantidad valida (tipo numero.decimal(2 digitos))&amp;lt;/label&amp;gt;
 &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;cantidad&amp;quot; title=&amp;quot;valid[regex,Por favor ingrese un numero con o sin decimales &uacute;nicamente]&amp;quot; data=&amp;quot;^([0-9]+.?[0-9]{0,2})$&amp;quot; /&amp;gt;&amp;lt;hr /&amp;gt;
 &amp;lt;label&amp;gt;Required&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&nbsp; name=&amp;quot;condiciones&amp;quot; value=&amp;quot;Required&amp;quot; title=&amp;quot;valid[Debes de aceptar los terminos y condiciones]&amp;quot;/&amp;gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Guardar datos&amp;quot;/&amp;gt;
 &amp;lt;/form&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;</pre><p></p>
<p>Y con esto ya tenemos funcionando el plugin ahora necesitamos indicarle cuales son los campos a validar lo haremos de la siguiente forma.</p>
<p>En cada input que necesitemos, vamos a agregar lo siguiente en el campo (input) que queramos validar</p>
<p><strong>title=&#8221;valid[tipo_de_validacion,{params,}]&#8220;</strong></p>
<p>Donde los tipos de validación son los siguientes:</p>
<ul>
<li><strong>valid[required,mensaje de error] </strong>==> Solo verifica que el campo tenga algún valor y el segundo parametro es lo que mostrara cuando no pase la validación</li>
<li><strong>valid[email,mensaje de error]</strong> => Valida que sea un email valido y si no muestra el mensaje del segundo parametro.</li>
<li><strong>valid[zip,mensaje de error]</strong> => Valida que sea un código postal valido (5 caracteres numéricos) y si no muestra el mensaje del segundo parámetro.</li>
<li><strong>valid[minlength,mensaje de error,numero_minimo]</strong> => Valida que el campo contenga un mínimo de caracteres indicado el el ultimo parámetro</li>
<li><strong>valid[maxlength,mensaje de error,numero_maximo]</strong> => Valida que el campo contenga un máximo de caracteres indicado el el ultimo parámetro</li>
<li><strong>valid[regex,mensaje de error] </strong>=> Este forma de validación necesita un parámetro data dentro del input donde venga especificada la expresión regular a validar y si no pasa lanza el error.</li>
<li><strong>valid[ensaje de error]</strong> =>Este solo es aplicable a los checkboxes y solo contiene como argumento el error que mostrara cuando el checkbox no este marcado<span id="more-2082"></span></li>
</ul>
<p>Los valores que se pueden personalizar dentro del plugin son los siguientes.</p>
<p></p><pre class="crayon-plain-tag">$(document).ready(function(){

   $(&amp;quot;#testForm&amp;quot;).simpleValidate({
     text: Array(&amp;quot;El campo&amp;quot;,&amp;quot; es obligatorio&amp;quot;),
     email: &amp;quot;Ingrese un email valido&amp;quot;,
     zip: &amp;quot;Ingrese un codigo postal valido&amp;quot;,
     min: Array(5,&amp;quot;Ingrese al menos &amp;quot;, &amp;quot;caracteres&amp;quot;),
     max: Array(10,&amp;quot;Ingrese maximo&amp;quot;, &amp;quot;caracteres&amp;quot;),
     checkmessage:'Es necesario marcar el campo',
     field: 'valid',
     msg: function(msg){
      alert(msg);
     }
   });

 });</pre><p></p>
<p>Donde</p>
<ul>
<li><strong>text</strong>: Es un array que contiene dos textos que mostrara en el error cuando un campo sea required de la forma (texto1+ nombre_campo+texto2)</li>
<li><strong>email</strong>: Es el error que mostrara cuando un email este invalido</li>
<li><strong>zip</strong>: Error cuando el codigo postal este mal</li>
<li><strong>min</strong>: array en donde viene el error a mostrar y el numero de elementos a validar por default</li>
<li><strong>max</strong>: array en donde viene el error a mostrar y el numero de elementos a validar por default</li>
<li><strong>checkmessage</strong>: Este es el mensaje que mostrara cuando se genere un error al no estar validado un checkbox</li>
<li><strong>field</strong>: es la clave para validar los campos, es decir cuando buscamos title=&#8221;valid[etc]&#8221; valid es el contenido del title del campo si le ponemos otro, podemos usar dentro de title lo que le hayamos puesto en esta opcion evitando asi posibles colisiones de palabras que esten usando otros plugins.</li>
<li><strong>msg</strong>: esta es una funcion, en donde solo estamos mandando un alert para mostrar el error, sin embargo si posees algun otro plugin como Sexyalertbox o similar puedes meterlos dentro de esta funcion asi cuando se lanza el error mostrara el cuadro de dialogo de la forma como deses (por ejemplo dentro de un Sexyalertbox).</li>
</ul>
<p>Es importante recalcar que estos parámetros son cambiados por los mensajes establecidos dentro del propio input, así que casi nunca se cambian estos valores.</p>
<p>Además el plugin recibe un parámetro mas el cual es una función anónima (según yo seria un closoure ), la cual se ejecutara cuando termine la validación, es decir si al terminar tu validación deseas que en vez de enviar el formulario normalmente, lo envié por XMLHttpRequest(aka Ajax), esta función al estar agregada hace que tu tomes la decisión de que hacer una vez terminada la validación y pasada obviamente.</p>
<p>Ejemplo complejo, usando JAlert para mostrar los errores (<a href="http://www.anieto2k.com/2008/12/31/jquery-alert-dialogs-reemplazo-para-alert-prompt-y-confirm/">http://www.anieto2k.com/2008/12/31/jquery-alert-dialogs-reemplazo-para-alert-prompt-y-confirm/</a>)</p>
<p></p><pre class="crayon-plain-tag">$(document).ready(function(){

   $(&amp;quot;#testForm&amp;quot;).simpleValidate(
     {
       msg: function(msg){
         jAlert(msg, 'Alert Dialog');
          }
     },
     function (){
       $.post('/account/',
              $(this).serialize(),
              function( Response ){
                 jAlert(&amp;quot;Sus datos se han enviado via Ajax&amp;quot;);
              });
     }
   );

 });</pre><p></p>
<p>El ejemplo anterior, hace una validación pero los mensaje de error los muestra de una forma diferente usando otro plugin (JAlert en este caso) además de eso al terminar la validación envía todos los datos del formulario por post usando ajax y cuando recibe respuesta manda un alert.</p>
<p>Como vemos es muy fácil, poderoso y practico de usar.</p>
<p>No se si me explique bien pero estar posteando por la noche da bastante sueño, ojala y les haya gustado mi plugin y sobre todo ojala y les sea útil.</p>
<p>Para bajarlo y ver las actualizaciones aquí dejo la información:</p>
<p>simpleValidate Version 1.6 Beta</p>
<p>GitHub: <a href="https://github.com/Ajaxman/simpleValidate">https://github.com/Ajaxman/simpleValidate</a> (Fork-ME =) )<br />
Plugins Jquery: <a href="http://plugins.jquery.com/project/simpleValidate">http://plugins.jquery.com/project/simpleValidate</a></p>
<p>Cualquier felicitación, duda, comentario, sugerencia, correción , Donación =), con gusto estoy para atenderla, la licencia es GPL =)</p>
<p>Hasta el próximo post</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/javascript-simplevalidate-jquery-plugin.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Programación] Ingeniería del Software</title>
		<link>http://www.ajaxman.net/programacion-ingenieria-del-software.html</link>
		<comments>http://www.ajaxman.net/programacion-ingenieria-del-software.html#comments</comments>
		<pubDate>Mon, 22 Nov 2010 03:07:27 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Ingeniería del Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2043</guid>
		<description><![CDATA[<p>Pues ya casi no tengo tiempo de escribir, tengo un par de posts en el tintero que no he podido terminar de escribir, es que últimamente ando estudiando bastante por que quiero saber mas jaja, pero bueno el propósito de este post no es quejarme si no platicarles de esto que hace poco me intereso. [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p><!-- p { margin-bottom: 0.21cm; } -->Pues ya casi no tengo tiempo de escribir, tengo un par de posts en el tintero que no he podido terminar de escribir, es que últimamente ando estudiando bastante por que quiero saber mas jaja, pero bueno el propósito de este post no es quejarme si no platicarles de esto que hace poco me intereso.</p>
<p>Resulta que via Twitter, me entere sobre una forma de programar mediante pruebas unitarias en PHP mediante <strong>PHPUnit</strong>, tenia rato que quería saber como hacer eso y creo que si le estoy entendiendo bien, de ahi aprendí que esto se llama <strong>TDD(Test-Driven Development) </strong>y bueno esto estará en otro post, la cuestión es que me intereso bastante, al final llegue hasta el tema de la ingeniería del software.</p>
<p>Si bien yo no soy ingeniero (Soy Técnico Profesional), me gusta bastante este tema, resulta que para ser un buen programador es muy bueno aprender a implementar la ingeniería del software en el desarrollo del mismo, para nuestro beneficio.</p>
<p>Si bien no es una técnica tipo AJAX o similar, es algo muy importante a considerar ya que aplicando esto no solo te dedicas a programar-codear un script, si no desarrollas una aplicación completa mediante ciertos pasos bien definidos.</p>
<p>Etapas del proceso de la implementación de la Ingeniería del Software.</p>
<ul>
<li>Análisis de requerimientos</li>
<li>Especificación</li>
<li>Arquitectura del Software</li>
<li>Programación</li>
<li>Prueba</li>
<li>Documentación</li>
<li>Mantenimiento</li>
</ul>
<p>Además de lo anterior también hay varios modelos ó paradigmas para implementar dicha Ingeniería del Software, algunos de los mas usados son los siguientes.<span id="more-2043"></span></p>
<ul>
<li>Modelo en cascada o Clásico (modelo tradicional)</li>
<li>Modelo de prototipos</li>
<li>Modelo en espiral (modelo evolutivo)</li>
<li>Desarrollo por etapas</li>
<li>Desarrollo iterativo y creciente o Iterativo e Incremental</li>
<li>RAD (Rapid Application Development)</li>
<li>Desarrollo concurrente</li>
<li>Proceso Unificado</li>
<li>RUP (Proceso Unificado de Rational)</li>
</ul>
<p>Claro dirán y todo esto para me sirve, pues para que programes mucho mejor, ya que usando todo esto, como mencione anteriormente no solo escribirás código, si no lo que haces serán soluciones completas, documentadas y seguras, además de que podrás usar los patrones de diseño para optimizar tu código, y bueno muchas cosas de este tipo.</p>
<p>Como verán no soy un experto en esto de la Ingeniería del Software, pero el propósito de este post era darles un preámbulo sobre este tema el cual como mencione se me hace muy interesante y creo que al implementarlo cuando usamos PHP podrá beneficiarnos a nosotros como programadores, a los clientes y a los jefes, bueno en general a todos, como dije antes tiene muchas ventajas.</p>
<p>Espero pronto sacar algún otro post sobre PHP y TDD</p>
<p>Mas información sobre esto en la Wikipedia | <a href="http://es.wikipedia.org/wiki/Ingenier%C3%ADa_del_software">Ingeniería de software</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/programacion-ingenieria-del-software.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Manual-PHP] Creando un proyecto MVC con Framework Kohana PHP parte III</title>
		<link>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-iii.html</link>
		<comments>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-iii.html#comments</comments>
		<pubDate>Tue, 31 Aug 2010 11:58:31 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[KohanaPHP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Vistas]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2025</guid>
		<description><![CDATA[<p>Usando Vistas y variables en Kohana PHP Framework Cuando trabajamos con el framework Kohana PHP, una parte muy importante son las vistas, ya que son unos de los pilares del MVC, el cual es altamente utilizado por el framework. Las vistas son archivos con extensión .php las cuales están pensadas para mostrar contenido, y también [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<h3><strong>Usando Vistas y variables en Kohana PHP Framework</strong></h3>
<p>Cuando trabajamos con el framework Kohana PHP, una parte muy importante son las vistas, ya que son unos de los pilares del MVC, el cual es altamente utilizado por el framework.<br />
<strong><br />
Las vistas son archivos con extensión .php las cuales están pensadas para mostrar contenido, y también existe un modulo que nos permite utilizar plantillas smarty, pero hoy no tocaremos ese tema, estos archivos estarán alojados en ruta_de_instalacion_/application/views/ y pueden contener código Php, aunque la idea es de que dicho código sea lo más pequeño  y simple posible, y sea solo para mostrar resultados por ejemplo de una consulta.</strong></p>
<p>Como vimos en <a href="http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-ii.html">la segunda entrega de este manual</a>, para mostrar algo es imprescindible usar una vista, he invocarla desde nuestro controlador, mediante el método estatico View::factory.</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct script access.');

class Controller_Tienda extends Controller {

 public function action_index()
 {

 $vista = View::factory('template');
 $this-&gt;request-&gt;response = $vista;

 }

} // End Tienda</pre><p></p>
<p>Ahora bien como es de suponerse, podemos enviar datos a nuestra vista para poder mostrarlos en ella, esto nos sirve para por ejemplo enviar un array a nuestra vista y recórrelo para mostrar algún resultado de una consulta.</p>
<p>Hay varias formas de enviar datos a nuestra vista, veamos cuales son:<br />
<strong><br />
Mediante Bind o Set</strong>, de esta forma podemos pasar una variable, sin importar su valor a nuestra vista y puede ser un string, entero, un array o un objeto y se encadena a nuestro método estático de View::factory, cabe señalar que la única diferencia entre bind y set es que bind asigna la variable por referencia, en lo personal casi no la uso, ya que set satisface mis tareas.</p>
<p>La otra opción es mediante variables globales y para ellos se pueden utilizar dos métodos estáticos (uno se usa como set y otro como bind), los cuales son <strong>View::set_global y View::bind_global</strong>, la diferencia con las dos formas anteriores es que con estos métodos se crean variables globales que pueden ser usadas por cualquier vista, sin tener que especificar alguna vista en especifico.</p>
<p>Ahora veamos cómo usarlas, como nota, solo voy a mostrar set, ya que como indique no he usado ni he necesitado usar bind, si quieren ver el funcionamiento de bien, simplemente reemplazan set por bien y listo XD.</p>
<p>Usando método set.</p>
<p>controlador.php</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct script access.');

class Controller_Tienda extends Controller {

 public function action_index()
 {

 $user = 'Ajaxman';
 $vista = View::factory('template')-&gt;set('username',$user);// Asignamos $user a una nueva variable $username;
 /* tambien podemos enviar muchas de la siguiente forma
 *
 * $vista = View::factory('template')
 -&gt;set('username',$user)
 -&gt;set('edad','18 A&ntilde;os')
 -&gt;set('pais','mexico'); Y asi podemos seguir enviando mas variables a dicha vista
 */

 $this-&gt;request-&gt;response = $vista;
 }

} // End Tienda</pre><p></p>
<p>Vista template.php</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;

&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Vista para Kohana PHP&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Bienvenido &amp;lt;?php echo $username; ?&amp;gt;&amp;lt;h1&amp;gt;
 &amp;lt;p&amp;gt;Hola esta es una vista para Kohana PHP&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;</pre><p></p>
<p>Lo anterior mostraría Bienvenido Ajaxman, y de esta forma pueden mandar un array o un objeto(resultado de una consulta), recórrelo mediante foreach y mostrar el resultado del mismo.</p>
<p>Ahora bien para las variables globales solo hay que definirlas con el siguiente método estático y podemos usarlas en cualquier vista que carguemos.<br />
<strong><br />
Y algo que se me olvidaba pero igual es muy importante el método estático View::factory se puede usar también dentro de la vista, pero debemos usar un método render para que se envié la salida en pantalla, en el código que sigue veremos cómo usarlo.</strong></p>
<p>controlador.php</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct script access.');

class Controller_Tienda extends Controller {

 public function action_index()
 {

 $user = 'Ajaxman';

 View::set_global('titulo','Bienvenido '.$user);
 View::set_global('keywords','Php,Kohana,Framework, prueba');

 $vista = View::factory('template'); //Notese que no enviamos nada ya que son variables globales

 $this-&gt;request-&gt;response = $vista;
 }

} // End Tienda</pre><p></p>
<p><span id="more-2025"></span></p>
<p>Vista template.php</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;

&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;&amp;lt;php echo $titulo; ?&amp;gt;&amp;lt;/title&amp;gt;
 &amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;&amp;lt;?php echo $keywords; ?&amp;gt;&amp;quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
 &amp;lt;div&amp;gt;
 &amp;lt;?php echo View::factory(&amp;quot;head_display&amp;quot;)-&gt;render();?&amp;gt;
 &amp;lt;!-- Con lo anterior estamos invocando a una vista --&gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;</pre><p></p>
<p>Vista header_display.php</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;h1&amp;gt;&amp;lt;?php echo $titulo; ?&amp;gt; &amp;lt;/h1&amp;gt;
&amp;lt;a href=&amp;quot;/logout&amp;quot;&amp;gt;Cerrar sesi&oacute;n&amp;lt;/a&amp;gt;</pre><p></p>
<p>Y listo con esto ya estaríamos trabajando con las vistas, ya saben si tienen dudas pueden dejar un comentario, si me tardo en responder no se alteren es que a veces ando muy ocupado, pero siempre respondo.</p>
<p>En la siguiente entrega veremos más a fondo los ORMS para después hacer un ejemplo ya útil con todo lo aprendido.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-iii.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[PHP - Senior] Usando los métodos magicos __construct y __destruct en PHP</title>
		<link>http://www.ajaxman.net/php-senior-usando-los-metodos-magicos-__construct-y-__destruct-en-php.html</link>
		<comments>http://www.ajaxman.net/php-senior-usando-los-metodos-magicos-__construct-y-__destruct-en-php.html#comments</comments>
		<pubDate>Thu, 05 Aug 2010 19:05:00 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[PHP 5 Certificación]]></category>
		<category><![CDATA[Php5]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1987</guid>
		<description><![CDATA[<p>En PHP 5 se incluyeron varios métodos mágicos como __construct y __destruct a las clases los cuales no facilitan la forma de programar. Y bien si no sabes que son estos métodos, aquí los veremos para que te des una idea de como usarlos y para que sirven. Imaginemos el siguiente código que nos servirá [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>En PHP 5 se incluyeron varios métodos mágicos como <strong>__construct y __destruct</strong> a las clases los cuales no facilitan la forma de programar.</p>
<p>Y bien si no sabes que son estos métodos, aquí los veremos para que te des una idea de como usarlos y para que sirven.</p>
<p>Imaginemos el siguiente código que nos servirá para mostrar los datos de un usuario</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
class User {
  private $name;
  private $link;
  private $pais;

  public function setData($name = '', $link = '', $pais = '')
  {
    $this-&gt;name = $name;
    $this-&gt;link = $link;
    $this-&gt;pais = $pais;
  }

  public function getData()
  {
    echo &amp;quot;Nombre::&amp;quot;.$this-&gt;name.&amp;quot;n&amp;quot;;
    echo &amp;quot;Link::&amp;quot;.$this-&gt;link.&amp;quot;n&amp;quot;;
    echo &amp;quot;Pais::&amp;quot;.$this-&gt;pais.&amp;quot;n&amp;quot;;
  }
}

$user = new User();
$user-&gt;setData('Ajaxman','http://www.ajaxman.net','Mexico'); // Lease User,Link,Pais
$user-&gt;getData();
?&amp;gt;</pre><p></p>
<p>Hasta ahí todo bien,sin embargo si vemos el código notamos que tenemos el método setData unicamente para asignar datos, esto se podría hacer de esta forma</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
$user = new User('Ajaxman','http://www.ajaxman.net','Mexico');// Lease User,Link,Pais
$user-&gt;getData();
?&amp;gt;</pre><p></p>
<p>Y si queremos que funcione simplemente hay que llamar a un método igual que el nombre d e la clase de la siguiente forma.</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
class User {
  private $name;
  private $link;
  private $pais;

  public function User($name = '', $link = '', $pais = '')
  {
    $this-&gt;name = $name;
    $this-&gt;link = $link;
    $this-&gt;pais = $pais;
  }

  public function getData()
  {
    echo &amp;quot;Nombre::&amp;quot;.$this-&gt;name.&amp;quot;n&amp;quot;;
    echo &amp;quot;Link::&amp;quot;.$this-&gt;link.&amp;quot;n&amp;quot;;
    echo &amp;quot;Pais::&amp;quot;.$this-&gt;pais.&amp;quot;n&amp;quot;;
  }
}

?&amp;gt;</pre><p></p>
<p>Ahora bien, desde que surgió PHP5 se puede usar métodos mágicos, uno de ellos es <strong>__construct</strong> el cual se ejecuta cuando se inicia la carga de la clase, la ventaja es que siempre se debe de llamar así y no tendrás que estar poniendo métodos con el mismo nombre de la clase y quedaría así.<span id="more-1987"></span></p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
class User {
  private $name;
  private $link;
  private $pais;
public function __construct($name = '', $link = '', $pais = '')
  {
    $this-&gt;name = $name;
    $this-&gt;link = $link;
    $this-&gt;pais = $pais;
  }

  public function getData()
  {
    echo &amp;quot;Nombre::&amp;quot;.$this-&gt;name.&amp;quot;n&amp;quot;;
    echo &amp;quot;Link::&amp;quot;.$this-&gt;link.&amp;quot;n&amp;quot;;
    echo &amp;quot;Pais::&amp;quot;.$this-&gt;pais.&amp;quot;n&amp;quot;;
  }
}
?&amp;gt;</pre><p></p>
<p>Se podría decir que tiene poca utilidad, sin embargo en diversas ocasiones verán que usar el método __construct les resolverá mucho problemas.</p>
<p><strong>Recuerden __construct se ejecuta automáticamente al instancia la clase, osea $obj = new Class();, si recuerdan los métodos estáticos, en el post anterior, recordaran que nunca se instancia, por lo cual no funciona en los métodos estáticos.</strong></p>
<p>El otro método se llama __destruct y funciona a la inversa, se ejecuta cuando se termina la clase, y este puede usarse para destruir variables o valores que ya no vayamos a usar.</p>
<p>Personalmente yo no había usado nunca __destruct(), hasta hace un par de días cuando debía hacer lo siguiente.</p>
<p>Movimos un website montado en Joomla a otro server y no funcionaba una lista de noticias, todo estaba bien, entonces revise el código y quise hacer un debug, pensé en usar un var_dump(); pero no funciono, entonces se me ocurrió que para evaluar esa variable debía usar __destruct() ya que se ejecuta cuando termina la clase, así que no debería de haber problemas y efectivamente todo funciono bien y pude depurar mis variables.</p>
<p>Claro es un uso que le encontré, pero puede haber muchos mas, creo que me extendí bastante, pero es para dar una idea a personas que no saben aun que onda con los métodos constructores y destructores de la clase.</p>
<p>Nota: Nos vemos el el Campus Party México 2010</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-senior-usando-los-metodos-magicos-__construct-y-__destruct-en-php.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[PHP] Métodos estáticos en PHP</title>
		<link>http://www.ajaxman.net/php-metodos-estaticos-en-php.html</link>
		<comments>http://www.ajaxman.net/php-metodos-estaticos-en-php.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 21:28:32 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Metodos]]></category>
		<category><![CDATA[Metodos Estaticos]]></category>
		<category><![CDATA[Php 5]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1977</guid>
		<description><![CDATA[<p>Este es un post de PHP, ya que si bien es lo que mejor manejo y ademas de que casi no hay posts de PHP en mi blog. Bien empecemos por el principio. Cuando estamos programando a veces no deseamos estar instanciando una clase, ya que puede que el método sea algo que simplemente devuelva [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Este es un post de PHP, ya que si bien es lo que mejor manejo y ademas de que casi no hay posts de PHP en mi blog.</p>
<p>Bien empecemos por el principio.</p>
<p>Cuando estamos programando a veces no deseamos estar instanciando una clase, ya que puede que el método sea algo que simplemente devuelva algún valor, por ejemplo un parser o similar, entonces se vuelve tedioso estar haciendo, $obj =new Clase();, la solución para esto es usar un método estático.</p>
<p>Los métodos estáticos no necesitan ser instanciandos ademas de que son ligeramente mas rápido que los métodos normales, si bien esto no significa que debamos de dejar de usar los métodos normales, estos pueden ser muy útiles para hacer por ejemplo una especie de catalogo de funciones, aunque claro su uso depende de cada quien.</p>
<p>Veamos una clase con un método normal y posteriormente como seria si fuera estático.</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
 //Clase
class Tools{
  /// Metodo normal
  public function today($paramString = '')
  {
    setlocale(LC_ALL,'es_MX');
    $date = $paramString.utf8_encode(strftime(&amp;quot;%A %d de %B del %Y&amp;quot;));
    return $date;
  }
}
$Helps = new Tools();
echo $Helps-&gt;today(&amp;quot;Hoy es &amp;quot;); //Salida  Hoy es jueves 29 de julio del 2010
?&amp;gt;</pre><p></p>
<p>Ahora veamos como se haría usando un método estático</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
 //Clase
class Tools{

 /// Metodo estatico
 public static function today($paramString = '')
 {
   setlocale(LC_ALL,'es_MX');
   $date = $paramString.utf8_encode(strftime(&amp;quot;%A %d de %B del %Y&amp;quot;));
   return $date;
 }
}

echo Tools::today(&amp;quot;Hoy es &amp;quot;); //Salida  Hoy es jueves 29 de julio del 2010

?&amp;gt;</pre><p></p>
<p>Como podemos ver es mas simple llamarlo, claro que como menciono hay algunas cosas a tener en cuenta, las mas importantes son:</p>
<ul>
<li> <strong>No existen los métodos &#8220;mágicos&#8221; __construct ni __destruct, puesto que jamas se instancia la clase, en su lugar se puede invocar otro método estático que asigne, las variables</strong></li>
<li><strong>No existe $this, se debe usar en su lugar self, aunque las variables tienen que ser igualmente estáticas, esto se aplica tanto en variables como métodos</strong></li>
</ul>
<p>Haremos un ejemplo un poco mas complejo para ver como usar self en vez de <strong>this</strong></p>
<p><strong><span id="more-1977"></span><br />
</strong></p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
/**
*
* Nota
* Este ejemplo funciona solo deben de copiar y pegar el codigo para probar
*/

 //Clase
class Tools
{
 /// Variable estatica
 public static $pais = 'Mexico';

 //Metodo estatico
 public static function setPais($pais = 'Mexico')
 {
   //Set de el pais
   /**
   * Notese la sintaxis self::$Variable
   */
   self::$pais = $pais;
 }

 /// Metodo estatico
 public static function today($paramString = '',$pais=FALSE)
 {
   setlocale(LC_ALL,'es_MX');
   $date = $paramString.utf8_encode(strftime(&amp;quot;%A %d de %B del %Y&amp;quot;));
   if($pais != FALSE)
   {
   $date .= ' en '.self::$pais; //Notese la forma de obtener la variable
   }
   return $date;
 }
}

echo Tools::$pais; //Salida Mexico
Tools::setPais('Brasil');
echo Tools::$pais; //Salida Brasil
echo Tools::today(&amp;quot;Hoy es &amp;quot;); //Salida  Hoy es jueves 29 de julio del 2010

Tools::$pais = 'Canada'; //Nota tambien es posible asignar valores de esta forma

echo Tools::today(&amp;quot;Hoy es &amp;quot;,TRUE); //Salida Hoy es jueves 29 de julio del 2010 en Canda

?&amp;gt;</pre><p></p>
<p>Con ello podríamos resumir que <strong>this es similar a self</strong> solo que hay que tratarlo con cuidado, y usar lo siguiente cuando se intenta invocar esto desde nuestra clase:</p>
<ul>
<li><strong>self::$var en vez de $this->var</strong></li>
<li><strong>self::function() en vez de $this->function()</strong></li>
</ul>
<p>Bueno creo que me excedí un poco con este post, pero lo importante es que creo que si quedado claro, dudas ya saben a en lo comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-metodos-estaticos-en-php.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Manual-PHP] Creando un proyecto MVC con Framework Kohana PHP  parte I</title>
		<link>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-i.html</link>
		<comments>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-i.html#comments</comments>
		<pubDate>Tue, 22 Jun 2010 22:14:46 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[KohanaPHP]]></category>
		<category><![CDATA[Manual]]></category>
		<category><![CDATA[Php5]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1959</guid>
		<description><![CDATA[<p>Hagamos un ejemplo muy bien explicado sobre cómo usar el Framework Kohana PHP con MVC usando ORM entre otras cosas, para que vean para que sirve y todo lo que pueden hacer con el Ya sabemos cómo instalarlo ahora procedamos a trabajar. Como ejemplo haremos una aplicación que liste productos, maneje altas y bajas de [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Hagamos un ejemplo muy bien explicado sobre cómo usar el Framework Kohana PHP con MVC usando ORM entre otras cosas, para que vean para que sirve y todo lo que pueden hacer con el</p>
<p>Ya sabemos cómo instalarlo ahora procedamos a trabajar.</p>
<p>Como ejemplo haremos una aplicación que liste productos, maneje altas y bajas de una tienda con un Front-End y un Back-End.</p>
<p>Para empezar necesitamos lo siguiente</p>
<p>*Requisitos</p>
<ul>
<li><strong>Apache (ModRewrite instalado)</strong></li>
<li><strong> PHP 5.2</strong></li>
<li><strong> MySQL</strong></li>
<li><strong> Kohana 3 Framework</strong></li>
</ul>
<p>*Opcionales</p>
<ul>
<li><strong>SQlFront</strong></li>
<li><strong> Phpmyadmin</strong></li>
<li><strong> Editor de código como Webuilder (Luego veremos cómo hacer casi lo mismo con Netbeans un IDE completo)</strong></li>
</ul>
<p>Haremos una nueva instalación de Kohana, en nuestra PC que será nuestro servidor (localhost) copiamos el contenido del framework a una carpeta que se llame tienda (en mi caso <strong>E:/www/tienda/</strong>)</p>
<p><strong>Y acceso a mi website escribiendo http://localhost/tienda/  y ahí veremos nuestro install ahora navegamos hasta  E:/www/tienda/ y ahí estará ese archivo, lo borramos (si todo salió ok, si no corregir y verificar hasta que todo este en verde)</strong></p>
<p>Esta vez vamos empezar por los datos para que al final hagamos el website.<br />
Necesitamos una tabla de productos usaremos el siguiente SQL con los datos básicos de cada producto.</p>
<p>Como regla general hay que tener en cuenta que la base de datos debe de tener las siguientes características:</p>
<ul>
<li><strong>Nombre de la tabla en Plural (&#8220;productos&#8221;)</strong></li>
<li><strong> Nombre de los campos en Singular (&#8220;descripción&#8221;)</strong></li>
<li><strong> La clave principal se llamara id, en minúsculas (Se puede poner otra cosa pero habría que editar nuestra clase que manejara esa tabla por ello lo dejaremos como id)</strong></li>
</ul>
<p></p><pre class="crayon-plain-tag">CREATE TABLE &lt;code&gt;productos&lt;/code&gt; (
 &lt;code&gt;id&lt;/code&gt; int(11) NOT NULL AUTO_INCREMENT,
 &lt;code&gt;nombre&lt;/code&gt; varchar(255) DEFAULT NULL,
 &lt;code&gt;descripcion&lt;/code&gt; text,
 &lt;code&gt;activo&lt;/code&gt; int(1) DEFAULT '1',
 PRIMARY KEY (&lt;code&gt;id&lt;/code&gt;)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;</pre><p></p>
<p>Agregamos el siguiente contenido</p><pre class="crayon-plain-tag">INSERT INTO &lt;code&gt;productos&lt;/code&gt; VALUES (1,'Agua Debian','Agua Embotellada 1 Lts Marca Debian',1);
INSERT INTO &lt;code&gt;productos&lt;/code&gt; VALUES (2,'Refresco Php','Refresco 2 Lts Marca Php Sabor Uva',1);
INSERT INTO &lt;code&gt;productos&lt;/code&gt; VALUES (3,'Paleta Ubuntu','Paleta Ubuntu sabor Cafe 1pza',1);</pre><p></p>
<p>Ahora editaremos nuestro bootstrap   (<strong>E:/www/tienda/application/bootstrap.php</strong>)<br />
Buscaremos el configuración del init y escribiremos los siguiente</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
//...
//...
Kohana::init(array(
 'base_url'&nbsp;&nbsp; =&gt; 'http://localhost/tienda/',//Aqui le decimos cual ser&aacute; la url del proyecto
 'index_file' =&gt; FALSE, //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Le indicamos que usara urls amigables (sin .php)
));
...
...
//Buscaremos el Route en el mismo script y lo editaremos
..
...
Route::set('default', '(&amp;lt;controller&amp;gt;(/&amp;lt;action&amp;gt;(/&amp;lt;id&amp;gt;)))')
 -&gt;defaults(array(
 'controller' =&gt; 'tienda',&nbsp; //Nombre del controlador por default
 'action'&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'index',&nbsp;&nbsp; //Acci&oacute;n por default (lo dejamos en index)
 ));</pre><p></p>
<p>Lo guardamos (:wq XD ) y vamos a ver que en la raíz del proyecto hay una archivo llamado example.htaccess lo renombramos a .htaccess que será el que manejara las urls amigables para no tener el tienda/index.php/controlador ser tienda/controlador.</p>
<p>Les recomiendo comentar la siguiente línea para no tener problemas en las direcciones</p><pre class="crayon-plain-tag"># Installation directory
#RewriteBase /kohana/ pueden poner /tienda y va a funcionar pero es mejor quitarla
# ya que con ello evitaremos problemas cuando estemos cambiando de un servidor local
# a un servidor de producci&oacute;n</pre><p></p>
<p>Lo guardamos (:wq XD )  Y ahora vayamos a crear nuestro controlador.</p>
<p>Entramos a E:/www/tienda/application/classes/controller y creamos tienda.php<br />
Y creamos nuestro controlador</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct script access.');

class Controller_Tienda extends Controller {
/**
 * Controller_Tienda Es el controlador por default recuerden el bootstrap
 * todos los controladores llevan esta sintaxis, Controller_&amp;lt;Nombre_del_controlador&amp;gt;
 *
 *&nbsp; action_index() Es la acci&oacute;n por default (ejemplo http://localhost/tienda/accion)
 *&nbsp; si no se especifica en la url (ejemplo http://localhost/tienda/accion, se usara
 *&nbsp; index por default y la sintaxis es action_&amp;lt;nombre_de_la_accion&amp;gt;
 */
 public function action_index()
 {
 echo &amp;quot;Programando ....&amp;quot;;
 }

} // End Tienda</pre><p></p>
<p>Lo guardamos (:wq XD ) y naveguemos a http://localhost/tienda/ veremos que dirá &#8220;Programando &#8230;.&#8221;, si no vemos eso es que algo hicimos mal y hay que volver a ver en donde nos fallo</p>
<p>Ahora bien, procederemos a conectar la base de datos, para ello vamos a editar el archivo de configuración de la base de datos E:/www/tienda/modules/database/config/database.php</p>
<p>Y agregaremos la conexión mysql, pueden usar PDO(pero prefiero hacerlo como ejemplo de forma tradicional)</p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct access allowed.');

return array
(
 'default' =&gt; array
 (
 'type'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'mysql',
 'connection' =&gt; array(
 /**
 * The following options are available for MySQL:
 *
 * string&nbsp;&nbsp; hostname
 * string&nbsp;&nbsp; username
 * string&nbsp;&nbsp; password
 * boolean&nbsp; persistent
 * string&nbsp;&nbsp; database
 *
 * Ports and sockets may be appended to the hostname.
 */
 'hostname'&nbsp;&nbsp; =&gt; 'localhost',&nbsp; ////Usa los datos de tu conexi&oacute;n MYSQL
 'username'&nbsp;&nbsp; =&gt; &amp;quot;root&amp;quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ////Usa los datos de tu conexi&oacute;n MYSQL
 'password'&nbsp;&nbsp; =&gt; &amp;quot;localhost&amp;quot;,&nbsp; ////Usa los datos de tu conexi&oacute;n MYSQL
 'persistent' =&gt; FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ////Opcional
 'database'&nbsp;&nbsp; =&gt; 'kh_tienda',&nbsp; ////Usa los datos de tu conexi&oacute;n MYSQL
 ),
 'table_prefix' =&gt; '',
 'charset'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'utf8',
 'caching'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; FALSE,
 'profiling'&nbsp;&nbsp;&nbsp; =&gt; TRUE,
 ),
 //Aqu&iacute; contin&uacute;a con el PDO, ese de momento no hay que tocarlo
 //..
 //....
 //......
)</pre><p></p>
<p>Ahora que ya lo tenemos vamos a decirle a kohana que agregue los módulos de base de datos y orm, necesarios para que funcione nuestro ejemplo, para ello hay que editar otra vez nuestro archivo bootstrap ya descomentar los módulos de manera que quede así.</p>
<p><span id="more-1959"></span></p><pre class="crayon-plain-tag">&amp;lt;?php
//..
//....
/**
 * Enable modules. Modules are referenced by a relative or absolute path.
 */
Kohana::modules(array(
 // 'auth'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; MODPATH.'auth',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Basic authentication
 //'cache'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; MODPATH.'cache',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Caching with multiple backends
 // 'codebench'&nbsp; =&gt; MODPATH.'codebench',&nbsp; // Benchmarking tool
 'database'&nbsp;&nbsp; =&gt; MODPATH.'database',&nbsp;&nbsp; // Database access
 // 'image'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; MODPATH.'image',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Image manipulation
 'orm'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; MODPATH.'orm',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Object Relationship Mapping
 // 'pagination' =&gt; MODPATH.'pagination', // Paging of results
 // 'userguide'&nbsp; =&gt; MODPATH.'userguide',&nbsp; // User guide and API documentation
 ));</pre><p></p>
<p>Lo guardamos y ahora hay que agregar el Modelo ORM que manejara la base de datos, para ello hay que crear un archivo llamado con el mismo nombre de nuestra tabla,</p>
<p>En E:/www/tienda/application/classes/model hay que agregar el modelo productos.php si no existe esta carpeta model hay que crearla.</p>
<p>En el modelo agregaremos el siguiente contenido</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php defined('SYSPATH') or die('No direct script access.');
/**
 * Description of Model_Productos
 *
 * @author Javier
 */
 //// Importante el nombre de nuestra&nbsp; clase debe de llevar la siguiente sintaxis
 ////&nbsp; Model_&amp;lt;Nombre_de_la_tabla&amp;gt;

class Model_Productos extends ORM {

 protected $_table_names_plural = false;
 /// Ojo con esto este campo es true por default pero hace que Kohana maneje a su gusto
 /// Los nombres de la tablas agreg&aacute;ndole &amp;quot;s&amp;quot; o &amp;quot;es&amp;quot; a las mismas
 /// Es decir trata de pluralizar el nombre autom&aacute;ticamente, puede que sea muy &uacute;til
 /// Pero en lo personal no me gusta prefiero yo usar lo nombres a mi gusto
 /// Por ello con esta indicaci&oacute;n le decimos a kohana:
 /// &amp;quot;Deja el nombre de la tabla como se llama la clase y no le hagas cambios&amp;quot;


}</pre><p></p>
<p>Y bien ya casi terminamos, ahora hagamos una prueba para ver si todo ha salido bien.</p>
<p>Vayamos a nuestro controlador y agreguemos el siguiente código</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
 //..
 //.....
 public function action_index()
 {
 //echo &amp;quot;Programando ....&amp;quot;;
 $productos = ORM::factory('productos')-&gt;find_all();
 foreach($productos as $producto)
 {
 echo &amp;quot;[[Producto=&amp;quot;.$producto-&gt;descripcion.&amp;quot;]]&amp;quot;;
 }

 }</pre><p></p>
<p>Ojo no es MVC todavía pero es para pruebas, expliquemos el código:<br />
Para hacer una consulta al ORM, usaremos el siguiente código (se puede de varias formas, esta es la mas fácil)<br />
<strong>$productos = ORM::factory(&#8216;&lt;Nombre_del_Modelo&gt;&#8217;)->otros_metodos()</strong><br />
Donde</p>
<ul>
<li><strong>$productos: es la variable donde se almacenara nuestro contenido de la consulta</strong></li>
<li><strong> ORM::factory(): Es el método estático para usar el ORM y el parámetro será el nombre del modelo</strong></li>
<li><strong> otros_metodos: Es donde le podemos agregar métodos where, join, order_by, find,find_all, etc., digamos como una especie de parámetros del query, algo importante a destacar es</strong>
<ul>
<li><strong> si usamos ->find() Kohana hará automáticamente un limit 1</strong></li>
<li><strong> Si usamos ->find_all() Kohana traerá todos los resultados</strong></li>
</ul>
</li>
<li><strong> Hay muchos parámetros poco a poco los iremos viendo.</strong></li>
</ul>
<p>Por último con el foreach recorremos nuestro objeto y mostramos sus propiedades las cuales son las mismas que los campos de la tabla y listo.</p>
<p>Guardamos nuestro controlador y al entrar a <strong>http://localhost/tienda/,</strong> nos debe aparecer algo como lo siguiente:</p>
<p><strong>[[Producto=Agua Embotellada 1 Lts Marca Debian]][[Producto=Refresco 2 Lts Marca Php Sabor Uva]][[Producto=Paleta Ubuntu sabor Cafe 1pza]]</strong></p>
<p>Con eso terminamos la parte 1, Como verán siento que fue bastante rápido, que quizá se me hayan quedado cosas, sin escribir, si notan algún error, o algo no funciona pueden comentarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/manual-php-creando-un-proyecto-mvc-con-framework-kohana-php-parte-i.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>[Evento] Konference (Kohana Conference) en Londres el 15 de Mayo 2010</title>
		<link>http://www.ajaxman.net/evento-konference-kohana-conference-en-londres-el-15-de-mayo-2010.html</link>
		<comments>http://www.ajaxman.net/evento-konference-kohana-conference-en-londres-el-15-de-mayo-2010.html#comments</comments>
		<pubDate>Sat, 01 May 2010 04:58:05 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Ko3]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[Konference]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1896</guid>
		<description><![CDATA[<p>Ahora si a lo windows Woow. Hasta hoy apenas me vengo enterando de esto, les platico rápidamente. El 15 de Mayo de este año (2010), se llevara a cabo en Londres, una conferencia de desarrolladores del Framework Kohana: KOnference &#8211; The London Kohana Conference 2010. La verdad estoy con unas tremendas ganas de ir sin [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Ahora si a lo windows Woow.</p>
<p>Hasta hoy apenas me vengo enterando de esto, les platico rápidamente.</p>
<p>El 15 de Mayo de este año (2010), se llevara a cabo en Londres, una conferencia de desarrolladores del Framework Kohana:<br />
<strong>KOnference &#8211; The London Kohana Conference 2010.</strong></p>
<p>La verdad estoy con unas tremendas ganas de ir sin embargo dudo mucho que pueda, por que no creo que en la chamba me paguen la ida y pues ahorita no hay mucho presupuesto.</p>
<p><a href="http://www.meetup.com/london-kohana/calendar/12925064/"><img class="aligncenter size-full wp-image-1895" title="Kohana Konference" src="http://www.ajaxman.net/wp-content/uploads/2010/04/highres_14691577.jpeg.png" alt="Kohana Konference" width="660" height="225" /></a></p>
<p>Me puse ha investigar y aquí les dejo la agenda, la cual se ve va a estar bien interesante.</p>
<ul>
<li><strong>Inicio || Duración || Sesión</strong></li>
<li>10:30  || 25&#8243;  || Registration</li>
<li>10:55  || 5&#8243;   || Welcome</li>
<li>11:00  || 55&#8243;  || Building Swiftly with Kohana 3 &#8211; KO3</li>
<li>11:55  || 40&#8243;  || Designing for Scalability with HMVC &#8211; KO3</li>
<li>12:35  || 15&#8243;  || Break</li>
<li>12:50  || 35&#8243;  || Migrating existing codebases to Kohana &#8211; KO2</li>
<li>13:25  || 30&#8243;  || Advanced ORM &#8211; theory and practice &#8211; KO3</li>
<li>13:55  || 30&#8243;  || Lunch</li>
<li>14:25  || 30&#8243;  || Discovery Session</li>
<li>14:55  || 20&#8243;  || Rapid site prototyping &#8211; KO2</li>
<li>15:15  || 30&#8243;  || Templating with Twig &#8211; KO3</li>
<li>15:45  || 30&#8243;  || Break</li>
<li>16:15  || 25&#8243;  || An introduction to using Gearman with Kohana &#8211; KO2</li>
<li>16:40  || 20&#8243;  || Deploying Kohana on a large scale application &#8211; KO2</li>
<li>17:00  || 10&#8243;  || Mukuru.com &#8211; Kohana meets E-Commerce</li>
<li>17:10  || N/A- || Beers &amp; dinner</li>
</ul>
<p>Como ven habra platicas tanto de Ko3 como de Ko2, el unico pero que veo es que sera hasta Londres y pues es algo complicado ir.</p>
<p>Ojala y leyeran este post y pronto hagan una aunque sea en EUA.</p>
<p>Al parecer el costo sera de 15 GBP (Libras) (unos $300 MXN),  el pago se realiza mediante Paypal y el registro sera a las 10:30 (Hora Local), recomiendan llegar a tiempo ya que como ellos dicen hay mucho que ver y el tiempo esta contado.</p>
<p>Pues ojala y eventos como este le den mas presencia a este increible framework y lo ayuden a crecer, por que se lo merece.</p>
<p>Mas info en los siguientes Links:<br />
<a href="www.meetup.com/london-kohana" target="_blank">KOnference &#8211; The London Kohana Conference 2010</a></p>
<p><a href="http://www.meetup.com/london-kohana/calendar/12925064/" target="_blank">KOnference &#8211; The London Kohana Conference 2010 Calendar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/evento-konference-kohana-conference-en-londres-el-15-de-mayo-2010.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Php] ¿Que es un ORM?</title>
		<link>http://www.ajaxman.net/php-que-es-un-orm.html</link>
		<comments>http://www.ajaxman.net/php-que-es-un-orm.html#comments</comments>
		<pubDate>Thu, 15 Apr 2010 18:43:10 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Ko3]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1871</guid>
		<description><![CDATA[<p>Pues como has visto en los últimos artículos de este blog he hablado mucho del famosísimo ORM que si bien aun me falta mucho, para poder usar todas sus características, lo poco que he aprendido a usarlo me ha resultado maravilloso. El mapeo objeto-relacional u ORM (Object-Relational Mapping), una técnica de programación para convertir datos [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Pues como has visto en los últimos artículos de este blog he hablado mucho del famosísimo <strong>ORM </strong>que si bien aun me falta mucho, para poder usar todas sus características, lo poco que he aprendido a usarlo me ha resultado maravilloso.</p>
<p>El <strong>mapeo objeto-relacional u ORM (Object-Relational Mapping)</strong>, una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional. En la práctica esto crea una base de datos orientada a objetos virtual, sobre la base de datos relacional. <a href="http://es.wikipedia.org/wiki/Mapeo_objeto-relacional" target="_blank">Wikipedia</a></p>
<p>Ose nos permite &#8220;pasar&#8221; una base de datos a programación orientada objetos,  es decir tu solo te encargas de configurar tu conexión y mediante métodos puedes hacer los querys que quieras, y todo son objetos.</p>
<p>Existen muchos ORMS, para diferentes lenguajes de programación, pero obviamente nos enfocaremos a Php, y según se (no estoy 100% seguro) pero los ORMS están basados en Hibérnate de Java se supone que fue como el primer ORM.</p>
<p>En Php tenemos los siguientes ORMS:</p>
<ul>
<li> <a href="http://www.doctrine-project.org/" target="_blank">Doctrine</a></li>
<li><a href="http://propel.phpdb.org/trac/" target="_blank">Propel</a></li>
<li><a href="http://v3.kohanaphp.com/guide/tutorials.orm" target="_blank">Kohana ORM</a></li>
<li><a href="http://code.google.com/p/bender-modeler/" target="_blank">Bender-modeler</a> (Este es de un amigo, aunque este es muy completo y va mas allá)</li>
<li><a href="http://junctionphp.com/" target="_blank">Junction PHP</a></li>
<li><a href="http://www.phpobjectgenerator.com/" target="_blank">PHP Object Generator</a></li>
<li><a href="http://phplens.com/lens/adodb/docs-active-record.htm" target="_blank">ADOdb Active Record</a></li>
<li><a href="http://www.ezpdo.net/blog/" target="_blank">EZPDO</a></li>
<li><a href="http://pear.php.net/package/DB_DataObject" target="_blank">DB_DataObject</a></li>
<li>Entre otras</li>
</ul>
<p>Yo no he visto como trabajan cada una y se dé muy buenas fuentes que las mejores estan entre Doctrine y Propel.</p>
<p>Claro que depende de que desees hacer, de hecho aun no he probado bender-modeler pero por lo que veo es muy completa <img src='http://www.ajaxman.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  (Y no es comercial he) ya que como dije va mas allá ya que te genera los modelos que usaras en tu bd automáticamente (incluidos getters y setter).</p>
<p>Voy a mostrar a que me refiero con todo esto del ORM desde la vista de Kohana ORM ya que es donde he trabajado y es muy fácil.</p>
<p>Antes que nada quiero aclarar que son solo ejemplos, prometo que después de esto seguirá nuestra primer MVC con base datos, ORMS y todo, esto solo es para que se den una idea de que hablo cuando digo que esta buenos los ORM´s.</p>
<p>Para empezar solo necesitamos crear nuestra tabla (p.ejem. &#8216;usuarios&#8217;), y crear un modelo con la siguiente sintaxis.</p>
<p><strong>usuarios.php</strong></p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php

class Model_Usuarios extends ORM {

}

?&amp;gt;</pre><p></p>
<p><span id="more-1871"></span><br />
Lo único que debemos de cambiar es Model_Usuarios donde Usuarios es el nombre de nuestra tabla y listo.</p>
<p>Y ahora veremos la diferencia</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php

//Anterior
$resultado = mysql_query(&amp;quot;select * from usuarios&amp;quot;,$conecct);

//en ORM
$resultado = ORM::factory('usuarios')-&gt;find_all();

?&amp;gt;</pre><p></p>
<p>Y además el resultado es un objeto no un array, aunque si deseamos usar array agregamos as_array() y listo y por ejemplo si necesitamos ver los usuarios que tuvieron 10 accesos sería algo así.</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php

//Esta es una forma
 $resultado = ORM::factory('usuarios')-&gt;where('accesos','=',10)-&gt;find_all();

 //Tambi&eacute;n se puede separar el c&oacute;digo para que se a mas f&aacute;cil leer
 $resultado = ORM::factory('usuarios')
 -&gt;where('accesos','=',10)
 -&gt;find_all();
?&amp;gt;</pre><p></p>
<p>Como puedes ver es muy fácil de usar, y usa el patrón de diseño Factory para acceder a los modelos(tablas), y luego le agregas os métodos, where, orderby, limit, etc.</p>
<p>Claro y pensaras ¿y el modelo solo ese es su contenido, un par de líneas? claro que no, pero ese es más avanzado, podemos hacer joins y demás, pero vayamos por partes, en la siguiente entrega veremos un ejemplo real de una aplicación web en kohana con MVC y una base de datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-que-es-un-orm.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.ajaxman.net @ 2012-05-22 18:29:05 -->
