Вопрос

Я пытаюсь создать виджет в модуле, а затем загрузить этот виджет из «снаружи» модуля. Более конкретно, я использую пользовательский модуль, написанный кем-то другим. Я не хочу иметь отдельную страницу для отображения формы входа в систему, поэтому я пытался сделать CBPENTLE / Widget (confusion), отображающий форму входа в систему. По сути, я переместил код из логинороллера в этот виджет. Затем я пытаюсь отобразить виджет на какой-то случайной странице

<?php $this->widget('user.components.LoginForm'); ?>

Тем не менее, я получаю ошибку

CWebApplication does not have a method named "encrypting".

В классе Usilidentity в этой строке:

else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)

Это происходит, потому что я в основном пытаюсь выполнить этот код в контексте приложения, а не модуль. При этом трюк «Yii :: App () -> Controller-> Module» не работает, как ожидалось.

  1. Что я делаю неправильно:-
  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.*',

Потому что у нас уже есть те импорт в 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.*',
    ));
}

Поэтому всякий раз, когда вы знаете, что некоторые функциональные возможности будут использоваться вне модуля, важно убедиться, что модуль загружен. Например, в виджете входа в систему, который я пытаюсь отобразить не в одном из контроллеров модулей, у меня есть эта строка кода:

$model = new UserLogin;

Тем не менее, UserLogin - это модель внутри пользовательского модуля, и для того, чтобы иметь возможность автозагрузки этой модели, которую мы сначала должны убедиться, что модуль был инициализирован:

$module = Yii::app()->getModule(UserModule::id());
$model = new UserLogin;

Я надеюсь, что это будет полезно, если вы застряли со всеми модулями концепции, как я был.http://www.yiiframework.com/forum/index.php?/topic/6449-access-Another-modules-model/ был полезным, но трудно найти =)

Другие советы

Вы лучше перемещаете, что шифрование () в класс Myuseridentiy, который расширяет Cuseriдентетность. Независимо от того, какой код вы используете для использования, они вкладывают метод в контроллере, является плохой идеей и в результате вы не можете использовать этот код.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top