【问题标题】:Yii2 kartik depend dropdown doesnt load next drop down listYii2 kartik 依赖下拉列表不加载下一个下拉列表
【发布时间】:2018-05-26 03:40:56
【问题描述】:

我正在使用 kartik DepDropdown 小部件。当我选择区域时,它必须在特定下拉列表中加载所有城市(例如,ID为city_id的城市)。 在 chrome 网络选项卡中我可以看到该操作返回所有城市的预期结果 json 格式

{
  "output": {
    "40": "Велико Търново",
    "41": "Горна Оряховица",
    "42": "Елена",
    "43": "Златарица",
    "44": "Лясковец",
    "45": "Павликени",
    "46": "Полски Тръмбеш",
    "47": "Свищов",
    "48": "Стражица",
    "49": "Сухиндол"
  },
  "selected": ""
}

但它们不会加载到 #city_id 下拉列表中。我的观点如下:

<div class="col-sm-6">

                                <?= $form->field($model, 'region_id')->dropDownList(Region::getAllRegions(), ['id' => 'region-dd', 'prompt'=> ' - ' . Yii::t('app', 'Region') . ' - ']); ?>

                            </div>
                            <div class="col-sm-6">

                                <?= $form->field($model, 'city_id')->widget(DepDrop::classname(), [
                                    'options'=>[
                                        'id'=>'city-id'
                                    ],
                                    'pluginOptions'=>[
                                        'allowClear' => true,
                                        'depends' => ['region-dd'],
                                        'url' => Url::to(['/system-information/load-cities'])
                                    ]
                                ]); ?>

                            </div>

我的控制器:

public function actionLoadCities()
    {
        $out = [];

        if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $region_id = $parents[0];
                $out = City::getAllCities($region_id);
                echo Json::encode(['output'=>$out, 'selected'=>'']);
                return;
            }
        }
        echo Json::encode(['output'=>'', 'selected'=>'']);
    }

提前谢谢你!

【问题讨论】:

    标签: yii2 yii2-advanced-app kartik-v


    【解决方案1】:

    您必须提供 idtextname=&gt;value 对,以分配给单个选项,如果您查看 DOCS,您将看到您必须返回如下所示的数组

    [
       'out'=>[
           ['id'=>'<city-id>', 'name'=>'<city-name>'],
           ['id'=>'<city-id>', 'name'=>'<city-name>']
        ],
        'selected'=>'<city-id>'
    ]
    

    这意味着 id 将提供索引id,下拉列表的文本将提供索引name,并查看您提供的方法getAllCities 的响应返回数组如下所示

     [
        'id'=>'name',
        'id'=>'name',
     ]
    

    您没有添加返回 $out 数组的方法 City::getAllCities($region_id);,但根据文档,它应该如下所示,

    注意:分别更改 tablecolumn 名称,我假设您有城市名称的 idname 列,如果您有任何其他列名称作为城市名称,例如 @ 987654337@ 那么您必须为查询中的city_name 字段创建别名name

    public function getAllCities($region_id){
    
        $query = new \yii\db\Query;
        $query->select('id, name')
            ->from('{{%city}}')
            ->where(['=', 'region_id', $region_id])
            ->limit(20);
        $command = $query->createCommand();
        return $command->queryAll();
    
    }
    

    这将返回一个如下所示的数组。

    Array
    (
        [0] => Array
            (
                [id] => 40
                [name] => Велико Търново
            )
    
        [1] => Array
            (
                [id] => 41
                [name] => Горна Оряховица
            )
    
        [2] => Array
            (
                [id] => 42
                [name] => Елена
            )
    
        [3] => Array
            (
                [id] => 43
                [name] => Златарица
            )
    
    )
    

    它将被编码为如下所示的 JSON

    [
      {
        "id": "40",
        "name": "Велико Търново"
      },
      {
        "id": "41",
        "name": "Горна Оряховица"
      },
      {
        "id": "42",
        "name": "Елена"
      },
      {
        "id": "43",
        "name": "Златарица"
      }
    ]
    

    最终当按行编码时

    echo Json::encode(['output'=>$out, 'selected'=>'']);
    

    它会返回

    {
      "output": [
        {
          "id": "40",
          "name": "Велико Търново"
        },
        {
          "id": "41",
          "name": "Горна Оряховица"
        },
        {
          "id": "42",
          "name": "Елена"
        },
        {
          "id": "43",
          "name": "Златарица"
        }
      ],
      "selected": ""
    }
    

    希望这会有所帮助。

    【讨论】:

    • 现在试试 :) 谢谢!
    • 一定要慢慢来@TomaTomov,我编辑了一些东西,只是再次浏览答案
    • 现在一切正常。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多