Sometimes you may need to add some fields from Profile to the registration form and this article will help you.
Let's start with overriding the registration form model:
namespace app\models;
use dektrium\user\models\Profile;
use dektrium\user\models\RegistrationForm as BaseRegistrationForm;
use dektrium\user\models\User;
class RegistrationForm extends BaseRegistrationForm
{
/**
* Add a new field
* @var string
*/
public $name;
/**
* @inheritdoc
*/
public function rules()
{
$rules = parent::rules();
$rules[] = ['name', 'required'];
$rules[] = ['name', 'string', 'max' => 255];
return $rules;
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
$labels = parent::attributeLabels();
$labels['name'] = \Yii::t('user', 'Name');
return $labels;
}
/**
* @inheritdoc
*/
public function loadAttributes(User $user)
{
// here is the magic happens
$user->setAttributes([
'email' => $this->email,
'username' => $this->username,
'password' => $this->password,
]);
/** @var Profile $profile */
$profile = \Yii::createObject(Profile::className());
$profile->setAttributes([
'name' => $this->name,
]);
$user->setProfile($profile);
}
}
Last thing you need to do is overriding the registration form view:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\web\View $this
* @var yii\widgets\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="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><?= Html::encode($this->title) ?></h3>
</div>
<div class="panel-body">
<?php $form = ActiveForm::begin([
'id' => 'registration-form',
]); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= Html::submitButton(Yii::t('user', 'Sign up'), ['class' => 'btn btn-success btn-block']) ?>
<?php ActiveForm::end(); ?>
</div>
</div>
<p class="text-center">
<?= Html::a(Yii::t('user', 'Already registered? Sign in!'), ['/user/security/login']) ?>
</p>
</div>
</div>