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

05.03.2019

Теги: ActiveFormHTMLPHPWeb-разработка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>
        <div class="help-block"></div>
    </div>

    <button type="submit" class="btn btn-primary">Отправить</button>
</form>

Дополнительно

Поиск: HTML • PHP • Web-разработка • Yii2 • Форма • Шаблон сайта • Form • ActiveForm • ActiveField • Модель • Model

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.