Routování GET parametrů v URL
- Hitny14
- Člen | 90
Ahoj,
už nějakou dobu nemůžu přijít na to jak vytvořit hezčí URL z parametrů po vyfiltrování produktů. Jde mi to to, že mám vytvořený formulář pomocí kterého se filtrují produkty a odesílám ho pomocí GETu. Po AJAXovém odeslání vše překreslím produkty se vyfiltrují ale URL mám následující:
http://localhost/categorie?size=701000&do=filterForm-submit
Potřeboval bych tu URL upravit následujícím způsobem:
http://localhost/categorie?velikost=XL
To znamená odebrat z URL &do=filterForm-submit
, ID
parametru 701000 nahradit za textovou hodnotu a vyřešit u toho i překlady
velikost/size.
Rouuter používám následujícím způsobem:
// definice routy pro kategorii produktů
$category = new CustomRouter($locale . '<id>[/<paginator-page>]', [
'locale' => $defaultLocale,
'presenter' => 'Category',
'action' => 'default',
'paginator-page' => 1,
'id' => [
Route::FILTER_OUT => function ($id) {
if (!is_numeric($id)) {
return $id;
} else {
return $this->categoryModel->getUrlById((int)$id);
}
}
]
]);
$category->setModel($this->categoryModel);
$router->add($category);
V CustomRouter je metoda match()
:
public function match(Nette\Http\IRequest $httpRequest): array|null
{
$appRequest = parent::match($httpRequest);
if ($appRequest && !is_numeric($appRequest['id'])) {
$pageId = $this->model->{$this->method}($appRequest['id']);
if ($pageId) {
$appRequest['id'] = $pageId;
} else {
return null;
}
}
return $appRequest;
}
Snažím se přijít na to jak pracovat s parametrama ale nedaří se mi. Mohl by mi prosím někdo poradit. Děkuji moc
- dakur
- Člen | 493
@Hitny14 Nevidím moc jednoduchý způsob, jak zachovat použití
nette/forms a zároveň nemít v adrese do
parametr. Osobně si
ale hlavně myslím, že je taková tendence „mít to dokonale čistý“
(docela ji znám). Je nějaký problém v tom, že to tam je? Běžný
uživatel celkem ignoruje existenci adresního řádku, natož parametru
v něm, a určitě se nebude pídit po tom proč to tam je, ani ho to nebude
nějak obtěžovat.
Jinak taky doporučuju nezbavovat se ID v URL – přináší to úplně
zbytečné problémy s identifikací, které ti ID už řeší (unikátnost).
Nejlepší řešení je podle mě použít obojí, takže např.
/categories/701000-velikost-xl
– tím docílíš URL, která je
relativně srozumitelná a zároveň technicky jednoduše parsovatelná
(vyhledáváš podle toho, co je před první pomlčkou a je to ID). V routeru
pak něco jako:
$router->add('categories/<id>-<slug>', ...);
- dakur
- Člen | 493
@Hitny14 Nevím úplně přesně jak to myslíš, ale zní to jakože ti přestane fungovat vyhledávání, pokud nemáš zapnutý javascript.. Javascript má sice dnes kdekdo, ale jsou zase docela tendence ho zakazovat/vypínat, takže se na to stejně úplně spolehnout nedá, pokud nemáš úplně kontrolu nad uživately svého webu. Pak by byla škoda, kdyby kvůli tomu nefungovalo vyhledávání, když zvládne fungovat i bez něj. To jen ke zvážení. :-)
Edit: Nevšiml jsem si, že celý search máš ajaxified, tak to pak asi neplatí, sorry.. Samozřejmě jsou use-casy, kdy to dává smysl mít ajaxem. 🙂
Editoval dakur (22. 2. 2022 9:40)
- Kamil Valenta
- Člen | 815
Při „neajaxovém“ požadavku se přeci normálně formulář odešle a není důvod, proč si URL, na kterou se redirectuje, neposkládat dle libost – a bez „do“ parametru.