Vytvareni linku – nehledat presenter

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

Ahoj,
potrebuju poradit s vytvarenim odkazu. Mam takovouto routu:

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/]<path .*>',array(
    'presenter'=>'Front',
    'action'=>'Default',
));
?>

Je tedy jasne, ze se jedna vzdy o FrontPresenter, ve kterem se uz url adresa zpracuje (parametr <path>) a timto smerem je to OK. Ale kdyz chci vytvorit odkaz pres {link}, potrebuju neco takoveho:
{link 'strankaX', 'param' => 'hodnota'} nehledal actionStrankaX, ale vytvoril odkaz v podobe:
$basePath.'/strankaX?param=hodnota' – zkratka aby nehledal presenter / action, ale aby proste vzal to, co mu tam vrazim.

Lze to nejak jednoduse udelat? Diky

Michal Vyšinský
Člen | 608
+
0
-

Ahoj,
musíš to udělat takto:

{link Front:strankaX, param => "hodnota"}

Nette nemůže při vytváření odkazu vědět, že chceš jít zrovna na ten konkrétní presenter. Když nezadáš název presenteru, tak Nette jako presenter pro odkaz bere právě aktuální presenter.

Editoval CherryBoss (23. 11. 2012 9:21)

KingKoca
Člen | 25
+
0
-

Jo to je spravne, on tam je jen jeden presenter a na ten to ma jit.

Problem je v tom, ze to neumi zkonstruovat URL:
volam: {link test/potomek/strankaX, 'param' => 'hodnota'}
a ono to pise: error: No route for Front:test/potomek/strankaX(param=hodnota, lang=1)

Potrebuju aby to vygenerovalo url test/potomek/strankaX?param=hodnota protoze diky tomu routeru to opet zpracuje FrontPresenter, coz je spravne.

Moje otazka zni: mam na to vytvorit nejaky specialni router (vlastni) nebo staci filter funkce, popr. jake?

Edit: prisel jsem na toto:
krome jiz definovaneho routeru (viz prvni post) jsem vytvoril dalsi:

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/][<action .*>]',array(
    'presenter'=>'Front',
    'action'=>array(
        \Nette\Application\Routers\Route::FILTER_OUT => function($arg){ return $arg;}
    )
));
?>

a kdyz volam metodu link (at uz z presenteru nebo z latte makra), tak to generovani prebira tento router a ten generuje url adresy takove, jake chci. Akorat v url nesmim mit dvojtecku.

Editoval KingKoca (23. 11. 2012 10:30)

jiri.pudil
Nette Blogger | 1029
+
0
-

Pokud má „test/potomek/strankaX“ odpovídat parametru path v routě, pak by to asi chtělo

{link default path => "test/potomek/strankaX", param => "hodnota"}
ViPEr*CZ*
Člen | 817
+
0
-

Hmmm to určitě nebude dobře…například takové action se u komponenty formuláře vygeneruje špatně. Zkoušel jsem to na odkazu například /cz/kontakt a do action mi to vygeneruje
/default?do=contactForm-submit což je špatně a já bych předpokládal /cz/kontakt?do=contactForm-submit
Taky by mě to docela zajímalo jestli toto lze nějak do routy zadat nebo jak řešit to, že předem nevím jak se jmenuje presenter ani akce a ani další parametry co pak následují?

KingKoca
Člen | 25
+
0
-

Vidite, to me nenapadlo, nemyslel jsem na formulare. Ale pravdepodobne nebude slozite podedit Form a zmenit mu defaultni action.

Kazdopadne by to chtelo nejake ciste reseni pro url adresy generovane z databaze ci jineho zdroje, nez je tvar <presenter>/<action>

mildabre
Člen | 62
+
0
-

CherryBoss napsal(a):

Ahoj,
musíš to udělat takto:

{link Front:strankaX, param => "hodnota"}

Nette nemůže při vytváření odkazu vědět, že chceš jít zrovna na ten konkrétní presenter. Když nezadáš název presenteru, tak Nette jako presenter pro odkaz bere právě aktuální presenter.

Když se podívám na tu routu co tam má:

$router[] = new Route('[<lang [a-z]{2}>/][<action .*>]',...};

tak je vidět, že tam někde musí mít ten lang, takže já bych zkusil třebas:

{link Front:strankaX, lang, param => "hodnota"}

Vyzkoušej to takhle a dej zprávu jak to dopadlo.

Editoval mildabre (8. 12. 2012 17:24)