Vyhledávací filtr s nápovědou
- gizer
- Člen | 67
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
- 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)
- Polki
- Člen | 553
@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í.
- Pavel Kravčík
- Člen | 1196
@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
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
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
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.