【问题标题】:Yii2 select2 ajax dropdown loadingYii2 select2 ajax 下拉加载
【发布时间】:2016-04-18 04:31:43
【问题描述】:

我正在使用两个使用 Yii2 kartik 小部件的 select2 ajax 加载下拉列表。我需要在更改第一个下拉列表的选择时更改第二个下拉列表的选择。

第一个下拉菜单

 <?php

     $qtnno = '';
     $qtn = ServiceQuotation::find()->where(['UDNO' => $model->QTN_UDNO])->one();
     if($qtn != null)  $qtnno = $qtn->UDNO;

    echo $form->field($model, 'QTN_UDNO')->widget(Select2::classname(), [
    'initValueText' => $qtnno, // set the initial display text
    'options' => ['placeholder' => 'Search for a Quotation ...',
             'onchange'=>'
		                $.getJSON( "'.Url::toRoute('getqtndetails').'", { id: $("#servicejobcard-qtn_udno").val() } )
		                    .done(function( data ) {
		                        $( "#'.Html::getInputId($model, 'QTNNO').'" ).val( data.qtnno );
		                        $( "#'.Html::getInputId($model, 'QTNDATE').'" ).val( data.qtndate );
		                        $( "#'.Html::getInputId($model, 'PCODE').'" ).select2({ data: [{id: data.pcode, text: data.pname}]});;
                                $( "#'.Html::getInputId($model, 'PCODE').'" ).select2("val",data.pcode);
                                $( "#'.Html::getInputId($model, 'PROJECTNAME').'" ).val( data.projectname );
		                    }
		                );'
                 ],
      'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => $urlQtn,
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }')
        ],
        'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
        'templateResult' => new JsExpression('function(data) { return data.text; }'),
        'templateSelection' => new JsExpression('function (data) { return data.text; }'),
    ],
]);
         ?>

第二个下拉菜单

  <?php

     $cusName = empty($model->PCODE) ? '' : Customer::findOne($model->PCODE)->PNAME;

    echo $form->field($model, 'PCODE')->widget(Select2::classname(), [
    'initValueText' => $cusName, // set the initial display text
    'options' => ['placeholder' => 'Search for a Customer ...',
                 ],
      'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => $url,
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }')
        ],
        'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
        'templateResult' => new JsExpression('function(party) { return party.text; }'),
        'templateSelection' => new JsExpression('function (party) { return party.text; }'),
    ],
]);
         ?>

使用上面的代码,我可以在第二个下拉菜单中更改选择。但更改后,我无法在第二个下拉列表中进行选择。

请帮忙...

【问题讨论】:

    标签: yii2


    【解决方案1】:

    尝试以这种方式使用onchange事件:

    [
        'options' => [],
        // other settings
        'pluginEvents' => [
            'change' => "function() { alert('change'); }",
        ]
    ]
    

    您可以在该页面上找到更多信息http://demos.krajee.com/widget-details/select2

    【讨论】:

      【解决方案2】:

      如果您不仅限于使用 Select2 小部件,我建议您使用专门为依赖下拉菜单创建的 Kartik V 的 DepDrop 小部件。

      由于您没有为您的代码实际执行的操作提供大量上下文,因此我给出了一个简单的 2 级依赖示例(Kartik V 的 depdrop 小部件页面中给出的示例的略微修改版本)。

      /*
       * 2-level dependency example
       */
      // THE VIEW
      use kartik\widgets\DepDrop;
      
      // Parent 
      echo $form->field($model, 'cat')->dropDownList($catList, ['id'=>'cat-id']);
      
      // Dependent Dropdown (Child)
      echo $form->field($model, 'subcat')->widget(DepDrop::classname(), [
          'options'=>['id'=>'subcat-id'],
          'pluginOptions'=>[
              'depends'=>['cat-id'],
              'placeholder'=>'Select...',
              'url'=>Url::to(['/site/subcat'])
          ]
      ]);   
      
      // THE SITE CONTROLLER (/site/subcat)
      public function actionSubcat() {
          $out = [];
          if (isset($_POST['depdrop_parents'])) {
              $parents = $_POST['depdrop_parents'];
              if ($parents != null) {
                  $cat_id = $parents[0];
                  $out = self::getSubCatList($cat_id); 
                  // the getSubCatList function will query the database based on the
                  // cat_id and return an array like below:
                  // [
                  //    ['id'=>'<sub-cat-id-1>', 'name'=>'<sub-cat-name1>'],
                  //    ['id'=>'<sub-cat_id_2>', 'name'=>'<sub-cat-name2>']
                  // ]
                  echo Json::encode(['output'=>$out, 'selected'=>'']);
                  return;
              }
          }
          echo Json::encode(['output'=>'', 'selected'=>'']);
      }
      

      以上代码可根据您的要求定制。

      这里是更多详细信息的链接:http://demos.krajee.com/widget-details/depdrop

      【讨论】:

      • 您的答案始于假设可以使用另一个库,尽管问题特别提到了 select2。如果您对问题的限制有疑问,我建议您先对问题发表评论,而不是回答问题。在这种情况下使用 select2 可能有几个原因。但是,您的答案格式正确。
      • 感谢您的反馈。我曾尝试为该问题添加评论,但是缺乏声誉使我无法这样做。更重要的是,虽然 DepDrop 是一个不同的插件,但它可以设置要生成的下拉列表的 type 选项,并且支持 Select2 插件。
      • 是的,您的声誉是正确的。我没有想到声誉部分,你不可能以任何其他方式做到这一点。我的错。你可以无视评论。无论如何,很高兴您决定发布您的第一个答案!它的格式很好,很高兴您在示例中包含了如此大的一段代码。祝你好运!
      【解决方案3】:

      您可以添加这种查询来完成这项工作。

      $cusname=QtnUdno::find()-&gt;select('PCODE')-&gt;where(['UDNO'=&gt;$model-&gt;QTN_UDNO])-&gt;one();

      【讨论】:

        猜你喜欢
        • 2012-11-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2013-07-22
        • 1970-01-01
        相关资源
        最近更新 更多