Создание формы и валидация

Шаг 1: Создание и вывод формы

Формы в Yii создаются через класс «Model», т.к. в этом случае Yii проверяет на CSRF (подделка запросов), и можно будет легко указать проверку данных, которые ввёл пользователь.

Модели создаются в папке models/.

# models/FeedbackForm.php
namespace app\models;

use Yii;
use yii\base\Model;

class FeedbackForm extends Model {

    // создание полей для формы
    public $name;
    public $email;

}

В контроллере надо загрузить объект FeedbackForm и передать его в шаблон.

# controllers/SiteController.php

// загрузка формы
use app\models\FeedbackForm;

class SiteController extends Controller
{

    public function actionFeedback()
    {
        // создание объекта формы и передача в шаблон
        $model = new FeedbackForm();
        return $this->render('feedback', ['model' => $model]);
    }

}

В шаблоне осталось вывести форму:

<!-- views/site/feedback.php -->

<?php
// загрузка объекта ActiveForm, для работы с формами
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
?>

Вывод формы:
<?php $form = ActiveForm::begin(['id' => 'feedback-form']); ?>
    <?=$form->field($model, 'name')?>
    <?=$form->field($model, 'email')?>
    <?=Html::submitButton('Отправить')?>
<?php ActiveForm::end(); ?>

В результате будет сгенерирована форма.

Имена для элементов форм можно задать в модели через метод attributeLabels().

class FeedbackForm extends Model {

    // создание полей для формы
    public $name;
    public $email;

    // имена для <label>
    public function attributeLabels()
    {
        return [
            'name' => 'Имя',
            'email' => 'Email',
        ];
    }

}

Шаг 2. Валидация

Валидация элементов форм указывается в методе rules().

# models/FeedbackForm.php

class FeedbackForm extends Model {

    // создание полей для формы
    public $name;
    public $email;

    // правила валидации
    public function rules()
    {
        return array(
            ['name', 'required'], // обязательное поле
            ['email', 'email'],   // проверка, что введён email
        );
    }

}

Достаточно указать нужные параметры для валидации данных, и они автоматически будут применяться к форме и выводить ошибки (например, «поле должно быть заполнено» или «email введён неправильно»). Ошибки будут показываться без перезагрузки страницы.

Проверка формы на правильность введённых данных происходит через JavaScript. Если пользователь отключит JavaScript, то проверка на обязательное поле и другие указанные параметры будут пропускаться. Чтобы этого не происходило, проверять на валидацию также рекомендуется в контроллере.

# controllers/SiteController.php
use app\models\FeedbackForm;

class SiteController extends Controller
{

    // …

    public function actionFeedback()
    {
        $model = new FeedbackForm();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // выполнение кода, если данные введены правильно
            // иначе будет показа ошибка (Yii выводит ошибки автоматически)
            $model->name; // используется вместо $_POST['name']
        }
        return $this->render('feedback', ['model' => $model]);
    }

}

При необходимости можно получить ошибки формы через метод $model->getErrors().