Pregunta

Mi autocompleto no funciona y no puedo detectar el error.

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 }
                    }));
                }
            });
        }
    });
});

Controlador:

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);
    }

Forma:

    <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>

Respuesta:

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}}

Editado para aclaración.

Me doy cuenta de que jQueryui espera etiqueta y valor y ese mapa debería reorganizarlos, pero por alguna razón no lo es. ¿Algunas ideas?


Encontré una solución aún mejor. Esto se hace completamente en el controlador. No se requiere vista.

 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);*
    }
¿Fue útil?

Solución

¿Qué pasa si reduce la matriz que está siendo devuelta por el modelo de elementos? Entonces en lugar de $this->set('items', $items); Devuelve los resultados codificados JSON así:

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

Esto está dentro del método auto_complete en el controlador.

ACTUALIZAR:Al consultar el pastel, por ejemplo, devolvería un resultado así:

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

Si no quiere devolver el JSON, podría volver $data sin la codificación JSON.

Actualización de formato:

No estoy seguro de si esto es "descuidado", pero podría cambiar el bucle foreach a:

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

Otros consejos

Parece que olvidaste el Item:

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

También puede hacerlo en el lado del servidor usando Set:

$this->set('items', Set::extract('/Item', $items));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top