Question

Je suis en train de créer un widget dans le module puis chargez ce widget de « l'extérieur » du module. Plus particulièrement, je suis en utilisant le module utilisateur écrit par quelqu'un d'autre. Je ne veux pas avoir une page séparée pour afficher un formulaire de connexion, donc j'ai essayé de faire un CPortlet / widget (confusion) afficher le formulaire de connexion. En fait, je l'ai déplacé le code de LoginController dans ce widget. Ensuite, je tente d'afficher le widget sur une page au hasard par

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

Cependant, je reçois une erreur

CWebApplication does not have a method named "encrypting".

dans la classe UserIdentity dans cette ligne:

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

Cela arrive, parce que je suis essentiellement essayer d'exécuter ce code dans le contexte de l'application et non le module. Ainsi, le "Yii :: app () -> controller-> module". Astuce ne fonctionne pas vraiment comme prévu

  1. Qu'est-ce que je fais mal: - \
  2. Y at-il une meilleure façon d'y parvenir. C'est à dire. afficher cette forme de connexion dans une autre page, qui est normalement affiché en accédant à contrôleur de connexion dans le module utilisateur (utilisateur / login) ou est un widget la bonne façon de le faire?

Merci.

Était-ce utile?

La solution

La solution rapide

Ok, donc je simplement fini par faire

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

au lieu de

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

Notez que maintenant le module doit être appelé « utilisateur » dans la configuration principale, mais je pense que cela permet une plus grande souplesse. C'est à dire. nous ne sommes pas tenus d'utiliser uniquement les fonctionnalités du module dans le module.

aperçu supplémentaire sur l'affichage un widget en dehors du champ du module

Après avoir joué plus avec ce qui est ce que je l'ai fait. Dans le UserModule.php j'ai créé une méthode

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

Alors partout où j'ai besoin du module que j'utilise

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

Je liés au module comme aime ne pas avoir beaucoup d'importations:

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

Parce que nous avons déjà ces importations dans le 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.*',
    ));
}

Par conséquent, chaque fois que vous savez que certains morceau de fonctionnalité sera utilisée en dehors du module, il est important de vous assurer que le module est chargé. Par exemple, dans le widget LoginForm que je suis en train d'afficher pas dans l'un des contrôleurs de module, j'ai cette ligne de code:

$model = new UserLogin;

Cependant, UserLogin est un modèle à l'intérieur du module de l'utilisateur, et afin de pouvoir charger automatiquement ce modèle il faut d'abord assurer que le module a été initialisés:

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

J'espère que cela sera utile si vous étiez coincé avec le concept des modules comme je l'étais. http://www.yiiframework.com /forum/index.php?/topic/6449-access-another-modules-model/ était utile mais difficile à trouver =)

Autres conseils

Vous feriez mieux de déplacer que le cryptage () dans une classe de MyUserIdentiy qui s'étend CUserIdentity. Quel que soit le code que vous prenez à utiliser, ils mettre la méthode dans le contrôleur est une mauvaise idée et par conséquent vous ne pouvez pas réutiliser ce code.

Le formulaire de connexion doit encore poster à l'utilisateur / contrôleur de connexion, mais je suppose qu'ils utilisent un code de connexion standard et vous Yii pourraient vouloir modifier pour utiliser le MyUserIdentity.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top