PresenterRequest – zrušit final

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

Zdravím Netti,
dělám si vlastní databázový router, který mi routuje na různé presentery podle infromací, které jsou obsaženy v databázi (pracky/automaticke/ – CategoryPresenter, foto/dovolena/ – GalleryPresenter). Zároveň přímo v routeru zjistím primaryKey patřičného záznamu a rád bych ho předal přímo presenteru, nechci ho však ukládat v URL. Jako nejlepší mi přišel přístup přes <?php $presenter->request->primaryKey; ?>, aktuální implementace PresenterRequest mi však nedovolí před vlastní „skrytý parametr“. Chtěl jsem si tedy implementovat vlastní PresenterRequest ale ejhle, aktuální PresenterRequest je final a nelze z něj dědit. Lze toto vyřešit jinak? Pokud ne, mohl bych požádat o zrušení final? Díky.

Editoval marau (9. 1. 2011 2:38)

Jan Tvrdík
Nette guru | 2595
+
0
-

Předej si ten parametr normálně v $params.

marau
Člen | 50
+
0
-

Pokud dám ID do params, přenáší se v URL adrese a to já nechci.

Tharos
Člen | 1030
+
0
-

Nemusí se předávat do URL, to záleží čistě na implementaci Nette\Application\IRouter::constructUrl(…). Vlastní PresenterRequest zde skutečně není zapotřebí.

Editoval Tharos (9. 1. 2011 16:12)

Ondřej Mirtes
Člen | 1536
+
0
-

Tak ten parametr nazvi stejně, jako ten parametr, který ho představuje v URL. Takhle funguje FILTER_IN/FILTER_OUT pro převádění třeba mezi slugem a IDčkem. Ale pamatuj, že to musí fungovat oboustranně.

marau
Člen | 50
+
0
-

Nakonec jsem to udělal následovně:
v constructUrl:

if (isset($params['primaryId'])) {
  unset($params['primaryId']);
}

a v presenteru:

$this->productId  = $this->request->params['primaryId'];
Ondřej Mirtes
Člen | 1536
+
0
-

V presenteru máš k dispozici $primaryId v metodách action* a render* jako vstupní parametr.

marau
Člen | 50
+
0
-

Ondřej Mirtes napsal(a):

V presenteru máš k dispozici $primaryId v metodách action* a render* jako vstupní parametr.

Pokud bych si nechal $primaryId nastavit do action a render, porušil bych tim koncept, pro který byl tento způsob odkazování navržen. Měl bych totiž následující:

public function actionDefault($url, $primaryId, $dalsiParametr, $jesteJiny, $aDalsi)
{

}

Pokud bych nyní chtěl vytvořit link, musel bych ručně zadávat názvy parametrů, $primaryId totiž niky nevyužiji (nastavuji ho pouze při routování).

Vyki
Člen | 388
+
0
-

Ondřej Mirtes napsal(a):

Tak ten parametr nazvi stejně, jako ten parametr, který ho představuje v URL. Takhle funguje FILTER_IN/FILTER_OUT pro převádění třeba mezi slugem a IDčkem. Ale pamatuj, že to musí fungovat oboustranně.

To je rozhodně nejčistší způsob jak se s tím vypořádat. Permalink si přeložit na id už v route table a v aplikaci používat už pouze id.

Tharos
Člen | 1030
+
0
-

Vyki: Ano, ale to předpokládá routování za pomocí Nette\Application\Route. Pokud někdo (z jakéhokoliv důvodu) routuje přes svou vlastní implementaci Nette\Application\IRouter, je to docela jiná situace. Pak je IMHO nejlepší řešit to právě v metodě constructUrl(…), anebo si implementovat vlastní filtrační mechanismus.