Проблема с отправкой формы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Проблема с отправкой формы

Сообщение Igor346 »

При попытки отправки форм получаю ошибку: Не удалось проверить переданные данные.
Если я все правильно понял, то причиной ошибки служит

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

'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '...',
            'enableCsrfValidation' => true, // - Эта строка и конкретно true в ней
            'baseUrl' => '',
Есть понимание того зачем она нужна в общих чертах. Совсем не пониманию как правильно ей пользоваться и как она работает.
В том виде как прописал сейчас получаю ошибку, без этой строки получаю ошибку, если меняю значение на false - работает. Попытки поиска универсального решения ясности не дали или я не смог понять. Прочитав здесь не понял где именно нужно прописать указанный код и мой ли это случай в итоге сделал вывод, что все не так просто с этим csrf. Но как решить проблему тоже не совсем понял, если кто может помочь, объясните человекопонятным языком как с этим зверем справится. Для понимания код дам, пишите конкретно каких файлов нужен код.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с отправкой формы

Сообщение ElisDN »

Во все формы с action="post" добавляется hidden-поле с токеном. При приёме POST-запросов этот токен проверяется.

Делайте формы через ActiveForm или Html::beginForm. Они добавят токен и проблем не будет.

Если нужно принимать запросы с других сайтов без токена, то можно отключить для нужного контроллера:

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

class MyController extends Controller
{
    public $enableCsrfValidation = false;

    ...
}
или для одного экшена:

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

class MyController extends Controller
{
    public function beforeAction($action)
    {
        if ($action->id == 'upload') {
            $this->enableCsrfValidation = false;
        }
        return parent::beforeAction($action);
    }
    ...
}
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Форма сделана через ActiveForm

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

<?
use yii\helpers\Html;
use yii\helpers\Url;
use yii\widgets\ActiveForm;
?>


<div class="page-cart">

    <?php if( Yii::$app->session->hasFlash('info') ): ?>
        <div class="alert alert-info alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <?php echo Yii::$app->session->getFlash('info'); ?>
        </div>
    <?php endif;?>

    <?php if( Yii::$app->session->hasFlash('error') ): ?>
        <div class="alert alert-danger alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <?php echo Yii::$app->session->getFlash('error'); ?>
        </div>
    <?php endif;?>

    <? if (!empty($session['cart'])): ?>
        <div class="table-responsive">
            <table class="table table-hover table-bordered">
                <thead>
                <tr class="info">
                    <th>Фото</th>
                    <th>Товар</th>
                    <th>Количество</th>
                    <th>Цена</th>
                    <th>Сумма</th>
                    <th><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </th>
                </tr>
                </thead>
                <tbody>
                <? foreach ($session['cart'] as $id => $item): ?>
                    <tr>
                        <td> <a href="<?= Url::to(['products/view', 'id' => $id])?>"> <?= Html::img("@web/pic/{$item['img']}", ['alt' => $item['name'], 'height' => 70]) ?></a></td>
                        <td>  <a href="<?= Url::to(['products/view', 'id' => $id])?>"><?= $item['serie'] ?> <?= $item['name'] ?> <?= $item['code']?></a></td>
                        <td><?= $item['qty'] ?></td>
                        <td><?= $item['price'] ?></td>
                        <td><?= $item['price'] * $item['qty'] ?></td>
                        <td><span data-id="<?= $id ?>" class="glyphicon glyphicon-remove text-danger del-item" aria-hidden="true"></span></td>
                    </tr>
                <? endforeach; ?>
                <tr class="info">
                    <td colspan="5">Количество:</td>
                    <td><?= $session['cart.qty'] ?> шт. </td>
                </tr>
                <tr class="info">
                    <td colspan="5">Всего:</td>
                    <td><?= $session['cart.sum'] ?> руб. </td>
                </tr>
                </tbody>
            </table>
        </div>
        <hr/>
        <? $form = ActiveForm::begin()?>
        <?= $form->field($order, 'name')?>
        <?= $form->field($order, 'email')?>
        <?= $form->field($order, 'phone')?>
        <?= $form->field($order, 'address')?>
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-info'])?>
        <? ActiveForm::end()?>
    <? else: ?>
        <h3>Корзина пуста</h3>
    <? endif; ?>
</div>
Или я не правильно понял и в контроллере обязательно прописано должно быть?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с отправкой формы

Сообщение ElisDN »

Igor346 писал(а): 2017.04.28, 19:29 Форма сделана через ActiveForm
Тогда всё должно работать.
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Т.е. хотите сказать, что в контроллере надо прописать то, что вы написали? Или поискать где-то ещё проблему можно?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с отправкой формы

Сообщение ElisDN »

Не надо прописывать.

Стандартная форма site/contact работает?
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Нет. Но вообще какая-то белиберда получается пробовал стандартную форму с трех устройств отправить. Со смартфона отправилась, с компьютера на котором отключал проверку csrf отправлял форму для входа в админку (т.к. выскакивала та же проблема с проверкой данных) и после этого включал проверку выдал экран ошибки
Swift_TransportException
Expected response code 250 but got code "553", with message "553 5.7.1 Sender address rejected: not owned by auth user.
с ноутбука на котором не отключал проверку и не отправлял никаких форм выдал ошибку проверки данных.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Проблема с отправкой формы

Сообщение futbolim »

В mailer-e "from" не совпадает с тем, что в конфиге
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

CartController

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

public function actionView()
    {
        $session = Yii::$app->session;
        $session->open();
        $this->setMeta('Корзина');
        $order = new Order();
        if ($order->load(Yii::$app->request->post()))
        {
            $order->qty = $session['cart.qty'];
            $order->sum = $session['cart.sum'];
            if ($order->save())
            {
                $this->saveOrderItems($session['cart'], $order->id);
                Yii::$app->session->setFlash('info', 'Заказ принят. В ближайшее время мы с Вами свяжемся.');
                Yii::$app->mailer->compose('order', compact('session', 'order'))
                    ->setFrom(['lea@msvlg.ru' => '...'])
                    ->setTo(Yii::$app->params['adminEmail'])
                    ->setSubject('Заявка')
                    ->send();
                Yii::$app->mailer->compose('letter', compact('session'))
                    ->setFrom(['lea@msvlg.ru' => '...'])
                    ->setTo($order->email)
                    ->setSubject('Заявка')
                    ->send();
                $session->remove('cart');
                $session->remove('cart.qty');
                $session->remove('cart.sum');
                return $this->refresh();
            }
            else
            {
                Yii::$app->session->setFlash('error', 'При оформлении произошла ошибка. Пожалуйста свяжитесь с нами для заказа.');
            }
        }
        return $this->render('view', compact('session', 'order', 'letter'));
    }

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

SiteController

<?php

namespace app\controllers;


use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
use app\models\Categories;


class SiteController extends AppController
{

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post', 'get'],
                ],
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

    /**
     * Displays homepage.
     *
     * @return string
     */
    public function actionIndex()
    {
        $cat = Categories::find()->where(['parent_id' => ''])->with('subcats')->limit(9)->all();
//        $subcats = Categories::find()->where(['parent_id' => ''])->all();
        
        return $this->render('index', compact('cat', 'subcats'));
    }

    /**
     * Login action.
     *
     * @return string
     */
    public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        }
        return $this->render('login', [
            'model' => $model,
        ]);
    }

    /**
     * Logout action.
     *
     * @return string
     */
    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }

    /**
     * Displays contact page.
     *
     * @return string
     */
    public function actionContact()
    {
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');

//        Пробовал еще с такой строкой, 
//            Yii::$app->mailer->compose('contact', ['model' => $model])->setFrom('lea@msvlg.ru')->setTo($model->email)->setSubject('Письмо директору')->send();
// та же ошибка Swift_TransportException
// Expected response code 250 but got code "553", with message "553 5.7.1 Sender address rejected: not owned by auth user.

            return $this->refresh();
        }
        return $this->render('contact', [
            'model' => $model,
        ]);
    }

    /**
     * Displays about page.
     *
     * @return string
     */
    public function actionAbout()
    {
        return $this->render('about');
    }
}
config/web

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

'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'useFileTransport' => false,
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.yandex.ru',
                'username' => 'lea@msvlg.ru',
                'password' => '...',
                'port' => '465',
                'encryption' => 'ssl',
            ],
        ],
Вот файлы, если я правильно понял о чем Вы.
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Проблема во всех формах. site/login тоже самое

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

<?php

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

$this->title = 'Авторизация';
$this->params['breadcrumbs'][] = $this->title;
?>

<div class="site-login windows">
    <h1><?= Html::encode($this->title) ?></h1>

    <p>Необходима авторизация:</p>

    <?php $form = ActiveForm::begin([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            'labelOptions' => ['class' => 'col-lg-1 control-label'],
        ],
    ]); ?>

        <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>

        <?= $form->field($model, 'password')->passwordInput() ?>

        <?= $form->field($model, 'rememberMe')->checkbox([
            'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
        ]) ?>

        <div class="form-group">
            <div class="col-lg-offset-1 col-lg-11">
                <?= Html::submitButton('Вход', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
            </div>
        </div>

    <?php ActiveForm::end(); ?>
</div>

Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с отправкой формы

Сообщение ElisDN »

Если даже стандартные вещи не работают, то проблема с сессиями/куками сервера, а не в Yii.
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Внесу еще больше смуты.
1. Как писал ранее на некоторых устройствах на, которых отправлял форму со значением выставленным в false, потом начинает работать и когда в true.
2. Протестил на локальном в браузерах где не отправлял форму со значением выставленным в false, тоже ошибка.
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Проблема с отправкой формы

Сообщение Igor346 »

Как решают данную проблему на сервере? Информация, что на локальном сервере не работает тоже, ничего не меняет? Мне нужно что-то поменять в настройках OpenServer'а?
Ответить