我试图将控制器中的查询返回给视图文件,以便我可以在表单中使用该数据。但我无法成功返回数据而没有错误。我知道该函数正在工作,因为它返回正确的数据但有错误。
这是我的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>
目前,当我在下拉框中选择一个触发视图中脚本的客户时会发生这种情况。 正如您所看到的,它返回了我需要的数据数组,但也有错误无法发出标头。我已经尝试在堆栈溢出的其他问题之后解决此错误,但无法解决它。 我尝试使用$ this-&gt; set而不是echo json_encode,但它总是返回任何内容。我不知道还有什么方法可以做到这一点。
答案 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