Pregunta

Estoy tratando de crear un widget dentro del módulo y luego cargar ese widget desde el 'exterior' del módulo. En particular, estoy usando el módulo de usuario escrito por otra persona. No quiero tener una página separada para mostrar un formulario de inicio de sesión, por lo tanto, intenté hacer un Cortelete/Widget (confusión) que muestra el formulario de inicio de sesión. Básicamente, moví el código de Logincontroller a ese widget. Luego intento mostrar el widget en una página aleatoria por

<?php $this->widget('user.components.LoginForm'); ?>

Sin embargo, recibo un error

CWebApplication does not have a method named "encrypting".

en la clase de identidad de usuario en esta línea:

else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)

Esto sucede, porque básicamente estoy tratando de ejecutar este código dentro del contexto de la aplicación y no el módulo. Por lo tanto, el truco "YII :: App ()-> Controller-> Module" realmente no funciona como se esperaba.

  1. Qué estoy haciendo mal:-
  2. ¿Hay una mejor manera de lograr esto? Es decir, visualice ese formulario de inicio de sesión en alguna otra página, que normalmente se muestra accediendo al controlador de inicio de sesión dentro del módulo de usuario (usuario/inicio de sesión) o es un widget la forma correcta de hacerlo?

Gracias.

¿Fue útil?

Solución

La solución rápida

Ok, entonces simplemente terminé haciendo

Yii::app()->getModule('user')->encrypting($this->password)

en vez de

Yii::app()->controller->module->encrypting($this->password)

Observe que ahora el módulo deber ser llamado 'usuario' en la configuración principal, pero creo que esto permite más flexibilidad. Es decir, no estamos obligados a usar solo la funcionalidad del módulo dentro del módulo.

Información adicional sobre la visualización de widget fuera del alcance del módulo

Después de jugar más con él, eso es lo que hice. En usermodule.php he creado un método

public static function id() {
    return 'user';
}

Luego en todas partes donde necesito el módulo que uso

Yii::app()->getModule(UserModule::id())->encrypting($this->password)

No me gusta tener muchas importaciones relacionadas con el módulo como:

'application.modules.user.models.*',
'application.modules.user.components.*',

Porque ya tenemos esas importaciones en usermodule.php:

public function init()
{
    // this method is called when the module is being created
    // you may place code here to customize the module or the application

    // import the module-level models and components
    $this->setImport(array(
        'user.models.*',
        'user.components.*',
    ));
}

Por lo tanto, siempre que sepa que se utilizará alguna funcionalidad fuera del módulo, es importante asegurarse de que el módulo esté cargado. Por ejemplo, en el widget de registro de loginform que estoy tratando de mostrar no en uno de los controladores del módulo, tengo esta línea de código:

$model = new UserLogin;

Sin embargo, UserLogin es un modelo dentro del módulo de usuario, y para poder poder automardear este modelo, primero debemos asegurarnos de que el módulo se inicialice:

$module = Yii::app()->getModule(UserModule::id());
$model = new UserLogin;

Espero que esto sea útil si estuviste atrapado con todo el concepto de módulos como yo.http://www.yiiframework.com/forum/index.php?/topic/6449-access-anothermodules-model/ fue útil pero difícil de encontrar =)

Otros consejos

Será mejor que mueva ese encripting () a una clase myuseridentiy que extiende CuserIentity. Cualquiera que sea el código que tome para usar, poniendo el método en el controlador es una mala idea y, como resultado, no puede reutilizar ese código.

El formulario de inicio de sesión aún debe publicar en el controlador de usuario/inicio de sesión, pero supongo que usan el código de inicio de sesión estándar de YII y es posible que desee modificarlo para usar la MyUserIentity.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top