Prečo mám v adrese do submodulu bodku?

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

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
+
+1
-

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

Šaman
Člen | 2659
+
+5
-

Offtopic: Nevím, proč někdo dislajkuje otázku. Ještě kdyby to tak byla nějaká stále omílaná, na kterou tu je 1001× odpovězeno, ale takhle? No nic, $offtopic->terminate();

Čamo
Člen | 798
+
0
-

matej21:
To sa mi nezdá ako čisté riešenie. Toto by malo fungovať bez pomocných funkcií. Ale díky.
Ja stále dúfam, že ma Nette teraz nesklame.

PS: Kde nájdem metódu link, ktorá je predpokladám zodpovedná, za vytváranie odkazov?

Editoval Čamo (25. 6. 2014 21:35)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Č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
+
-7
-

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
+
0
-

@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
+
0
-

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
+
0
-

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)

Šaman
Člen | 2659
+
0
-

Pokud máš parametry, je všechno předtím povinné. Takže třeba Front/Homepage/default/1. U modulů to neplatí, adresa se snaží zkrátit. Takže tvoje řešeni by mohlo fungovat, jen pokud by adresa měla pevný, nezkrátitelný tvar Module1/Module2/Presenter/Action.

Čamo
Člen | 798
+
0
-

Š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
+
0
-

Č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
+
-2
-

Š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
+
0
-

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)

Čamo
Člen | 798
+
0
-

Taký filter neviem napísať. Spracovať parameter viem, ale tá bodka je oddelovač nieje súčasťou parametra, či nie?

David Matějka
Moderator | 6445
+
0
-

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)

Čamo
Člen | 798
+
-1
-

To ale nehovoríš o filterin a filterout filtrovaní. Chceš aby som zasahoval do zdrojáku ak to dobre chápem.

David Matějka
Moderator | 6445
+
+2
-

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
+
0
-

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
+
0
-

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)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Čamo: Dokumentaci jsi četl? Route::PATTERN je tam vysvětlený.

Čamo
Člen | 798
+
0
-

Routovanie som čítal asi 4×. Ale PATERN je tam len spomenutý ak sa nemýlim.

Edit:
Aha tak to je ten regulár čo mám v tagu <module .+>.

Editoval Čamo (27. 6. 2014 15:22)