Routa jde jinam než by měla

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

Zdravím,
potřeboval bych poradit s routama.

Definice:

<?php
$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('<kraj>/[<okres>/]', array(
	'presenter' => 'Vyber',
        'action' => 'default',
        'okres' => NULL,
        ));

$router[] = new Route('<kraj>/[<okres>/]<advert_type>/[<advert_subtype>/]', array(
	'presenter' => 'Vypis',
        'action' => 'default',
        'okres' => NULL,
        'advert_subtype' => NULL
        ));


$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));

	RoutingDebugger::enable();

// Step 5: Run the application!
$application->run();
?>

Problém je v případě, kdy volám presenter Vypis a parametry okres a advert_subtype jsou NULL. Router mě přesměruje na presenter Vyber i když by správně měl na Vypis. Co s tím ?

Editoval pjoter (6. 8. 2010 15:24)

Panda
Člen | 569
+
0
-

Router není zázračný, neumí při mapování z adresy na presenter odhadnout, co je jaký parametr. Pokud mu dáš například adresu

/ustecky-kraj/banner/

tak nepozná, zda je banner parametr okres ze druhé routy, nebo advert_type ze třetí. Proto vybírá první routu, na kterou maska pasuje. A to je ta druhá, která směřuje na presenter Vyber.

Řešením by bylo například prefixovat celou routu, nebo nastavit parametr okres jako povinný. On obecně nepovinný parametr uprostřed routy bude dělat neplechu, v PHP si taky nemůžeš s pořadím parametrů dělat co chceš a funkce typu

function ($arg1, $arg2 = NULL, $arg3) { ... }

nemá moc význam, protože stejně vždycky budeš muset zadávat všechny parametry.

pjoter
Člen | 118
+
0
-

Okres povinny prave nemuze byt stejne jako advert_subtype, takze z tve nabidky reseni zbyva prefixovat celou routu. Mohl bys me prosim nakopnout co to znamena ? Diky

Panda
Člen | 569
+
0
-
$router[] = new Route('vypis/<kraj>/[<okres>/]<advert_type>/[<advert_subtype>/]', array( /* ... */ ));
pjoter
Člen | 118
+
0
-

Aha, no s prefixama to vali ale url nemaji takovy tvar jaky jsem chtel :(, rad bych dosahl

/kraj/okres/typ/podtyp

/kraj/typ/podtyp

/kraj/okres/typ

/kraj/typ

/kraj/okres

/kraj

To by nejak neslo napadlo me treba spojit to do jednoho presenteru a udelat ten vypis vyber jako akce, ale asi bych dosel opet k tomu ze dve adresy budou mit stejny tvar a to kraj/typ a kraj/okres. Fakt to nejde jinak nez s tema prefixama ? (dik)

Ondrej
Člen | 110
+
0
-

pjoter napsal(a):

Aha, no s prefixama to vali ale url nemaji takovy tvar jaky jsem chtel :(, rad bych dosahl

/kraj/okres/typ/podtyp

/kraj/typ/podtyp

/kraj/okres/typ

/kraj/typ

/kraj/okres

/kraj

jedine vlastni iteligentni router, ktery by vedel jake parametry mohou nabyvat jakych hodnot a podle toho by mohl lepe urcit o jaky presenter/akci jde.