Frage

Ich versuche, ein Widget innerhalb des Moduls zu erstellen und dann dieses Widget von 'Outside' des Moduls zu laden. Insbesondere verwende ich Benutzermodul von jemand anderem. Ich möchte keine separate Seite zum Anzeigen eines Anmeldeformulars haben. Daher habe ich versucht, ein Cportlet/Widget (Verwirrung) zu erstellen, das das Anmeldeformular anzeigt. Grundsätzlich habe ich den Code von Logincontroller in dieses Widget verschoben. Dann versuche ich, das Widget auf einer zufälligen Seite von anzuzeigen

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

Ich bekomme jedoch einen Fehler

CWebApplication does not have a method named "encrypting".

in der Benutzeridentitätsklasse in dieser Zeile:

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

Dies geschieht, weil ich im Grunde versuche, diesen Code im Kontext der App und nicht im Modul auszuführen. So funktioniert der Trick "yii :: app ()-> Controller-> Modul" nicht wirklich wie erwartet.

  1. Was mache ich falsch:-
  2. Gibt es einen besseren Weg, dies zu erreichen? IE Zeigen Sie dieses Anmeldeformular auf einer anderen Seite an, die normalerweise durch den Zugriff auf Anmeldesteuerung innerhalb des Benutzermoduls (Benutzer/Login) angezeigt wird, oder ist ein Widget der richtige Weg, dies zu tun?

Vielen Dank.

War es hilfreich?

Lösung

Die schnelle Lösung

Ok, also habe ich einfach gemacht

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

Anstatt von

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

Beachten Sie, dass jetzt das Modul jetzt muss Seien Sie in der Hauptkonfiguration als "Benutzer" bezeichnet, aber ich denke, dies ermöglicht mehr Flexibilität. Dh wir sind nicht verpflichtet, die Modulfunktionalität innerhalb des Moduls nur zu verwenden.

Zusätzliche Einblicke in das Anzeigen von Widget außerhalb des Modulbereichs

Nachdem ich mehr damit gespielt habe, habe ich das getan. Im Usermodule.php habe ich eine Methode erstellt

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

Dann überall, wo ich das Modul brauche, das ich benutze

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

Ich mag es nicht, viele Importe im Zusammenhang mit dem Modul zu haben wie:

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

Weil wir diese Importe bereits im Usermodule.php haben:

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.*',
    ));
}

Wenn Sie also wissen, dass außerhalb des Moduls ein Stück Funktionalität verwendet wird, ist es wichtig, dass das Modul geladen ist. Zum Beispiel habe ich im LoginForm -Widget, das ich nicht in einem der Modulcontroller anzeigen möchte, diese Codezeile:

$model = new UserLogin;

UserLogin ist jedoch ein Modell innerhalb des Benutzermoduls, und um dieses Modell automatisch zu automatisieren, müssen wir zunächst sicherstellen, dass das Modul initialisiert wurde:

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

Ich hoffe, das wird hilfreich sein, wenn Sie mit dem gesamten Modulkonzept festgefahren sind, wie ich war.http://www.yiiframework.com/forum/index.php?/topic/6449-access-another-modules-model/ war nützlich, aber schwer zu finden =)

Andere Tipps

Sie bewegen diese Verschlüsselung () in eine MyUserIdentiy -Klasse, die die Cuseridentität erweitert. Unabhängig von dem Code, den Sie verwenden, ist die Methode in Controller eine schlechte Idee, und infolgedessen können Sie diesen Code nicht wiederverwenden.

Das Anmeldeformular sollte weiterhin an den Benutzer-/Anmeldesteuerungscontroller veröffentlichen, aber ich denke, sie verwenden den Standard -Anmeldecode von YII und Sie möchten ihn möglicherweise so ändern, dass die MyUseridentität verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top