Быстрое решение
Хорошо, так что я просто закончил делать
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/ было полезно, но трудно найти =)