От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. Эту статью мы посвятим теме Yii2 формы. Мы узнаем о том, как происходит создание форм, что такое модель формы, и как происходит ajax отправка формы. Начнем.
Итак, перед нами стоит стандартная задача — принять данные от пользователя. Обычно для этого используются формы и метод передачи данных POST. Что нам потребуется для создания формы? Во-первых, нам необходима модель формы. Далее, потребуется action, который будет отвечать за получение данных. Ну и, конечно же, нам необходим как минимум один вид, в котором и будет выведена форма.
Начнем с создания модели. В папке моделей создадим класс TestForm.
1 2 3 4 5 6 7 8 9 |
namespace app\models; use yii\base\Model; class TestForm extends Model { } |
Модель наследует класс yii\base\Model, именно он, как правило, используется для работы с формами. В модели мы должны объявить публичные свойства, которые будут соответствовать полям формы. Например, пусть это будет форма с полями для ввода имени и email. Соответственно, объявим оба публичных свойства:
1 2 3 4 5 6 7 |
class TestForm extends Model { public $name; public $email; } |
Пока что отложим модель и создадим action для работы со страницей формы и данными из нее. Я воспользуюсь созданным ранее контроллером TestController и его действием actionPage. В этом действии создадим экземпляр модели и передадим его в представление.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
namespace app\controllers; use yii\web\Controller; use app\models\TestForm; class TestController extends Controller { public function actionIndex() { return $this->render('index'); } public function actionPage() { $form_model = new TestForm(); return $this->render('page', compact('form_model')); } } |
Осталось в виде \views\test\page.php отрисовать форму. Для этого мы воспользуемся возможностями виджета yii\widgets\ActiveForm и хэлпером yii\helpers\Html.
1 2 3 4 5 6 7 8 9 |
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin() ?> <?= $form->field($form_model, 'name') ?> <?= $form->field($form_model, 'email') ?> <?= Html::submitButton('Send', ['class' => 'btn btn-success']) ?> <?php ActiveForm::end() ?> |
Теперь обратимся к нужной нам странице, указав имя контроллера и действия: //yii2/index.php?r=test/page. В результате мы должны увидеть нашу форму.
Отлично! Полдела сделано. Теперь задача состоит в том, чтобы принять данные из формы. По умолчанию она будет отправлена в это же действие, т.е. TestController::actionPage — там и попробуем принять данные. Для получения данных методом POST мы воспользуемся методом post() класса yii\web\Request. Попробуем загрузить полученные данные в модель с помощью метода load() в действии. Для этого немного изменим код действия:
1 2 3 4 5 6 7 8 9 |
public function actionPage() { $form_model = new TestForm(); if($form_model->load(\Yii::$app->request->post())){ var_dump(\Yii::$app->request->post()); var_dump($form_model); } return $this->render('page', compact('form_model')); } |
Здесь мы пытаемся загрузить данные в модель и затем распечатать ее. Также мы дополнительно распечатываем сами данные из массива $_POST. Давайте попробуем отправить тестовые данные и взглянем на то, что будет распечатано.
В результате мы увидели, что данные приходят, но вот модель почему-то ими не заполняется, свойства name и email модели оказываются пустыми. Все правильно. Дело в том, что в модель могут быть загружены только проверенные данные, которые прошли валидацию. Для этого в модели нам потребуется создать массив правил валидации. Об этом мы и поговорим в следующей статье. Ну а на этом мы пока что остановимся.
Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.