【问题标题】:Posting multiple submit button value to controller error将多个提交按钮值发布到控制器错误
【发布时间】:2015-12-13 09:38:26
【问题描述】:

过去几天我一直在寻找解决方案,但我无法获得正确的解决方案,包括在Submitting Button Value to Controller but fail to post the value 之前将其发布到 stackoverflow,但我决定再次提交,因为问题已经改变,因为我已经知道错误。

我想在 yii2 中向控制器发布多个提交按钮,如果代码如下所示,首先我可以从控制器中的 $_POST['chosen'] 获取提交按钮值:

    <?php $form =ActiveForm::begin() ?>


        <hr>
        <div class="row">
            <div style="float:left" >
                <?= Html::submitButton('Add Row', [ 'name' => 'chosen', 'value'  =>  'addmore', 'class' => 'btn btn-info']) ?>
            </div>
            <div style="float:right" >
                <?= Html::submitButton('Next Page', ['class' => 'btn btn-primary', 'name' => 'chosen', 'value' =>  'nextpage']) ?>
            </div>
        </div>

    <?php ActiveForm::end()?>

但是当我添加我的函数来生成一个 div 时,我无法再获得 $_POST['chosen'],但我仍然可以在控制器中获得 $model 对象。该函数(addRelationForm)用于动态生成 div 对象,因此我可以将未确定大小的数组提交给控制器。我可以通过按添加行按钮动态添加 div。

<?php
    use kartik\widgets\RangeInput;
    use yii\app\clientScript;
    use yii\bootstrap\ActiveForm;
    use yii\helpers\Html;
    use frontend\models\relation;

    $this->registerJsFile('http://code.jquery.com/jquery-2.1.4.min.js');

    function addRelationForm($form, $item, $i){



        return '<div class="col-md-12" id=\'r_'.($i).'\'>
        <div class="form-group col-md-12">
            <label> Friend ' . ($i + 1) . '</label>'.
         $form->field($item, "[$i]user_friend_id") .
       '<label> Closeness to you </label>

        <div class="form-inline">   ' .

            $form->field($item, "[$i]closeness")->widget(RangeInput::classname(), [
                'options' => ['placeholder' => 'Rate (1 - 5)...'],
                'html5Options' => [
                    'min' => 1, 'max' => 5,
                    'width' => '75%',
                    'addon' => ['append' => ['content' => '<i class="glyphicon glyphicon-star"></i>']]
                ]])->label(false).
        '</div> '.
        '<div class="form-inline" >
                I know this person as a friend for approximately (in year) '.
                $form->field($item, "[$i]known_for")->textInput(["type" => "number", "placeholder" => '(in year)'])->label(false).
        '</div></div></div>';

    }


?>


    <h1>Friendship Survey</h1>

    <p> Introverted the space below, list up to ten of your closest friends that are currently in Econs/ Math and Econs; a minimum of 5 is compulsory. *Please select their full names from the dropdown list provided. Also, please select on the scale how close you are to each friend. 1Note the incentives for this section </p>


    <?php $form =ActiveForm::begin() ?>

        <?php foreach ($items as $i => $item) { 
                echo addRelationForm($form ,$item, $i);
            } 
        ?>


        <hr>
        <div class="row">
            <div style="float:left" >
                <?= Html::submitButton('Add Row', [ 'name' => 'chosen', 'value'  =>  'addmore', 'class' => 'btn btn-info']) ?>
            </div>
            <div style="float:right" >
                <?= Html::submitButton('Next Page', ['class' => 'btn btn-primary', 'name' => 'chosen', 'value' =>  'nextpage']) ?>
            </div>
        </div>

    <?php ActiveForm::end()?>

<?php
    $this->registerJsFile('/advanced/frontend/web/js/partone-two.js');
?>

我的控制器如下所示:

public function actionTwo(){ 
        if(\Yii::$app->user->isGuest){ 
            $this->goHome();
        } 
        $models = []; 

        var_dump($_POST);

        Yii::trace("esting" .empty($_POST['chosen']));

        for($i = 0; $i < 5 ; $i++){ 
                $models[$i] = new RelationForm(); 
        }


        if(!empty($_POST['add'])){                
            if('addmore' == $_POST['add']){
                Model::loadMultiple($models, Yii::$app->request->post('items'));
                $model = new RelationForm();
                array_push($models, $model);
                return $this->render('two', ['items' => $models]);    
            }
        }



        if (Model::loadMultiple($models, Yii::$app->request->post()) ) 
        { 
            $count = 0; 
            for($i = 0 ; $i < count($models); $i++){ 
                if(!$models[$i]->validate()){
                    if($models[$i]->hasErrors()){
                        Yii::trace( Html::errorSummary($models[$i]  ));
                    }  

                    return $this->render('two', ['items' => $models]);     
                }
            }

            for($i = 0 ; $i < count($models); $i++){ 
                if(!$models[$i]->store()){
                     return $this->render('two', ['items' => $models]);     
                }
            }

            Yii::$app->session->setFlash('success', "Processed {$count} records successfully."); 
            return $this->redirect('three', ['items' => $models]);// redirect to your next desired page 
        }
        else {                 
            Yii::trace("Render");
            return $this->render('two', array('items' => $models)); 
        } 
        return null; 
}

【问题讨论】:

  • 我从 var_dump($_POST) 检查,它应该在我之前测试过的树内
  • 如果您通过 ajax 加载 div,您需要确保在 jquery 中使用 .on,否则它将无法工作。 api.jquery.com/on
  • 我无法获得名称,您可以看看我的question 相关吗?

标签: php yii2 yii2-advanced-app


【解决方案1】:

而不是 &lt;?= Html::submitButton('Add Row', [ 'name' =&gt; 'chosen', 'value' =&gt; 'addmore', 'class' =&gt; 'btn btn-info']) ?&gt; 创建 &lt;button type="submit" ... &gt;Submit&lt;/button&gt; 使用 submitInput($label = 'Submit', $options = []) 创建 &lt;input type="submit" name="chosen" value="addmore" class="btn btn-info"&gt;

然后在控制器中:$var = \Yii::$app-&gt;request-&gt;post('chosen'); 您可以检查变量是否为空:empty($var)(每个 submitInput 的名称不同,没有值)或 isset &amp;&amp; $var === 'your_value'(名称相同,但 submitInput 中的值不同 - 未测试它是否工作)

【讨论】:

  • 我无法获得名称,您可以看看我的question 相关吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多