Форма обратной связи на Yii 2.x

Рассмотрим форму обратной связи для сайта. Нам необходимо создать модель, контроллер и вывести форму в представление. Рассмотрим кусок программного кода, а так же прокомментируем его.

Первым действием создадим модель с названием ContactForm. Для  этого в директории models создаем файл ContactForm.php. Приведем код модели и прокомментируем его.

/* Объявляем пространство имен */
namespace app\models;

use Yii;
use yii\base\Model;

/* Объявляем класс формы */
class ContactForm extends Model
{
    /* Объявление переменных */
    public $name, $email, $subject, $body, $verifyCode;
    
    /* Правила для полей формы обратной связи (валидация) */
    public function rules()
    {
        return [
            /* Поля обязательные для заполнения */
            [ ['name', 'email', 'subject', 'body'], 'required'],
            /* Поле электронной почты */
            ['email', 'email'],
            /* Капча */
            ['verifyCode', 'captcha', 'captchaAction'=>'index/captcha'],
        ];
    }

    /* Определяем названия полей */
    public function attributeLabels()
    {
        return [
            'verifyCode' => 'Подтвердите код',
            'name' => 'Имя',
            'email' => 'Электронный адрес',
            'subject' => 'Тема',
            'body' => 'Сообщение',
        ];
    }

    /* функция отправки письма на почту */
    public function contact($emailto)
    {
        /* Проверяем форму на валидацию */
        if ($this->validate()) {    
            Yii::$app->mailer->compose() 
                ->setFrom([$this->email => $this->name]) /* от кого */
                ->setTo($emailto) /* куда */
                ->setSubject($this->subject) /* имя отправителя */
                ->setTextBody($this->body) /* текст сообщения */
                ->send(); /* функция отправки письма */

            return true;
        } else {
            return false;
        }
    }
}

Шаг второй. В папке controllers создадим файл IndexController.php. Рассмотрим код и прокомментируем его.

/* Объявляем пространство имен */
namespace app\controllers;

use Yii;

use yii\web\Controller;
use app\models\ContactForm;
use yii\web\Request;

/* Расширяем класс Controller */
class IndexController extends Controller
{
    
    /* Объявляем функцию */
    public function actionContact()
    {
       /* Для страницы контактов можно использовать свой слой */
       $this->layout = 'contacts';
       
        /* Создаем экземпляр класса */
        $model = new ContactForm();
        /* получаем данные из формы и запускаем функцию отправки contact, если все хорошо, выводим сообщение об удачной отправке сообщения на почту */
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['emailto'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        /* иначе выводим форму обратной связи */
        } else {
            return $this->render('contact', [
                'model' => $model,
            ]);
        }
    }
}

Третий шаг. В папке views создаем папку index с файлом contact.php. Добавим туда следующий код.

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;

/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model app\models\ContactForm */

$this->title = 'Контакты';
?>
<article class="col-xs-12 col-lg-6">

    <div class="row margin-null">
        // Заголовок
        <h1><?= Html::encode($this->title) ?></h1>
    
        // Условие отправления формы, если она отправлена выводим сообщение
        <?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
    
        <div class="alert alert-success">
            Спасибо за обращение к нам. Мы постараемся ответить вам как можно скорее.
        </div>
    
        // иначе выводим форму
        <?php else: ?>
    
            <?php $form = ActiveForm::begin([
                'id' => 'contact-form', /* Идентификатор формы */
                'options' => ['class' => 'form-horizontal'], /* класс формы */
                'fieldConfig' => [ /* классы полей формы */
                    'template' => "<div class=\"col-lg-3\">{label}</div>\n<div class=\"col-lg-9\">{input}</div>\n<div class=\"col-lg-12 col-lg-offset-3 \">{error}</div>"
               
                ],
            ]); ?>
            /* Поля формы и капча */
            <?= $form->field($model, 'name') ?>
            <?= $form->field($model, 'email') ?>
            <?= $form->field($model, 'subject') ?>
       
            <?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
            <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
                'captchaAction' => '/index/captcha',
                'template' => '<div class="row"><div class="col-lg-4">{image}</div><div class="col-lg-7">{input}</div></div>',
            ]) ?>
            // Кнопка отправки формы
            <div class="form-group">
                <?= Html::submitButton('Отправить сообщение', ['class' => 'btn btn-default waves-effect btn-color-orange btn-color-orange-long', 'name' => 'contact-button']) ?>
            </div>
            
            <?php ActiveForm::end(); ?>
    
        <?php endif; ?>
    
    </div>
</article>

Четвертый шаг. В папке config в файле config.php и пишем следующий код.

$params = require(__DIR__ . '/params.php');
//.....
'components' => [
    'mailer' => [
            'class' => 'yii\swiftmailer\Mailer'
            ]
]
//.....
'params => $params,
//....

Шаг пятый. В папке config создаем файл params.php и пишем следующий код.

return [
    'emailto' => 'your@mail.ru',
];

Основная часть этого кода доступна из коробки, но для того чтобы до конца понимать принцип работы фреймворка, обязательно создайте его вручную!