Yii2 post 表单无法执行动作
Yii2 post form can't execute the action
我有一个用 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
没有。我的错误是什么?
您应该手动添加带有 CSRF 令牌的输入,如下所示,因为您没有使用 ActiveForm
自动添加隐藏输入以提交 POST
请求和所有 POST
请求需要 CSRF
令牌来阻止 CSRF attacks,所以我不建议您禁用它,但您应该手动提供输入:
<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>
我有一个用 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
没有。我的错误是什么?
您应该手动添加带有 CSRF 令牌的输入,如下所示,因为您没有使用 ActiveForm
自动添加隐藏输入以提交 POST
请求和所有 POST
请求需要 CSRF
令牌来阻止 CSRF attacks,所以我不建议您禁用它,但您应该手动提供输入:
<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>