На некоторых веб-сайтах нет ни какой необходимости в том, чтобы у пользователя из идентификаторов кроме email было еще и имя пользователя. В этом случае лучше вообще не заставлять пользователя выбирать имя пользователя при регистрации и тратить его драгоценное время на веб-сайте.
В статье пойдет речь о том, как "малой кровью" отказаться от необходимости регистрации с обязательным указанием имени пользователя на веб-сайте, созданном на Yii2 v2.0.6 (шаблон приложения advanced) с использованием стороннего модуля Yii2-user v0.9.5.
Почему "малой кровью"? Дело в том, что если имя пользователя выпиливать под чистую, то придется достаточно значительно переписать (переопределить) Yii2-user, чего делать не очень-то хочется.
Далее о том, какое в итоге решение у меня получилось.
Предполагается, что вы уже установили и настроили Yii2 (advanced) а так же Yii2-user.
Основная идея заключается в том, чтобы изменить поведение Yii2-user таким образом, чтобы он перестал ругаться на незаполненное поле имени пользователя при регистрации.
Для этого как минимум потребуется:
- Переопределить метод rules() в модели RegistrationForm.
- Переопределить метод rules() в модели User.
- Переопределить представление register.
- Создать и применить миграцию, делающую имя пользователя в базе необязательным полем.
1. Переопределение модели RegistrationForm.
Создадим файл RegistrationForm.php в директории, где лежат модели вашего приложения. Я сделал это в common/models:
namespace common\models;
use dektrium\user\models\RegistrationForm as BaseRegistrationForm;
class RegistrationForm extends BaseRegistrationForm
{
public function rules()
{
$rules = parent::rules();
unset($rules['usernameRequired']);
$rules[] = ['username', 'default'];
return $rules;
}
}
В RegistrationForm мы переопределяем метод rules() таким образом, чтобы исключить из него правило валидации имени пользователя (username), которое делает его обязательным к заполнению, и добавить новое правило валидации, которое в случае незаполненного значения username присвоит ему значение NULL - как раз то, что нам нужно.
Теперь сообщим Yii2, чтобы вместо стандартной RegistrationForm в Yii2-user он использовал нашу созданную модель. Для этого подредактируем конфиг приложения common/config/main.php:
[...]
'modules' => [
[...]
'user' => [
'class' => 'dektrium\user\Module',
'modelMap' => [
'RegistrationForm' => [
'class' => 'common\models\RegistrationForm',
],
],
],
[...]
],
[...]
2. Переопределение модели User.
Создадим файл User.php в директории, где лежат модели приложения. Так же как и ранее сделаем это в common/models:
namespace common\models;
use dektrium\user\models\User as BaseUser;
class User extends BaseUser
{
public function rules()
{
$rules = parent::rules();
unset($rules['usernameRequired']);
$rules[] = ['username', 'default'];
return $rules;
}
}
Изменения в User аналогичны тому, что мы делали с моделью RegistrationForm.
Так же аналогичным образом сообщим Yii2 использовать нашу созданую модель User вместо стандартной в Yii2-user:
[...]
'modules' => [
[...]
'user' => [
'class' => 'dektrium\user\Module',
'modelMap' => [
'RegistrationForm' => [
'class' => 'common\models\RegistrationForm',
],
'User' => [
'class' => 'common\models\User',
],
],
],
[...]
],
[...]
3. Переопредение представления register.
Создадим копию представление vendor/dektrium/yii2-user/views/registration/register.php например сделав это в директории common/views/dektrium/yii2-user/. Из него удалим строку, содержащую:
$form->field($model, 'username')
которая создает поле формы для ввода имени пользователя.
Сообщим Yii2 о том, что нужно использовать вместо стандартного наше модифицированное представление. Для этого подредактируем конфиг common/config/main.php:
[...]
'components' => [
[...]
'view' => [
'theme' => [
'pathMap' => [
'@dektrium/user/views' => '@common/views/dektrium/yii2-user',
],
],
],
[...]
],
[...]
4. Создание миграции для модификации БД.
По-умолчанию поле username не может быть пустым, а это нам не подходит. Создадим миграцию, для чего в корневом каталоге проекта выполним команду:
php yii migrate/create username_unrequired
После выполнения команды в директорию console/migrations/ упадет файлик, имя которого будет оканчиваться на _username_unrequired.php, внутри будет шаблон класса миграции, расширяемого от yii\db\Migration. Определим у этого класса следующие методы:
public function up()
{
$this->alterColumn('{{%user}}', 'username', Schema::TYPE_STRING . '(255)');
}
public function down()
{
$this->alterColumn('{{%user}}', 'username', Schema::TYPE_STRING . '(255) NOT NULL');
}
Теперь нужно применить миграцию. Сделать это можно командой:
php yii migrate
По большому счету на этом все. На сайте уже можно регистрироваться и логиниться без указания имени пользователя.
Комментариев нет:
Отправить комментарий