Vlastní router zahodí ostatní parametry

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Peetee
Člen | 75
+
0
-

Ahoj,

vytvořil jsem si vlastní router, který mi převádí adresy dle db tabulky (např. kategorie/podkategorie/produkt převede na Product:detail 7) metada Match vypadá asi takto:

<?php
public function match(Nette\Http\IRequest $httpRequest)
{
	// ... získá $table z cache/db a $path z $httpRequest
	if (isset($table[$path])) {
		return new Nette\Application\Request('Product', 'detail', Array('id' => $table[$path]));
	} else {
		return NULL;
	}
}
?>

Problém je v tom, že když na stráce Product:detail mám nějaký formulář, tak se všechna ostatní data zahodí a ani se formulář nevykoná (nezavolá se onSuccess). Je nějaký způsob jak je můžu předat všechny parametry? (například z Visual Paginator)

Jan Endel
Člen | 1016
+
0
-

však tam máš $httpRequest ze kterého si z toho api všechno krásně vyčtěš.

Peetee
Člen | 75
+
0
-

pilec napsal(a):

však tam máš $httpRequest ze kterého si z toho api všechno krásně vyčtěš.

Díky za reakci, rozumím tomu, že to musím dostat z $httpRequest do Nette\Application\Request, ale přemýšlím nad tím tak, jak dostat všechno ostatní, aby to fungovalo stejně jako statní routy, kde kdybych přidal další proměnou, tak taky neměním routy.

Můžeš mě prosím nějak nakopnout?

Jan Endel
Člen | 1016
+
0
-

Narychlo mě napadá jen takový nástřel (možná bude mít někdo lepší nápad):

if (isset($table[$path])) {
	$data = Array('id' => $table[$path]);
	$data =  array_merge($data, $httpRequest->getQuery(), $httpRequest->getPost());
               return new Nette\Application\Request('Product', 'detail', $data);
       } else {
               return NULL;
       }
Peetee
Člen | 75
+
0
-

Děkuji za odpověď, snažím se v tom rýpat a zdá se, že parametry zahazuje už constructUrl. ten dostane Nette\Application\Request a já bych sice mohl napsat něco jako:

<?php
$params = $appRequest->getParameters();
$out = '?';
foreach ($params as $key => &value) {
	$out .= $key . '=' . $value . '&';
}
return $out;

?>

Musel bych dořešit spoustu detailů (které parametry nepředávat, protože si je vzalo něco jiného), které předávat… Nebylo by možné celou tu část za otazníkem nechat vygenerovat Nette?

jasir
Člen | 746
+
0
-

Zkus tady na foru pohledat hosiplanův FilterRouter.

Filip Procházka
Moderator | 4668
+
0
-

Nebo přímo na wiki v kuchařce :)

Peetee
Člen | 75
+
0
-

Díky za odpovědi, pořád si s tím hraju. V současný době se mi nejvíc líbí myšlenka udělat vlastní router, nechat vše vyřešit rodiče a přepsat jen to co je třeba… (velice podobně jako právě filterRouter).

Jen drobná poznámka: V tom článku v kuchařce je asi nesrovnalost, píšeš $route->addFilter('id', 'PageModule::uriToId', 'PageModule::idToUrl'); ale pak máš fci v ArticleModel a static function slugToId($slug, Nette\Application\PresenterRequest $request).