<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog -  El TallerWeb &#187; Yii</title>
	<atom:link href="http://blog.eltallerweb.com/category/programacion/yii/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.eltallerweb.com</link>
	<description>Blog para apasionados al diseño y desarrollo Web</description>
	<lastBuildDate>Tue, 16 Jun 2015 20:26:30 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Reporte de errores a Correo</title>
		<link>http://blog.eltallerweb.com/reporte-de-errores-a-correo/</link>
		<comments>http://blog.eltallerweb.com/reporte-de-errores-a-correo/#comments</comments>
		<pubDate>Thu, 28 May 2015 21:52:07 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=883</guid>
		<description><![CDATA[Buenas tardes a todos Continuando con la construcción de nuestro sitio web con Yii Framework, vamos a ver un tema muy importante para asegurarnos que nuestro servicio esté el mayor tiempo posible cumpliendo con sus objetivos, ]]></description>
				<content:encoded><![CDATA[<div><strong>Buenas tardes a todos</strong></div>
<div></div>
<div>Continuando con la construcción de nuestro sitio web con Yii Framework, vamos a ver un tema muy importante para asegurarnos que nuestro servicio esté el mayor tiempo posible cumpliendo con sus objetivos, y que cualquier error que tengamos podamos rastrearlo. Para esto tenemos que tomar en cuenta que nuestro sistema puede tener fallas si no se realizaron las pruebas necesarias, y que no podemos dejar que los usuarios vean la vista de debug que el framework trae por default ya que no genera confianza y además les permite ver cosas que no deben de ver.</div>
<div></div>
<div>Para esto tenemos que modificar en nuestro sistema operando en producción el archivo index.php que se encuentra en la raíz de nuestro proyecto similar a lo que se apunta a continuación:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;?php&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;// change the following paths if necessary&lt;/div&gt;
&lt;div&gt;$yii=dirname(__FILE__).'/../../../opt/yii-1.1.14.f0fee9/framework/yii.php';&lt;/div&gt;
&lt;div&gt;$config=dirname(__FILE__).'/protected/config/main.php';&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;// remove the following lines when in production mode&lt;/div&gt;
&lt;div&gt;//defined('YII_DEBUG') or define('YII_DEBUG',true);&lt;/div&gt;
&lt;div&gt;// specify how many levels of call stack should be shown in each log message&lt;/div&gt;
&lt;div&gt;//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;require_once($yii);&lt;/div&gt;
&lt;div&gt;Yii::createWebApplication($config)-&gt;run();&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div></div>
<div>Comentando esas dos lineas, desactivamos la vista de debug, pero nos falta que en la vista de nuestro sistema no aparezca el código y descripción del error, información que es útil para el debug pero no para los usuarios de nuestro sitio, así que en protected/views/site/error, cambiamos el siguiente código:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;h2&gt;Error &lt;?php echo $code; ?&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div class=&quot;error&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;?php echo CHtml::encode($message); ?&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div>por:</div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;h2&gt;Ha ocurrido un problema&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div class=&quot;error&quot;&gt;&lt;/div&gt;
&lt;div&gt;Es posible que los datos ingresados no sean correctos, favor de verificarlos y de persistir el problema comunicarse con el área correspondiente&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div></div>
<div>Con esto, ya no le mostraríamos errores a nuestros usuarios, pero aun tenemos el problema de que nadie del staff que desarrolla el proyecto se enteraría de que hay un problema con el funcionamiento, así que modificaremos nuestro protected/controller/SiteController.php para que nos haga un envió de la información del error:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;?php&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;public function actionError() {&lt;/div&gt;
&lt;div&gt;        if ($error = Yii::app()-&gt;errorHandler-&gt;error) {&lt;/div&gt;
&lt;div&gt;            if ($error[&quot;code&quot;] != 404 &amp;&amp; $error[&quot;code&quot;] != 403) {&lt;/div&gt;
&lt;div&gt;                $content = &quot;&quot;;&lt;/div&gt;
&lt;div&gt;                foreach ($error as $key =&gt; $item) {&lt;/div&gt;
&lt;div&gt;                    if ($key == &quot;traces&quot;) {&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;$key: &quot;;&lt;/div&gt;
&lt;div&gt;                        $content.= json_encode($item);&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;&lt;br /&gt;&quot;;&lt;/div&gt;
&lt;div&gt;                    } else {&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;$key: $item&lt;br /&gt;&quot;;&lt;/div&gt;
&lt;div&gt;                    }&lt;/div&gt;
&lt;div&gt;                }&lt;/div&gt;
&lt;div&gt;                //echo $content;&lt;/div&gt;
&lt;div&gt;                $remitente=&quot;&lt;a href=&quot;mailto:prueba@prueba.com&quot; target=&quot;_blank&quot;&gt;prueba@prueba.com&lt;/a&gt;&quot;&lt;/div&gt;
&lt;div&gt;funcion_enviar_correo($remitente, $body);&lt;/div&gt;
&lt;div&gt;            }&lt;/div&gt;
&lt;div&gt;            if (Yii::app()-&gt;request-&gt;isAjaxRequest)&lt;/div&gt;
&lt;div&gt;                echo $error['message'];&lt;/div&gt;
&lt;div&gt;            else&lt;/div&gt;
&lt;div&gt;                $this-&gt;render('error', $error);&lt;/div&gt;
&lt;div&gt;        }&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div>Lo que hacemos en esta función es que recibimos el error que se presentó, si es error de no encontrado o no autorizado no enviamos ningún correo ya que no debería ser necesario, y si es otro error lo ponemos en texto plano y lo enviamos a través de cualquier función de correo que a ustedes les convenga.</div>
<div></div>
<div>Esto suele ser de mucha utilidad para darte cuenta de errores sin darlo a notar con los usuarios del sistema, así que es muy recomendable. Espero les sea muy útil y sigan programando agilmente.</div>
<div></div>
<div>Felices Códigos</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/reporte-de-errores-a-correo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usuarios y Sessiones en Yii</title>
		<link>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/</link>
		<comments>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/#comments</comments>
		<pubDate>Tue, 19 May 2015 17:36:08 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[sesiones]]></category>
		<category><![CDATA[usuarios]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii framework]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=855</guid>
		<description><![CDATA[Buenas tardes a todos Para ir un poco mas adelante en la construcción de un sitio web con Yii Framework nos encontramos con un tema básico en el desarrollo de cualquier sistema, la implementación de un ]]></description>
				<content:encoded><![CDATA[<p class="p1"><span class="s1">Buenas tardes a todos</span></p>
<p class="p1"><span class="s1">Para ir un poco mas adelante en la construcción de un sitio web con Yii Framework nos encontramos con un tema básico en el desarrollo de cualquier sistema, la implementación de un sistema de logueo, usuarios, roles y permisos para diferentes acciones en el sistema.</span></p>
<p class="p1"><span class="s1">Comenzando por explicar como tiene Yii configurado en su sistema base el logueo, nos encontramos con una acción en el controller &#8220;site/login&#8221; en la cual recibe la información de un formulario con usuario y contraseña.</span></p>
<pre class="brush: php; title: ; notranslate">

public function actionLogin() {
$model = new LoginForm;

// if it is ajax validation request
if (isset($_POST['ajax']) &amp;&amp; $_POST['ajax'] === 'login-form') {
 echo CActiveForm::validate($model);
 Yii::app()-&gt;end();
}

// collect user input data
if (isset($_POST['LoginForm'])) {
 $model-&gt;attributes = $_POST['LoginForm'];
 // validate user input and redirect to the previous page if valid
 if ($model-&gt;validate() &amp;&amp; $model-&gt;login())
$this-&gt;redirect(array(&quot;perfil&quot;));
}
// display the login form
$this-&gt;render('login', array('model' =&gt; $model));
}

</pre>
<p class="p1"><span class="s1">Esta acción a menos que tengamos algún requerimiento muy específico no debe cambiar, ya que solo nos permite desplegar el formulario y cuando ingresa la información mandarla a validar, a donde? pues esa es una pregunta importante.</span></p>
<p class="p1"><span class="s1">En &#8220;protected/components/UserIdentity&#8221; nos encontramos con una función llamada authenticate, que por default valida sobre un Array, que contiene los usuarios admin y demo, y que sirven en la forma más sencilla de nuestro sistema, pero que puede ser sustituida por:</span></p>
<pre class="brush: php; title: ; notranslate">

public function authenticate() {
$registro = Usuario::model()-&gt;findByAttributes(array('email' =&gt; $this-&gt;username));

if ($registro === null) {
$this-&gt;errorCode = self::ERROR_USERNAME_INVALID;
} else if ($registro-&gt;password === crypt($this-&gt;password,$registro-&gt;salt)) {//
$this-&gt;setState('id_usuario', $registro-&gt;id);
$this-&gt;setState('id_rol', $registro-&gt;id_rol);
$this-&gt;errorCode = self::ERROR_NONE;
} else {
$this-&gt;errorCode = self::ERROR_PASSWORD_INVALID;
}
return !$this-&gt;errorCode;
}

</pre>
<p class="p1"><span class="s1">El código anterior consulta nuestra base de datos buscando el usuario con el que coincida el correo que fue ingresado en el formulario de login, una vez encontrado, si existe, compara la contraseña almacenada en la base con la que fue enviado por el usuario, utilizando el mismo método de cifrado que se utilizó para almacenarla al principio.</span></p>
<p class="p1"><span class="s1">Una vez comparado, y si no manda error, se declaran las variables de sesión que pudiéramos utilizar en el sistema para identificar a este usuario. Se pueden definir tantas variables como sea necesario, recordando que si se agrega una nueva variable o modifica la información, esta se tomará en cuanta cuando se vuelvan a loguear.</span></p>
<p class="p1"><span class="s1">Estas variables podrán ser utilizadas a lo largo de la sesión del usuario utilizando las variables con formato:</span></p>
<pre class="brush: php; title: ; notranslate"> 
Yii::app()-&gt;user-&gt;id_usuario;
</pre>
<p class="p1"><span class="s1">Una buena practica es utilizar primero un &#8220;isset&#8221; para ver si el usuario de verdad tiene sesión, de lo contrario, el sistema arrojara un error al no encontrar dicha variable.</span></p>
<p class="p1"><span class="s1">En cuanto a los roles en las acciones, los controladores generados con crud, traen por default el access rules, que define quien si y quien no, pasa a las acciones correspondientes del controlador:</span></p>
<pre class="brush: php; title: ; notranslate">

public function accessRules() {
return array(
 array('allow', // allow all user perform 'index' and 'view' actions
'actions' =&gt; array('index', 'view'),
'users' =&gt; array('*'),
 ),
 array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions' =&gt; array('create', 'update'),
'users' =&gt; array('@'),
 ),
 array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions' =&gt; array('admin', 'delete'),
'users' =&gt; array('admin'),
 ),
 array('deny', // deny all users
'users' =&gt; array('*'),
 ),
);
}

</pre>
<p class="p1"><span class="s1">Como podemos ver, tenemos cuatro escenarios:</span></p>
<p class="p1"><span class="s1">En el primero, permitimos a todos los usuarios(*) entrar a la accion index y view</span></p>
<p class="p1"><span class="s1">En el segundo, permitimos a todos los usuarios que tengan sesión iniciada(@) entrar a la acción create y update</span></p>
<p class="p1"><span class="s1">En el tercero, permitimos a todos los usuarios que tengan sesión iniciada y que su usuario sea admin(admin) entrar a la acción admin y delete</span></p>
<p class="p1"><span class="s1">En el cuarto, Negamos cualquier acción que no haya sido definida antes</span></p>
<p class="p1"><span class="s1">Pero como esto no aplica para todos los casos, sino que podemos manejar roles, podríamos poner una regla como la siguiente:</span></p>
<pre class="brush: php; title: ; notranslate">
array('allow',
'actions' =&gt; array('create', 'update'),
'users' =&gt; array('@'),
'expression' =&gt; 'Yii::app()-&gt;user-&gt;id_rol==1 || Yii::app()-&gt;user-&gt;id_rol==3',
),
</pre>
<p class="p1"><span class="s1">Con esta regla, permitimos a todos los usuarios con sesión y que cuenten con un rol de usuario 1 o 2 a que ejecuten la acción create y update.</span></p>
<p class="p1"><span class="s1">Existen otra formas de llevar a cabo acciones, permisos y roles, aunque esta puede adaptarse a las necesidades de tu proyecto, espero les sea útil</span></p>
<p class="p1"><span class="s1">Felices Códigos</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
