Autoload modulos

Alguien por aqui ya trabajo desarrollando una aplicación que de forma automatica cargue los modulos que tienen en la carpeta modules … eso sin tener que escribirlos en el archivo de configuracion ?? asi como lo hace wordpress … alguna idea ?

Lo que me imagino que podrías hacer es cargarlos con un componente de modulo sobreescribiendo el CWebApplication __get para los módulos…

Igualmente deberías tener cuidado para que no pierdas performance ya que esto no es muy veloz normalmente.

Saludos,

my suggestion would be you set

‘modules’ => require_once(‘modules.php’)

and in modules.php put some code to read the modules folder and return the corresponding array…don’t know if it would work or if it is the best practice…but thats a thought

regards!

Es una buena solución, el tema esta en como configuras los módulos. Con lo que te dije podrías inclusive utilizar el mismo framework (AR, Cache, etc) para hacer la carga de los mismos.

Saludos,

Yo he encontrado la solución en un Blog que no recuerdo en este momento.

Te pego la documentación que tengo con ejemplo de implementación y espero te sirva…

Saludos!


[center][b]Como hacer que Yii reconozca modulos automaticamente

[/b][/center]

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

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:

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:

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;

}

else

return 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.