Сегодня рассмотрим работающий пример формы обратной связи с использованием компонента SwiftMailer. Изначально в файл конфигурации web.php components подключим SwiftMailer.
'components' => [ //... 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer' ] //... ]
Создадим модель MailForm и опишем ее. Используем для примера 3 поля это заголовок, описание и капчу.
namespace app\models; use Yii; use yii\base\Model; class MailForm extends Model { public $title; // заголовок public $description; // описание public $verifyCode; // капча public function rules() { return [ //поля обязательные для заполнения [ ['title', 'body'], 'required'], // проверка капчи ['verifyCode', 'captcha'], ]; } public function attributeLabels() { return [ 'title' => 'Заголовок', 'description' => 'Описание', 'verifyCode' => 'Подтвердите код с картинки', ]; } // функция отправки формы обратной связи public function contact($emailto) { if ($this->validate()) { Yii::$app->mailer->compose() ->setFrom('to@mail.ru') // email, от кого отправляем ->setTo($emailto) // email, кому отправляем ->setSubject($this->title) // заголовок писма ->setTextBody($this->description) // тело письма ->send(); return true; } else { return false; } } }
Вторым шагом опишем функцию-обработку отправки формы обратной связи на почту.
public function actionFix() { // создаем экземпляр класса описанного выше $model = new MailForm(); // если произошла передача формы и отправка ее, то if ($model->load(Yii::$app->request->post()) && $model->contact('from@mail.ru)) { // выводим сообщение об успехе и обновляем страницу Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh(); } else { // иначе просто выводим форму return $this->render('contact', ['model' => $model]); } }
Третьим, завершающим шагом, опишем вывод формы в представлении.
use yii\helpers\Html; use yii\bootstrap\ActiveForm; $this->title = 'Обратная связь'; ?> // выводим заголовок echo Html::encode($this->title) ?> // если ошибок нет то выводим информации об успехе отправки формы обратной связи if (Yii::$app->session->hasFlash('fixFormSubmitted')) echo "Форма обратной связи отправлена" else: // выводим форму $form = ActiveForm::begin([ 'id' => 'fix-form', 'options' => ['class' => 'form-horizontal'], 'fieldConfig' => [ 'template' => "{label}{input}{error}", ], ]); // поле для заголовка echo $form->field($model, 'title'); // тело документа echo $form->field($model, 'description')->textArea(['rows' => 6]); // капча echo $form->field($model, 'verifyCode')->widget(Captcha::className(), [ 'captchaAction' => '/index/captcha', 'template' => '{image}{input}', ]) ?> // кнопка отправить echo Html::submitButton('Отправить', ['class' => contact-button', 'name' => 'contact-button']); ActiveForm::end(); endif;