В таблице users
есть поле username
, при этом при регистрации будет вместо username
2 инпута name
и surname
. Каким образом можно занести в поле username
суммарное значение 2х инпутов name + surname
, не меняя принцип валидации ActiveForm и не добавляя лишний JS код?
P.S. вопрос не сильно принципиальный, в принципе ничего страшного не произойдет, если в таблице вместо username будут 2 поля name и surname, однако все равно любопытно узнать ответ на вышепоставленный вопрос.
Если без js, только так:
public $name = null;
public $surname = null;
public function beforeValidate()
{
if ($this->$name !== null)
$this->username = $this->name . ' ' . $this->surname;
return parent::beforeValidate();
}
Или, как вариант, использовать сценарии
Придумал все-таки способ, как это реализовать, пусть и не так лаконично, как предложили выше, но тоже имеет право на существование.
В контроллер в методе регистрации меняем код на
public function actionSignup()
{
$model = new SignupForm();
// объявляем объект из анонимного класса
$obj = new class extends SignupForm{
public $name;
public $surname;
};
if (Yii::$app->request->isPost) {
// так как класс анонимный, его включ в массиве $_POST выглядит мягко скажем не очень, поэтому значения name и surname можно найти либо рекурсией, либо регуляркой, я выбрал регулярку.
preg_match('/s\:[\d]+\:\"'.preg_quote("surname").'\";s\:[\d]+\:\"(.*?)\"/', serialize(Yii::$app->request->post()), $rgMatches);
preg_match('/s\:[\d]+\:\"'.preg_quote("name").'\";s\:[\d]+\:\"(.*?)\"/', serialize(Yii::$app->request->post()), $rgMatches2);
// так как нельзя изменить данные $app->request->post() создаем новую переменную для ввода данных в модель $load
$load = Yii::$app->request->post();
$load['SignupForm']['username'] = $rgMatches2[1]." ".$rgMatches[1];
if ($model->load($load)) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
}
return $this->render('signup', [
'model' => $model,
'obj' => $obj
]);
}
В представлении просто добавляем 2 инпута привязанных к объекту $obj
<?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
<?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
<?= $form->field($obj, 'name')->textInput() ?>
<?= $form->field($obj, 'surname')->textInput() ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
</div>
<?php ActiveForm::end(); ?>
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
База данных postgresql установлена на одном сервереPHP установлена на другом сервере
Отправлялись данные из формы на сервер с помощью php и добавлялись в бд, после того как попытался отправить данные через Ajax, они не приходят...