Jak zajistit, aby vice URL bylo routerem nasmerovano do jedne renderAction?

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

Ahoj vsem,

chci vytvorit „system“ kde vice stranek (rekneme 3, ale klidne 100) bude obsluhovano skrze jednu renderAction (i jednu sablonu napr. sablona1.latte). Duvody jsou proste, obsah bude vicemene stejny, jen se bude menit jedno promennych, ktere bude presenter do sablony dodavat. Zakladem bude ale, ze vse se bude muset vycist na zaklade URL.

Priklad tech URL:
http://localhost/…ky-text-jana
http://localhost/…y-text-petra
http://localhost/…y-text-alena

V bootstrape to pak bude predklapokladam reseno pres FILTERin/out … tj. napr.

$router[] = new Route('/neco/<action>', array(
    'presenter'  =>  'test',
    'action'  =>  array(
      Route::VALUE => 'default',
      Route::FILTER_IN => callback('TestPresenter::testRouterIn'),
      Route::FILTER_OUT => callback('TestPresenter::testRouterOut'),
    ),
));

v TestPresenteru bude napr.

$jmeno[] = "Jana";
$jmeno[] = "Petra";
$jmeno[] = "Alena";
$this->template->promenna = $jmeno;

v @layout.latte pak bude napr.

{foreach $promenna as $item}
<a n:href="Test:neco1, 'jmeno'=>$item">Jmeno: {$item}</a>
{/foreach}

Otazkou, kterou jsem zatim nedokazal zodpovedet je, jak napsat ty static function testRouterIn a testRouterOut ?

Diky vsem za radu a posoupnuti spravnym smerem.

Editoval ras (2. 11. 2011 23:42)

ras
Člen | 135
+
0
-

Zatim jsem problem (asi) srazil do vyreseni situace, jak nacist v testRouterOut($renderAction) parametr, ktery se zadava do sablony, tj. to co prijde v tom $item z <a n:href=„Test:neco1, ‚jmeno‘=>$item“>, protoze testRouterOut($renderAction) obdrzi $renderAction = „neco1“ … takze jak je mozne zde nacist ten $item? (zacinam tusim, ze to mozna bude trivialni, ale ja to proste nevim).

Editoval ras (2. 11. 2011 23:45)

powercz
Člen | 12
+
0
-

Ahoj,

pokud jsem to správně pochopil, tak stačí použít: (z hlavy)

$router[] = new Route('/nejaky-text-<jmeno>', array(
    'presenter'  =>  'test',
    'action' => 'test',
    'jmeno' => Null
));

v action „test“ získáš promněnou „jmeno“ a na základě toho pošleš do šablony data…

ras
Člen | 135
+
0
-

Diky, to je dobry napad … jedina vytka (ktera asi me trapit nebude), ze pokud tech variant „nejaky-text“ bude vice, tak pak by hrozilo velke (relativne nekonecne) mnozstvi rout a to by asi nebylo nejlepsi/nejrychlejsi.

Tj. napadne nekoho jeste neco lepsiho?

Editoval ras (3. 11. 2011 0:33)

Felix
Nette Core | 1189
+
0
-

Mozna bys me upresnit co vlastne chces.

Metody filterIn a filterOut se povetsinou pouzivaji kdyz chces reprezentovat dlouho adresu napriklad:
example.com/tohle-je-hrozne-dlouhy-test-a-taky-uplne-naprd napriklad do test.latte a nebo vycistit url. Popis vic tvuj pozadavek, jinak me nepada to co uz bylo receno tady

Edit:

$router[] = new Route('/<url>-<jmeno>', array(
    'presenter'  =>  'MujPresenter',
    'action' => 'NejakaAkce',
    'url' => NULL,
    'jmeno' => NULL
));

to ti zaruci, ze at tam das cokoli ve formatu xxx-yyy, tak to vezme a presmeruje na akci MujPresenter:NejakaAkce.

Editoval Felix (3. 11. 2011 1:09)

ras
Člen | 135
+
0
-

To Felix: muzes pls opravit ten link, diky

Tak to zkusim popsat jinak a lepe ;o)

URL
-------
http://localhost/nejaky-text1-jana
http://localhost/nejaky-text2-jana
http://localhost/nejaky-text1-petra
http://localhost/nejaky-text1-alena
http://localhost/nejaky-text3-dasa

Vysledek
----------
TestPresenter:renderActionA, parametr = jana
TestPresenter:renderActionB, parametr = jana
TestPresenter:renderActionA, parametr = petra
TestPresenter:renderActionA, parametr = alena
TestPresenter:renderActionC, parametr = dasa

Pricemz „nejaky-text1“ muzu opravdu byt „silene-dlouhy-a-uplne-zbytecny-text-se-spoustou-pomlcek“

Felix
Nette Core | 1189
+
0
-

Zkusil bych neco jako:

$router[] = new Route('<url><id [0-9]+>-<jmeno>', array(
    'presenter'  =>  'Presenter',
    'action' => 'Akce',
    'url' => array(
        Route::PATTERN => '.+',
        Route::FILTER_IN => NULL,
        Route::FILTER_OUT => NULL,
    ),
));

Editoval Felix (3. 11. 2011 1:15)