在cakephp 2上自动完成Ajax

时间:2017-06-09 04:35:46

标签: php jquery ajax cakephp autocomplete

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

目前我首先在控制器上加载所有数据,分配给视图然后从所有数据开始自动完成。但这样做效率不高,需要时间,因为数据可能很多。如何过滤控制器功能只加载输入上的关键字i类型?我可以在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)));
    }

如何设置密钥:ajax从控制器到数据响应的值?

1 个答案:

答案 0 :(得分:1)

你可以做的是,你可以在自动完成中调用ajax函数。所以在页面加载时,你不必做任何事情。但是在键类型上,将调用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.
}