<?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; Frameworks</title>
	<atom:link href="http://www.ajaxman.net/category/frameworks/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxman.net</link>
	<description>Ajax, Javascript, Xul, Internet, Recursos, Informatica ...</description>
	<lastBuildDate>Sat, 07 Jan 2012 23:15:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.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[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 [...]]]></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[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 [...]]]></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>
<pre class="brush: php; title: ; notranslate">

//Consulta ORM
$result = ORM::factory('users')-&gt;find_all();

//Consulta generada
$sql = 'select * from users';
</pre>
<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>
<pre class="brush: php; title: ; notranslate">

//Sintaxis
$query = DB::query(integer $type,String $sql);
</pre>
<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>
<pre class="brush: php; title: ; notranslate">

Database::SELECT;  // corresponde a 1
Database::INSERT;  // corresponde a 2
Database::UPDATE;  // corresponde a 3
Database::DELETE;  // corresponde a 4
</pre>
<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>
<pre class="brush: php; title: ; notranslate">

$user = 'ajaxman';

//Nótese la variable :user

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

//Asignación de la variable :user a variable PHP $user.

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

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

$query = 'SELECT id,username FROM users WHERE username = '.$user;
</pre>
<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>
<pre class="brush: php; title: ; notranslate">

//Declaración de variables en hardcode, esto debe de ser de otra forma,
// dentro de una clase (Modelo) y un método correspondiente
// Solo esta así 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é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ótese que son métodos que se adhieren al mismo método estático (luego veremos como usar esta técnica)
//ya que nos permite un código mas claro

//Forma 3
//Los pará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étodo bind y es útil para hacer muchos inserts ya que se apoya de
//El uso de arrays, y foreach para hacer los inserts

$users =  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ás antes de ejecutarse reemplaza :user y :pass
//por cada uno de los elementos del array que definimos arriba
</pre>
<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>[Kohana - PHP] 12 consejos útiles para desarrollar con kohana PHP</title>
		<link>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html</link>
		<comments>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html#comments</comments>
		<pubDate>Tue, 10 May 2011 21:47:06 +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[Software]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[Kohana Framework]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2094</guid>
		<description><![CDATA[Pues hoy les voy a mostrar, algunos consejos sobre el Framework kohana PHP, que les servirán mucho al momento de iniciarse en con este software, quizá algunos lo usen de otro modo y sea mejor, pero yo voy a poner como lo he usado y como me ha resultado de utilidad, así que si hay algo que no les funcione con kohana quizá deberían a darle un vistazo a este POST, aquí vienen:]]></description>
			<content:encoded><![CDATA[<p>Pues hoy les voy a mostrar, algunos consejos sobre el Framework kohana PHP, que les servirán mucho al momento de iniciarse en con este software, quizá algunos lo usen de otro modo y sea mejor, pero yo voy a poner como lo he usado y como me ha resultado de utilidad, así que si hay algo que no les funcione con kohana quizá deberían a darle un vistazo a este POST, aquí vienen:</p>
<h2><strong>1.- Kohana PHP</strong></h2>
<p>Es un framework escrito en PHP para acelerar el desarrollo de aplicaciones web, originalmente basado en CodeIgniter pero reescrito desde cero.</p>
<h2><strong>2.- Las ventajas de kohana PHP</strong></h2>
<p>Bueno son muchas, aquí pondré algunas</p>
<ul>
<li>Extremadamente ligero</li>
<li> PHP 5 Estricto</li>
<li> OOP</li>
<li> Arquitectura HMVC</li>
<li> Curva de aprendizaje fácil, pero extensa</li>
<li> Se puede usar con Doctrine ORM, Smarty, Twig y hasta con tus propias clases sin problemas.</li>
<li> IDE &#8211; Trabaja muy bien con Netbeans.</li>
</ul>
<h2><strong>3.- Las versiones de Kohana PHP</strong></h2>
<p>Kohana surgió como un fork de Codeigniter(CI) tratando de mejorarlo, y la versión 2.x es basado en CI y actualmente hay soporte para la misma y es manejada por Jeremy Bush( aka zombor).</p>
<p>Sin embargo la versión que uso y recomiendo en las 3.x, mas específicamente la 3.1.3.1, la cual también es estable, la recomiendo por que esta reescrita desde cero pensando en puro PHP5 Y OOP, , es mas fácil de usar, y con muchas mejoras a nivel código, de la versión 3.0 y 3.1.1, hubo cambios algo fuertes y puede que tu código no funcione bien.</p>
<p>En resumen usa la versión 3.1.3.1 y evitate problemas.</p>
<h2><strong>4.-Instalando Kohana PHP</strong></h2>
<p>Tengo aquí un post que menciona como instalar Kohana PHP, que no es mas que descomprimir, ver si tenemos todos los requisitos y ya.</p>
<p>Además de eso recomiendo que su servidor tenga soporte para .htaccess y el modulo ModRewrite instalado y en ese archivo comenta esta linea, ya que puede generarte problemas con la ubicación de tu kohana</p>
<pre class="brush: php; title: ; notranslate">

# Installation directory
#RewriteBase /
</pre>
<h2><strong>5.-  Configura tus rutas dentro del bootstrap</strong></h2>
<p>Configura tus rutas dentro del archivo Bootstrap, por default viene configurada una ruta que se llama default la cual apunta al controlador welcome, elimina ese archivo y configura tus rutas o ponlo para que apunte al controlador por default de tu proyecto<br />
<span id="more-2094"></span></p>
<pre class="brush: php; title: ; notranslate">
//reescribir estas lineas de acuerdo a tu proyecto
Route::set('default', '(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))')
-&gt;defaults(array(
 'controller' =&gt; 'welcome',
 'action'     =&gt; 'index',
));
</pre>
<h2><strong>6.- Elimina tu archivo de instalación</strong></h2>
<p>Cuando se instala kohana siempre trae un archivo que se llama install.php, el cual se encarga de verificar y mostrar que tengas todos los requisitos para usar kohana, después de que verifiques que todo esta ok, debes borrarlo ya que contiene información sensible que puede ser accesible muy fácilmente.</p>
<h2><strong>7.- Cada cosa en su lugar</strong></h2>
<p>Si bien cuando uno empieza a probar kohana sin leer mucho, hay cosas que podemos hacer pero que no están bien como poner consultas en los controladores, o en las vistas, hay que organizar todo, es mucho mejor.</p>
<p>Estas son las reglas</p>
<ul>
<li>Ruteos en el Bootstrap</li>
<li>Capa de lógica en el Controlador</li>
<li>Capa de persistencia de datos en los modelos</li>
<li>Capa de presentación en las vistas</li>
</ul>
<h2><strong>8.- Configura tu init del bootstrap</strong></h2>
<p>Configura en tu bootstrap tu url_base que es donde esta la dirección de tu sitio, es decir si tu sitio es http://www.ajaxman.net y ahí estas usando kohana en tu bootstrap debe de estar así</p>
<p>Y de preferencia usa urls amigables solo indicando, index_file como FALSE.</p>
<pre class="brush: php; title: ; notranslate">
Kohana::init(array(
 'base_url'   =&gt; 'http://www.ajaxman.net/',
 'index_file' =&gt; FALSE
));
</pre>
<h2><strong>9.- Usa un IDE</strong></h2>
<p>Para desarrollar con kohana, sirve hasta el bloc de notas (o el vi), pero a veces no es lo mejor, yo recomiendo que usen un IDE (Entorno de Desarrollo Integrado) como Eclipse, Zend Studio, Netbeans, Aptana,etc.</p>
<p>Yo uso Netbeans y trabaja de maravilla, reconoce todos los métodos y clases de kohana, además de que Netbeans te sirve para programar en Java, C, C++, Python entre otros y es Open Source</p>
<h2><strong>10.- La configuración de tu aplicaciones</strong></h2>
<p>Todos los módulos y algunas clases de kohana viene con una carpeta config y dentro de estas aparece un archivo con el nombre de la clase, estos archivos, contienen la configuración de cada clase que necesita configuración.</p>
<p>Para tenerlos mas claros estos se encuentran dentro de:</p>
<ul>
<li>*configuraciones del sistema
<ul>
<li> System
<ul>
<li>config</li>
</ul>
</li>
</ul>
</li>
<li>*configuraciones de los módulos
<ul>
<li>Modules
<ul>
<li>nombre_del_modulo
<ul>
<li> config</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Y si bien se puede configurar desde ahí, no es recomendable, entonces lo que hay que hacer es que cada vez que necesites usar algo lo debes de configurar, para hacerlo solo debes de copiar estos archivos dentro de la ruta de aplicación esto es.</p>
<ul>
<li>*configuraciones de tu aplicación
<ul>
<li>application
<ul>
<li>config</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Y ahí configurarlos así tienes todo dentro de tu aplicación.</p>
<h2><strong>11.- Cambia tus permisos en tus archivos de logs</strong></h2>
<p>Cuando uno empieza a programar en kohana a veces veremos errores del tipo:</p>
<p><strong>ErrorException [ 2 ]: file_put_contents(/home/tuwebsite/public_html/application/logs/2011/05/10.php) function.file-put-contents]: failed to open stream: Permission denied ~ SYSPATH/classes/kohana/log/file.php [ 82 ]</strong></p>
<p>Esto sucede por que que no tienes permisos para escribir en el archivo 10.php lo que hay que hacer aparte de cambiar los permisos de application/logs y todos sus directorios también hay que crear un archivo en blanco con el nombre del día que nos este mostrando en este caso es el 10.php, y darle permisos 777, para que escriba los logs, en este caso el error es por que no existe mi controlador.</p>
<p>Entonces mas que nada hay que tener dicho archivo y permisos de escritura para que guarde ahí el error.</p>
<p>Si no quieren usar este archivo hay que comentar la siguiente linea en el bootstrap</p>
<pre class="brush: php; title: ; notranslate">
/**
 * Attach the file write to logging. Multiple writers are supported.
 */
Kohana::$log-&gt;attach(new Log_File(APPPATH.'logs')); //Comentar esta linea
</pre>
<h2><strong>12.- Quita el user_guide</strong></h2>
<p>Por último otra recomendación útil es quitar el modulo user_guide ya que no sirve de mucho mostrar esta información al usuario y puede ser un agujero de seguridad.</p>
<p>Solo hay que borrarlo dentro de la carpeta modules.</p>
<p>Con estos 12 tips espero que les sea más fácil de usar kohana además de que ojala y sirva de base para que migren de otros frameworks, si tienen algún duda pues me avisan en lo comentarios, ha también se viene el congreso de PHP, pronto mas detalles.</p>
<p>Kohana FrameWork:<a href="http://kohanaframework.org/"> Kohana: The Swift PHP Framework</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Kohana - PHP] Lanzamiento de Kohana 3.1 &#8220;Merle&#8221; y como hacer el upgrade</title>
		<link>http://www.ajaxman.net/kohana-php-lanzamiento-de-kohana-3-1-merle-y-como-hacer-el-upgrade.html</link>
		<comments>http://www.ajaxman.net/kohana-php-lanzamiento-de-kohana-3-1-merle-y-como-hacer-el-upgrade.html#comments</comments>
		<pubDate>Fri, 11 Feb 2011 05:07:42 +0000</pubDate>
		<dc:creator>Ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[Kohana 3.1]]></category>
		<category><![CDATA[Kohana Framework]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2062</guid>
		<description><![CDATA[Pues apenas me vengo enterando de que los desarrolladores de Kohana han liberado el día 7 de Febrero la versión 3.1 del Framework Kohana llamada &#8220;merle&#8220;. Pues obviamente hay muchos que queremos tener nuestro Framework actualizado, entonces pues me dispuse a migrar un website de la versión 3.0.9 a la 3.0.x. Las instrucciones de migrar [...]]]></description>
			<content:encoded><![CDATA[<p>Pues apenas me vengo enterando de que los desarrolladores de <strong>Kohana</strong> han liberado el día 7 de Febrero la versión 3.1 del <strong>Framework Kohana</strong> llamada &#8220;<strong>merle</strong>&#8220;.</p>
<p>Pues obviamente hay muchos que queremos tener nuestro Framework actualizado, entonces pues me dispuse a migrar un website de la versión 3.0.9 a la 3.0.x.</p>
<p>Las instrucciones de migrar son fáciles, regularmente se basa en reemplazar el directorio system de nuestra aplicación, pero esta nueva versión incorpora muchos cambios los cuales, hacen la migración un poco mas complicada.</p>
<p>El mismo sitio de kohana nos avisa de los siguientes cambios:</p>
<pre class="brush: php; title: ; notranslate">

//Versión 3.0.x

$this-&gt;request-&gt;response = 'foo';

//Versión 3.1
$this-&gt;response-&gt;body('foo');

//Cambios en la clase Request de propiedades a métodos

//Versión 3.0.x  ===&gt;    Versión 3.1
Request::$controller ==&gt; Request::controller()
Request::$action ==&gt; Request::action()
Request::$directory ==&gt; Request::directory()
Request::$uri ==&gt; Request::uri()
</pre>
<p>Todos lo puntos son marcados aquí<br />
<a href="http://kohanaframework.org/3.1/guide/kohana/upgrading">http://kohanaframework.org/3.1/guide/kohana/upgrading</a>.</p>
<p>Ahora bien, a mi los que mas me interesaron, son importantes y no vienen aqui son los siguientes.</p>
<p>Request</p>
<pre class="brush: php; title: ; notranslate">

//Versión 3.0.x

Request::instance();
</pre>
<p>El método estático anterior nos devolvía el singleton de nuestra solicitud con dicho método estático podiamos obtener parámetros y una de las cosas para lo que yo la utilizaba era para la creación de mi Breadcrumb.</p>
<pre class="brush: php; title: ; notranslate">

//Version 3.1

Request::current();

//o

Request::initial();
</pre>
<p>Aquí como vemos tenemos dos opciones, y se elimino instance, las dos son iguales salvo por un detalle, si usamos <strong>HMVC</strong>, initial contendrá la información de la petición inicial, es decir si desde un controlador estamos invocando a un <strong>Request::factory()</strong>, ese sera <strong>inital</strong> y el <strong>factory</strong> invocado sera <strong>current</strong> cuando estemos programando dentro del <strong>factory</strong>.<br />
<span id="more-2062"></span><br />
Importante, lo anterior hay que tenerlo muy en cuenta ya que algunos módulos pueden usar dicho método estático, entonces, hay que buscar alguna actualización del mismo (me paso con el modulo de paginación)</p>
<p><strong>Bootstrap</strong></p>
<p>Pues creo que hay que destacar que reescribieron bastante de este archivo, por ello hay que reemplazar el que tenemos, obviamente guardando una copia del actual, ya que recordemos que en el <strong>bootstrap</strong> se guardan las rutas, módulos y muchas configuraciones de Kohana.</p>
<p><strong>Desaparece el método -&gt;render() de la vistas</strong></p>
<p>También es fundamental remarcar este cambio, en versiones anteriores se usaba <strong>View::factory($vista)-&gt;render(); </strong>el cual ya no existe por ello si lo tienen así, quítenle ese método a sus vistas o sea quedaria <strong>View::factory($vista);</strong> (Nota puede afectar a sus módulos, de nuevo me paso con el modulo de paginación).</p>
<p><strong>Security::xss_clean </strong></p>
<p>También desaparece, podemos usar <strong>HTML::chars().</strong></p>
<p>Para generar mi breadcrumb yo lo hacia con una código el cual extraía un array de la url, el cual ya no funciona, ahora hay que tomar la url y volverla array con explode como dice el siguiente código</p>
<pre class="brush: php; title: ; notranslate">

//versión 3.0.x  $segments es un array con las partes que forman la url

$segments = Request::instance()-&gt;param();

//Versión 3.1  Ahora tenemos que tomarla de un string el cual cambio la forma de extraerlo ya que las nuevas clases están mas completas  y convertirla a array
$segments = Request::$current-&gt;param();
$segments = explode('/',$segments['uri']);
</pre>
<p>Bueno pues como verán los cambios si son fuertes, y también ya no viene el modulo de paginación( ahora hay que bajarlo),inclusive el <strong>index.php</strong> cambia, como vemos el equipo de kohana realizo bastantes cambios, los cuales al principio pueden darnos algún dolor de cabeza, pero es mejor migrar de una vez ya que ya están trabajando en la versión 3.2(la cual saldría en 6 meses aproximadamente) y hasta la 3.3.</p>
<p>Hasta aquí llegamos, con este post, en entregas posteriores tratare de cubrir los temas pendientes de <strong>kohana framework</strong></p>
<p>Anuncio del lanzamiento: <a href="http://forum.kohanaframework.org/discussion/8024/kohana-v3.1.0-released">http://forum.kohanaframework.org/discussion/8024/kohana-v3.1.0-released</a></p>
<p>Manual de Kohana 3.1.x :<a href="http://kohanaframework.org/3.1/guide/"> http://kohanaframework.org/3.1/guide/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-lanzamiento-de-kohana-3-1-merle-y-como-hacer-el-upgrade.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>[Framework Kohana 3] Instalando y configurando Kohana 3 #Ko3</title>
		<link>http://www.ajaxman.net/framework-kohana-3-instalando-y-configurando-kohana-3-ko3.html</link>
		<comments>http://www.ajaxman.net/framework-kohana-3-instalando-y-configurando-kohana-3-ko3.html#comments</comments>
		<pubDate>Fri, 09 Apr 2010 21:45:57 +0000</pubDate>
		<dc:creator>Ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Ko3]]></category>
		<category><![CDATA[Kohana 3]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1854</guid>
		<description><![CDATA[Para empezar con con Kohana, necesitamos tener instalado un entorno de pruebas el cual debe tener lo siguiente. Apache o un servidor Web como Lighttpd Php 5 o superior (de preferencia 5.3) MySQL 5 Funcionando y correctamente configurado Imaginemos que tenemos nuestro Htdocs en E:\www y que ese es nuestro htdocs. Ahora procedamos Bajaremos nuestro [...]]]></description>
			<content:encoded><![CDATA[<p>Para empezar con con Kohana, necesitamos tener instalado un entorno de pruebas el cual debe tener lo siguiente.</p>
<ul>
<li>Apache o un servidor Web como Lighttpd</li>
<li>Php 5 o superior (de preferencia 5.3)</li>
<li>MySQL 5</li>
</ul>
<p>Funcionando y correctamente configurado<br />
Imaginemos que tenemos nuestro Htdocs en E:\www y que ese es nuestro htdocs.</p>
<p>Ahora procedamos</p>
<ul>
<li>Bajaremos nuestro<strong> kohana 3</strong></li>
<li>Para ello iremos a la siguiente pagina <a href="http://v3.kohanaphp.com/download">http://v3.kohanaphp.com/download</a><br />
Y descargaremos la<strong> versión v3.0.0 &#8220;renaissance</strong>&#8221; que es la estable de la rama 3.x</li>
<li> Lo descomprimimos y veremos dentro una carpeta que se llama kohana, y dentro de ella el framework</li>
<li>Copiamos esta carpeta kohana a nuestro Htdocs</li>
<li>Quedaría así <strong>E:\www\kohana</strong></li>
</ul>
<p>Ahora vayamos a nuestro dirección <strong>http://localhost/kohana</strong> y veremos lo siguiente.</p>
<div id="attachment_1855" class="wp-caption aligncenter" style="width: 503px"><img class="size-full wp-image-1855" title="kohana 3" src="http://www.ajaxman.net/wp-content/uploads/2010/04/kohana_install.PNG" alt="kohana 3" width="493" height="699" /><p class="wp-caption-text">kohana 3</p></div>
<p><span id="more-1854"></span></p>
<p>Con ello ya tenemos instalado kohana, fácil verdad? lo que están viendo es el archivo install.php, que no hace otra cosa más que comprobar que tienes un entorno en donde se pueda trabajar con Kohana 3 sin problemas.</p>
<p>En la imagen pudiste ver que me aplicación los obligatorios son los siguientes:<br />
<strong>Environment Tests</strong></p>
<ul>
<li><strong>PHP Version</strong> 5.2.11</li>
<li><strong>System Directory </strong> E:\www\kohana\system\</li>
<li><strong>Application Directory </strong> E:\www\kohana\application\</li>
<li><strong>Cache Directory</strong> E:\www\kohana\application\cache/</li>
<li><strong>Logs Directory</strong> E:\www\kohana\application\logs/</li>
<li><strong>PCRE UTF-8 </strong>Pass</li>
<li><strong>SPL Enabled</strong> Pass</li>
<li><strong>Reflection Enabled</strong> Pass</li>
<li><strong>Filters Enabled</strong> Pass</li>
<li><strong>Iconv Extension Loaded</strong> Pass</li>
<li><strong>Mbstring Not Overloaded</strong> Pass</li>
<li><strong>URI Determinatio</strong>n 	Pass</li>
</ul>
<p>Los opcionales son los siguientes:</p>
<p><strong>Optional Tests</strong></p>
<ul>
<li><strong>cURL</strong> Enabled  	Kohana requires cURL  for the Remote class.</li>
<li><strong>mcrypt Enabled</strong> Pass</li>
<li><strong>GD Enabled </strong>Pass</li>
<li><strong>PDO Enabled</strong> Pass</li>
</ul>
<p>Como ven hay una opción que está incompleta, es porque no tengo instalada la extensión cURL, la cual al puedo agregar haciendo lo siguiente:</p>
<p>Abriendo el archivo php.ini de mi instalación de Php (en mi casa está en C:\PHP\php.ini)</p>
<p>Y buscar estas líneas</p>
<pre><strong>;extension=php_bz2.dll
</strong>
<strong>
;extension=php_curl.dll
</strong>
<strong>
;extension=php_dba.dll</strong></pre>
<p>Y descomentar la que dice curl para que quede así</p>
<pre><strong>;extension=php_bz2.dll
</strong>
<strong>
extension=php_curl.dll
</strong>
<strong>
;extension=php_dba.dll</strong></pre>
<p>Reiniciamos el servidor y listo, esto sirve por si nos falta alguna extensión.</p>
<p>Ojo si tenemos algún campo marcado en rojo en Optional Tests, Kohana funcionara aunque en algún momento cuando usemos esa característica fallara(), si hay campos en rojo en la sección de Environment Tests, entonces no funcionara, esto se puede deber a la versión de Php que tengamos instalada, o a los permisos en ciertas carpetas, revisar los permisos de la carpeta<strong> Cache Directory  	E:\www\kohana\application\cache/</strong> o <strong>Logs Directory  	E:\www\kohana\application\logs/</strong>.</p>
<p>Ya que no existen, y kohana los crea, entonces si vemos que nos marca error, podemos crearlos a mano y poner les permisos de escritura chmod 676.</p>
<p>Ahora que ya todo funciona <strong>borramos el archivo install o lo renombramos (por seguridad elimínalo)</strong> y ahora si podemos ver nuestro entorno en funcionamiento<br />
y si vemos el mensaje hello, world! significa que todo es funcionando bien.</p>
<p>Lo que vemos es la ejecución del controlador por default que está en</p>
<p><strong>E:\www\kohana\application\classes\controller\welcome.php </strong>-&gt;Este el el controlador por default el cual contiene el siguiente código:</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php defined('SYSPATH') or die('No direct script access.');

class Controller_Welcome extends Controller {

public function action_index()

{

$this-&gt;request-&gt;response = 'hello, world!';

}

} // End Welcome

?&gt;
</pre>
<p>Hasta ahí llegamos hoy, luego les diré como usar bien lo controladores, pero se pueden guiar por nuestro anterior inicio de Codeigniter son parecidos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/framework-kohana-3-instalando-y-configurando-kohana-3-ko3.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Programación PHP]El Framework Kohana 3 el elegido</title>
		<link>http://www.ajaxman.net/programacion-phpel-framework-kohana-3-el-elegido.html</link>
		<comments>http://www.ajaxman.net/programacion-phpel-framework-kohana-3-el-elegido.html#comments</comments>
		<pubDate>Fri, 09 Apr 2010 04:16:16 +0000</pubDate>
		<dc:creator>Ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Ko3]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[Php 5]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1850</guid>
		<description><![CDATA[Después de varios días sin actividad, hoy platicare de varias cosas. Pues como sabrán (x vía Twitter), no tengo pc, por ello no he posteado, y bueno tengo un proyecto entre manos el cual empezare a partir del día de hoy, pensaba hacerlo con Python con el Framework Django o en su caso con Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>Después de varios días sin actividad, hoy platicare de varias cosas.</p>
<p>Pues como sabrán (x vía Twitter), no tengo pc, por ello no he posteado, y bueno tengo un proyecto entre manos el cual empezare a partir del día de hoy, pensaba hacerlo con Python con el Framework Django o en su caso con Ruby on Rails.</p>
<p>Y la verdad estaba pensando muy seriamente hacerlo con Django pero la verdad estoy con poco tiempo, y después de haber estado usando Kohana en el trabajo me decante por este Framework en su versión 3.0.</p>
<p>El proyecto es un website, pero no daré mas pistas hasta que este casi listo(pronto), lo importante es que se que quiero hacer y tengo con que hacerlo.</p>
<div id="attachment_1851" class="wp-caption aligncenter" style="width: 201px"><img class="size-full wp-image-1851" title="kohana 3" src="http://www.ajaxman.net/wp-content/uploads/2010/04/kohana.png" alt="kohana 3" width="191" height="62" /><p class="wp-caption-text">kohana 3</p></div>
<p>Pero el propósito de este post va mas haya les platicare un poco de que se trata este Framework y en medida de lo posible pondré documentación en español la cual esta un poco escasa.</p>
<p>Kohana es un Framework escrito en Php, el cual comenzó siendo un Fork del Framework CodeIgniter, el cual trata de ser mejor que este, esto es en su version 2.3.4</p>
<p>Pero en su nueva versión 3.0 el Framework fue reescrito completamente, agregando mas características importantes, como una mejor implementación de su ORM, se implemento el uso de métodos estáticos para prácticamente todo, para instalarlo se requiere PHP 5 obligatorio, entre otras mejoras.</p>
<p>Además de que a diferencia de Codeigniter la carpeta de la aplicación esta fuera de la del sistema, haciéndolo mas seguro.</p>
<p>Bien ahora a programar, les informare de los avances.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/programacion-phpel-framework-kohana-3-el-elegido.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[Manual - Codeigniter] Programando php en MVC con CodeIgniter [Parte 1]</title>
		<link>http://www.ajaxman.net/manual-codeigniter-programando-php-en-mvc-con-codeigniter-parte-1.html</link>
		<comments>http://www.ajaxman.net/manual-codeigniter-programando-php-en-mvc-con-codeigniter-parte-1.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 04:44:36 +0000</pubDate>
		<dc:creator>Ajaxman</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Php5]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1616</guid>
		<description><![CDATA[Antes de empezar con este post, quiero ofrecer disculpas ya que no he sido constante en el blog, sin embargo cuando estén casados y esperando un bebe sabrán que hay cosas que son mas importantes jaja. También déjenme comentarles que estoy planeando un cambio de diseño en el blog, algo que no modifique mucho la [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de empezar con este post, quiero ofrecer disculpas ya que no he sido constante en el blog, sin embargo cuando estén casados y esperando un bebe sabrán que hay cosas que son mas importantes jaja.<br />
También déjenme comentarles que estoy planeando un cambio de diseño en el blog, algo que no modifique mucho la estructura pero que se vea elegante, esos son los planes a futuro, bueno ahora si pasemos al post.</p>
<p>A mi siempre me ha gusto programar directamente sin usar algún tipo de Framework<br />
o algo similar (a excepción del Blog que uso WordPress), sin embargo ahora que estoy viendo como programar el proyecto empecé a buscar opciones que aligerarán mi carga de trabajo, pero a la vez que fuera muy flexible para meter código donde fuera necesario (claro de una manera ordenada).</p>
<p>Entonces empecé a buscar algún Framework que me satisficiera, pensé en Zend, en Smarty, Phpbb, Xtemplate, etc, sin embargo esta dudoso, como que una parte me decía que si y otra que no, entonces conocí a CodeIgniter, un Framework que si bien no es tan conocido como Zend o Symphony, si es muy potente y muy simple de usar y puede llegar a ser tan potente como los dos anteriores.</p>
<p>Ahora bien, me puse a investigar como instalar y como hacer mi !Hello Word!, así que aquí les pongo como le hice y como quedo.</p>
<p>[PASO:1]</p>
<p>Requisitos:</p>
<ul>
<li> Tener php 4 o superior instalado</li>
<li> Base de datos MySQL(soporta otras)</li>
</ul>
<p>[PASO:2]</p>
<ul>
<li>Obtenemos CodeIgniter de la siguiente URL  <a href="http://codeigniter.com/download.php" target="_blank"><strong>http://codeigniter.com/download.php</strong></a></li>
<li> Lo copiamos dentro de nuestra carpeta raíz de htdocs (en Apache)</li>
<li> Hay dos carpetas una se llama <strong>system </strong>y otra <strong>user_guide</strong>, además de otros archivos</li>
</ul>
<p>[PASO:3]</p>
<ul>
<li>Ahora procederemos a configurar nuestro <strong>CodeIgniter</strong></li>
<li> Primero abrimos el siguiente archivo <strong>system/application/config/config.php</strong> y buscamos la línea<strong> $config['base_url'] = &#8220;http://localhost/CodeIgniter/&#8221;;</strong> en donde pondremos la ruta de nuestra carpeta que acabamos de descomprimir</li>
<li> Para conectar la base de datos hay que editar el archivo <strong>system/application/config/database.php</strong> en donde dice</li>
<p><strong>$db['default']['hostname'] = &#8220;localhost&#8221;; </strong></p>
<p><strong> $db['default']['username'] = &#8220;&#8221;; </strong></p>
<p><strong> $db['default']['password'] = &#8220;&#8221;; </strong></p>
<p><strong> $db['default']['database'] = &#8220;&#8221;; </strong></p>
<p>y Ahi colocamos los valores que usamos para conectarnos a nuestra base de datos.</ul>
<p>[PASO:4]   Ahora debes de entrar a la url que pusiste y te debe de aparecer el siguiente mensaje.</p>
<p>[PASO:5]<br />
Ahora si entras a <strong>system/application</strong> veras muchas carpetas, las que nos interesan son las siguientes <strong>config, controlles, views y models</strong>.<br />
Abrimos el archivo <strong>system/application/config/routes.php</strong> en donde buscaremos lo siguiente <strong>$route['default_controller'] = &#8220;welcome&#8221;;</strong> (<strong>esta en la línea 43 aproximadamente</strong>) esta la vamos a cambiar por el nombre de nuestro controlador que vamos a usar, su sintaxis es muy simple, <strong>debe de ser el nombre del archivo donde haremos el controlador</strong>, por ejemplo <strong>si nuestro archivo controlador se llamara test.php quedara así $route['default_controller'] = &#8220;test&#8221;;</strong> si el controlador se llamara delfines.php quedaría $route['default_controller'] = &#8220;delfines&#8221;;<br />
Nota: Es muy importante lo anterior ya que toda la sintaxis que usa CodeIgniter sigue esta estructura<br />
Ya que lo editamos cerramos ya abrimos el controlador, por default esta el controlador welcome, el cual recordemos que estaba por default dentro de routes.php,  ahora creamos nuestro controlador con el nombre que deseemos, por ejemplo <strong>biblioteca.php, (recuerden cambiar en routes.php $route['default_controller'] = &#8220;welcome&#8221;; a $route['default_controller'] = &#8220;biblioteca&#8221;; )</strong><br />
Abrimos nuestro controlador y escribimos lo siguiente.</p>
<pre class="brush: php; title: ; notranslate">

class Welcome extends Controller {

function Welcome()
{

parent::Controller();

}
function index()
{
echo &quot;Hola Mundo&quot;;
}
}
</pre>
<p>Lo que tenemos en muy simple, creamos una clase la cual extiende de Controller con lo cual obtiene todos los métodos y propiedades de un controlador genérico de CodeIgniter, vemos el método Welcome, el cual es necesario ya que tu constructor local anularia al constructor de la clase padre Controller, por lo tanto necesitamos llamarlo manualmente. en el caso de php5 podemos optar por usar.</p>
<pre class="brush: php; title: ; notranslate">

function __construct()
{
parent::Controller();
}
</pre>
<p>Es lo mismo.</p>
<p>Luego tenemos el método index, el cual se ejecuta cuando entremos al index.php(después del método constructor) y le decimos que escriba &#8220;Hola mundo&#8221;, si bien esto no tiene nada de MVC, es para ver que esta funcionando deberemos entrar a</p>
<p>http://localhost/codeigniter/biblioteca/</p>
<p>Y nos deberá arrojar <em><strong>&#8220;Hola Mundo&#8221;</strong></em></p>
<p>Queda pendiente el ejemplo MVC completo, cualquier duda pueden preguntar, recuerden pueden empezar a probar para que vean como funciona.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/manual-codeigniter-programando-php-en-mvc-con-codeigniter-parte-1.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.442 seconds -->

