Prečo mám v adrese do submodulu bodku?
- Čamo
- Člen | 798
Dobrý večer,
Snažím sa už asi týždeň pochopiť a spojazdniť moduly a submoduly a tiež
ich naroutovať.
Prvá úroveň modulov sa mi podarila a funguje bez problémov.
Druhá úroveň síce funguje, ale generuje mi odkazy v tvare:
http://localhost/nette-blog/www/blog/in.drom20/default
Netuším ako sa mám zbaviť tej bodky resp. ju zmeniť na lomítko.
Už to pomaly začína ohrozovať moje duševné zdravie. Skúsil som už
všetko možné ale tá bodka tam stále je.
Mám k tomu routu, ktorá ale nefunguje a ja neviem prečo(je to len prepis
inej routy do modulu(tu ale ide o submodul), ktorá funguje):
$router[] = $inModuleRouter = new RouteList('in');
$inModuleRouter[] = new Route('/<blog>/<module>/<presenter>/<action>');
Editoval Čamo (25. 6. 2014 20:01)
- David Matějka
- Moderator | 6445
Jedna se o defaultni filtr pro moduly (konkretne to resi tato fce). Muzes pro parametr „module“ napsat FILTER_IN a FILTER_OUT a prizpusobit si to
- Jan Tvrdík
- Nette guru | 2595
@Čamo: Ach jo. Zkus se zamyslet a třeba ti dojde, že když použiješ jako seperátor místo tečky lomítko, tak není možné obecně určit, co je modul, presenter a akce.
- Čamo
- Člen | 798
Jan Tvrdík:
A prečo to nejde určiť? Prečo Nette neakceptuje viac parametrov s názvom
<module>?
Ale hlavne aké je riešenie ma zaujíma nie ani tak to prečo to nefunguje.
A mimochodom nemusíš reagovať ak nechceš? Ja nie som zvedavý na tvoje
arogantné výplody.
Editoval Čamo (25. 6. 2014 22:14)
- David Matějka
- Moderator | 6445
@JanTvrdík kdyz tam jsou vsechny parametry povinny, tak by to fungovat mohlo, ne?
@Čamo v tvem pripade to snad pude, jen budes muset upravit i akceptovany pattern, ktery nepovoluje lomitka.
Ale pokud bys udelal treba action dobrovolny, tak narazis na problem,
napr pro routu
/<module>/<presenter>[/<action=default>]
(kde by si nejak oddelil jednotlive moduly pomoci lomitka)
si predstav nasledujici url:
http://localhost/lorem/ipsum/foo
z toho nepoznas, jestli je to modul Lorem:Ipsum, presenter Foo a akce default, nebo jestli je to modul Lorem, presenter Ipsum a akce foo. I proto je lepsi nechat defaultni oddelovani teckou.
Prečo Nette neakceptuje viac parametrov s názvom <module>?
eh?
Editoval matej21 (25. 6. 2014 22:39)
- Čamo
- Člen | 798
matej21:
No akurát študujem tú triedu routers a chápem aj ten problém
s voliteľnými parametrami. Asi aj tuším prečo vám je čudné mať viac
parametrov s menom modul. Len neviem prečo by sa pri viacnásobnom výskyte
parametra modul(čo je vždy označenie adresára myslím), nemohlo vytvoriť
pole z ktorého by sa odvodila cesta. Mne to príde logické. Ale na
začiatočníka mám zrejme dosť prehnané ambície..
Editoval Čamo (25. 6. 2014 23:19)
- Čamo
- Člen | 798
Ja sa ospravedlňujem ale dnes mi to zase prestalo dávať zmysel.
Včera som tvrdil, že chápem, že ak by nebol presenter oddelený bodkou, tak
by sa nedalo poznať čo je presenter a čo modul. Ale to mi dnes vôbec nedáva
zmysel. V adrese môžem mať predsa všetko možné a bodka sa tam nedáva
modul/presenter/action/param1/param2/paramx. Router také
adresy rozoznáva podľa regulárnych výrazov napr <presenter
post>. Tak prečo u submodulov tá bodka?
Ja sa ospravedlňujem ak to nechápem, ale začal som s tým len toť
prednedávnom, tak sorry.
Editoval Čamo (26. 6. 2014 15:09)
- Čamo
- Člen | 798
Šaman
Práveže to čo je pred parametrami nemusí byť povinné. Napr.
<presenter post>[/<action=show>]/<id>/<title> funguje.
A jediný dôvod prečo sa do tejto routy netriafajú ostatné
presentry(u ktorých dajme tomu to show chcem mať) je to post
v presentery.
Takže tak isto by mali fungovať aj submoduly. Ja stále tam tú bodku
nechápem.
Editoval Čamo (26. 6. 2014 19:13)
- Šaman
- Člen | 2659
Čamo napsal(a):
Šaman
Práveže to čo je pred parametrami nemusí byť povinné. Napr.
<presenter post>[/<action=show>]/<id>/<title> funguje. A jediný dôvod prečo sa do tejto routy netriafajú ostatné presentry(u ktorých dajme tomu to show chcem mať) je to post v presentery.
Takže tak isto by mali fungovať aj submoduly. Ja stále tam tú bodku nechápem.
Zkus si to. Pokud budeš předávat parametr, třeba id
, tak
budeš mit v adrese i tu defaultní (nepovinnou) akci show
. Ta se
nezobrazí jen pokud už za ní nic není.
- Čamo
- Člen | 798
Šaman:
No ja som to písal s tým, že to vyskúšané mám a funguje to tak. Tak som
to aj napísal.
Toto je adresa post/show/id/title a show tam ako vidíš nieje.
Ale fakt nechápem ako že toto všetci obhajujete. Adresa s bodkou miesto
lomítka nieje ani cool, ani seo friendly, ani user friendly URL.
By ma zaujímalo vysvetlenie Davida Grudla. Ten zrejme jediný rozumie o čo tu
ide. Cool URL a toto sa proste nedá spojiť dohromady. A dosť ma to mrzí,
lebo mám skoro až absťák bez toho routovania.
Editoval Čamo (26. 6. 2014 22:13)
- David Matějka
- Moderator | 6445
To, ze tobe to funguje v jednom konkretnim pripade spravne, neznamena, ze to
bude fungovat spravne vsude. Tecka je tam proste defaultne, aby se predeslo
problemum s nejednoznacnosti.
Pokud ti tohle chovani nevyhovuje, napis si filtr pro ten parametr. Nevim, co na
tom dal resis.
Editoval matej21 (26. 6. 2014 22:23)
- David Matějka
- Moderator | 6445
Ta tecka je soucasti parametru. Implicitne se o prevod z „teckoveho a
pomlckoveho tvaru“ (tedy nazev-modulu.nazev-submodulu
) na
„presenterovy tvar“ (tedy NazevModulu:NazevSubmodulu
) stara tahle
metoda, ktera je tam registrovana jako filtr. Pro opacny smer pri vytvareni url
pak tahle
metoda. Pokud tedy vymenis filtry v obou smerech, aby misto tecky pracovaly
s pomlckou (+ povilis v patternu modulu pomlcku a zajistis, aby nedochazelo
k nejednoznacnym url), tak ti to bude fungovat
Editoval matej21 (26. 6. 2014 22:28)
- David Matějka
- Moderator | 6445
ne, jen si napises vlastni filtr
new Route("<module>", array(
"module" => array(
Route::FILTER_IN => function($value) {
...
},
Route::FILTER_OUT => function($value) {
...
},
Route::PATTERN => ...
),
));
- Čamo
- Člen | 798
Tak ešte som to neskúšal, len som mal taký nápad, že ak je problém
s interpretovaním všeobecného pravidla, tak by mohlo pomôcť upresniť
regulárnym výrazom presenter
<module>/<presenter nieco|niecoine>. No a naozaj sa bodka zmenila na
lomítko. Len zase mi z adresy :Blog:In:Drom20:default vygenerovalo
in/drom20/default bez toho Blog. A tiež by to znamenalo, že všetky
presentery v module musia byť explicitne určené v tom regulárnom výraze,
čo je nepraktické.
Tak teraz idem na ten filter…
Editoval Čamo (27. 6. 2014 9:41)
- Čamo
- Člen | 798
matej21:
Tak nakoniec som niečo pozliepal a funguje to. Len neviem aké to môže mať
prípadne nežiadúce následky. Môžeš sa na to pozrieť? A nepochopil som
to Route::PATTERN ⇒ … čo to znamená:
$router[] = new Route('<module .+>/<presenter>/<action>',
array('module' => array(
Route::FILTER_IN => function($s)
{
$s = strtolower($s);
/*$s = preg_replace('#([.-])(?=[a-z])#', '$1 ', $s); */
$s = ucwords($s);
/*$s = str_replace('. ', ':', $s);
$s = str_replace('- ', '', $s);
return $s; */
return strtr($s, '/', ':');
},
ROUTE::FILTER_OUT => function($s)
{
$s = strtr($s, ':', '/');
/*$s = preg_replace('#([^.])(?=[A-Z])#', '$1-', $s); */
$s = strtolower($s);
$s = rawurlencode($s);
$s = strtr($s, array('%2F' => '/'));
return $s;
/*strtr($s, '.', '/'); */
}
)
)
);
Editoval Čamo (27. 6. 2014 12:38)