Yii2 无法在控制器中获取提交按钮名称

Posted

技术标签:

【中文标题】Yii2 无法在控制器中获取提交按钮名称【英文标题】:Yii2 unable to get the submit button name in controller 【发布时间】:2021-04-06 06:05:21 【问题描述】:

我正在处理yii2。我正在尝试在我的控制器中获取 submit button 名称。以下是我的看法

<div class="form-group">
            <a class="btn btn-default" onclick="window.history.back()" href="javascript:"><i
                        class="fa fa-close"></i>
                Cancel</a>

            <?php if ($model->isNewRecord && in_array(Yii::$app->user->identity->access_level,['admin','manager']))  ?>

                <?= html::submitButton('Add' ,['class' => 'btn btn-success','name'=>'a']) ?>
                <?= Html::submitButton('Add & Send Quotation' ,['class' => 'btn btn-info','name'=>'s']) ?>
            <?php  elseif (!$model->isNewRecord && in_array(Yii::$app->user->identity->access_level,['admin'])) ?>
                <?= Html::submitButton('Update', ['class' =>'btn btn-warning']) ?>
            <?php elseif (!$model->isNewRecord && in_array(Yii::$app->user->identity->access_level,['editor']))?>

                <?php
                if ($model->reqStatus==\common\models\Accountant::$request_status_titles[0]
                    ||$model->reqStatus==\common\models\Accountant::$request_status_titles[2]
                )
                

                    echo Html::submitButton('Verified', ['class' =>'btn btn-success','name'=>'v']);
                    echo Html::submitButton('Not-Verified', ['class' =>'btn btn-danger','name'=>'n']);
                
                ?>

            <?php  elseif (!$model->isNewRecord && in_array(Yii::$app->user->identity->access_level,['manager']))?>
                <?php
                if ($model->reqStatus==\common\models\Accountant::$request_status_titles[3])
                
                    echo Html::submitButton('Signed',['class' =>'btn btn-primary','name'=>'g']);
                
                elseif ($model->reqStatus==\common\models\Accountant::$request_status_titles[4])
                
                    echo Html::submitButton('Follow-Up',['class' =>'btn btn-primary','name'=>'r']);
                
                else
                    echo Html::submitButton('Send Quotation',['class' =>'btn btn-primary','name'=>'q']);
                
                ?>
            <?php  ?>
        </div>

在上面的代码中有多个submit button,每个name。在我的控制器中,我想获得 Html::submitButton('Verified', ['class' =&gt;'btn btn-success','name'=&gt;'v']); 这个和 echo Html::submitButton('Not-Verified', ['class' =&gt;'btn btn-danger','name'=&gt;'n']); 这个按钮的名称。

 if (isset($_POST['v'])) //verified
        
            $model->load(Yii::$app->request->post());
            $model->reqStatus = Accountant::$request_status_titles[1];
            $model->callVerified = 1;
            $model->clientRef = 'CL-'.uniqid();
            if($model->save())
            

                return $this->redirect(['view', 'id' => $model->id]);
            
            return $this->render('update', [
                'model' => $model,
            ]);

        
        elseif (isset($_POST['n']))//not-verified
        
            
            $model->load(Yii::$app->request->post());
            $model->reqStatus = Accountant::$request_status_titles[2];

            if($model->save())
            

                return $this->redirect(['view', 'id' => $model->id]);
            
            return $this->render('update', [
                'model' => $model,
            ]);
        
        else
        
            if ($model->load(Yii::$app->request->post()) && $model->save()) 
                return $this->redirect(['view', 'id' => $model->id]);
            
            return $this->render('update', [
                'model' => $model,
            ]);
        

当我执行它时。我可以看到verifiednot verified 按钮。但是当我点击其中任何一个时,它不会转到 if (isset($_POST['v']))esleif (isset($_POST['n']))part 而是点击 else 部分。我正在另一个控制器上做同样的事情,它工作得很好。

更新 1

根据scaisEdge 的评论,我尝试过var_dump($_POST),下面是结果

array(2) 
    ["_csrf-backend"]=> string(88) "xS7Ctb2C677HKQJjoBL2SPznK3IHVGUDSn7MGhMs9SigHov36PSI7J9OewzkSJ0AzpBYN0A_KTIlEIZfd1qiYQ=="
    ["Bookkeeping"]=> array(43) 
        ["name"]=> string(5) "Laeeq"
        ["conNumb"]=> string(11) "03464394600"
        ["email"]=> string(15) "laeeq@gmail.com"
        ["location"]=> string(12) "Amber Valley"
        ["reqConcerns"]=> string(22) "UK_limited_partnership"
        ["workStart"]=> string(21) "PROJECT_START_2_MONTH"
        ["businessName"]=> string(27) "Retail_consumer_merchandise" 
        ["reqPurpose"]=> string(40) "Select between several bookkeeper quotes" 
        ["bookAssign"]=> string(16) "One_time_project"
        ["bookkRequire"]=> string(32) "Only local bookkeepers can quote"
        ["bookWork"]=> string(15) "Annual accounts"
        ["companyName"]=> string(22) "NONPROFIT_ORGANIZATION"
        ["turnOver"]=> string(17) "£300,000-600,000"
        ["info"]=> string(7) "Testing"
        ["remarks"]=> string(15) "Client Verified"
        ["annualConf"]=> string(0) ""
        ["personalTaxRetHrmc"]=> string(0) ""
        ["mPaySlip"]=> string(0) ""
        ["mRtiPenRet"]=> string(0) ""
        ["annualAcc"]=> string(0) ""
        ["annualCorpTaxRet"]=> string(0) ""
        ["annualCorpTaxRetHrmc"]=> string(0) ""
        ["qVatRet"]=> string(0) ""
        ["qBookMtd"]=> string(0) ""
        ["insuranceHmrc"]=> string(0) ""
        ["corpTaxPlan"]=> string(0) ""
        ["persTaxPlan"]=> string(0) ""
        ["businessAdvice"]=> string(0) ""
        ["fedTax"]=> string(0) ""
        ["provTax"]=> string(0) ""
        ["invPerM"]=> string(0) ""
        ["invPerMPrice"]=> string(0) ""
        ["add1"]=> string(0) ""
        ["add2"]=> string(0) ""
        ["add3"]=> string(0) ""
        ["add4"]=> string(0) ""
        ["add5"]=> string(0) ""
        ["add6"]=> string(0) ""
        ["add7"]=> string(0) ""
        ["add8"]=> string(0) ""
        ["add9"]=> string(0) ""
        ["add10"]=> string(0) ""
        ["remarks2"]=> string(0) "" 
    

上述结果中没有v字符串。

我一定错过了一些我不知道的东西。

任何帮助将不胜感激。

【问题讨论】:

尝试在控制器中使用 var_dump($_POST) 检查 $_POST .. 的真实内容 @scaisEdge 你可以查看我的update 1 @scaisEdge 字符串v 不存在 但是你有名字n .. ? .如果您只有两者之一,这对您的代码是正确的..一个项目只能有一个名称.. @scaisEdge 如果我点击verified 按钮,那么传递的名称应该是v,如果我点击not verified 按钮,那么传递的名称应该是n。在这两种情况下,它都没有发生。 【参考方案1】:
<?php $form = ActiveForm::begin() ?>

在开始和结束表单之前,您是否正在使用它?

【讨论】:

【参考方案2】:

您的代码很难阅读,因此您需要为简单起见对其进行重构。 如果我理解正确,您有一些条件,您希望出现不同的提交按钮。

第一件事是所有条件都不需要用户输入,所以你可以简单地在模型中做逻辑。

例如

$model-&gt;isNewRecord &amp;&amp; in_array(Yii::$app-&gt;user-&gt;identity-&gt;access_level,['admin','manager']

不需要用户输入,因此您可以在模型端进行处理。

【讨论】:

【参考方案3】:

我认为@Lionel Yeo 是对的。你的代码太复杂了。它应该在许多视图、控制器操作中分开。 另一种选择是您可以使用 Yii 生成的带有 GET 参数的 html 链接。如果我没看错你的代码..

如果你想查看传入的 POST 数据.. - 只需在控制器中打印 Yii::$app->request->post()

【讨论】:

【参考方案4】:

我遇到了同样的问题,似乎是因为我正在使用它造成的

'enableClientScript' => false,

在 ActiveForm::begin() 中

【讨论】:

【参考方案5】:

主要问题是您没有将值发送回名称。

看看这个答案:

Send value of submit button when form gets posted

简而言之,您的 html 标记应如下所示:

<button type="submit" name="submit" value="Signed">Signed</button>
<button type="submit" name="submit" value="Follow-Up">Follow-Up</button>

在 Yii2 视图中:

Html::submitButton('Signed',['class' =>'btn btn-primary','name' => 'submit', 'value' =>'Signed'])

在 Yii2 控制器中:

if(Yii::$app->request->post('submit') === 'Signed') 

【讨论】:

我要提交两次:| 嗨@Moeez,你是对的,我的回答不好。在您的情况下,$_POST 中应该有一个空字符串值。也许您可以为您的问题添加更多细节,至少是表单开始、结束标记。也许您可以检查浏览器开发人员工具以获取帖子信息。 (chrome - F12 - 网络选项卡 - 推送提交按钮 - 选择您的请求 - 标题 - 表单数据)

以上是关于Yii2 无法在控制器中获取提交按钮名称的主要内容,如果未能解决你的问题,请参考以下文章

我可以以其他形式获取提交按钮的名称吗?

提交时无法获取引导下拉列表的值

yii防止延迟用户多次点击按钮重复提交数据

Yii2 - 在模型中提交时如何从小部件中获取数据?

php一个表单提交多个页面,怎样获取按钮提交过来的值

如何在iOS(Xcode)中的提交按钮内实现分段控制?