Yii2 二级联动 DropDownList

先随手建库 CIty 和Province

| province | CREATE TABLE `province` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `province` varchar(255) NOT NULL,
  `provinceid` int(10) unsigned NOT NULL COMMENT '省份id,外联市区id',
  PRIMARY KEY (`id`),
  KEY `provinceid` (`provinceid`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 |

| city  | CREATE TABLE `city` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cityid` int(10) unsigned NOT NULL,
  `city` varchar(50) NOT NULL,
  `provinceid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `provinceid` (`provinceid`),
  KEY `cityid` (`cityid`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`provinceid`) REFERENCES `province` (`provinceid`)
) ENGINE=InnoDB AUTO_INCREMENT=346 DEFAULT CHARSET=utf8 COMMENT='行政区域地州市信息表' |

然后随手再点个Users的库

| users | CREATE TABLE `users` (
  `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user` int(11) NOT NULL,
  `name` varchar(200) NOT NULL DEFAULT '',
  `desc` text NOT NULL,
  `cityid` int(10) unsigned NOT NULL,
  `provinceid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uid`),
  KEY `city_id` (`cityid`),
  KEY `provinceid` (`provinceid`),
  CONSTRAINT `users_ibfk_2` FOREIGN KEY (`cityid`) REFERENCES `city` (`cityid`),
  CONSTRAINT `users_ibfk_1` FOREIGN KEY (`provinceid`) REFERENCES `province` (`provinceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

好了,后面喜欢的话就添加点数据, 接下来开始写代码.

只要需要2步 View.php中代码如下

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use app\models\Province;
use app\models\City;
?>

<div class="users-form" id="area">
    <?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'user')->textInput() ?>
    <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
    <?= $form->field($model, 'provinceid')->label('Province')->dropDownlist(
        Province::find()
            ->select(['province','provinceid'])
            ->indexBy('provinceid')
            ->column(),
            [
                'prompt'=>'请选择省份',
                 'onchange'=>'
                    $.post("index.php?r=users/list&id='.'"+$(this).val(),function(data){
                    //'onchange'=>'$.post("/index/list.html?id='.'"+$(this).val(),function(data){
                        $("select#users-cityid").html(data);
                    });',
            ]
    ) ?>
    <?= $form->field($model, 'cityid')->dropDownList(
        City::find()->select(['city','cityid'])->indexBy('cityid')->column(),
        [
            'prompt'=>'选择市区',
        ]
    ) ?>
    <?= $form->field($model, 'desc')->textarea(['rows' => 10]) ?>
    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>
    <?php ActiveForm::end(); ?>
</div>

上面问题最关键的就是onchange方法. 是用ajax调取Controller来影响下面的栏

Controller中代码如下

public static function actionList($id=230000)  //这个$id调试用,可以直观看到调试数据又没问题
    {
        $countCities = City::find()->where('provinceid=:id',[':id'=>$id])
                    ->count();
                $cities = City::find()->where('provinceid=:id',[':id'=>$id])
                    ->all();
                if ($countCities > 0) {
                    foreach ($cities AS $city) {
                        echo "<option value='" . $city->cityid . "'>" . $city->city. "</option>";
                    }
                } else {
                    echo "<option>-</option>";
                }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Yii2中使用Select2实现二级联动可以通过以下步骤实现: 1. 首先在视图文件中引入Select2组件: ```php use yii\helpers\Html; use kartik\select2\Select2; ``` 2. 定义一个数组来存储一级选项的数据,假设我们的数组为$parentData: ```php $parentData = ['1' => 'Parent 1', '2' => 'Parent 2', '3' => 'Parent 3']; ``` 3. 在视图文件中使用Select2组件来渲染一级选项: ```php echo $form->field($model, 'parent_id')->widget(Select2::classname(), [ 'data' => $parentData, 'options' => ['placeholder' => 'Select parent'], ]); ``` 4. 定义一个二维数组来存储二级选项的数据,假设我们的数组为$childData: ```php $childData = [ '1' => ['1-1' => 'Child 1-1', '1-2' => 'Child 1-2'], '2' => ['2-1' => 'Child 2-1', '2-2' => 'Child 2-2', '2-3' => 'Child 2-3'], '3' => ['3-1' => 'Child 3-1'], ]; ``` 5. 在视图文件中使用jQuery脚本来实现二级联动: ```php $script = <<< JS $(document).ready(function() { $('#model-parent_id').on('change', function() { var parent_id = $(this).val(); var childData = $.parseJSON('{$childData}'); $('#model-child_id').html(''); $.each(childData[parent_id], function(id, name) { var opt = $('<option/>').attr('value', id).text(name); $('#model-child_id').append(opt); }); }); }); JS; $this->registerJs($script); ``` 6. 在视图文件中使用Select2组件来渲染二级选项: ```php echo $form->field($model, 'child_id')->widget(Select2::classname(), [ 'options' => ['placeholder' => 'Select child'], ]); ``` 注意,我们在二级选项的Select2组件中并没有设置数据源,而是通过jQuery脚本来动态生成选项。此外,我们还需要在一级选项的Select2组件中添加`id`属性,以便在jQuery脚本中使用`$('#model-parent_id')`来获取选项的值。 以上就是使用Select2实现Yii2下的二级联动的步骤。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值