JQueryui Completa automatico non funziona in CakePhp 2.0
-
27-10-2019 - |
Domanda
Il mio completamento automatico non funziona e non riesco a individuare l'errore.
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 }
}));
}
});
}
});
});
Controller:
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);
}
Modulo:
<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>
Risposta:
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}}
A cura di chiarimenti.
Mi rendo conto che JQueryui si aspetta l'etichetta e il valore e quella mappa dovrebbe riorganizzarli, ma per qualche ragione non lo è. Qualche idea?
Ho trovato una soluzione ancora migliore. Questo viene fatto completamente nel controller. Nessuna vista richiesta.
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);*
}
Soluzione
E se riduci l'array che viene restituito dal modello degli articoli. Quindi invece di $this->set('items', $items);
Restituisci i risultati codificati JSON in questo modo:
foreach($items as $item) {
$data[] = $item['Item'];
}
$data = json_encode($data);
echo $data;
exit;
Questo è all'interno del metodo Auto_Complete nel controller.
AGGIORNARE:Durante la domanda per la torta, ad esempio, restituirebbe un risultato così:
[
{"name":"Cake Batter","id":"1","category_id":"3"},
{"name":"Cake Mix","id":"2","category_id":"3"}
]
Se non vuoi restituire il JSON, potresti semplicemente tornare $data
Senza la codifica JSON.
Aggiornamento del formato:
Non sono sicuro che questo sia "sciatto", ma potresti cambiare il ciclo foreach in:
foreach($items as $item) {
$data[]= array(
'label' => $item['Item']['name'],
'value' => $item['Item']['id']
);
}
Altri suggerimenti
Sembra che tu abbia dimenticato il Item
:
response($.map( data, function( el ) {
return { label: el.Item.id, value: el.Item.name }
});
Puoi anche farlo sul lato server utilizzando Set
:
$this->set('items', Set::extract('/Item', $items));