forms.md 6.3 KB

Формы в Yii2

Как и зачем

Формы - часто используемые способы ввода данных от пользователя в Веб. В обычном случае программист сам осуществляет верстку, валидацию и обработку данных из формы, однако несложно заметить, что форма по своей структуре часто пересекается с теми или иными структурами данных в коде, структурой СУБД и т. п. Поэтому во многих случаях создание форм можно автоматизировать, исходя из этой структуры

Model

Структура-контейнер для данных из формы называется моделью. Именно в этой структуре хранится информация о валидации, названии полей, пояснениях и так далее.

<?php
namespace app\models;

use yii\base\Model;

class UserModel extends Model
{
    public $login;
    public $password;
    public $email;
    public $verifyCode;


    public function rules(){
        return [
            [['login', 'password', 'email], 'required'], //обязательные поля
            ['email', 'email'], //email должен быть email-адресом
            ['verifyCode', 'captcha'] //КАПЧА
        ];
    }
}

rules

Метод rules возвращает требования к полям (валидация и тип) в форме массива.

Некоторые из возможных видов валидаторов, применяемых в rules:

  • required. Обязательное поле
  • email. Адрес электронной почты
  • ['login', 'string', 'max' => 50]. Тип и длина
  • ['countOfHands', 'min' => 0, 'max' => 2]. Тип, минимальное и максимальное значение.
  • ['someField', 'validateSomeField'] - валидатор в методе класса
  • ['even', function($attribute, $params, $validator){ if (($this->$attribute & 2) == 1){ $this->addError($attribute, "It's not even"); } }] Валидатор с помощью коллбэк-функции.
  • when позволяет сделать условную валидацию, т. е. валидацию, которая работает или нет в зависимости от внешних условий.

Так же есть возможность задавать JS код для валидации на клиенте. http://www.yiiframework.com/doc-2.0/guide-input-validation.html#inline-validators

Имя правила валидации.

Для удобства вы так же можете задавать правило, используя ассоциативный синтаксис массива:

    ...
    'password' => [['password'], 'string', 'max' => 60]
    ...

Работа с СУБД.

Для того, что бы модель использовать с возможностью сохранения СУБД, следует использовать ActiveRecord в качестве предка вашей модели. ActiveRecord, в свою очередь, имеет в предках Model, таким образом работает прозрачно в качестве модели.

Контроллер и ЭкшОн

    public function actionForm()
    {
        $model = new SomeModel();

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $model->save();
            return $this->render('form-confirm', ['model' => $model]);
        } else {
            return $this->render('form', ['model' => $model]);
        }
    }

В примере выше в случае удачной валидации происходит сохранение модели, в случае же неудачи или первого захода - отображается форма

View

В базе HTML для формы формируется следующим образом:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'login') ?>

    <?= $form->field($model, 'password') ?>

    <?= $form->field($model, 'email') ?>
    
    <?= $form->field($model, 'password')->passwordInput() ?>

    <div class="form-group">
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

Для формирования более сложных полей ввода используются методы объекта, возвращаемые методом field:

$form->field($model, 'password')->passwordInput() 

Так же есть другие методы:

  • textInput для ввода текста, позволяет настроить поле ввода и его label
  • input для поля ввода, можно задать например HTML5 тип (email, date, number)
  • fileInput для загрузки файла
  • checkboxList для списка чекбоксов
  • dropdownList для выпадающего списка
  • radioList для списка радиокнопок
  • textArea для полей ввода

Общие настройки и полей

Можно задать общие настройки формы:

    $form = ActiveForm::begin([
        'id' => 'register-form',
        'options' => ['class' => 'big']
    ]) ?>

Можно задать общие настройки полей формы, включая шаблон поля:

    <?php $form = ActiveForm::begin([
        'id' => 'register-form',
        'options' => ['class' => 'big']
        'fieldConfig' => [
             'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
        ],
    ]); ?>

Так же можно задавать настройки для каждого поля

 <?= $form->field($model, 'password', [
                            'template' => '{label}{input}{hint}{error}'
                        ]