Empfehlungen: Erweiterte Suche

jQuery AutoComplete

Daten auslesen, verarbeiten und den Views übergeben

jQuery AutoComplete

Beitragvon Superfly » Sa 27. Aug 2011, 15:32

Ich versuche gerade, die AutoComplete-Funktion aus jQuery UI in meine CakePHP-App zu integrieren. Mit einer statischen Liste von Keywords/Tags klappt es auch wunderbar (die Scripte sind also korrekt eingebunden), aber ich schaffe es nicht, die Autocomplete-Vorschläge dynamisch aus den Datenbankeinträgen zu erzeugen.

Das jQuery-Script ist ziemlich simpel:

Code: Alles auswählen
$("#SearchQuery").autocomplete({
            source: "/Places/autocomplete",
            minLength: 1
        });


Die angeforderte action sieht wie folgt aus:

Code: Alles auswählen

function autocomplete() {
        $data = $this->Place->find('all', array('conditions'=>array('Place.city LIKE' => $this->params['url']['term'].'%'),'fields'=>array('city')));
        $this->set('suggestions', $data);
        }
 


Und auch einen view autocomplete.ctp habe ich angelegt:

Code: Alles auswählen
<?php

if(!empty($suggestions)) {

    $data = array();

    foreach ($suggestions as $item){
        $data[] = $item['city'];
    }

    echo json_encode($data);
}
else echo 'Keine Ergebnisse';

?>


Allerdings wird unter dem Suchfeld damit keine Liste mit Vorschlägen angezeigt. Wie spielt denn die action die Ergebnisse an den View zurück? Mir ist da irgendwie das Zusammenspiel von Controller, default.ctp und autocomplete.ctp noch nicht ganz klar… Bin also für jede Hilfe dankbar!

(Nutze CakePHP 2.0b und jQuery 1.6.2)
Superfly
 
Beiträge: 1
Registriert: Fr 26. Aug 2011, 19:12
CakePHP-Version: 2.0.0-beta
OS: Mac OS 10.7

Re: jQuery AutoComplete

Beitragvon Jörg » Do 24. Nov 2011, 21:38

Hi,

da du scheinbar das normale Layout mit den Daten zurückgeliefert bekommst, solltest du das Ajax-Layout verwenden.

In deiner Controller-Methode setzt du folgendes:
Code: Alles auswählen

$this->layout = 'ajax';
$this->render(false);
 

Das this->render(false); widerspricht sich zwar ein bisschen mit dem "this->layout", aber du kannst somit auf Nummer sicher gehen.

Du brauchst nicht zwingend ein View (autocomplete.ctp) für deine Methode, denn du kannst das Rendern abschalten und dein json_encode() direkt in der Methode vornehmen.

Zum Beispiel so: (ungetestet)
Code: Alles auswählen

function autocomplete() {
$this->layout = 'ajax';
        $data = $this->Place->find('all', array('conditions'=>array('Place.city LIKE' => $this->params['url']['term'].'%'),'fields'=>array('city')));
        }

if(!empty($data)) {
    foreach ($data as $item){
        $keywords[] = $item['city'];
    }

    echo json_encode($keywords);
} else {
 echo 'Keine Ergebnisse';
}
$this->render(false);
 


Weitere Infos zum Layout (Ajax) - http://book.cakephp.org/2.0/en/views.ht ... light=ajax

Grüße
Jörg
Jörg
 
Beiträge: 130
Registriert: Di 13. Mai 2008, 13:45
Wohnort: Bremen
CakePHP-Version: 2.0.3, 1.3.x
OS: Win7/Ubuntu


Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron