¿Que es un filtro y para que sirven?

Un filtro es una sentencia que ayuda a validar una condición xD.

Por lo general sirven para no reescribir el código en cada uno de los .php que debemos validar, lo cual no ahorra tiempo y errores ante la edición del filtro 🙂

Para este ejemplo , se creara un filtro que valida la condición de logeado o no logeado para poder desplegar información  de los usuarios registrados en Yii (para ver manejo de usuarios pincha acá)

El problema :

Como se puede ver, podemos acceder mediante la url a información de todos los usuarios registrados en el sitio, sin tener que estar logeados como administrador lo cual es muy malo D:

Screenshot from 2013-06-01 17:39:10

Para ello vamos a crear un filtro que verifique si el usuario esta logeado o no para mostrar la información o un error 😉

para ello vamos a meter mano en :

../protected/controllers/<span style="color: #ff0000;">nombre_del_controlador_de_usuarios.php</span>

aqui debajo de la función “public function filters()”, agregamos nuestro filtro:

public function filterEsMio($filterChain) {
if(Yii::app()->user->isGuest){
throw new CHttpException(300, 'Usted no tiene acceso a este sitio');
}

else{
$dataProvider=new CActiveDataProvider('USER');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
}

Donde “Yii::app()->user->isGuest”, nos entrega en true o un false si el usuario “No esta logeado” o si “el usuario esta logeado”

En el else realice un copy y paste de la función actionIndex(), para desplegar el contenido :).

ahora vamos a “function filters()” y agregamos ”   ‘esMio + index’  “, dando como resultado:

public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'postOnly + delete', // we only allow deletion via POST request
<span style="color: #ff6600;">'esMio + index'</span>
);
}

done la sintaxis del filtro es:

‘nombre_del_filtro + nombre_pagina ‘  //APLICA EL FILTRO EN nombre_pagina, si queremos otra pagina basta con una coma y nombre_pagina_dos

‘nombre_del_filtro – nombre_pagina ‘//NO APLICA EL FILTRO EN nombre_pagina

‘nombre_del_filtro’ //APLCIA EL FILTRO EN TODAS LAS VISTAS, en este caso del controlador “uSER”

dando como resultado :

Screenshot from 2013-06-01 17:38:03

Saludos!