Je možné změnit presenter v Routě?

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

Zdravím,

už několik hodin se dělám s routovací třídou, která dědí ze třídy Route a přepisuje metodu Match. Zde se snažím pomocí hodnot vygenerovaných z databáze (kde mám uložené info o presenteru, akci a id pro danou adresu) upravit $appRequest a ten vrátit.

U Akce a ID mi vše funguje, pouze presenter se sice v debuggeru zobrazí, pouze ale jako nový parametr a stránka se zobrazí v defaultním presenteru. http://bit.ly/H6Ikbc

Chci se proto zeptat, je presenter vůbec možné upravit a pokud ne, jak vyřešit situaci, kdy potřebuju generovat různé presentery pro různé záznamy.

Takto vypadá část kódu v metodě match

$params = $appRequest->parameters;
$params['id'] = self::$allRoutesArr[$appRequest->parameters['id']]['url'];
$params['action'] = self::$allRoutesArr[$appRequest->parameters['id']]['action'];
$params['presenter'] = self::$allRoutesArr[$appRequest->parameters['id']]['presenter'];

$appRequest->parameters = $params;

return $appRequest;

Díky za jakoukoli pomoc, Michal.

Michal Majer
Člen | 8
+
0
-

Zkoušel jsem před návratem hodnoty použít setPresenterName, to mě ale přesměruje na adresu: /destination/default/zadana-adresa.html a tím pádem se nepoužije Routa.

$appRequest->setPresenterName("Destination");
Michal Majer
Člen | 8
+
0
-

Tak takové jedno řešení jsem vymyslel, ale zdá se mi to poměrně fuj fuj, co myslíte?

Do bootstrapu jsem vložil pole s presentery a deklaraci routy provedl ve foreach. Do Match jsem pak vložil podmínku, aby se routa neprovedla, neshodují-li se presentery. Není lepší řešení? Díky

Editoval Michal Majer (3. 4. 2012 21:48)

jasir
Člen | 746
+
0
-

Něco podobného jsem řešil, podědil jsem FilterRouter a přidal si filter na presenter:

<?php


class PageRouter extends FilterRoute {

	public function __construct($mask, $metadata = array(), $flags = 0,
		parent::__construct($mask, $metadata, $flags);
		$this->addFilter('page', array($this, 'filterIn'), array($this, 'filterOut'));
		$this->addFilter('presenter', array($this, 'presenterFilterIn'), array($this, 'presenterFilterOut'));
	}

...
?>