Как используя чистый ActiveForm, запихнуть 2 поля input в одно поле модели? yii2

288
15 января 2018, 09:47

В таблице users есть поле username, при этом при регистрации будет вместо username 2 инпута name и surname. Каким образом можно занести в поле username суммарное значение 2х инпутов name + surname, не меняя принцип валидации ActiveForm и не добавляя лишний JS код?

P.S. вопрос не сильно принципиальный, в принципе ничего страшного не произойдет, если в таблице вместо username будут 2 поля name и surname, однако все равно любопытно узнать ответ на вышепоставленный вопрос.

Answer 1

Если без js, только так:

public $name = null;
public $surname = null;
public function beforeValidate() 
{
    if ($this->$name !== null)
        $this->username = $this->name . ' ' . $this->surname;
    return parent::beforeValidate();
}

Или, как вариант, использовать сценарии

Answer 2

Придумал все-таки способ, как это реализовать, пусть и не так лаконично, как предложили выше, но тоже имеет право на существование.

В контроллер в методе регистрации меняем код на

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(); ?>
READ ALSO
Ошибка: Undefined index

Ошибка: Undefined index

Создал в таблице oc_product столбец sticker_new

404
Call to undefined function pg_connect() ошибка

Call to undefined function pg_connect() ошибка

База данных postgresql установлена на одном сервереPHP установлена на другом сервере

366
Не отправляются данные Ajax

Не отправляются данные Ajax

Отправлялись данные из формы на сервер с помощью php и добавлялись в бд, после того как попытался отправить данные через Ajax, они не приходят...

250