5

モジュール内にウィジェットを作成し、そのウィジェットをモジュールの「外部」からロードしようとしています。より具体的には、私は他の誰かによって書かれたユーザーモジュールを使用しています。ログインフォームを表示するための別のページを持ちたくないので、ログインフォームを表示する CPortlet/widget (混乱) を作成しようとしました。基本的に、コードを LoginController からそのウィジェットに移動しました。次に、ウィジェットをランダムなページに表示しようとします

<?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->module」というトリックは実際には期待どおりに機能しません。

  1. 何が間違っているのですか:-\
  2. これを達成するためのより良い方法はありますか。つまり、通常はユーザー モジュール (ユーザー/ログイン) 内のログイン コントローラーにアクセスすることによって表示される他のページにそのログイン フォームを表示しますか、それともウィジェットを使用するのが正しい方法ですか?

ありがとう。

4

2 に答える 2

9

迅速な解決策

わかりましたので、私は単にやっただけです

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

したがって、機能の一部がモジュールの外で使用されることがわかっている場合は常に、モジュールがロードされていることを確認することが重要です。たとえば、モジュール コントローラーの 1 つではなく表示しようとしている LoginForm ウィジェットには、次のコード行があります。

$model = new UserLogin;

ただし、 UserLogin は User モジュール内のモデルであり、このモデルを自動ロードできるようにするには、まずモジュールが初期化されていることを確認する必要があります。

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

私のようにモジュール全体の概念に行き詰まっている場合、これが役立つことを願っています。 http://www.yiiframework.com/forum/index.php?/topic/6449-access-another-modules-model/は便利でしたが、見つけるのは困難でした =)

于 2010-04-14T18:13:58.397 に答える
1

そのencrypting()をCUserIdentityを拡張するMyUserIdentiyクラスに移動することをお勧めします。使用するコードが何であれ、メソッドをコントローラーに配置することは悪い考えであり、その結果、そのコードを再利用できません。

ログイン フォームは引き続き User/Login コントローラに投稿する必要がありますが、Yii の標準ログイン コードを使用していると思われます。MyUserIdentity を使用するように変更する必要があるかもしれません。

于 2010-06-12T06:10:02.937 に答える