виджет в модуле в 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:: приложение ()-> контроллер-> модуль" прием действительно не работает как ожидалось.

  1. Что я делаю wrong:-\
  2. Есть ли лучший способ достигнуть этого. Т.е. дисплей, которые входят в форму на некоторой другой странице, которая обычно отображается путем доступа к контроллеру входа в систему в пользовательском модуле (пользователь/вход в систему) или действительно ли виджет, является правильным способом сделать его?

Спасибо.

5
задан Karolis 8 April 2010 в 04:15
поделиться

2 ответа

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

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

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

Потому что у нас уже есть этот импорт в the 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 / было полезно, но трудно найти =)

9
ответ дан 13 December 2019 в 22:04
поделиться

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

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

1
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: