JqueryUI自动完成功能无法在CakePHP 2.0中运行

时间:2012-02-18 16:31:07

标签: jquery-ui cakephp jquery-ui-autocomplete cakephp-2.0

我的自动填充功能无效,我无法发现错误。

Jquery的

<script>
$(function() {
    $('#autoComplete').autocomplete({
        //source: "/groceries/items/autoComplete", ///This works but response isn't formatted correctly'
        //dataType: "json"
        minLength: 2,
        source: function( request, response ) {
            $.ajax({
                url: "/groceries/items/autoComplete",
                dataType: "jsonp",
                data: {
                    featureClass: "P",
                    style: "full",
                    maxRows: 12,
                    term: request.term
                },
                success: function( data ) {
                    response( $.map( data, function( el ) {
                        return { label: el.id, value: el.name }
                    }));
                }
            });
        }
    });
});

控制器

public function autoComplete() {
        Configure::write('debug', 0);
        $this->layout = 'ajax';
        $query = $_GET['term'];
        $items = $this->Item->find('all', array(
            'conditions' => array('Item.name LIKE' => $query . '%'),
            'fields' => array('name', 'id', 'category_id'),
            'group' => array('name')));
        $this->set('items', $items);
    }

表格

    <p>
    <?php echo $this->Form->create('Item', array('model'=>'item','action' => 'addItem', 'name'=>'AddItem'));?>
        <?php echo $this->Form->text('Item.name', array('size'=>'30', 'id'=>'autoComplete', 'autocomplete'=>'off')); ?>
        <?php echo $this->Form->text('Item.category_id', array('type'=>'hidden', 'value'=>'0')); ?>
        <?php echo $this->Form->text('Groclist.id', array('type'=>'hidden', 'value'=>$groclist['Groclist']['id'])); ?>
    <?php echo $this->Form->end('Add'); ?>
</p>

响应

0: {Item:{name:Cake, id:6, category_id:null}}
1: {Item:{name:Carrot Cake, id:9, category_id:null}}
2: {Item:{name:Carrots, id:8, category_id:null}}
3: {Item:{name:Casserole, id:11, category_id:null}}
4: {Item:{name:Cauliflower, id:10, category_id:null}}

编辑澄清。

我意识到JqueryUI期望标签和值以及该地图应该重新排列它们,但由于某种原因它不是。有什么想法吗?


我找到了更好的解决方案。这完全在控制器中完成。无需查看。

 public function autoComplete() {
        Configure::write('debug', 0);
        *$this->autoRender=false;*
        $this->layout = 'ajax';
        $query = $_GET['term'];
        $items = $this->Item->find('all', array(
            'conditions' => array('Item.name LIKE' => $query . '%'),
            'fields' => array('name', 'id', 'category_id'),
            'group' => array('name')));
        *$i=0;
        foreach($items as $item){
            $response[$i]['value']="'".$item['Item']['id']."'";
            $response[$i]['label']="'".$item['Item']['name']."'";
            $i++;
        }
        echo json_encode($response);*
    }

2 个答案:

答案 0 :(得分:1)

如果减少Items模型返回的数组,该怎么办?因此,不是$this->set('items', $items);而是返回json编码的结果,如下所示:

foreach($items as $item) {
    $data[] = $item['Item'];
}
$data = json_encode($data);
echo $data;
exit;

这是在控制器中的auto_complete方法中。

<强>更新 例如,在查询Cake时,它会返回如下结果:

[
  {"name":"Cake Batter","id":"1","category_id":"3"},
  {"name":"Cake Mix","id":"2","category_id":"3"}
]

如果你不想返回json,你可以在没有json编码的情况下返回$data

格式更新:

我不确定这是否“草率”,但您可以将foreach循环更改为:

foreach($items as $item) {
    $data[]= array(
        'label' => $item['Item']['name'],
        'value' => $item['Item']['id']
    );
}

答案 1 :(得分:0)

您似乎忘记了Item

response($.map( data, function( el ) {
    return { label: el.Item.id, value: el.Item.name }
});

您也可以使用Set

在服务器端执行此操作
$this->set('items', Set::extract('/Item', $items));