Yii中模块内的小部件

时间:2010-04-08 04:15:47

标签: php yii

我正在尝试在模块中创建一个小部件,然后从模块的“外部”加载该小部件。更具体地说,我正在使用其他人编写的用户模块。我不想有一个单独的页面来显示登录表单,因此我尝试制作一个显示登录表单的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() - &gt;控制器 - &gt;模块”技巧并没有真正按预期工作。

  1. 我做错了什么: - \
  2. 有没有更好的方法来实现这一目标。即在其他一些页面中显示该登录表单,通常是通过访问用户模块中的登录控制器(用户/登录)来显示的,或者是一个正确的方法来构建一个小部件?
  3. 感谢。

2 个答案:

答案 0 :(得分:9)

快速解决方案

好的,所以我结束了

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

而不是

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

请注意,现在模块必须在主配置中被称为'user',但我认为这样可以提供更大的灵活性。即我们不一定只使用模块中的模块功能。

在模块范围之外显示小部件的其他见解

在玩了更多之后,这就是我所做的。在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.*',
    ));
}

因此,每当您知道某些功能将在模块外部使用时,确保加载模块非常重要。例如,在我试图在其中一个模块控制器中显示的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/很有用,但很难找到=)

答案 1 :(得分:1)

您最好将encrypting()移动到扩展CUserIdentity的MyUserIdentiy类中。无论您使用什么代码,他们将该方法放在控制器中都是一个坏主意,因此您无法重用该代码。

登录表单仍应发布到用户/登录控制器,但我猜他们使用Yii的标准登录代码,您可能希望修改它以使用MyUserIdentity。