[英]CakePHP 3 : Cannot get JSON data from controller
我正在尝试将控制器中的查询返回到视图文件,以便可以在表单中使用该数据。 但是我无法成功返回没有错误的数据。 我知道该函数正在运行,因为它返回了正确的数据,但是有一个错误。
这是我的CustomerController填充函数,它正在运行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>
当前,这是当我在下拉框中选择一个客户时触发视图中的脚本时发生的情况。 如您所见,它返回我需要的数据数组,但也有错误,无法发出标头。 我曾尝试解决其他有关堆栈溢出的问题,但无法解决此错误。 我试过使用$ this-> set代替echo json_encode,但它始终不返回任何内容。 我不确定还有其他方法可以做到这一点。
首先,如果要通过唯一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'])
(同样,假设数据存储在变量名'data'中)。
3)参考此文档以获取有关如何请求json的信息。 您可以使用文件扩展名(.json,.xml)。 另外,请确保在请求中添加“ Accept:application / json”标头。( 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.