Форма сообщения Yii2 не может выполнить действие - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть форма, которую я запускаю с jQuery trigger, и если я устанавливаю метод на GET, она работает.Но если метод «POST» - 400 Bad Request.Мой взгляд выглядит следующим образом:

<?php if (Yii::$app->session->hasFlash('success')): ?>
    <div class="success-message text-center"><?= Yii::$app->session->getFlash('success') ?></div>
<?php else: ?>
    <form action="/order/confirmation" method="post" style="display: none" id="confirm-order">
        <input type="hidden" name="order_id" value="<?= $_GET['id'] ?>"/>
        <input type="hidden" name="confirm" value="1"/>
    </form>
<?php endif; ?>

<?php
$this->registerJs("
    (function(){
        let form = $('#confirm-order')       
        form.trigger('submit')
    })()
", \yii\web\View::POS_LOAD)
?>  

И мое действие:

public function actionConfirmation()
    {
        $id = Yii::$app->request->post('order_id');
        $confirm = Yii::$app->request->post('confirm');
        if($confirm){
            $order = Orders::findOne(['id' => $id]);
            $order->confirmed = 1;
            $order->update(false);
            Yii::$app->session->setFlash('success', Yii::t('app', 'Your personal information was deleted'));
        }
        return $this->render('confirmation');
    }

В моем UrlManager URL установлен так:

'order/confirmation' => 'order/confirmation',

Такжепопытался поставить behaviors на действие контроллера как:

public function behaviors()
    {
        return [
            'verbs' => [
                'class' => \yii\filters\VerbFilter::className(),
                'actions' => [
                    'confirmation'  => ['POST', 'GET'],
                ],
            ],
        ];
    }

Ничего не помогает.Резюме - GET работ.POST нет.В чем здесь моя ошибка?

1 Ответ

0 голосов
/ 31 декабря 2018

Вы должны добавить ввод с токеном CSRF вручную, как показано ниже, в вашу форму, поскольку вы не используете ActiveForm, который автоматически добавляет скрытый ввод для отправки запроса POST, а для всех запросов POST требуется CSRF токен для предотвращения CSRF-атак , поэтому я не рекомендую его отключать, но вы должны предоставить ввод вручную:

<form action="/order/confirmation" method="post" style="display: none" id="confirm-order">
    <?= \yii\helpers\Html::hiddenInput(Yii::$app->request->csrfParam, Yii::$app->request->getCsrfToken());?>
    <input type="hidden" name="order_id" value="<?= \yii\helpers\Html::encode($_GET['id']) ?>"/>
    <input type="hidden" name="confirm" value="1"/>
</form>
...