Routování GET parametrů v URL

Hitny14
Člen | 90
+
0
-

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
+
+4
-

@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>', ...);

Hitny14
Člen | 90
+
0
-

@dakur Nakonec jsme to vyřešil pomocí pomocí NAJA. Aelikož odesílám formulář pomocí AJAXu tak sem si nastavil payload postGet na true a poslal jsm si i urlkde mám požadovaný tvar URL. Díky za radu

dakur
Člen | 493
+
0
-

@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 | 762
+
-1
-

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.