CakePHP 3自动完成AJAX响应
我一直在尝试让cakephp从我的表(如autocomplete)中的数据中建议输入。我读过一些关于其他人是如何做到这一点的书,但仍然无法理解。目前,我的控制器似乎每次都在等待ajax请求,但总是错误的。控制台没有出现错误,有些我不确定我做错了什么。我试图删除if($this->request->is('ajax'))语句,但随后出现了一个错误,它无法发出头。 这是我在InvoicesController中的搜索函数,我从其他人的示例中获取了代码,但未能实现它CakePHP 3自动完成AJAX响应,php,jquery,html,ajax,cakephp,Php,Jquery,Html,Ajax,Cakephp,我一直在尝试让cakephp从我的表(如autocomplete)中的数据中建议输入。我读过一些关于其他人是如何做到这一点的书,但仍然无法理解。目前,我的控制器似乎每次都在等待ajax请求,但总是错误的。控制台没有出现错误,有些我不确定我做错了什么。我试图删除if($this->request->is('ajax'))语句,但随后出现了一个错误,它无法发出头。 这是我在InvoicesController中的搜索函数,我从其他人的示例中获取了代码,但未能实现它 public funct
public function search()
{
if ($this->request->is('ajax')) {
$this->autoRender = false;
pr('b');
$name = $this->request->query['term'];
$results = $this->Invoices->find('all', [
'conditions' => [ 'OR' => [
'id LIKE' => $id . '%',
]]
]);
$resultsArr = [];
foreach ($results as $result) {
$resultsArr[] =['label' => $result['full_name'], 'value' => $result['id']];
}
echo json_encode($resultsArr);
}
}
这是我的search.ctp
<?php use Cake\Routing\Router; ?>
<?php echo $this->Form->input('id', ['type' => 'text']);?>
<script>
jQuery('#id').autocomplete({
source:'<?php echo Router::url(array('controller' => 'Invoices', 'action' => 'search')); ?>',
minLength: 1
});
</script>
jQuery(“#id”).autocomplete({
来源:“”,
最小长度:1
});
这是我的发票表,ID是我希望从用户键入的内容中得到建议的ID。
我可能没有看到您的确切问题,但让我指出一些可能有助于解决此问题的事情 拆下这条线。没有必要
$this->autoRender = false;
相反,你应该在最后这样做。请参见使用
这将返回不带根键的数据
[
{"label":"Label Value"},
{"label":"Another Label Value"}
]
或者你可以这样做
$this->set('_serialize', ['resultsArr']);
这将返回如下数据
{"resultArr":[
{"label":"Label Value"},
{"label":"Another Value"}
]}
用此替换查找器查询
$resultArr = $this->Invoices->find('all')
->where(['id LIKE' => $id . '%'])
// If you want to remap your data use map
// All queries are collections
->map(function ($invoice) {
return ['label' => $invoice->full_name, 'id' => $invoice->id];
});
在我看来,您可能想查看新的CakePHP3ORM。为了使这些文档易于阅读和相关,在编写这些文档时进行了大量的艰苦工作。我不是那种把文档推给别人的人,但这会让你少受几个小时的挫折
我注意到的一些小问题也是问题
- 您从未定义$id
- 您定义了$name,但从未使用它
- pr是一个调试语句,我不知道你为什么有它
// By default the ajax detection is limited to the x-request-with header
// I didn't want to have to set that for every ajax request
// So I overrode that with the accepts header.
// Any request where Accept is application/json the system will assume it is an ajax request
$this->request->addDetector('ajax', function ($request) {
$acceptHeaders = explode(',', $request->env('HTTP_ACCEPT'));
return in_array('application/json', $acceptHeaders);
});
我可能没有看到你的确切问题,但让我指出一些我认为可能有助于解决这个问题的事情 拆下这条线。没有必要
$this->autoRender = false;
相反,你应该在最后这样做。请参见使用
这将返回不带根键的数据
[
{"label":"Label Value"},
{"label":"Another Label Value"}
]
或者你可以这样做
$this->set('_serialize', ['resultsArr']);
这将返回如下数据
{"resultArr":[
{"label":"Label Value"},
{"label":"Another Value"}
]}
用此替换查找器查询
$resultArr = $this->Invoices->find('all')
->where(['id LIKE' => $id . '%'])
// If you want to remap your data use map
// All queries are collections
->map(function ($invoice) {
return ['label' => $invoice->full_name, 'id' => $invoice->id];
});
在我看来,您可能想查看新的CakePHP3ORM。为了使这些文档易于阅读和相关,在编写这些文档时进行了大量的艰苦工作。我不是那种把文档推给别人的人,但这会让你少受几个小时的挫折
我注意到的一些小问题也是问题
- 您从未定义$id
- 您定义了$name,但从未使用它
- pr是一个调试语句,我不知道你为什么有它
// By default the ajax detection is limited to the x-request-with header
// I didn't want to have to set that for every ajax request
// So I overrode that with the accepts header.
// Any request where Accept is application/json the system will assume it is an ajax request
$this->request->addDetector('ajax', function ($request) {
$acceptHeaders = explode(',', $request->env('HTTP_ACCEPT'));
return in_array('application/json', $acceptHeaders);
});
谢谢,我将阅读这些文档,我做了这些更改,但我认为我的search.ctp没有正确发送数据,因为我认为它从来没有真正通过控制器中的is('ajax')。这就是为什么我试图使用pr来查看它是否在那里。@mark.nz-我更新了我的答案,告诉我如何检测ajax。我将把新ajax检测的代码放在哪里?@mark.nz放在你的app controller initialize函数中。非常感谢,它还没有完全起作用,但现在我得到了回应。SQL遇到了另一个问题,但您解决了这个问题,谢谢!谢谢,我将阅读这些文档,我做了这些更改,但我认为我的search.ctp没有正确发送数据,因为我认为它从来没有真正通过控制器中的is('ajax')。这就是为什么我试图使用pr来查看它是否在那里。@mark.nz-我更新了我的答案,告诉我如何检测ajax。我将把新ajax检测的代码放在哪里?@mark.nz放在你的app controller initialize函数中。非常感谢,它还没有完全起作用,但现在我得到了回应。SQL遇到了另一个问题,但您解决了这个问题,谢谢!