Facebook Fanpage


martes, 23 de octubre de 2012

Como hacer que Yii reconozca modulos automaticamente


Escenario :
Necesitamos que la aplicacion al cargar, reconozca los modulos que tenga incluido, mas los modulos que puedan tener estos otros modulos.

¿Que debemos hacer?

En el fichero de inicio de la aplicacion (index.php) sustituí
Yii::createWebApplication($config)->run();
por

Código PHP:
class VRSTWebApplication extends CWebApplication{public function __construct($config=null){parent::__construct($config);
$this->_configurarModulosAplicacion();}
private function _configurarModulosAplicacion(){$modulos=array();$mods=AyudaModulo::modulosExistentes(realpath(Yii::app()->basePath . DIRECTORY_SEPARATOR . 'modules'));foreach($mods as $mod) {$this->setImport(array('application.modules.'.$mod.'.models.*','application.modules.'.$mod.'.components.*',));$this->setModules(array($mod=>array('id'=>$mod)));
$modulo=$this->getModule($mod);}}
}$webApp=new VRSTWebApplication($config);$webApp->run();




Esto para detectar los modulos que existen dentro de la carpeta protected/modules y configurarselos a la aplicacion.
La linea $modulo=$this->getModule($mod); me sirve para que cada modulo configurado al cargarse tambien "recargue" los modulos que tenga dentro.
Para esto cree una clase que hereda de CWebModule y pongo todos mis modulos a heredar de ella.

Esta clase tiene un metodo que se se encarga de cargar los modulos interiores, este es el codigo:




Código PHP:
private function _configurarModulosComponentes(){$this->setImport(array($this->id.'.models.*',$this->id.'.components.*',));
$mods=AyudaModulo::modulosExistentes($this->modulePath);foreach($mods as $mod) {$strMod=strtolower($mod);$this->setImport(array($this->id.'.'.$strMod.'.models.*',$this->id.'.'.$strMod.'.components.*',));
$this->setModules(array($strMod=>array('id'=>$strMod)));$modulo=$this->getModule($strMod);}}



Como resolver lo del usuario?
En esta misma clase redefinír el metodo:



Código PHP:
public function beforeControllerAction($controller, $action){if(parent::beforeControllerAction($controller, $action)){if ((Yii::app()->session['usuarioNombre']=='')||(Yii::app()->session['usuarioClave']=='')){$controller->redirect(Yii::app()->homeUrl);}if (Yii::app()->user->isGuest){$LoginForm = new LoginForm;$LoginForm->username = Yii::app()->session['usuarioNombre'];$LoginForm->password = Yii::app()->session['usuarioClave'];$LoginForm->login();}
return true;}elsereturn false;}


Basicamente lo que se hace es preguntar por dos variables de sesión, usuarioNombre y usuarioClave, si estan vacias redirecciono para homeUrl, si no entonces creo un nuevo modelo LoginForm y hago Login.




0 comentarios:

Publicar un comentario