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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class Controller_Tienda extends Controller {

 public function action_index()
 {

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

 }

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

class Controller_Tienda extends Controller {

 public function action_index()
 {

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

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

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

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

class Controller_Tienda extends Controller {

 public function action_index()
 {

 $user = 'Ajaxman';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class Model_Productos extends ORM {

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


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

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

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1865</guid>
		<description><![CDATA[<p>Bien después del error que se presento en el penultimo post, y ya resuelto seguimos posteando &#8220;ahora si que voy tendido&#8221;. Yo supongo que ya leyeron el post anterior sobre instalación de Kohana 3, si no este es el link [Framework Kohana 3] Instalando y configurando Kohana 3 #Ko3 Bien teniendo eso, hoy haremos un pequeño [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Bien después del error que se presento en el penultimo post, y ya resuelto seguimos posteando &#8220;ahora si que voy tendido&#8221;.</p>
<p>Yo supongo que ya leyeron el post anterior sobre instalación de Kohana 3, si no este es el link <a href="http://www.ajaxman.net/1854/framework-kohana-3-instalando-y-configurando-kohana-3-ko3/" target="_blank">[Framework Kohana 3] Instalando y configurando Kohana 3 #Ko3</a></p>
<p>Bien teniendo eso, hoy haremos un pequeño ejemplo de MVC, recordemos que el paradigma MVC (Modelo, Vista, Controlador) nos permite desarrollar mejor, mas rápido, organizar nuestro proyecto y hacerlo abstracto.</p>
<p>Lo anterior es porque nos permite programar de la siguiente manera:</p>
<ul>
<li><strong>Modelo</strong>: Capa de datos, la cual se encarga de la petición de datos</li>
<li><strong>Vista</strong>: capa de presentación, es la que se encarga de mostrar el resultado al cliente</li>
<li><strong>Controlador</strong>: capa de negociación, esta se encarga de organizar al información, en otras palabras identifica que es lo que necesitas, pide los datos al modelo y los presenta en la vista.</li>
</ul>
<p>Bien ahora veamos cómo trabaja Kohana 3 con esto</p>
<p>Como podemos ver Kohana consta de 3 carpetas:</p>
<ul>
<li><strong>Application</strong>: es donde estará nuestra aplicación donde tendremos nuestras carpetas de MVC, digamos que es lo publico</li>
<li><strong>Modules</strong>: es donde residen los módulos que le podemos agregar a Kohana por ejemplo la conexion a la base de datos, el ORM(luego hablaremos de este),autenticación etc.</li>
<li><strong>System</strong>: pues como su nombre lo indica es donde está el core del Kohana 3 o el núcleo, este pues casi no hay que tocarlo en la mayoría de proyectos de hecho casi nunca se toca o no debería tocarse.</li>
</ul>
<p>Ahora lo que nos interesa en este caso es la carpeta Application, al abrimos y veremos las siguiente carpetas:</p>
<p><span id="more-1865"></span></p>
<ul>
<li><strong>Cache</strong>: es donde se guardara el cache interno, este se activa muy fácil pero no esta tan eficiente como un verdadero cache.</li>
<li><strong>Clases</strong>: es donde estarán nuestros controladores (C de MVC) y nuestros modelos aquí veremos que hay una carpeta llamada <strong>controller</strong>, ahí hay que crear una carpeta que se llame <strong>model </strong>que servirá para nuestros modelos, y también podemos crear una carpeta <strong>helper </strong>que nos servirá para poner ahí nuestros helpers cuando los creemos.</li>
<li><strong>Config</strong>: esta carpeta no le he tocado, pero por lo que he visto son como configuraciones especiales del website, yo recomiendo no poner nada ahí, hasta ver bien su uso.</li>
<li><strong>Logs</strong>: como su nombre lo indica aquí se guardan logs de los errores de nuestro código.</li>
<li><strong>views</strong>:  si bien esta carpeta regularmente no existe, pero hay que crearla por que es donde estarán nuestras vistas(la capa de presentación) de nuestro proyecto.</li>
</ul>
<p>También veremos que dentro de la carpeta principal <strong>Application </strong>hay un archivo <strong>bootstrap.php</strong> el cual es digamos que como un config y un router a la vez, ya que es donde configuraremos algunas cosas y enrutaremos mediante expresiones regulares(<strong>se parece al settings.py de Django</strong>) a los controladores que deseemos.</p>
<p>A continuación describiré cada una de las partes que conforman el <strong>bootstrap.php</strong></p>
<ul>
<li><strong>date_default_timezone_set(&#8216;America/Chicago&#8217;); </strong>define la zona donde se está ejecutando nuestros script yo le pongo <strong>America/Mexico_city</strong></li>
<li><strong>setlocale(LC_ALL, &#8216;en_US.utf-8&#8242;); </strong>Configuración de la codificación, recomiendo usar UTF-8</li>
<li><strong>spl_autoload_register(array(&#8216;Kohana&#8217;, &#8216;auto_load&#8217;));</strong> Esto es un poco complicado de explicar en un par de líneas(luego me extenderé), pero diremos que con esto se esta cargando Kohana.</li>
<li><strong>ini_set(&#8216;unserialize_callback_func&#8217;, &#8216;spl_autoload_call&#8217;); </strong> Lo mismo que el de arriba, es para que inicialice el autoloader para serializar.</li>
<li><strong>Kohana::init(array(&#8216;base_url&#8217; => &#8216;/kohana/&#8217;));</strong> es donde configuraremos el mod_rewrite (en php, también hay que agregar el htacces), la url de base, el cache interno entre otras.</li>
<li><strong>Kohana::$log->attach(new Kohana_Log_File(APPPATH.&#8217;logs&#8217;));</strong> pues indica donde guardara los logs</li>
<li><strong>Kohana::$config->attach(new Kohana_Config_File);</strong> Configuración de Kohana</li>
<li><strong>Kohana::modules(array( &#8230; )) </strong>Aquí es donde cargaremos los módulos como el ORM y la base de datos, también podemos agregar algunos otros.</li>
<li><strong>Route::set(&#8216;default&#8217;, &#8216;((&lt;controller&gt;/(/&lt;action&gt;)))&#8217;) ->defaults(array( &#8217;controller&#8217; =>  &#8217;welcome&#8217;,'action&#8217;     => &#8216;index&#8217;,));</strong> Este por el momento diremos que nos indica a que controlador ira por default en este caso se llama welcome, y método index, luego veremos cómo configurarlo bien.</li>
<li>e<strong>cho Request::instance()->execute() ->send_headers() ->response</strong>; Esto hasta ahorita no lo he tocado pero es para que se ejecute el sistema.</li>
</ul>
<p>Bien creo que por hoy es suficiente, si queremos empezar a probar les recomiendo que pongan controladores copiando el código del controlador welcome.</p>
<p>Perdonen que este todo amontonado pero no hay mucho tiempo para formatear bien el texto, esto es solo para que se den una idea, lo mejor el abrir el <strong>bootstrap.php</strong> y ver el contenido.</p>
<p>El capitulo que sigue veremos un ejemplo de un MVC con ORM (haber si me alcanza el tiempo si no por separado).</p>
<p>Saludos y buen codding&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-kohana-3el-framework-kohana-3-y-el-mvc.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[<p>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 [...]</p>
 ]]></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:wwwkohana</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:wwwkohanasystem</li>
<li><strong>Application Directory </strong> E:wwwkohanaapplication</li>
<li><strong>Cache Directory</strong> E:wwwkohanaapplicationcache/</li>
<li><strong>Logs Directory</strong> E:wwwkohanaapplicationlogs/</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:PHPphp.ini)</p>
<p>Y buscar estas líneas</p><pre class="crayon-plain-tag">&lt;strong&gt;;extension=php_bz2.dll
&lt;/strong&gt;
&lt;strong&gt;
;extension=php_curl.dll
&lt;/strong&gt;
&lt;strong&gt;
;extension=php_dba.dll&lt;/strong&gt;</pre><p>Y descomentar la que dice curl para que quede así</p><pre class="crayon-plain-tag">&lt;strong&gt;;extension=php_bz2.dll
&lt;/strong&gt;
&lt;strong&gt;
extension=php_curl.dll
&lt;/strong&gt;
&lt;strong&gt;
;extension=php_dba.dll&lt;/strong&gt;</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:wwwkohanaapplicationcache/</strong> o <strong>Logs Directory  	E:wwwkohanaapplicationlogs/</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:wwwkohanaapplicationclassescontrollerwelcome.php </strong>->Este el el controlador por default el cual contiene el siguiente código:</p>
<p></p><pre class="crayon-plain-tag">&amp;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

?&amp;gt;</pre><p></p>
<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>3</slash:comments>
		</item>
		<item>
		<title>[Tutorial] Creando Virtual Host de Apache usando Linux</title>
		<link>http://www.ajaxman.net/tutorial-creando-virtual-host-de-apache-usando-linux.html</link>
		<comments>http://www.ajaxman.net/tutorial-creando-virtual-host-de-apache-usando-linux.html#comments</comments>
		<pubDate>Thu, 16 Apr 2009 01:22:14 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Manual]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[VirtualHost]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1541</guid>
		<description><![CDATA[<p>Hasta hoy creo que voy a escribir algo util, pero pues y saben que mi tiempo es poco y hay que aprovecharlo al máximo. Bueno la idea de este post es platicarles sobre como se pueden crear los famosos virtualhosts.Pero antes de empezar enterémonos bien que es un virtualhost. Con los virtualhosts podremos tener varios [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Hasta hoy creo que voy a escribir algo util, pero pues y saben que mi tiempo es poco y hay que aprovecharlo al máximo.</p>
<p>Bueno la idea de este post es platicarles sobre como se pueden crear los famosos <strong>virtualhosts</strong>.Pero antes de empezar enterémonos bien que es un virtualhost.</p>
<p>Con los <strong>virtualhosts</strong> podremos tener varios dominios apuntando a una misma pc. Dentro de cada <strong>virtualhost</strong> podremos definir las condiciones para cada dominio que esté representando.</p>
<p>Es como si tuviéramos varios dominios dentro de nuestro servidor osea 127.0.0.1.</p>
<p><strong>Es decir que aparte de usar http://localhost, podríamos usar http://localweb, http://proyecto, http://www.beta.com o el nombre que mas nos guste, para ello lo primero que necesitamos es tener instalado apache2 (la ultima versión) y funcionando.</strong></p>
<p>Ahora veamos como crear y usar los virtualhost(<strong>Es necesario tener permisos de root para algunos cambios</strong>)</p>
<p>Entraremos  a nuestra consola y nos moveremos a   cd /etc/apache2/sites-available/</p>
<p><em><strong>ajaxman@debianJS:~$ su<br />
Contraseña:<br />
debianJS:/home/ajaxman# cd /etc/apache2/sites-available/<br />
debianJS:/etc/apache2/sites-available#</strong></em></p>
<p>Una vez ahí veremos que hay un archivo llamado default (en mi caso hay dos el otro se llama default-ssl es digamos que la &#8220;plantilla&#8221; de los sitio con ssl)</p>
<p><em><strong>debianJS:/etc/apache2/sites-available# ls -la<br />
total 24<br />
drwxr-xr-x 2 root root 4096 abr 14 16:37 .<br />
drwxr-xr-x 7 root root 4096 nov  6 16:46 ..<br />
-rw-r&#8211;r&#8211; 1 root root 1428 nov  6 17:44 default<br />
-rw-r&#8211;r&#8211; 1 root root 7366 oct  1  2008 default-ssl</strong></em></p>
<p>El archivo default es el que contiene la información que usaremos en los virtualHost por lo cual simplemente copiaremos todo el archivo en uno nuevo eso lo hacemos mediante el comando <strong>cat</strong>.</p>
<p><em><strong>debianJS:/etc/apache2/sites-available# cat default&gt; website</strong></em></p>
<p>Ahora nuestro ls se vera asi</p>
<p><em><strong>debianJS:/etc/apache2/sites-available# ls -la<br />
total 24<br />
drwxr-xr-x 2 root root 4096 abr 14 16:37 .<br />
drwxr-xr-x 7 root root 4096 nov  6 16:46 ..<br />
-rw-r&#8211;r&#8211; 1 root root 1428 nov  6 17:44 default<br />
-rw-r&#8211;r&#8211; 1 root root 7366 oct  1  2008 default-ssl<br />
-rw-r&#8211;r&#8211; 1 root root 1480 abr 14 16:35 website</strong></em></p>
<p>Ahora lo abrimos y lo editamos con el Vi y lo unico que modificaremos sera lo siguiente.</p>
<p><strong>debianJS:/etc/apache2/sites-available# vim website</strong><br />
<em><br />
<strong>< VirtualHost *:80 ><br />
ServerAdmin webmaster@localhost</p>
<p>DocumentRoot /home/www/<br />
< Directory  / ><br />
Options FollowSymLinks<br />
AllowOverride None<br />
< /Directory ><br />
< Directory /home/www/ ><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
< / Directory ><br />
&#8230;&#8230;&#8230;<br />
&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
< VirtualHost ></strong></em></p>
<p>Por esto</p>
<p><em><strong>< VirtualHost *:80 ><br />
ServerAdmin webmaster@ajaxman.net<br />
ServerName prog<br />
ServerAlias www.website.net</p>
<p>DocumentRoot /home/www/prog<br />
< Directory / ><br />
Options FollowSymLinks<br />
AllowOverride None<br />
< /Directory ><br />
< Directory /home/www/prog ><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
< / Directory ><br />
&#8230;&#8230;&#8230;<br />
&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
< VirtualHost ></strong></em></p>
<p>Nota: Tiene espacios intencionales para evitar que wordpress lo tome como si fueran tags HTML</p>
<p>Lo que cambiamos fue</p>
<ul>
<li><strong>Agregamos Server Name</strong>, que es donde estará el nombre de nuestro servidor en este caso se llama prog</li>
<li><strong>Le agregamos un ServerAlias</strong>, que es como otro nombre para acceder a este VirtualHost, en este caso es <strong>www.website.net.</strong></li>
<li><strong>Y le modificamos el DocumentRoot</strong>, el cual sera la carpeta del sitio que queremos Virtualizar</li>
</ul>
<p><strong>Los guardamos con [Esc]:wq</strong></p>
<p>Ahora lo agregamos a apache</p>
<p><em><strong>debianJS:/etc/apache2/sites-available# a2ensite website</strong></em></p>
<p>Y apache nos dira que lo agrego con éxito, Ojo:<strong> para evitar que Apache nos de errores, es necesario que la carpeta que el indicamos en DocumentRoot exista, si no no nos va a funcionar.</strong></p>
<p><strong>a2ensite,</strong> lo único que hace es un enlace simbólico dentro de la carpeta <strong>/etc/apache2/sites-enabled</strong> a algunos de los sitios que están en la otra carpeta<strong> /etc/apache2/sites-available</strong> , es decir  en <strong>sites-available</strong> están los sitios disponibles, y en <strong>sites-enabled</strong> están  los que podemos usar.<em><strong><br />
</strong></em><br />
<span id="more-1541"></span><br />
<em><strong>debianJS:/etc/apache2/sites-enabled# ls -la<br />
total 8<br />
drwxr-xr-x 2 root root 4096 abr 14 16:26 .<br />
drwxr-xr-x 7 root root 4096 nov  6 16:46 ..<br />
lrwxrwxrwx 1 root root   26 nov  6 16:13 000-default -> ../sites-available/default<br />
lrwxrwxrwx 1 root root   23 abr 14 16:26 website -> ../sites-available/website</strong></em></p>
<p><strong>Ahora modificamos nuestro fichero hosts, hay que tener cuidado por que Apache en mi debian tiene dos un host y otro que se llama hosts, el que vamos a modificar es hosts(con ese al final)</strong></p>
<p><em><strong>debianJS:/etc/apache2/sites-enabled# vim /etc/hosts</strong></em></p>
<p>Nos aparecera asi</p>
<p><em><strong>127.0.0.1       localhost<br />
&#8230;&#8230;.<br />
&#8230;&#8230;&#8230;.<br />
&#8230;&#8230;&#8230;&#8230;</strong></em></p>
<p>Lo unico que debemos hacer es agregar nuestro nuevo sitio de acuerdo al alias que le pusimos o bien el servername(se ve mas chido con Alias) y quedara asi</p>
<p><em><strong>127.0.0.1       localhost<br />
127.0.0.1       www.website.net<br />
..<br />
&#8230;..<br />
&#8230;&#8230;..</strong></em></p>
<p>Guardamos nuestro archivo, y con esto le decimos a nuestro Linux, que cuando teeclemos www.website.net lo busque en nuestra misma pc y no afuera.</p>
<p>Ahora solo recargamos apache</p>
<p><strong>debianJS:/etc/apache2/sites-enabled# /etc/init.d/apache2 reload</strong></p>
<p>Y listo</p>
<p>Ahora abrimos nuestro Firefox(Navegador) (acaso hay otro?) y tecleamos www.website.net y nos debe de desplegar la informacion de la carpeta /home/www/prog ya se aun index.php index.html o un listado, claro esi esta permitido en nuestra configuracion default(recuerden que de ahi sacamos toda la configuración).</p>
<p>En resumen mis comandos fueron<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<em><strong>ajaxman@debianJS:~$ su<br />
Contraseña:<br />
debianJS:/home/ajaxman# cd /etc/apache2/sites-available/<br />
debianJS:/etc/apache2/sites-available# ls -la<br />
total 24<br />
drwxr-xr-x 2 root root 4096 abr 14 16:37 .<br />
drwxr-xr-x 7 root root 4096 nov  6 16:46 ..<br />
-rw-r&#8211;r&#8211; 1 root root 1428 nov  6 17:44 default<br />
-rw-r&#8211;r&#8211; 1 root root 7366 oct  1  2008 default-ssl<br />
debianJS:/etc/apache2/sites-available# cat default&gt; website<br />
debianJS:/etc/apache2/sites-available# vim website<br />
debianJS:/etc/apache2/sites-available# vim default<br />
debianJS:/etc/apache2/sites-available# a2ensite website<br />
Site prog already enabled<br />
debianJS:/etc/apache2/sites-available# cd ..<br />
debianJS:/etc/apache2# ls<br />
apache2.conf  conf.d  envvars  httpd.conf  mods-available  mods-enabled  ports.conf  sites-available  sites-enabled<br />
debianJS:/etc/apache2# cd sites-enabled/<br />
debianJS:/etc/apache2/sites-enabled# ls -la<br />
total 8<br />
drwxr-xr-x 2 root root 4096 abr 14 16:26 .<br />
drwxr-xr-x 7 root root 4096 nov  6 16:46 ..<br />
lrwxrwxrwx 1 root root   26 nov  6 16:13 000-default -> ../sites-available/default<br />
lrwxrwxrwx 1 root root   23 abr 14 16:26 website -> ../sites-available/website<br />
debianJS:/etc/apache2/sites-enabled# vim /etc/hosts<br />
debianJS:/etc/apache2/sites-enabled# /etc/init.d/apache2 reload</strong></em><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Creo que ya quedo, espero que les sea util y bueno ya mejore mis posts o no?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/tutorial-creando-virtual-host-de-apache-usando-linux.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[Linux] Solución a la baja velocidad de internet en Open Suse 11.0</title>
		<link>http://www.ajaxman.net/linux-solucion-a-la-baja-velocidad-de-internet-en-open-suse-110.html</link>
		<comments>http://www.ajaxman.net/linux-solucion-a-la-baja-velocidad-de-internet-en-open-suse-110.html#comments</comments>
		<pubDate>Wed, 24 Sep 2008 20:11:25 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Computadoras]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[LPIC]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Open Suse]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bash]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1257</guid>
		<description><![CDATA[<p>Tal como les comente ando bien apurado con un buen de cosas, y probablemente el blog va a sufrir una ligera crisis en estos días, pero bueno, lo chido es que mis 200 Lectores de Feeds sigen activos , eso es bueno. Ahora pasando a otras cosas, les platico que desde que instale Open Suse [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Tal como les comente ando bien apurado con un buen de cosas, y probablemente el blog va a sufrir una ligera crisis en estos días, pero bueno, lo chido es que mis 200 Lectores de Feeds sigen activos <img src='http://www.ajaxman.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , eso es bueno.</p>
<p>Ahora pasando a otras cosas, les platico que desde que instale Open Suse 11, me pasaba lo siguiente cuando me conectaba a Internet, la resolución de nombres era lenta, aquí pongo una lista para que vean, como estaba la situación.</p>
<ul>
<li>Abrir Firefox 1-3 Segundos</li>
<li>Escribir Ajaxman.net  3-4 Segundos</li>
<li>Resolución de nombres de dominio (DNS) 10-20 o hasta 30 segundos</li>
<li>Respuesta de la pagina y mostrar en pantalla 5-9 Segundos</li>
<li>Si había una conexión con Twitter o con Google, o algún otro servicio, volvía ha hacer la resolución de nombres o sea otros 30 segundos mas o menos</li>
<li>Esto solo sucedía en mi pc con Linux.</li>
</ul>
<p>El problema en si no era la conexión a Internet, si no la resolución de nombres el DNS.</p>
<p>Sabia que algo tenia que hacer pero no soy tan bueno en Linux, pues estuve sufriendo así mas o menos un mes.</p>
<p>Leyendo foros y mas di con el problema, ya que a primera vista, no sabia cual era el problema, ya cuando di con el busque como resolverlo.</p>
<p>La solución era simple, modificar los dns&#8217;s. Y ¿Como hacemos eso?</p>
<p>Bueno se supone que en Suse ya todo biene mas APP(*) , pero para verlo mas Geek, lo haremos a manita.</p>
<p>Como primer paso toca modificar el archivo resolv.conf, para esto veamos que contiene dicho archivo, recuerden hacer un respaldo en caso de que algo vaya mal</p>
<p><span style="color: #800000;"><strong>Ajaxman:/home/javier #</strong></span><span style="color: #333333;"> <strong>cat  /etc/resolv.conf</strong></span></p>
<p style="text-align: center;"><img class="size-full wp-image-1258 aligncenter" title="Archivo resolv.conf" src="http://www.ajaxman.net/wp-content/uploads/2008/09/resolvconf.jpeg" alt="Archivo resolv.conf" width="516" height="660" /></p>
<p>Ahora si observamos lo siguiente</p>
<p><strong><span style="color: #333333;">#search gateway.2wire.net<br />
#nameserver 192.168.1.254</span></strong></p>
<p>Ahorita están comentados pero al principio no, osea en vez de eso que les puse estaba así</p>
<p><strong><span style="color: #333333;">search gateway.2wire.net<br />
nameserver 192.168.1.254</span></strong></p>
<p>Entonces, al parecer el problema viene de que al parecer suse, intenta resolver nombres en el router, lo cual es incorrecto, ya que el no es un servidor de DNS.</p>
<p>Entonces la solución es simple modifiquemos el archivo, agregándole unos DNS&#8217;s buenos, yo en lo personal use Open DNS, los cuales son los siguientes.</p>
<p><strong>200.33.146.233<br />
200.33.146.169</strong></p>
<p>Ahora lo editamos con el Vi</p>
<p><strong><span style="color: #993300;">Ajaxman:/home/javier #</span> <span style="color: #333333;">vim  /etc/resolv.conf</span></strong></p>
<p>Para que quede asi</p>
<div id="attachment_1259" class="wp-caption aligncenter" style="width: 526px"><img class="size-full wp-image-1259" title="Archivo resolv.conf editado" src="http://www.ajaxman.net/wp-content/uploads/2008/09/resolvconf1.jpeg" alt="Archivo resolv.conf editado" width="516" height="681" /><p class="wp-caption-text">Archivo resolv.conf editado</p></div>
<p style="text-align: center;">
<p>Ahora bien, ya debe de funcionar bien, sin embargo tendremos un problema, cada vez que, reiniciemos la tarjeta de red (NIC), o cuando reiniciamos el servicio <strong>dhclient, </strong>veremos que nos borrar este archivo y nos lo deja como estaba al principio.</p>
<p>Bien para solucionar esto basta con editar dos archivos(en estos no pongo capturas por que están muy grandes los archivos), el primero es.</p>
<p><strong><span style="color: #993300;">Ajaxman:/home/javier #</span> <span style="color: #333333;">vim /etc/sysconfig/network/dhcp</span></strong></p>
<p><span id="more-1257"></span></p>
<p>En donde buscaremos lo siguiente</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p><span style="color: #333333;">## Type:        yesno<br />
## Default:     yes<br />
#<br />
# Should the DHCP client modify /etc/resolv.conf at all?<br />
# If not, set this to &#8220;no&#8221;. (The default is &#8220;yes&#8221;)<br />
#<br />
# resolv.conf will also stay untouched when MODIFY_RESOLV_CONF_DYNAMICALLY<br />
# in /etc/sysconfig/network/config is set to &#8220;no&#8221;.<br />
#<strong><br />
DHCLIENT_MODIFY_RESOLV_CONF=&#8221;yes&#8221;</strong></span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Y cambiaremos lo que esta en negritas , pondremos no quedando asi</p>
<p><span style="color: #333333;"><strong>DHCLIENT_MODIFY_RESOLV_CONF=&#8221;no&#8221;</strong></span></p>
<p>Lo guardamos y ahora abrimos este</p>
<p><strong><span style="color: #993300;">Ajaxman:/home/javier #</span> <span style="color: #333333;">vim /etc/sysconfig/network/config</span></strong></p>
<p>Y ahi buscamos</p>
<p>## Type:        yesno<br />
## Default:     yes<br />
# There are some services (ppp, ippp, dhcp-client, pcmcia, hotplug) that have to<br />
# change the /etc/resolv.conf dynamically at certain times.  E.g. if ppp/ippp<br />
# establishes a connection and is supplied by the peer with a list of<br />
# nameservers. Or pcmcia needs to set the correct nameserver for the choosen<br />
# configuration scheme. If you don&#8217;t like these services to change<br />
# /etc/resolv.conf at all, then set this variable to &#8220;no&#8221;.<br />
# If unsure, leave it at the default (which is &#8220;yes&#8221;).<br />
#<br />
<span style="color: #333333;"><strong>MODIFY_RESOLV_CONF_DYNAMICALLY=&#8221;no&#8221;</strong></span></p>
<p>## Type:        yesno<br />
## Default:     no<br />
# Like MODIFY_RESOLV_CONF_DYNAMICALLY, except it modifies<br />
# /etc/named.d/forwarders.conf instead of resolv.conf.<br />
# If unsure, leave it at the default (which is &#8220;no&#8221;).<br />
<span style="color: #333333;">#<br />
<strong>MODIFY_NAMED_CONF_DYNAMICALLY=&#8221;no&#8221;</strong></span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Y tambien lo que esta en negritas lo ponemos en NO, en mi caso ya lo deje en no.</p>
<p>Y ahora si podemos reiniciar la interfaz de red y siempre conservara los valores del DNS.</p>
<p>Bueno un pequeño pero valioso tutorial, créanme que fue muy difícil encontrar dicha solución.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/linux-solucion-a-la-baja-velocidad-de-internet-en-open-suse-110.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[Php] Cargando clases en Php 5 !!sin dolores de cabeza!!</title>
		<link>http://www.ajaxman.net/php-cargando-clases-en-php-5-sin-dolores-de-cabeza.html</link>
		<comments>http://www.ajaxman.net/php-cargando-clases-en-php-5-sin-dolores-de-cabeza.html#comments</comments>
		<pubDate>Wed, 20 Aug 2008 16:55:13 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Manual]]></category>
		<category><![CDATA[Php5]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=1144</guid>
		<description><![CDATA[<p>Hasta hoy creo que voy a escribir algo sobre Php, una categoría que tenia algo de olvidada por este blog, y se trata de algo muy simple digamos que es un tip, es una forma de cargar clases en Php 5 sin hacer un relajo. Les cuento a que viene el caso o la situación, [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Hasta hoy creo que voy a escribir algo sobre Php, una categoría que tenia algo de olvidada por este blog, y se trata de algo muy simple digamos que es un tip, es una forma de<strong> </strong>cargar<strong> clases en Php 5</strong> sin hacer un relajo.</p>
<p>Les cuento a que viene el caso o la situación, estoy creando una clase en <strong>Php, </strong>para manejar unas cosas, sin embargo son 3 cosas diferentes, vamos, tendré que usar 3 clases diferentes, ya que se trata de cosas distintas, ahora bien, para usar una clase el <strong>php</strong> se haría de la siguiente forma.</p>
<p></p><pre class="crayon-plain-tag">&lt; ?php
include (&quot;clases/calcula.inc.php&quot;);
$calcula=new Calcula();
?&gt;</pre><p></p>
<p>El problema surge cuando deseamos utilizar varias clases, las cuales a veces por facilidad y por costumbre las almacenamos en archivos diferentes, el ejemplo se vería mas o menos de esta forma</p>
<p></p><pre class="crayon-plain-tag">&lt; ?php
include (&quot;clases/cacula.inc.php&quot;);
include (&quot;clases/suma.inc.php&quot;);
include (&quot;clases/resta.inc.php&quot;);
include (&quot;clases/raiz.inc.php&quot;);
$calc=new Calcula();

$sum=new Suma();

$rest=new Resta();
?&gt;</pre><p></p>
<p>Esto DESAFORTUNADAMENTE se tendrá que hacer si tenemos<strong> php 4</strong> en nuestro server,<strong> ya que si tenemos Php 5 podemos usar autoload, una función nativa de php5, </strong>como lo indica la documentacion de Php.</p>
<p><strong><em>Puede definir una función     __autoload la cual es llamada automáticamente en caso de que    intente usar una clase que no ha sido definida aún. Al llamar     esta función la ejecución del script da una última    oportunidad de cargar la clase antes de que PHP falle con un error. </em></strong></p>
<p>Aqui les pongo un ejemplo de como quedaría nuestro código anterior</p>
<p></p><pre class="crayon-plain-tag">&lt; ?php

function __autoload($nombre_de_clase) {
require_once $nombre_de_clase . '.php';
}

$calc=new Calcula();

$sum=new Suma();

............
?&gt;</pre><p></p>
<p>Como vemos es muy simple, espero que les ayude, ya que a mi no me ayudara mucho, por que en uno de los servers donde haré esto usa php 4 <img src='http://www.ajaxman.net/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  pues ya que, si a ti te sirvió coméntanos, como la usaste.</p>
<p>Mas información | <a href="http://www.php.net/manual/es/language.oop5.autoload.php" target="_blank">Auto carga de Objetos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-cargando-clases-en-php-5-sin-dolores-de-cabeza.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.ajaxman.net @ 2012-05-21 18:48:25 -->
