質問
モジュール内でウィジェットを作成し、モジュールの「外側」からそのウィジェットをロードしようとしています。特に、他の誰かによって書かれたユーザーモジュールを使用しています。ログインフォームを表示するための別のページが必要であるため、ログインフォームを表示するcportlet/ウィジェット(混乱)を作成しようとしました。基本的に、コードをLogginControllerからそのウィジェットに移動しました。それから私はいくつかのランダムなページにウィジェットを表示しようとします
<?php $this->widget('user.components.LoginForm'); ?>
ただし、エラーが発生します
CWebApplication does not have a method named "encrypting".
この行のuseridentityクラスで:
else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)
これは、モジュールではなくアプリのコンテキスト内で基本的にこのコードを実行しようとしているためです。したがって、「yii :: app() - > controller->モジュール」トリックは、実際には期待どおりに機能しません。
- 私は何を間違っていますか: -
- これを達成するためのより良い方法はありますか? IE他のページにそのログインフォームを表示します。これは通常、ユーザーモジュール内のログインコントローラーにアクセスすることによって表示されます(ユーザー/ログイン)、またはウィジェットは正しい方法ですか?
ありがとう。
解決
クイックソリューション
さて、私は単にやってしまいました
Yii::app()->getModule('user')->encrypting($this->password)
それ以外の
Yii::app()->controller->module->encrypting($this->password)
今ではモジュールに注意してください しなければならない メイン構成で「ユーザー」と呼ばれますが、これにより柔軟性が高まると思います。つまり、モジュール内のモジュール機能のみを使用することはできません。
モジュールスコープの外側にウィジェットを表示することに関する追加の洞察
それでもっと遊んだ後、それが私がしたことです。 usermodule.phpでメソッドを作成しました
public static function id() {
return 'user';
}
その後、どこにでも使用しているモジュールが必要です
Yii::app()->getModule(UserModule::id())->encrypting($this->password)
私は次のようなモジュールに関連する多くのインポートを持っているのが好きではありません:
'application.modules.user.models.*',
'application.modules.user.components.*',
私たちはすでに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.*',
));
}
したがって、モジュールの外側でいくつかの機能が使用されることを知っているときはいつでも、モジュールがロードされていることを確認することが重要です。たとえば、モジュールコントローラーのいずれにも表示しないでください。このコードの行があります。
$model = new UserLogin;
ただし、userloginはユーザーモジュール内のモデルであり、このモデルを自動ロードできるようにするには、最初にモジュールが初期化されていることを確認する必要があります。
$module = Yii::app()->getModule(UserModule::id());
$model = new UserLogin;
モジュール全体の概念に私がそうであった場合、これが役立つことを願っています。http://www.yiiframework.com/forum/index.php?/topic/6449-Access-another-modules-model/ 役に立ちましたが、見つけるのが困難でした=)
他のヒント
その暗号化()を()cuseridentityを拡張するmyuseridentiyクラスに移動する方が良いでしょう。あなたが使用するコードが何であれ、彼らはコントローラーにメソッドを置くことは悪い考えであり、その結果、あなたはそのコードを再利用することはできません。
ログインフォームは引き続きユーザー/ログインコントローラーに投稿する必要がありますが、YIIの標準ログインコードを使用していると思います。これを変更してMyUseridentityを使用することをお勧めします。