=城市三级联动的实现=
==需求==
* 列出直辖市及省份的列表
* 选择某个直辖市或省份后,列出隶属于该选择的城市或区
* 选择某个城市后,列出隶属该城市的区县
==设计与实现==
===前提===
* [[安装yii2框架]]
* [[安装phpmyadmin]]
===[[STEP 1:基本的MVC]]===
====创建文件结构====
* 控制器文件路径 : opt/lampp/htdocs/basic/conctrollers/city.php
*模型文件路径 :opt/lampp/htdocs/basic/models/city.php
* 视图文件路径 :opt/lampp/htdocs/basic/views/city/city.php
====编辑视图文件====
<source>
<?php
use yii\boostrap\ActiveForm//使用ActiveForm创建下拉菜单
?>
<?php $from = ActiveForm::begin();?>
<?php =$from->field($model,'province')->dropDownlist()?>
<?php =$from->field($model,'city')->dropDownlist()?>
<?php =$from->field($model,'area')->dropDownlist()?>
<?php $from = ActiveForm::end();?>
</source>
====编辑控制器文件====
<source>
<?php
namespace app\controllers;
class CityController extends Controller
{
public function actionIndex()//默认方法
{
}
public function actionCity()//创建控制器方法,
{
return $this->render($model,[’model‘=>$model]);
}
}
</source>
====编辑模型文件====
<source>
<?php
namespace app\models;
class City extends ActiveRecord
{
public $province;//定义变量
public $city;
public $area;
public static function tablename()//类名与数据库表名不一致时修改其映射关系返回映射的数据库表名
{
return 'city';//city为表名
}
}
</source>
===[[STEP 2:显示直辖市或省份]]===
====view====
* 视图第一个form获得省份列表
<source>
<?php = $form->field($model,'province')->dropDownlist($provincelist,//控制器传递$provincelist
['prompt'=>'请选择省份',//默认显示的第一个提示
,])?>
</source>
====controller====
<source>
public function actionCity()
{
$model = new city();//创建新的模型
$pid = 0;//省/直辖市pid值为0
$provincelist = $model->getprovincelist($pid);//获得省级列表
return $this->render(['model'=>$model,'provincelist'=>$provincelist]);//渲染视图
}
</source>
====model====
* 视图需要模型传送省份列表,在模型文件下添加模型方法getcitylist()
<source>
public function getprovincelist($pid)
{
$model = City::findAll(array('pid'=>$pid));//通过所传参数取出对应的列表
return ArrayHelper::map($model,'$id','$name');//返回id和name的数组
}
</source>
* 到此为止,省级列表已经可以显示出来了
===[[STEP 3:获取城市列表]]===
=====view=====
*第二个市级列表创建
<source>
<?php =form->field($model,'city')->dropDownlist($model->getcitylist($model->city),
['prompt'=>'请选择市',
])?>
</source>
* 第二个市级列表根据第一个选中的省份所得来的隶属市,所以需要增加一个触发事件onchange
<source>
<?php = $form->field($model,'province')->dropDownlist($provincelist,
['prompt'=>'请选择省份',
'onchange'=>'
$.post("'.yii::$app->urlManager->createUrl('city/getcitylist').'&pid="+$(this).val(),function(data){
$("#provice-city").append(data);
});'
,])?>
</source>
=====controller=====
*post向控制器请求,创建控制器getcitylist方法
<source>
public function getcitylist()
{
$model = new city();//创建模型对象
$pid = \Yii::$app->request->get($pid);//获得传送过来的参数pid
$citylist= $model->getcitylist($pid);//获得市级列表
$html = "";//创建一个变量
foreach($citylist as $value=>$name)
{
$html.='<option value='.$value.'>'.$name.’</option>‘; //通过foreach遍历构造html并返回
}
return $html;
}
</source>
=====model=====
*调用数据库查询市列表,创建getcitylist方法
<source>
public function getcitylist()
{
$model = City::findAll(array('pid'=>$pid));
return ArrayHelper::map($model,'id','name');
}
</source>
===[[STEP 4:获取区县列表]]===
====view====
*区级列表创建
<source>
<?php =form->field($model,'area')->dropDownlist($model->getcitylist($model->area),
['prompt'=>'请选择区',
])?>
</source>
* 区级列表根据选中的县份所得来的隶属区,所以需要增加一个触发事件onchange
<source>
<?php = $form->field($model,'area')->dropDownlist($model->getcitylist(0),
['prompt'=>'请选择市',
'onchange'=>'
$.post("'.yii::$app->urlManager->createUrl('city/getarealist').'&pid="+$(this).val(),function(data){
$("#provice-area").append(data);
});'
,])?>
</source>
====controller====
*post向控制器请求,创建控制器getarealist方法
<source>
public function getarealist()
{
$model = new city();
$pid = \Yii::app->request->get($pid);
$arealist = $model->getarealist($pid);
$html="";
foreach($model as $value=>$name)
{
$html.='<option value='.$value.'>'.$name.'</option>';
}
return $html;
}
</source>
====model====
* 控制器中需要调用模型的getarealist方法,创建getarealist方法
<source>
public function getarealist($pid)
{
$model = city::findAll('pid'=>$pid);
return ArrayHelper::map($model,'id','name');
}
</source>