yii2实现省市县三级联动


=城市三级联动的实现=
==需求==
* 列出直辖市及省份的列表
* 选择某个直辖市或省份后,列出隶属于该选择的城市或区
* 选择某个城市后,列出隶属该城市的区县
==设计与实现==
===前提===
* [[安装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>


转载于:https://my.oschina.net/u/2606879/blog/648045

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值