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