THINKPHP__THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

Posted 秦皇汉武

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了THINKPHP__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数据。

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

以上是关于THINKPHP__THINKPHP6接收ajax下拉菜单提交的数据,存在的bug的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP6.0静态资源模板标签的使用

ThinkPHP6 事件与多应用

ThinkPHP6 事件与多应用

thinkPHP6 JQuery的ajax批量删除

thinkphp有没有获取当前域名的常量

Thinkphp6 获取当前协议+域名