Pergunta
Estou tentando criar um widget dentro do módulo e, em seguida, carregar esse widget de 'fora' do módulo. Mais particularmente, estou usando o módulo de usuário escrito por outra pessoa. Não quero ter uma página separada para exibir um formulário de login; portanto, tentei fazer um cportlet/widget (confusão) exibindo o formulário de login. Basicamente, movi o código do Logincontroller para esse widget. Então eu tento exibir o widget em alguma página aleatória por
<?php $this->widget('user.components.LoginForm'); ?>
No entanto, eu recebo um erro
CWebApplication does not have a method named "encrypting".
Na classe UserIdentity nesta linha:
else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)
Isso acontece, porque estou basicamente tentando executar esse código no contexto do aplicativo e não no módulo. Assim, o truque "yii :: app ()-> controlador-> módulo" não funciona realmente como esperado.
- O que estou fazendo errado:-
- Existe uma maneira melhor de conseguir isso. Ou seja, exibir esse formulário de login em outra página, que normalmente é exibida acessando o controlador de login no módulo de usuário (usuário/login) ou é um widget da maneira certa de fazê -lo?
Obrigado.
Solução
A solução rápida
Ok, então eu simplesmente acabei fazendo
Yii::app()->getModule('user')->encrypting($this->password)
ao invés de
Yii::app()->controller->module->encrypting($this->password)
Observe que agora o módulo devo ser chamado de 'usuário' na configuração principal, mas acho que isso permite mais flexibilidade. Ou seja, não somos obrigados a usar apenas a funcionalidade do módulo dentro do módulo.
Insight adicional sobre a exibição do widget fora do escopo do módulo
Depois de jogar mais com isso, foi o que eu fiz. No usermodule.php eu criei um método
public static function id() {
return 'user';
}
Então em todos os lugares onde eu preciso do módulo que uso
Yii::app()->getModule(UserModule::id())->encrypting($this->password)
Não gosto de ter muitas importações relacionadas ao módulo como:
'application.modules.user.models.*',
'application.modules.user.components.*',
Porque já temos essas importações no 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.*',
));
}
Portanto, sempre que você souber que alguma peça de funcionalidade será usada fora do módulo, é importante garantir que o módulo seja carregado. Por exemplo, no widget loginform que estou tentando exibir não em um dos controladores de módulos, tenho essa linha de código:
$model = new UserLogin;
No entanto, o UserLogin é um modelo dentro do módulo de usuário e, para poder automatizar esse modelo, primeiro temos que garantir que o módulo fosse inicializado:
$module = Yii::app()->getModule(UserModule::id());
$model = new UserLogin;
Espero que isso seja útil se você estivesse preso a todos os módulos conceitos do jeito que eu era.http://www.yiiframework.com/forum/index.php?/topic/6449-access-another-modules-model/ foi útil, mas difícil de encontrar =)
Outras dicas
É melhor você mover esse criptografia () para uma classe myUserIdiDiy que estende a CUSERIDIDENTIDADE. Qualquer que seja o código que você leva para usar, eles colocam o método no controlador é uma má idéia e, como resultado, você não pode reutilizar esse código.
O formulário de login ainda deve postar no controlador de usuário/login, mas acho que eles usam o código de login padrão do YII e você pode modificá -lo para usar o MyUserIdentity.