具有相关下拉列表的动态表单

时间:2016-09-23 16:27:52

标签: php mysql forms yii2

嘿开发人员我正在构建一个应用程序表单,用户将数据输入到不同的字段中。该应用程序的一部分是来自https://github.com/wbraganca/yii2-dynamicform的动态表单。现在在动态表单内部我有一个依赖下拉,但是当我单击[+]符号时,依赖下拉列表会更改第一行而不是第二行的数据。

这是我的代码。

在我的控制器中

 public function actionLists($name)
    {
         $countHs= Hs::find()
                        ->where(['hscode'=> $name])
                        ->count();
         $Hs  = Hs::find()
                 ->where(['hscode'=> $name])
                 ->all();
         if($countHs > 0)
         { 
             foreach ($Hs as $H)
             {
                 echo "<option value='".$H->hsproduct."'> ".$H->hsproduct."</option>";


             }
         }else{
                 echo "<option> - </option>";
             }


    }

和我的表格

<div class="col-sm-6" style="width: 135px">
     <?= $form->field($modelsItems, "[{$i}]hscode")->dropDownList(
                                    ArrayHelper::map(Hs::find()->all(),'hscode','hsproduct'),                      

                                        [


                                            'prompt'=>'',

                                         'onchange'=>

                                        '$.get( "'.Url::toRoute('/hs/lists').'", { name: $(this).val() })
         .done(function( data ) { $( "#'.Html::getInputId($modelsItems, "[{$i}]hsproduct").'" ).html( data ); } );'

                                            ])->label('HS.Code'); 


                                ?>  

        </div>
    <div class="col-sm-6" style="width: 135px">
   <?= $form->field($modelsItems, "[{$i}]hsproduct")->dropDownList(
                                    ArrayHelper::map(Hs::find()->all(),'hsproduct','hsproduct'),
                                    [
                                     'prompt'=>'',
                                    ])->label('HS.Product');
                                 ?>  
        </div>

我是新手,对不起我的英文

1 个答案:

答案 0 :(得分:2)

针对您的案例进行了更新。

我所做的是在JS文件var i中声明了全局变量并分配了0。在第一个事件被触发后,我将变量i增加一个。现在它在内存中包含1个。下次需要1并再次添加1。等等:

var i = 0;

$(document).on('change', 'select', function(e) {
    i++;
})

请注意,只有在每行选择一次并且不会返回特定行时,这才有效。如果你想做类似的事情,你应该获取元素ID的数字,解析为浮点数(而不是字符串)并将该数字用于你的事件脚本。

parseFloat($('#hs-0-hscode')[0].id.split('-')[1])

留下一个额外的解决方案(但不是根据你的解决方案)。以防万一。

使用Inspect source查找输入字段的名称(名称或ID)。比方说,我们有name="hs-0-hscode"。这只是为了你的jQuery:

$(document).on('change', 'select', function(e) {
    if ($(this)[0].id.indexOf('hscode') > 0) {
        // Now you can use Ajax to get a list of items you want to show.
        // Element itself can be reached: $(this).parent().parent().parent().children().eq(1);
        // For example:
        // var data = $.parseJSON(results);
        // $.each(data, function(key, value) {
        //    $('#client-company_size')
        //        .append($("<option></option>")
        //        .attr("value", key)
        //        .text(value)); 
        // });
    }
});