cakephp 2 上的自动完成 Ajax

Posted

技术标签:

【中文标题】cakephp 2 上的自动完成 Ajax【英文标题】:Autocomplete Ajax on cakephp 2 【发布时间】:2017-11-10 23:24:42 【问题描述】:

我想知道,如何在 cakephp 2 中创建自动完成功能。我在互联网上阅读,但找不到有关我的部分的相关信息。

目前我首先在控制器加载所有数据,分配给视图,然后从所有数据开始自动完成。但这效率不高并且需要时间,因为数据可能很多。如何过滤控制器功能以仅加载我在输入中键入的关键字?我可以在 PHP 级别上做到这一点,但我不知道 cakephp 2 上的方法。

这里是我在 cakephp 2 上的当前代码:

productcontroller 这会加载商店中的所有产品:

$storeproducts = $this->get_storeproduct_autocomplete($sale['Sale']['store_id']);

这是我认为的输入:

<input type="text" class="form-control" placeholder="Barcode/Nama barang..." name="search_keyword" id="searchProduct" />

在视图的底部我放了脚本:

$(function() 
        var availableProduct = [
        <?php 
        foreach ($products as $spro):
            $label = addslashes($spro['Product']['barcode'].' '.$spro['Product']['product_name']);

            ?>
             label:"<?php echo $label;?>", value:"<?php echo $spro['Product']['barcode'];?>" ,
            <?php
        endforeach;
        unset($spro);
        ?>
        ];
        $( "#searchProduct" ).autocomplete(
            source: availableProduct,
            delay: 200,
            minLength: 2
        );
    );

通过使用这些代码,自动完成功能正在工作,但它首先加载整个记录,而不是作为我输入的过滤器。并且输入字段填充了条形码,或者我设置的任何值,但我希望它显示产品名称,并且当我提交时,它得到产品 ID,我们可以这样做吗?

编辑 1: 更新我的控制器,创建新函数来执行通过 ajax 调用的数据过滤器:

public function ajax_get_autocomplete_storeproduct($keyword, $store_id)
    
        $result = array();

        $storeproducts = $this->StoreProduct->find('all', array(
            'fields'=>array('StoreProduct.id', 'StoreProduct.stok'),
            'conditions'=>array('Product.deleted'=>0, 
                                'StoreProduct.stok >'=>0, 
                                'StoreProduct.store_id'=>$store_id,
                                'OR'=>array(
                                    'Product.barcode LIKE' => "%$keyword%",
                                    'Product.product_name LIKE' => "%$keyword%",
                                )
                               )));

        //how to set the value to view ?

        return new CakeResponse(array('body'=>json_encode($result)));
    

如何设置key:value从控制器到ajax的数据响应?

【问题讨论】:

你可以使用引导自动完成 有相关的文档页面吗? 【参考方案1】:

你可以做的是,你可以在自动完成中调用 ajax 函数。因此,在页面加载时,您无需执行任何操作。但是在key type上,会调用ajax函数。

$("#searchProduct").autocomplete(
     source: function (request, response) 
          $.ajax(
              url: "add url for function call in ajax",
              dataType: "json",
              type: "post",
              data: key: value,// if you want to send any values to ajax call, you can do it here.
              success: function (data) 
                   response(data);
              
          );
      ,
      minLength: 2,
      delay: 200// im not sure why u need delay.
 );

在调用 ajax 的函数中,在那里填充数组并使用 echo json_encode($array); 以 json 格式回显数组。它会起作用的。

编辑

你的控制器函数应该是这样的

function products() 
    $array[0]['name'] = "Product - 1";
    $array[0]['price'] = 100;
    $array[1]['name'] = "Product - 2";
    $array[1]['price'] = 200;
    // like above populate all your products in to an array.

    // at last add this line
    echo json_encode($array);// this will generate key: value what you asked.

【讨论】:

Ic.. 但我如何发送数据格式键:来自控制器的值? *我更新了我的问题 qith 更新了控制器代码?只是在控制器上查找列表? 自动完成功能不起作用,我们是否需要库来执行此操作?而不是 jQuery 我已经加载了它,我的其他 ajax 和 jquery 工作,但是当我添加脚本时,所有其他突然不工作,控制台上没有信息 控制台没有错误,输入字段没有任何反应 让我们continue this discussion in chat。

以上是关于cakephp 2 上的自动完成 Ajax的主要内容,如果未能解决你的问题,请参考以下文章

大数据库表和繁忙站点上的ajax自动完成查询的有效方法

如何提高 Jquery 自动完成的性能

Jquery自动完成换行符不起作用

CakePHP 2.1 JsonView

ui自动完成上的json数据源问题

Ajax 自动完成(或自动建议)与 TAB 完成/自动填充类似于 shell 命令行完成?