Vyhledávací filtr s nápovědou

gizer
Člen | 67
+
0
-

Dobrý den,
stále hledám možnosti, jak udělat zúžený výběr z databáze ve formuláři ještě před jeho odesláním. Něco jako příjezdový formulář do republiky, kde si vyberete město a zobrazí Vám to v našeptávání pouze ulice z vybraného města. Uvedu, jak jsem doposud postupoval.


Presenter:
 protected function createComponentSearchBranchClientsForm()
    {
        $form = new Form;

        $form->addSelect('city', 'Město:',$this->searchBranchManager->getPreselectionCity())
            ->setPrompt('Zadejte město.. ')
            ->setRequired();

  		$form->addSelect('street', 'Ulice:',$this->searchBranchManager->getPreselectionStreet())
            ->setPrompt('Zadejte ulici.. ');
..
..

V presenteru jsou vyhledávací pole definovaná jak addSelect. Položky selectu jsou načítány z databáze pomocí metod
getPreselectionCity() a getPreselectionStreet(). V modelu tyto metody vypadají takto.

Model:

 public function getPreselectionCity() {
            return  $this->database->fetchPairs('SELECT DISTINCT city FROM localclients');
        }

        public function getPreselectionStreet() {
            return  $this->database->fetchPairs('SELECT DISTINCT street FROM localclients');
        }

Všechno to funguje, až na to, že se stále načítají všechny ulice z celé databáze. Potřeboval bych při zadání města ještě před odesláním formuláře mít v selectu v nabídce ulic jen takové, které se nacházejí ve vybraném městě.

Děkuji moc za případnou radu, jak to zapsat v kódu.

Pavel Kravčík
Člen | 1196
+
0
-

Jednou z cest může být závislý input – viz componette

gizer
Člen | 67
+
0
-

Děkuji za návrh a určitě si ho nastuduji. Rád bych přivítal i další možnosti bez nutnosti instalovat doplňky a knihovny.

Pavel Kravčík
Člen | 1196
+
0
-
  • Třeba zkusit krokování (wizard form).
  • Případně při vybrání města uložit do URL nějaký parametr a dle něj pak omezit výběr ulic (redirect, ajax)
gizer
Člen | 67
+
0
-

Pořád si myslím, že existuje jednodušší možnost. Stačí přece odchytit parametr ‚city‘ hned při zadávání a podle něho upravit výběr v databázi v metodě getPreselectionStreet().

Jenomže také nevím dost dobře jak.

Polki
Člen | 553
+
0
-

@gizer

Stačí přece odchytit parametr ‚city‘ hned při zadávání a podle něho upravit výběr v databázi

To je přesně to, co popsal @PavelKravčík Výběr odchytíš JS událostí ‚CHANGE‘ a pošleš AJAX požadavek GETEM/POSTEM na server, který vygeneruje nové možnosti pro další select a ty jako překreslený snippet vrátí.

gizer
Člen | 67
+
0
-

Byl bych vděčný za malou ukázku kódu jak na to.

Pavel Kravčík
Člen | 1196
+
0
-

@gizer: Pošli, jak to zatím máš, je těžké odhadovat strukturu apod. Ale obecně třeba jquery a naja:

$('input').on('change', function(){
  naja.makeRequest('GET', '/url', {city: '42'});
};
gizer
Člen | 67
+
0
-

Kód v presenteru je nahoře.

 $form->addSelect('city', 'Město:',$this->searchBranchManager->getPreselectionCity())
            ->setPrompt('Zadejte město.. ')
            ->setRequired();

Jak tam mám správně zakomponovat tu událost „onkeyup“ nebo „onchange“ v Ajaxu ?

Editoval gizer (5. 11. 2021 11:50)

gizer
Člen | 67
+
0
-

Možná bude lepší použít něco jako toto v action metodě.

$city = $form->getComponent('city');

a následně to poslat do JS. Nevím?

Ještě dotaz?

$('input').on('change', function(){
  naja.makeRequest('GET', '/url', {city: '42'});
};

Ten script za použití ajaxové knihovny „naja“ zapíšu přesně kde? V presenteru a metodě action?

Editoval gizer (5. 11. 2021 12:00)

Pavel Kravčík
Člen | 1196
+
+2
-

Je to nepopulární věta, ale zkus se podívat trochu zpátky do základů. PHP je server-side. Tj. něco uděláš na serveru a pošleš výsledek klientovi (request, response, http). Pokud chceš reagovat na klientovo akce (mimo parsování URL), musíš použít client-side akci, která pošle request (například ajaxem). To popisoval @Polki.

Proto jsem nabízel ten doplněk, to je nejefektivnější cesta, pokud začínáš. ;) Script píšeš do šablony.

gizer
Člen | 67
+
+1
-

Obecně samozřejmě znám rozdíl PHP a JS. Ajax jsem ještě nedělal. OK, dám naja zápis do šablony.

Při změně pošlu request s obsahem proměnné z inputu „city“. Na serveru se to pokusím zachytit a upravit podle toho načítání z databáze.

Vyzkouším a uvidíme. Každopádně moc děkuji za veškeré rady.