Код контроллера:
Код: Выделить всё
<?php
namespace frontend\controllers;
use Yii;
use yii\web\TooManyRequestsHttpException;
use yii\web\UploadedFile;
use yii\filters\AccessControl;
use frontend\models\EnquiriesForm;
use frontend\traits\controller\ContentPageLoader;
/**
* Контроллер страницы приема обращения от граждан
* @package frontend\controllers
*/
class EnquiriesController extends BaseController
{
use ContentPageLoader;
/**
* Страница формы приема обращения от граждан
*
* @return mixed
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['index'],
'allow' => true,
],
],
],
];
}
public function actionIndex()
{
$formModel = new EnquiriesForm();
if (Yii::$app->request->isPost && $formModel->load(Yii::$app->request->post()) && $formModel->validate()) {
try {
$formModel->attached = UploadedFile::getInstance($formModel, 'attached');
$fileName = $this->uploadFile($formModel);
$this->sendEmail($formModel, $fileName);
if (is_file($fileName)) {
@unlink($fileName);
}
Yii::$app->session->setFlash('success-msg', Yii::t('frontend', 'Ваше обращение отправлено!'));
return $this->refresh();
} catch (TooManyRequestsHttpException $e) {
Yii::$app->session->setFlash('error-msg',
Yii::t('frontend', 'Можно отправлять не более 1 обращения в минуту!'));
}
}
return $this->render('index.twig', [
'formModel' => $formModel,
]);
}
/**
* Сохранения файла
* @param $formModel
* @return bool|string
*/
protected function uploadFile($formModel)
{
$tmp_dir = rtrim(ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir(), '/') . '/';
if ($formModel->attached && $formModel->validate()) {
$fileName = $tmp_dir . md5($formModel->attached->baseName . rand()) . '.' . $formModel->attached->extension;
if ($formModel->attached->saveAs($fileName)) {
return $fileName;
}
}
return false;
}
/**
* Отослать на email
*
* @param EnquiriesForm $enquiries
* @param null $fileName
* @return bool
*/
protected function sendEmail(EnquiriesForm $enquiries, $fileName = null)
{
$mail = Yii::$app->mailer->compose('@common/mail/enquiries-html', [
'enquiries' => $enquiries
])
->setSubject(Yii::t('frontend', 'Новое обращение!'))
->setTo(Yii::$app->settings->get('enquiries_email')->value)
->setFrom([Yii::$app->params['supportEmail'] => Yii::t('frontend', 'Сайт ТПУ')]);
if ($fileName) {
$mail->attach($fileName, ['fileName' => $enquiries->attached->name]);
}
return $mail->send();
}
}
Код: Выделить всё
<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
use yii\helpers\ArrayHelper;
/**
* Форма для отправки обращений
*/
class EnquiriesForm extends Model
{
public $stuff;
public $familiya;
public $imya;
public $otchestvo;
public $mailIndex;
public $mailAddress;
public $email;
public $phone;
public $text;
public $attached;
public $verifyCode;
public $iAgree;
/**
* @inheritdoc
*/
public function rules()
{
return [
[
['stuff', 'familiya', 'imya', 'mailIndex', 'mailAddress', 'text',],
'required',
'message' => Yii::t('frontend', 'Необходимо заполнить поле')
],
[
['iAgree'],
'required',
'requiredValue' => 1,
'message' => Yii::t('frontend', 'Подтвердите согласие на обработку данных')
],
[['email'], 'email', 'message' => Yii::t('frontend', 'Почта имеет неправильный формат')],
[['familiya', 'imya', 'otchestvo', 'email', 'phone'], 'string', 'max' => 255],
[['text'], 'string', 'max' => 3000],
[['attached'], 'file', 'maxSize' => 1024 * 100],
// Добавляем капчу
['verifyCode', 'captcha','captchaAction'=>'enquiries/captcha'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return ArrayHelper::merge(parent::attributeLabels(), [
'stuff' => Yii::t('frontend', 'Кому адресовано обращение *'),
'familiya' => Yii::t('frontend', 'Фамилия *'),
'imya' => Yii::t('frontend', 'Имя *'),
'otchestvo' => Yii::t('frontend', 'Отчество'),
'mailIndex' => Yii::t('frontend', 'Индекс *'),
'mailAddress' => Yii::t('frontend', 'Почтовый адрес *'),
'email' => Yii::t('frontend', 'Электронная почта'),
'phone' => Yii::t('frontend', 'Телефон'),
'text' => Yii::t('frontend', 'Суть обращения *'),
'attached' => Yii::t('frontend',
'Вы можете также прикрепить здесь файл, если суть обращения этого требует'),
'verifyCode' => Yii::t('frontend', 'Введите проверочный код *'),
]);
}
}
Код: Выделить всё
{% if app.session.flash('success-msg') %}
<h3 class="form-message form-message_success">{{ app.session.flash('success-msg') }}</h3><br>
{% endif %}
{% if app.session.flash('error-msg') %}
<h3 class="form-message form-message_error">{{ app.session.flash('error-msg') }}</h3><br>
{% endif %}
{% set form = active_form_begin(
{
'id': 'enquiries-question-form',
'enableAjaxValidation' : false,
'enableClientValidation' : true,
'options': {
'class': 'enquiries__form form',
},
'fieldConfig' : {
'wrapperOptions': {
'tag': 'div',
'class': 'form__row'
},
'labelOptions': {
'class': 'form__label'
},
'inputOptions': {
'class': 'form__input'
},
'errorOptions': {
'class': 'form-message form-message_error'
},
'template' : "{beginWrapper}\n{label}\n<div class='form__control'>{input}</div>\n{hint}\n{error}\n{endWrapper}",
},
})
%}
<p style="color:red">.Внимание! Поля, отмеченные <b>*</b>, обязательны для заполнения.</p><br>
{{ form.field(formModel, 'stuff')|raw }}
{{ form.field(formModel, 'familiya')|raw }}
{{ form.field(formModel, 'imya')|raw }}
{{ form.field(formModel, 'otchestvo')|raw }}
{{ form.field(formModel, 'mailIndex')|raw }}
{{ form.field(formModel, 'mailAddress')|raw }}
{{ form.field(formModel, 'email')|raw }}
{{ form.field(formModel, 'phone')|raw }}
{{ form.field(formModel, 'text', {'template': "{beginWrapper}\n{label}\n{input}\n{hint}\n{error}\n{endWrapper}"})
.textarea({'class': 'textarea', 'rows' : '5'})|raw }}
{{ form.field(formModel, 'attached').fileInput({'class': ''})|raw }}
{{ use('yii\helpers\Html') }}
{{ use('yii\widgets\ActiveForm') }}
{{ use('yii\captcha\Captcha') }}
{{ form.field(formModel, 'verifyCode').widget('yii\\captcha\\Captcha',
{'template': '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>','captchaAction' : 'site/captcha'}) | raw
}}
<div class="form__row">
{% set IAgreeText = 'Я даю согласие на обработку моих персональных данных в целях работы по данному обращению, в соответствии
<p >с Федеральным законом № 152-ФЗ «О персональных данных». Настоящее согласие предоставляется на осуществление любых действий в отношении моих персональных данных, которые необходимы или желаемы для достижения указанных выше целей.</p>
<p >Оператор гарантирует, что обработка личных (персональных) данных осуществляется в соответствии с законодательством Российской Федерации.</p>
<p >Я проинформирован, что Оператор будет обрабатывать мои персональные данные как неавтоматизированным, так и автоматизированным способом обработки.
Данное Согласие действует до достижения целей обработки персональных данных, установленных законодательством Российской Федерации.</p>
<p >Согласие может быть отозвано по моему письменному заявлению.</p>
<p >Я подтверждаю, что, давая такое Согласие, я действую своей волей и в своих интересах.<p>' %}
{{ form.field(formModel, 'iAgree').checkbox({'checked' : false, 'label': IAgreeText})|raw }}
</div>
<div class="form__row">
<button class="button button_theme_rectangle-blue">
<span>{{ t('frontend', 'Отправить') }}</span>
</button>
</div>
{{ active_form_end() }}