виджет внутри модуля в Yii - PullRequest
5 голосов
/ 08 апреля 2010

Я пытаюсь создать виджет внутри модуля, а затем загрузить этот виджет снаружи модуля. В частности, я использую пользовательский модуль, написанный кем-то другим. Я не хочу иметь отдельную страницу для отображения формы входа в систему, поэтому я попытался сделать 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. Есть ли лучший способ достичь этого. То есть отобразить эту форму входа на какой-либо другой странице, которая обычно отображается при доступе к контроллеру входа в пользовательском модуле (user / login) или виджет является правильным способом сделать это?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 14 апреля 2010

Быстрое решение

Хорошо, так что я просто закончил делать

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 голос
/ 12 июня 2010

Вам лучше переместить этот encrypting () в класс MyUserIdentiy, который расширяет CUserIdentity. Какой бы код вы ни использовали, они помещают метод в контроллер - плохая идея, и в результате вы не сможете повторно использовать этот код.

Форма входа по-прежнему должна публиковаться на контроллере пользователя / входа, но я думаю, что они используют стандартный код входа Yii, и вы можете изменить его для использования MyUserIdentity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...