Suppose, you need to add new field to User
model which will be editable in
admin panel. Unfortunately at the moment Yii2-user does not support adding new
fields to the registration form.
Let's start with creating new migration, which will add new field to user
table:
run php yii migrate/create add_new_field_to_user
and open generated migration:
class m123456_654321_add_new_field_to_user extends \yii\db\Migration
{
public function up()
{
$this->addColumn('{{%user}}', 'field', Schema::TYPE_STRING);
}
public function down()
{
$this->dropColumn('{{%user}}', 'field');
}
}
And now you can apply that migration by running php yii migrate
.
Override User
model as described in guide and add following lines to the overridden model:
class User extends \dektrium\user\models\User
{
public function scenarios()
{
$scenarios = parent::scenarios();
// add field to scenarios
$scenarios['create'][] = 'field';
$scenarios['update'][] = 'field';
$scenarios['register'][] = 'field';
return $scenarios;
}
public function rules()
{
$rules = parent::rules();
// add some rules
$rules['fieldRequired'] = ['field', 'required'];
$rules['fieldLength'] = ['field', 'string', 'max' => 10];
return $rules;
}
}
You should override view file @dektrium/user/views/admin/_user.php
as described in special guide
with the following content:
<?php
/**
* @var yii\bootstrap5\ActiveForm $form
* @var dektrium\user\models\User $user
*/
?>
<?= $form->field($user, 'username')->textInput(['maxlength' => 25]) ?>
<?= $form->field($user, 'email')->textInput(['maxlength' => 255]) ?>
<?= $form->field($user, 'password')->passwordInput() ?>
<?= $form->field($user, 'field')->textInput(['maxlength' => 10]) ?>
In order to do such thing you should override registration form class and appropriate view file. Let's start with overriding registration form. Since all the fields of registration form are passed to the User model, we should only add a field and appropriate validation rules:
class RegistrationForm extends \dektrium\user\models\RegistrationForm
{
/**
* @var string
*/
public $field;
/**
* @inheritdoc
*/
public function rules()
{
$rules = parent::rules();
$rules['fieldRequired'] = ['field', 'required'];
$rules['fieldLength'] = ['field', 'string', 'max' => 10];
return $rules;
}
}
And the last thing you need to do is overriding registration form view file:
<?php
use yii\bootstrap5\Html;
use yii\bootstrap5\ActiveForm;
/**
* @var yii\web\View $this
* @var yii\bootstrap5\ActiveForm $form
* @var dektrium\user\models\User $user
*/
$this->title = Yii::t('user', 'Sign up');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="card">
<div class="card-header">
<h3><?= Html::encode($this->title) ?></h3>
</div>
<div class="card-body">
<?php $form = ActiveForm::begin([
'layout' => 'floating',
'id' => 'registration-form',
]); ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'field') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= Html::submitButton(Yii::t('user', 'Sign up'), ['class' => 'btn btn-success w-100 mt-3']) ?>
<?php ActiveForm::end(); ?>
</div>
</div>
<p class="text-center">
<?= Html::a(Yii::t('user', 'Already registered? Sign in!'), ['/user/security/login']) ?>
</p>
</div>
</div>