Рассмотрим форму обратной связи для сайта. Нам необходимо создать модель, контроллер и вывести форму в представление. Рассмотрим кусок программного кода, а так же прокомментируем его.
Первым действием создадим модель с названием 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', ];
Основная часть этого кода доступна из коробки, но для того чтобы до конца понимать принцип работы фреймворка, обязательно создайте его вручную!