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.

  1. O que estou fazendo errado:-
  2. 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top