Создание формы — Yii2

Для добавления формы на страницу предназначен класс yii\widgets\ActiveForm. Кроме того, имеются дополнительные методы в yii\helpers\Html. Форма в большинстве случаев связана с моделью, которая проверяет данные формы на сервере. Модель наследует класс yii\db\ActiveRecord или класс yii\base\Model.

Создаем модель для формы обратной связи

<?php
/*
 * Файл models/FeedbackForm.php
 */
namespace app\models;

use Yii;
use yii\base\Model;

/**
 * Модель для формы обратной связи
 */
class FeedbackForm extends Model
{
    public $name;
    public $email;
    public $body;
}

Создаем action для страницы, где будет форма обратной связи

<?php
/*
 * Файл controllers/PageController
 */
namespace app\controllers;

use yii\web\Controller;
use app\models\FeedbackForm;

class PageController extends Controller {
    public function actionIndex() {
        return $this->render('index');
    }

    public function actionFeedback() {
        $model = new FeedbackForm();
        return $this->render('feedback', ['model' => $model]);
    }
}

Создаем шаблон страницы формы обратной связи

<?php
/* @var $this yii\web\View */

use yii\widgets\ActiveForm;
// стилизованная версия под bootstrap 3
// use yii\bootstrap\ActiveForm
use yii\helpers\Html;

$this->title = 'Обратная связь';
?>

<div class="site-feedback">
    <h1><?= Html::encode($this->title) ?></h1>

    <?php $form = ActiveForm::begin(); ?>
        <?= $form->field($model, 'name')->textInput()->label('Имя, Фамилия'); ?>
        <?= $form->field($model, 'email')->input('email')->label('Адрес почты'); ?>
        <?= $form->field($model, 'body')->textarea(['rows' => 5])->label('Ваше сообщение'); ?>
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']); ?>
    <?php ActiveForm::end(); ?>
</div>

В результате получим такой html-код:

<form id="w0" action="/web/index.php?r=page%2Ffeedback" method="post">
    <input type="hidden" name="_csrf" value=".....">

    <div class="form-group field-feedbackform-name required">
        <label class="control-label" for="feedbackform-name">Имя, Фамилия</label>
        <input type="text" id="feedbackform-name" class="form-control"
               name="FeedbackForm[name]" aria-required="true">
        <div class="help-block"></div>
    </div>
    
    <div class="form-group field-feedbackform-email required">
        <label class="control-label" for="feedbackform-email">Адрес почты</label>
        <input type="email" id="feedbackform-email" class="form-control"
               name="FeedbackForm[email]" aria-required="true">
        <div class="help-block"></div>
    </div>
    
    <div class="form-group field-feedbackform-body required">
        <label class="control-label" for="feedbackform-body">Ваше сообщение</label>
        <textarea id="feedbackform-body" class="form-control" name="FeedbackForm[body]"
                  rows="10" aria-required="true"></textarea>
        <div class="help-block"></div>
    </div>
    
    <button type="submit" class="btn btn-primary">Отправить</button>
</form>

Можно добавить для формы идентификатор и класс, а для полей формы — подсказки и placeholder-ы:

<div class="page-feedback">
    <h1><?= Html::encode($this->title) ?></h1>

        <?php
        $form = ActiveForm::begin([
            'options' => ['id' => 'feedback-form', 'class' => 'form-horizontal']
        ]);
        ?>
        <?=
        $form->field($model, 'name')
             ->textInput(['placeholder' => 'Ваше имя и фамилия'])
             ->hint('Ваше имя и фамилия')
             ->label('Имя, Фамилия');
        ?>
        <?=
        $form->field($model, 'email')
             ->input('email', ['placeholder' => 'Ваш адрес почты'])
             ->hint('Ваш адрес почты')
             ->label('Адрес почты');
        ?>
        <?=
        $form->field($model, 'body')
             ->textarea(['rows' => 5, 'placeholder' => 'Введите ваше сообщение'])
             ->hint('Введите ваше сообщение')
             ->label('Ваше сообщение');
        ?>
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']); ?>
    <?php ActiveForm::end(); ?>
</div>
<form id="feedback-form" class="form-horizontal" action="/web/index.php?r=page%2Ffeedback" method="post">
    <input type="hidden" name="_csrf" value=".....">
    
    <div class="form-group field-feedbackform-name required">
        <label class="control-label" for="feedbackform-name">Имя, Фамилия</label>
        <input type="text" id="feedbackform-name" class="form-control" name="FeedbackForm[name]"
               placeholder="Ваше имя и фамилия" aria-required="true">
        <div class="hint-block">Ваше имя и фамилия</div>
        <div class="help-block"></div>
    </div>

    <div class="form-group field-feedbackform-email required">
        <label class="control-label" for="feedbackform-email">Адрес почты</label>
        <input type="email" id="feedbackform-email" class="form-control" name="FeedbackForm[email]"
               placeholder="Ваш адрес почты" aria-required="true">
        <div class="hint-block">Ваш адрес почты</div>
        <div class="help-block"></div>
    </div>
    
    <div class="form-group field-feedbackform-body required">
        <label class="control-label" for="feedbackform-body">Ваше сообщение</label>
        <textarea id="feedbackform-body" class="form-control" name="FeedbackForm[body]" rows="5"
                  placeholder="Введите ваше сообщение" aria-required="true"></textarea>
        <div class="hint-block">Введите ваше сообщение</div>

Leave a Comment