第一次做省市三级联动时候遇到了坑,感觉还是自己太菜。头疼了很久研究了很久,最后终于发现了问题。大致总结一下思路

在控制器中实例化model,然后在视图中渲染所有国家,当选取国家时候,ajax通过 id="community-country_id" 把country_id传递到控制器中,控制器通过$this->ajaxGetProvince(); 得到country_id相同的省,再在视图中渲染显示该国家下省,选取省后,ajax再通过id="community-province_id" 传递province_id到控制器,控制器通过 $this->ajaxGetCity();得到province_id相同的市,再在视图中显示该省下的城市。

1.在视图中时候

第一种:(因为是地区管理库,国家表,省表,城市表三者分开,而非同一张表)

<div class="form-group field-community-country_id required">
<label class="col-lg-1 control-label" for="community-country_id">地区</label>
<div class="col-lg-8">
<?php
$countryList = array();
$countryList = ArrayHelper::map(CountryRegion::find()->where(['is_deleted'=>0])
->orderBy(['order_num'=>SORT_ASC,'id'=>SORT_ASC])->all(), 'id', 'name');
?>
<select id="community-country_id" class="form-control" name="Community[country_id]" style="width:200px;display: inline-block">
<option value="" selected>请选择</option>
<?php foreach ($countryList as $key => $val): ?>
<option value="<?= $key ?>"
<?= $modelCommunity->country_id != null && $modelCommunity->country_id == $key ? ' selected ' : '' ?>><?= $val ?></option>
<?php endforeach; ?>
</select> <?php
$provinceList = array();
if ($modelCommunity->country_id) {
$provinceList = ArrayHelper::map(Province::find()
->where(['country_id' => $modelCommunity->country_id,'is_deleted'=>0])
->orderBy(['order_num'=>SORT_ASC,'id'=>SORT_ASC])->all(), 'id', 'name');
}
?>
<select id="community-province_id" class="form-control" name="Community[province_id]" style="width:200px;display: inline-block">
<option value="">请选择</option>
<?php foreach ($provinceList as $key => $val): ?>
<option value="<?= $key ?>"
    <?= $modelCommunity->province_id != null && $modelCommunity->province_id == $key ? ' selected ' : '' ?>>
<?= $val ?></option>
<?php endforeach; ?>
</select> <?php
$cityList = array();
if ($modelCommunity->province_id) {
$cityList = ArrayHelper::map(City::find()->where(['province_id' => $modelCommunity->province_id,'is_deleted'=>0])
->orderBy(['order_num'=>SORT_ASC,'id'=>SORT_ASC])->all(), 'id', 'name');
}
?>
<select id="community-city_id" class="form-control" name="Community[city_id]" style="width:200px;display: inline-block">
<option value="">请选择</option>
<?php foreach ($cityList as $key => $val): ?>
<option value="<?= $key ?>"<?= $modelCommunity->city_id != null && $modelCommunity->city_id == $key ? ' selected ' : '' ?>><?= $val ?></option>
<?php endforeach; ?>
</select>
</div>
</div>

第二种:(在做学校管理,国家,省,城市,三者都在school表中)

<div class="form-group field-community-country_id required">
<label class="col-lg-1 control-label" for="community-country_id">地区</label>
<div class="col-lg-8">
<?php
$countryList = array();
$countryList = ArrayHelper::map(CountryRegion::find()->where(['is_deleted' => 0])
->orderBy(['order_num' => SORT_ASC, 'id' => SORT_ASC])->all(), 'id', 'name');
?>
<select id="community-country_id" class="form-control" name="School[country_id]"
style="width:200px;display: inline-block">
<option value="" selected>请选择</option>
<?php foreach ($countryList as $key => $val): ?>
<option
value="<?= $key ?>" <?= $model->country_id != null && $model->country_id == $key ? ' selected ' : '' ?>><?= $val ?></option>
<?php endforeach; ?>
</select> <?php
$provinceList = array();
if ($model->country_id) {
$provinceList = ArrayHelper::map(Province::find()->where(['country_id' => $model->country_id, 'is_deleted' => 0])
->orderBy(['order_num' => SORT_ASC, 'id' => SORT_ASC])->all(), 'id', 'name');
}
?>
<select id="community-province_id" class="form-control" name="School[province_id]"
style="width:200px;display: inline-block">
<option value="">请选择</option>
<?php foreach ($provinceList as $key => $val): ?>
<option
value="<?= $key ?>"<?= $model->province_id != null && $model->province_id == $key ? ' selected ' : '' ?>><?= $val ?></option>
<?php endforeach; ?>
</select> <?php
$cityList = array();
if ($model->province_id) {
$cityList = ArrayHelper::map(City::find()->where(['province_id' => $model->province_id, 'is_deleted' => 0])
->orderBy(['order_num' => SORT_ASC, 'id' => SORT_ASC])->all(), 'id', 'name');
}
?>
<select id="community-city_id" class="form-control" name="School[city_id]"
style="width:200px;display: inline-block">
<option value="">请选择</option>
<?php foreach ($cityList as $key => $val): ?>
<option
value="<?= $key ?>"<?= $model->city_id != null && $model->city_id == $key ? ' selected ' : '' ?>><?= $val ?></option>
<?php endforeach; ?>
</select>
</div>
</div>

第三种:(只有省和市联动,国家是中国)

<?php
$provinceList = ArrayHelper::map(Province::find()->where(['country_id' => 142])->all(), 'id', 'name');
?>
<?= $form->field($model, 'province_id')->dropDownList($provinceList, ['prompt' => '请选择', 'style' => 'width:200px','id'=>'community-province_id']) ?>
<?php
$cityList = array();
if ($model->province_id) {
$cityList = ArrayHelper::map(City::find()->where(['province_id' => $model->province_id])->all(), 'id', 'name');
}
?>
<?= $form->field($model, 'city_id')->dropDownList($cityList, ['prompt' => '请选择', 'style' => 'width:200px','id'=>'community-city_id']) ?>

2.在控制器中

第一种:

 //添加地区
public function actionCreate(){ $this->ajaxGetProvince(); //用作城市联动 这段很重要,因为需要获取前台传递过来的country_id,所以不能丢 $CountryModel = new CountryRegion();
$ProvinceModel = new Province();
$CityModel = new City();
$CityProvince = new Province();       /**其他代码*/ return $this->render('create',[
'level'=>$level,
'CountryModel'=>$CountryModel,
'ProvinceModel'=>$ProvinceModel,
'CityModel'=>$CityModel,
'CityProvince'=>$CityProvince
]);
}

第二种和第三种控制器中一样代码如下:


public function actionCreate()
{
$this->ajaxGetProvince(); //用作城市联动
$this->ajaxGetCity(); //用作城市联动 $model = new School();

     /**中间其他代码*/
  return $this->render('create', [
'model' => $model,
]);
 

3.前端

/*国家、省份联动ActiveRecord*/
$(document).on('change', '#community-country_id', function () {
var $select = $(this),
requestUrl = $select.attr('data-country-url') || window.location.href;
if ($select.attr('data-requestform') === 'true') {
requestUrl = $select.parents('form').attr('action');
}
$('#community-province_id').html('<option value="">请选择</option>');
$('#community-city_id').html('<option value="">请选择</option>');
if ($select.val()) {
$.ajax({
url: requestUrl,
data: {
country_id: $select.val(),
ajax_get_province: true
},
type: "GET",
success: function (e) {
$('#community-province_id').html(e);
$('#community-city_id').html('<option value="">请选择</option>');
console.log(e);
}
});
}
}); /*省份、城市联动ActiveRecord*/
$(document).on('change', '#community-province_id', function () {
var $select = $(this),
requestUrl = $select.attr('data-province-url') || window.location.href;
if ($select.attr('data-requestform') === 'true') {
requestUrl = $select.parents('form').attr('action');
} $('#community-city_id').html('<option value="">请选择</option>');
if ($select.val()) {
$.ajax({
url: requestUrl,
data: {
province_id: $select.val(),
ajax_get_city: true
},
type: "GET",
success: function (e) {
$('#community-city_id').html(e);
console.log(e);
}
});
}
});

以上~~

第一次这样做,应该会有更简单的方法吧,请求高手指导。

转载本文请注明出处。

[moka同学笔记]Yii下国家省市三级联动的更多相关文章

  1. JS实现年月日三级联动+省市区三级联动+国家省市三级联动

    开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...

  2. Vue 国家省市三级联动

    在网上查阅一下,基本上是省市区三级联动,国家省市的就只能自己动手了. 样式就根据自己的需要去调整了. JSON数组太长,就折叠放在了后面. 效果图: <!DOCTYPE html> < ...

  3. [moka同学笔记]window下.htacess文件 与linux下.htacess文件

    windows下 # Turn on URL rewritingRewriteEngine On# Installation directoryRewriteBase /# Protect hidde ...

  4. [moka同学笔记]window下redis的安装以及php-redis详细配置(摘录)

    (注意对应的版本)下载地址:https://github.com/phpredis/phpredis/downloads 首先下载redis安装,windows下安装软件都是下一步下一步over,就不 ...

  5. [moka同学笔记]yii表单dropdownlist样式

    <?= $form->field($modelUser,'name') ?> <div class="form-group field-community-mobil ...

  6. [moka同学笔记]yii2.0查询数据库

      一. [:id占位符]使用 $results = Test::findBySql($sql,array(':id'=>'1 or 1=1))->all()   二. [id=1]  选 ...

  7. [moka同学笔记]Yii2.0 modal的使用

    第一次使用,时候不明白什么原理,大概用了几次后,才模模糊糊搞清楚原来是怎么一回事,现在就把写过的代码,贴在下边. 1.在视图文件中, 第一步首先在index.php文件中 做了一个a链接的按钮 调用了 ...

  8. [moka同学笔记]Yii2.0验证码

    1.Model中Code.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/07/25 * Time: 10:48 ...

  9. [moka同学笔记]yii2.0表单的使用

    1.创建model   /biaodan.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/08/05 * Tim ...

随机推荐

  1. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

  2. spring 学习

    一.spring框架介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供 ...

  3. IE和firefox火狐在JS、css兼容区别

    1.firefox不能对innerText支持. firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,不过默认把多余的空格也保留了. ...

  4. 【转】C#中如何实现左截取和右截取字符串

    使用C#语法编写程序时,我们需要截取一个字符串左边或右边的若干个字符,该如何操作呢?在VB中可以使用left或right函数实现,C#中没有提供这样的函数呢?答案是没有.但是,C#中提供Substri ...

  5. 深入理解CSS浮动

    × 目录 [1]定义 [2]特性 [3]表现 [4]重叠 前面的话 浮动最早的使用是出自<img src="#" align="right">,用于 ...

  6. BOM之location对象

    定义 location提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能.location是一个很特别的对象,因为它既是window对象的属性,也是document对象的属性.换句话说,wi ...

  7. BOM之window对象

    双重角色 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过Javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Glob ...

  8. 哈夫曼树(二)之 C++详解

    上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

  9. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  10. android调试输出

    测试时不想直接debug总要调试输出一些字符串信息,那以下方法可选: 1.用Log.i(TAG, "onCreate");日志输出. 先要引用 import android.uti ...