CakePHP 3:无法从控制器获取JSON数据

时间:2017-11-20 02:06:43

标签: php jquery json ajax cakephp

我试图将控制器中的查询返回给视图文件,以便我可以在表单中使用该数据。但我无法成功返回数据而没有错误。我知道该函数正在工作,因为它返回正确的数据但有错误。

这是我的CustomersController填充函数,它运行sql查询。

public function fill(){
        $layout = 'ajax';
        $this->autoRender = false;
        if ($this->request->is('post')) {
            $id = $this->request->data['id'];
            $query = $this->Customers->find()
            ->where([
               'id' => $id
            ])->first();
            echo json_encode($query);  
       }  
}

这是我的blah.ctp,它是视图文件。

<?php use Cake\Routing\Router; ?>
<?= $this->Form->create(Null, ['type' => 'POST']) ?>
<?php
    echo $this->Form->input('customer_id', ['options' => $customers, 'empty' => true,'id'=>'customers']);
?>
<?= $this->Form->end() ?>

<script>
document.getElementById('customers').addEventListener('change',function(){
   var id = this.value;
    var csrfToken = $('[name=_csrfToken]').val();
    $.ajax({
        type: "POST",
        url: '<?php echo Router::url(array("controller" => "Customers", "action" => "fill")); ?>',
        data: {'id' : id},
        beforeSend: function(xhr){
           xhr.setRequestHeader('X-CSRF-Token', csrfToken);
        },
        success: function(data){
            alert(data);
        }
    });
});
</script>

目前,当我在下拉框中选择一个触发视图中脚本的客户时会发生这种情况。 enter image description here 正如您所看到的,它返回了我需要的数据数组,但也有错误无法发出标头。我已经尝试在堆栈溢出的其他问题之后解决此错误,但无法解决它。 我尝试使用$ this-&gt; set而不是echo json_encode,但它总是返回任何内容。我不知道还有什么方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

首先,如果您按唯一ID选择单个记录,则可以致电 直接在表对象上->get($id),而不是使用->find()构建查询链。

CakePHP 3.x应该使用RequestHandlerComponent自动处理将视图转换为JSON。通常,如果您的脚手架或安装没有,则必须启用它。

1)启用请求处理程序组件。 (如果尚未启用)https://book.cakephp.org/3.0/en/controllers/components/request-handling.html

2)删除echo json_encode($query)行;你不应回应任何东西,因为这将打破请求/响应周期。这是导致错误的原因。 相反,您应该将数据序列化到视图中。假设您在$ data中获取了数据:$this->set(compact('data'))。然后,请务必添加$this->set('_serialize', ['data'])(同样,假设数据存储在变量名称&#39;数据&#39;)。

3)参考此文档,了解有关如何请求json的信息。您可以使用文件扩展名(.json,.xml)。  此外,请确保添加“接受:application / json&#39;标头到您的请求。(https://book.cakephp.org/3.0/en/development/routing.html#Cake \ Routing \ Router :: extensions)。

我为模糊反应道歉。 CakePHP3有很多方法可以实现这一目标。有关详细信息,请参阅此文档页面:https://book.cakephp.org/3.0/en/views/json-and-xml-views.html