[moka同学笔记]Yii下国家省市三级联动
第一次做省市三级联动时候遇到了坑,感觉还是自己太菜。头疼了很久研究了很久,最后终于发现了问题。大致总结一下思路
在控制器中实例化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下国家省市三级联动的更多相关文章
- JS实现年月日三级联动+省市区三级联动+国家省市三级联动
开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...
- Vue 国家省市三级联动
在网上查阅一下,基本上是省市区三级联动,国家省市的就只能自己动手了. 样式就根据自己的需要去调整了. JSON数组太长,就折叠放在了后面. 效果图: <!DOCTYPE html> < ...
- [moka同学笔记]window下.htacess文件 与linux下.htacess文件
windows下 # Turn on URL rewritingRewriteEngine On# Installation directoryRewriteBase /# Protect hidde ...
- [moka同学笔记]window下redis的安装以及php-redis详细配置(摘录)
(注意对应的版本)下载地址:https://github.com/phpredis/phpredis/downloads 首先下载redis安装,windows下安装软件都是下一步下一步over,就不 ...
- [moka同学笔记]yii表单dropdownlist样式
<?= $form->field($modelUser,'name') ?> <div class="form-group field-community-mobil ...
- [moka同学笔记]yii2.0查询数据库
一. [:id占位符]使用 $results = Test::findBySql($sql,array(':id'=>'1 or 1=1))->all() 二. [id=1] 选 ...
- [moka同学笔记]Yii2.0 modal的使用
第一次使用,时候不明白什么原理,大概用了几次后,才模模糊糊搞清楚原来是怎么一回事,现在就把写过的代码,贴在下边. 1.在视图文件中, 第一步首先在index.php文件中 做了一个a链接的按钮 调用了 ...
- [moka同学笔记]Yii2.0验证码
1.Model中Code.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/07/25 * Time: 10:48 ...
- [moka同学笔记]yii2.0表单的使用
1.创建model /biaodan.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/08/05 * Tim ...
随机推荐
- 修改WebBrowser控件的内核解决方案
方法一 加入你想让WebBrowser控件的渲染模式编程IE8的标准模式, 你可以通过设置注册表FEATURE_BROWSER_EMULATION 来实现. 示例: 注册表中注明当前本机装的IE版本H ...
- Android WebView 总结 —— 使用HTML5播放视频及全屏方案
在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在WebView中使用html5播放视频. 1.让视频在各个Android版本能够正常播放 在AndroidManif ...
- jQuery_02之元素操作及事件绑定
1.操作元素之属性: ①attr读:$("selector").attr("属性名"):=>getAttribute("属性名"):改 ...
- angularjs的resource实例对象
angularjs的resource实例对象 我们看看都有啥 而直接使用service对象的时候没有前面这些$
- Java基本特征 - 多态
多态的实现方式: 1. 重载(overload):实现编译时的多态性,前绑定 同一个类中.方法名相同.参数类型或者参数数量不相同 重写(override):运行时的多态性,后绑定.运行时的多态,是面向 ...
- SSH无密码登录
首先生成密钥对 ssh-keygen -t rsa cd ~/.ssh/ cat id_rsa.pub 复制你生成的公钥 登录到需要免登录的服务器 cd ~/.ssh 添加到 authorized_k ...
- 一种利用 Cumulative Penalty 训练 L1 正则 Log-linear 模型的随机梯度下降法
Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之一,其训练常采用最大似然准则,且为防止过拟合,往往在目标函数中加入(可以产生稀疏性的) L1 正则.但对于这种带 L ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3
[java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 // */ // ]]> [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 Table of C ...
- KafkaConfig介绍
public class KafkaConfig implements Serializable { /** 一个借口,实现类有ZkHosts,和StatisHosts **/ public fina ...