yii2 & twig Проблема КАПЧИ

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
deryabinrs
Сообщения: 2
Зарегистрирован: 2019.02.18, 12:57

yii2 & twig Проблема КАПЧИ

Сообщение deryabinrs »

Доброе время. Проблема с отображением капчи. Капча не загружает изображение

Код контроллера:

Код: Выделить всё

<?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();
    }
}
Код модуля - EnquiriesForm.php

Код: Выделить всё

<?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', 'Введите проверочный код *'),
        ]);
    }
}
_form.twig

Код: Выделить всё

{% 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() }}
Ответить