THINKPHP_(5)_THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

反思:

国产总是不尽人意,但是要支持国产。

ThinkPHP的6接收ajax的post数据,存在一个bug。即ajax传递的json数据,在thinkphp后端解析出来后,并非直接的json格式。

描述:

三级联动,此处不赘述如何实现。以省市县为例,当点击省的下拉菜单时,我们设置监听函数:

  layui.use(['form','cjgl'], function(){
    var config = {
      s1: 'xunliandui_id',
      s2: 'xunlianying_id',
      s3: 'xunlianlian_id',
      v1: null,//默认的训练队id
      v2: null,//默认的训练营id
      v3: null,//默认的训练连id
    };

    var form = layui.form;
    form.on('select(' + config.s1 + ')', function(data){
      cityEvent(data);
    });
    function cityEvent(data) {
      // alert('yes');
      var $ = layui.jquery;
      var $form = $('form');
      $form.find('select[name=' + config.s2 + ']').html("");
      // alert('no');
      var myjson = JSON.stringify({parent_id:data.value});
      // $.post("/system/school/xiajidanwei",myjson,function(result){
      //
      // },'JSON');

      $.ajax({
        url:"/system/school/xiajidanwei",//查询下级子单位
        type:"post",
        data:myjson,
        dataType:'json',
        success:function(result){
          if(result.code == 0)
          {
              alert('xxx');
              $.each(result.data, function(index,item){
                  console.log(item);
              });
          }else{
            layer.msg(result.msg);
          }
        },
        error:function(xhr,status,error) {
          layer.msg('数据处理错误',{
            icon: 2,
            time: 2000 //2秒关闭(如果不配置,默认是3秒)
          });
        }
      });
    }
  });

上述代码中,使用的是layui的jquery,无论是$.post还是$.ajax,其功能同。

当点击下拉菜单进行选择后,会执行js的cityEvent函数。

我们构造json字符串,即myjson。

但是,thinkphp后端利用$_POST接收的内容为:

 

 

 因此,我们的后端需要特殊处理:

    public function ajaxData2()
    {
        // 获取参数
        $a=array();
        $a[0]=1000;
        $src = $this->request
            ->only([
                'parent_id' => ''
            ],'POST');
        // 实例化
//        $parent_id=$_POST["parent_id"];
        foreach($_POST as $key=>$value){
            $key=json_decode($key);
            $parent_id=$key->{"parent_id"};
            if($parent_id){
                break;
            }
        }

        $sch = new sch;
        $data = $sch->where('status',1)->where('parent_id',$parent_id)->select();
        $data = reSetObject($data, $src);

        return json($data);
    }

利用foreach取出$_POST的索引值,然后转化为json,再取出parent_id中的数据。

结论:

jquery.ajax以json传递的数据,在thinkphp6的后端,变成了数组的索引。而非json数据。

国产的库和框架,需要加油啊。

posted @ 2021-06-04 23:35  秦皇汉武  阅读(820)  评论(0编辑  收藏  举报