ThinkPHP快速简单实现Ajax地区三级联动(很详细)

首先呢,我们准备好TP框架还有一个表,地区表,其中包含以下字段:


建表语句:
  1. CREATE TABLE `tp_region` (
  2.   `region_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  3.   `parent_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  4.   `region_name` varchar(120) NOT NULL DEFAULT '',
  5.   `region_type` tinyint(1) NOT NULL DEFAULT '2',
  6.   `agency_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  7.   `status` tinyint(4) NOT NULL COMMENT '0无效果,1已开通,2待开通,3,招募加盟商',
  8.   PRIMARY KEY (`region_id`),
  9.   KEY `parent_id` (`parent_id`),
  10.   KEY `region_type` (`region_type`),
  11.   KEY `agency_id` (`agency_id`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=3409 DEFAULT CHARSET=utf8;
复制代码
不想自己创建的朋友呢,可以去百度下载一个单独的地区表(里面已经有了地区数据了);


我这里用的Thinkphp版本是3.2.2 其实用法都一样!照葫芦画瓢,相信大家都会!


首先我们随便来一个HTML代码。我们这里使用Jquery1.7.2
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>phpsafe--PHP开发之Thinkphp实现Ajax地区三级联动</title>
  6.     <script src="__PUBLIC__/Home/jquery-1.7.2.min.js"></script>
  7. </head>
  8. <body>
  9. <!-- 省份 -->
  10.     <select name="pro" id="pro">
  11.         <option></option>
  12.     </select>
  13. <!-- 城市 -->
  14.     <select name="city" id="city">
  15.         <option></option>
  16.     </select>
  17. <!-- 区县 -->
  18.     <select name="area" id="area">
  19.         <option></option>
  20.     </select>
  21.     
  22. </body>
  23. </html>
复制代码
Ok 接下来 我们需要先把省份给遍历出来。(我已经将数据库一些简单的已经全部配置好了)代码如下:
  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller 
  5. {
  6.     public function Index()
  7.     {
  8.         if (IS_POST) {
  9.             
  10.         } else {
  11.             $parent_id['parent_id'] = 1;
  12.             $region = M('Region')->where($parent_id)->select();
  13.             $this->assign('region',$region);
  14.                $this->display();
  15.         }
  16.     }
  17. }
复制代码
这里为什么用到IS_POST 因为我请求打算用post请求 所以我们为了方便可以在同一个方法里面搞定,我们用IS_POST就可以简单的区分!


接下来直接到Index.html模板里面将数据用Foreach遍历出来。
  1. <!-- 省份 -->
  2. <select name="pro" id="pro">
  3.     <foreach name="region" item="v">
  4.     <option value="{$v.region_id}">{$v.region_name}</option>
  5.     </foreach>
  6. </select>
复制代码
我们看看是否成功遍历!


OK了 省份已经遍历出来了 那么接下来都简单多了,我们只需要在用户选择地区的时候出发Ajax代码把父类ID用Ajax发送到Index方法处理就好了。代码如下:(我们需要接收json格式的数据)
  1. <script>
  2.     $('#pro').change(function(){
  3.         $.ajax({
  4.             type:"post",
  5.             url:"{:U('Index/Index')}",
  6.             data:'pro_id='+$('#pro').val(),
  7.             dataType:"json",
  8.             success:function(data){
  9.                 console.log(data);
  10.             }
  11.         });
  12.     });
  13. </script>
复制代码
现在我们打印一下POST数据 看看结果是什么
  1. public function Index()
  2. {
  3.     if (IS_POST) {
  4.         dump($_POST);
  5.     } else {
  6.         $parent_id['parent_id'] = 1;
  7.         $region = M('Region')->where($parent_id)->select();
  8.         $this->assign('region',$region);
  9.         $this->display();
  10.     }
  11. }
复制代码

我们可以看到 打印出来的是广东的id


接下来需要拿这个父类的id 查询该父类下面有多少个对应的子类 并且将数据处理成Json格式在输出出去。代码如下:
  1. $parent_id['parent_id'] = I('post.pro_id','addslashes');
  2. $region = M('Region')->where($parent_id)->select();
  3. $opt = '<option>--请选择市区--</option>';
  4. foreach($region as $key=>$val){
  5.     $opt .= "<option value='{$val['region_id']}'>{$val['region_name']}</option>";
  6.  }
  7.  echo json_encode($opt);
  8.             
复制代码
接下来,我们在用Jquery 将刚才处理完的数据给他直接丢到市的下拉框里面。
  1. $('#pro').change(function(){
  2.     $.ajax({
  3.         type:"post",
  4.         url:"{:U('Index/Index')}",
  5.         data:'pro_id='+$('#pro').val(),
  6.         dataType:"json",
  7.         success:function(data){
  8.             $('#city').html(data);
  9.         }
  10.     });
  11. });
复制代码

Ok,市区查询出来了。区县也是一样,我们查询用该市的ID作为条件 去查询底下有多少个区

代码如下:
  1. $('#city').change(function(){
  2.     $.ajax({
  3.         type:"post",
  4.         url:"{:U('Index/Index')}",
  5.         data:'pro_id='+$('#city').val(),
  6.         dataType:"json",
  7.         success:function(data){
  8.             $('#area').html(data);
  9.         }
  10.     });
  11. });
复制代码
其实这里我们可以分为多个区间来判断 市的一个 区的一个 但是我这里简单起见 就放在一起了。


每一次请求一次 数据就会重新覆盖,所以呢,不会存在以前的数据存在的问题!


处理的数据是一样的。所以我们在Ajax请求的时候 需要保证参数一致 在Index方法里面可以被接收到。接下来的操作都是一样的,只是遍历的地方不一样而已。



其实原生态的代码也是同样的原理。没有任何的区别。看完以后,有没有觉得很简单呢??
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值