CakePHP 3自动完成AJAX响应

CakePHP 3自动完成AJAX响应,php,jquery,html,ajax,cakephp,Php,Jquery,Html,Ajax,Cakephp,我一直在尝试让cakephp从我的表(如autocomplete)中的数据中建议输入。我读过一些关于其他人是如何做到这一点的书,但仍然无法理解。目前,我的控制器似乎每次都在等待ajax请求,但总是错误的。控制台没有出现错误,有些我不确定我做错了什么。我试图删除if($this->request->is('ajax'))语句,但随后出现了一个错误,它无法发出头。 这是我在InvoicesController中的搜索函数,我从其他人的示例中获取了代码,但未能实现它 public funct

我一直在尝试让cakephp从我的表(如autocomplete)中的数据中建议输入。我读过一些关于其他人是如何做到这一点的书,但仍然无法理解。目前,我的控制器似乎每次都在等待ajax请求,但总是错误的。控制台没有出现错误,有些我不确定我做错了什么。我试图删除if($this->request->is('ajax'))语句,但随后出现了一个错误,它无法发出头。 这是我在InvoicesController中的搜索函数,我从其他人的示例中获取了代码,但未能实现它

     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是一个调试语句,我不知道你为什么有它
根据您的评论,这里是关于ajax检测的更新

// 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是一个调试语句,我不知道你为什么有它
根据您的评论,这里是关于ajax检测的更新

// 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遇到了另一个问题,但您解决了这个问题,谢谢!