Yii2-user от dektrium и роль при регистрации

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

Здравствуйте!
Установил модуль Yii2-user от dektrium (https://yii2-user.dektrium.com/) на сайт!
Но он при регистрации юзера не создает ему роль, а просто добавляет в таблицу данные, а в таблицу auth_assignment не вносит связь с ролью.
У меня на сайте есть роль admin - это для админки юзеров для бекенда, и на фронтенде роль author и мне надо чтоб это роль была при регистрации.
В сам модуль лесть не хочется и дописывать в нем, так как он уже готовый устанавливается с композера, и каждый раз после установки дописывать не хочется. Подскажите как эту роль реализовать
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ElisDN »

1. Открываем RegistrationController и видим события EVENT_AFTER_REGISTER и EVENT_AFTER_CONFIRM.
2. Подписываем свой обработчик на эти события. Например, через controllerMap модуля, как описано в пункте Using controllers events.
3. В обработчике прописываем Yii::$app->authManager->assign(...).
Последний раз редактировалось ElisDN 2016.08.03, 08:43, всего редактировалось 2 раза.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

ElisDN писал(а): 3. В обработчике прописываем Yii::$app->authManager->assign(...).
Спасибо за подсказку, но подскажите еще, вот код я сделал:

Код: Выделить всё

'user' => [
    'class' => 'dektrium\user\Module',
            'controllerMap' => [
                    'registration' => [
                        'class' => \dektrium\user\controllers\RegistrationController::className(),
                        'on ' . \dektrium\user\controllers\RegistrationController::EVENT_AFTER_REGISTER => function ($e) {
                                    $auth = Yii::$app->authManager;
                                    $role = $auth->getRole('author');
                                    $auth->assign($role, $e->id);
                        }
                    ],
                ], 
    ],               
Ошибка в $auth->assign($role, $e->id), а именно в $e->id - не видит id из модели в юзера
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Yii2-user от dektrium и роль при регистрации

Сообщение Loveorigami »

Yii::$app->user->id не пробовали?
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

Loveorigami писал(а):Yii::$app->user->id не пробовали?
выдает ошибку:

Код: Выделить всё

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null
The SQL being executed was: INSERT INTO `auth_assignment` (`user_id`, `item_name`, `created_at`) VALUES (NULL, 'admin', 1470161055)
Error Info: Array
(
    [0] => 23000
    [1] => 1048
    [2] => Column 'user_id' cannot be null
)
 
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Yii2-user от dektrium и роль при регистрации

Сообщение Loveorigami »

Понятно.
Id не видит, потому что в event id не попадает

https://github.com/dektrium/yii2-user/b ... onForm.php
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

Loveorigami писал(а):Понятно.
https://github.com/dektrium/yii2-user/b ... onForm.php
так что предлагаете класс переделывать или периприсвоить его и поменять кое что? но это мне кажется не правильный вариант
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Yii2-user от dektrium и роль при регистрации

Сообщение Loveorigami »

Доку внимательно читать

Код: Выделить всё

Alternative: Class based-events

You can also assign events on class-level.

\yii\base\Event::on(
    \dektrium\user\controllers\RegistrationController::className(),
    \dektrium\user\controllers\RegistrationController::EVENT_AFTER_CONFIRM,
    function () {        
        Yii::info('Assigning default roles to user...');
        // implement role assignment(s)
    }
);

 
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

Loveorigami писал(а):Доку внимательно читать
А можно подсказку как мне сделать? я смотрел доки, но не понял.
Если не сложно то киньте строчку кода
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ElisDN »

В EVENT_AFTER_REGISTER в $event попадает сама форма. Сам $user попадает только в EVENT_AFTER_CONFIRM.

Либо находим пользователя через:

Код: Выделить всё

$user = User::findOne(['username' => $event->form->username]) 
в обработчике EVENT_AFTER_REGISTER, либо берём самого пользователя $event->user в EVENT_AFTER_CONFIRM.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

ElisDN писал(а): в обработчике EVENT_AFTER_REGISTER, либо берём самого пользователя $event->user в EVENT_AFTER_CONFIRM.
Сделал вот так и работает:

Код: Выделить всё

            'controllerMap' => [
                    'registration' => [
                        'class' => \dektrium\user\controllers\RegistrationController::className(),
                        'on ' . \dektrium\user\controllers\RegistrationController::EVENT_AFTER_REGISTER  => function ($event) {
                                    $auth = Yii::$app->authManager;
                                    $role = $auth->getRole('admin');
                                    $user = \dektrium\user\models\User::findOne(['username' => $event->form->username]); 
                                    $auth->assign($role, $user->id);
                        }
                    ],
                ],
 
Но мне почему то кажется это решение на самым оптимальным, мне кажется что можно как то id юзера получить сразу, не через запрос к модели с передачей $event->form->username . Может есть еще какое то более гибкое решание
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ElisDN »

webplus писал(а):мне кажется что можно как то id юзера получить сразу, не через запрос к модели с передачей $event->form->username . Может есть еще какое то более гибкое решание
По коду $user передаётся только в EVENT_AFTER_CONFIRM. В EVENT_AFTER_REGISTER попадает только форма в $event->form, которая из register() зарегистрированную модель $user не возвращает. Решение - либо навешиваться на EVENT_AFTER_CONFIRM, либо переписать контроллер, чтобы он заполнял $form и $user для EVENT_AFTER_REGISTER, либо навешиаться глобально не на контроллер, а на User::AFTER_REGISTER:

Код: Выделить всё

Event::on(User::className(), User::AFTER_REGISTER, function (Event $event) {
    $user = $event->sender;
    ...
} 
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

ElisDN писал(а):
webplus писал(а):либо навешиаться глобально не на контроллер, а на User::AFTER_REGISTER:
Пробовал вот так, навесить на User::AFTER_REGISTER, но не работает, вылазит ошибка:

Код: Выделить всё

            'controllerMap' => [
                    'registration' => [
                        'class' => \dektrium\user\models\User::className(),
                        'on ' . \dektrium\user\models\User::AFTER_REGISTER  => function ($event) {
                                    $auth = Yii::$app->authManager;
                                    $role = $auth->getRole('admin');
                                    $auth->assign($role, $event->id);
                        }
                    ],
                ],    
Вижу это же для controllerMap и тут не модель нужна, а контроллер! А как тогда реализовать User::AFTER_REGISTER
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ElisDN »

webplus писал(а):Вижу это же для controllerMap и тут не модель нужна, а контроллер!
Здесь controllerMap не нужен, так как он только для контроллеров. Нужно выполнить именно код с Event::on в Bootstrap-классе.
Аватара пользователя
ilma55
Сообщения: 65
Зарегистрирован: 2016.07.15, 19:26
Откуда: Молдова
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ilma55 »

как вы решили данную проблему?
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Yii2-user от dektrium и роль при регистрации

Сообщение webplus »

ilma55 писал(а):как вы решили данную проблему?
вот так:

Код: Выделить всё

            'controllerMap' => [
                    'registration' => [
                        'class' => \dektrium\user\controllers\RegistrationController::className(),
                        'on ' . \dektrium\user\controllers\RegistrationController::EVENT_AFTER_REGISTER  => function ($event) {
                                    $auth = Yii::$app->authManager;
                                    $role = $auth->getRole('admin');
                                    $user = \dektrium\user\models\User::findOne(['username' => $event->form->username]); 
                                    $auth->assign($role, $user->id);
                        }
                    ],
                ],
  
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
ilma55
Сообщения: 65
Зарегистрирован: 2016.07.15, 19:26
Откуда: Молдова
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ilma55 »

Нужно выполнить именно код с Event::on в Bootstrap-классе.
я думал как-то так. а то я ничего не понял про это решение
Аватара пользователя
ilma55
Сообщения: 65
Зарегистрирован: 2016.07.15, 19:26
Откуда: Молдова
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ilma55 »

если кому нить еще надо, то я навесил именно на confirm

Код: Выделить всё

                    'on ' . \dektrium\user\controllers\RegistrationController::EVENT_AFTER_CONFIRM => function ($e) {
                        $auth = Yii::$app->authManager;
                        $user = \dektrium\user\models\Profile::find()->select('acctype')->where(['user_id' => $e->user->id])->asArray()->one();
                        $role = $auth->getRole($user['acctype']);
                        $auth->assign($role, $e->user->id);
                        Yii::$app->response->redirect(array('/login'))->send();
                        Yii::$app->end();
                    } 
Tivos
Сообщения: 41
Зарегистрирован: 2015.08.12, 12:34

Re: Yii2-user от dektrium и роль при регистрации

Сообщение Tivos »

Здравствуйте, подскажите, как в этом модуле можно реализовать переход в личный кабинет сразу после регистрации
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii2-user от dektrium и роль при регистрации

Сообщение ElisDN »

Tivos писал(а):Здравствуйте, подскажите, как в этом модуле можно реализовать переход в личный кабинет сразу после регистрации
Аналогично сделать:

Код: Выделить всё

Yii::$app->user->login($event->user);
Yii::$app->response->redirect(['/cabinet/index'])->send();
Yii::$app->end();
в обработчике EVENT_AFTER_CONFIRM.
Ответить