Vlastní router zahodí ostatní parametry
- Peetee
- Člen | 75
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)
- Peetee
- Člen | 75
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
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
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?
- Peetee
- Člen | 75
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)
.