Podpora modulů (a změny v rev. 14)

- David Grudl
- Nette Core | 8285
Počínaje revizí 14 funguje podpora modulů.
Do SVN jsem přidal Nette\Application a také adresář examples, kde najdete i příklad modules-usage s příkladem použití modulů.
Třída Route doznala větších změn. Podstatná je úprava, kterou navrhl Michal
Krause. Pokud máte někde v definici rout uvedenou výchozí hodnotu
'action' => NULL, změňte ji prosím na
'action' => 'default'.
Dále je možné specifikovat parametr module, který funguje
jako prefix pro název presenteru:
$route = new Route('<presenter>', array(
'module' => 'Module:Submodule',
));
// url /Catalog/ -> Module:Submodule:Catalog
Jak to vypadá se strukturou adresářů? Tak je v Nette samozřejmě totálně konfigurovatelná a jako výchozí jsem zkusil následující:
presenters/
DefaultPresenter.php
AdminModule/
DefaultPresenter.php (Admin:Default)
FrontModule/
DefaultPresenter.php (Front:Default)
Tedy moduly tvoří adresáře. V případě šablon je to maličko složitější. Tady se asi nevyhneme nějaké restrukturalizaci:
templates/
layout.phtml
Default/ (Default presenter)
@layout.phtml (layout for Default presenter)
default.phtml (default view)
add.phtml (add view)
AdminModule/
Default/ (Admin:Default presenter)
add.phtml (Admin:Default:add view)
Default.add.phtml (alternativa Admin:Default:add view)
FrontModule/
layout.phtml
Default/ (Front:Default presenter)
...
Do třídy Presenter jsem přidal nové metody
formatLayoutTemplateFiles($presenter) a
formatTemplateFiles($presenter, $view), kde je přehledně vidět,
jak se šablony dohledávají. Jestli tuto strukturu použít nebo upravit
nechávám k diskusi.
Problém, o kterém vím, se týká velkých a malých písmenek v cestách šablon.
Ještě odkazování mezi presentery a moduly: v podstatě každý odkaz je
tvořen relativně vůči aktuálnímu modulu, absolutní odkazy začínají
dvojtečkou. Příklad: v modulu Module je
link('Presenter:add')→ Module:Presenter:addlink('Submodule:Presenter:view')→ Module:Submodule:Presenter:viewlink(':AnotherModule:Presenter:')→ AnotherModule:Presenter:default

- David Grudl
- Nette Core | 8285
Na čem teď pracuju
- handlování výjimek mezi Presenterem a Application
- AJAX a formuláře

- ViliamKopecky
- Nette hipster | 230
Teoreticky by už nevadilo u templates stejnou (…podobnou) strukturu. Tím
mám na mysli, že u presenterů je modul označen jenom Admin/,
kdežto u templates je tam AdminModule/. Myslim, že kdyby bylo
obojí bez slovíčka Module, tak to bude lepší a nemělo by to
dělat problémy. Hm?

- phx
- Člen | 651
On pak je problme ze se ti michaji dva stromy do sebe.
- admin:default (admin jako presenter s pohledy default)
- admin:vypis:tabulka (admin jako modul a v tom vypis jako presenter s pohledem tabulka)
Proste by se tam michaly v adresari admin *.phtml soubory jako pohledy pro presenter Admin a adresare jako presentery pro modul Admin. Ale je to extrem pojmenovavat presenter a modul stejne, ale stat se to muze

- ViliamKopecky
- Nette hipster | 230
No, ale myslel jsem, že presentery by se zapisovali celé (tedy např
AdminPresenter)
jednoduše:
presenters/
DefaultPresenter.php
Admin/
DefaultPresenter.php
templates/
DefaultPresenter/
Admin/
layout.phtml
DefaultPresenter/
view.phtml

- David Grudl
- Nette Core | 8285
enoice napsal(a):
Teoreticky by už nevadilo u templates stejnou (…podobnou) strukturu. Tím mám na mysli, že u presenterů je modul označen jenom
Admin/, kdežto u templates je tamAdminModule/. Myslim, že kdyby bylo obojí bez slovíčkaModule, tak to bude lepší a nemělo by to dělat problémy. Hm?
S jednotnou strukturou souhlasím, ale nebude spíš lepší v adresáři
presenterů používat AdminModule namísto Admin?
Z důvodu dopředné kompatibility – třeba jednou se bude hodit vytvářet
nějaké další podadresáře i tady.

- ViliamKopecky
- Nette hipster | 230
S jednotnou strukturou souhlasím, ale nebude spíš lepší v adresáři presenterů používat AdminModule namísto Admin? Z důvodu dopředné kompatibility – třeba jednou se bude hodit vytvářet nějaké další podadresáře i tady.
Ano, to je pravda.
Ke komponentám asi taky. Ikdyž nevim jakou má Nette logiku pro komponenty (opravdu by se hodil nějaký quick-component-tutorial :), ale komponenty asi budou patřit do jednotlivých modulů.
Ještě trošku mimo ke struktuře:
Má název document_root/ nějaký význam? Já místo toho
používám www/, document_root se mi zdá zbytečně dlouhý,
vedle kratičkých libs/ a app/ mi www/
připadá, když nic jiného, tak estetické. Ale jestli má
document_root nějaký smysl, tak se rád poučím.

- David Grudl
- Nette Core | 8285
enoice napsal(a):
Ještě trošku mimo ke struktuře:
Má název
document_root/nějaký význam? Já místo toho používámwww/, document_root se mi zdá zbytečně dlouhý, vedle kratičkýchlibs/aapp/miwww/připadá, když nic jiného, tak estetické. Ale jestli mádocument_rootnějaký smysl, tak se rád poučím.
Myslíš v příkladech? Document Root je terminus technicus Apache, tudíž jsem
volil srozumitelnost, ačkoliv ve vlastních projektech ho nepoužívám
(obvykle to bývá název subdomény, tudíž třeba www).
ad Admin → AdminModule: tu změnu v kódu udělám.

- ViliamKopecky
- Nette hipster | 230
Jo, Apache mě napadnul, takže je to teda čistě kosmetická záležitost?
Myslel jsem, jestli na tom názvu document_root není závislá
například nějaká část Nette.

- David Grudl
- Nette Core | 8285
enoice napsal(a):
Jo, Apache mě napadnul, takže je to teda čistě kosmetická záležitost? Myslel jsem, jestli na tom názvu
document_rootnení závislá například nějaká část Nette.
Nene.

- David Grudl
- Nette Core | 8285
Aktualizoval jsem adresářovou strukturu v prvním postu. Je to takle lepší?
Navíc se tam skrývá řešení problému
s layoutem pro jeden presenter – prefixoval by se znakem @.

- David Grudl
- Nette Core | 8285
phx napsal(a):
Ja osobne bych drzel maximalen stejne pojmenovani. Tz kdyz mam tridu BagrPresenter tak at si nacita sablony z BagrPresenter. Pokud mam modul Admin tak at si nacita z adresare Admin. To slovo modul mi tam prijde zbytecne.
To je dobrý argument, ale ber v úvahu, že presenter se jmenuje jen
Bagr. To jen výchozí PresenterFactory za něj přilepí slovo
Presenter – v odkazech a URL je to stále Bagr.

- David Grudl
- Nette Core | 8285
Ano, stačí změnit příslušné metody formatXYZ() ve třídě Presenter nebo PresenterFactory.

- paranoiq
- Člen | 392
myslím, že problém Default presenter vs Default modul není tak ožehavý. buďto bych ho ignoroval (kdo chce modul pojemnovaný „Default“, ten má smůlu), nebo bych jej řešil stejně jako u @layout.phtml – zavináčem před název souboru v presenters a před název adresáře v templates
osobně bych preferoval minimální přístup:
presenters/
[@]default.php
admin/
default.php (Admin:Default)
front/
default.php (Front:Default)
templates/
layout.phtml
[@]default/ (Default presenter)
@layout.phtml (layout for Default presenter)
default.phtml (default view)
add.phtml (add view)
admin/
default/ (Admin:Default presenter)
add.phtml (Admin:Default:add view)
default.add.phtml (alternativa Admin:Default:add view)
front/
layout.phtml
default/ (Front:Default presenter)

- David Grudl
- Nette Core | 8285
paranoiq napsal(a):
myslím, že problém Default presenter vs Default modul není tak ožehavý. buďto bych ho ignoroval
:-)) tak to skutečně nelze.

- David Grudl
- Nette Core | 8285
Tady jde jednak o to, že člověk se musí v adresářích vyznat a ne dumat, co je modul a co presenter, za druhé nevytvářet zcela zbytečné omezení pro jména modulů a presenterů a za třetí nezpůsobit bezpečnostní chybu, kdy mi někdo podstrčí jako presenter název modulu a dopadne to třeba špatně.

- LM
- Člen | 206
Jak použít moduly se SimpleRoutrem? Předpokládal bych že když v příkladu s moduly nahradím rewrite routy za:
$router[] = new SimpleRouter(array(
'module' => 'Front',
'presenter' => 'Default',
));
bude to fungovat, ale nedokáže to vytvořit odkaz na cokoliv v admin modulu (a ani ho převést na request).
edit. aha takže asi spíš takhle:
$router[] = new SimpleRouter(array(
'presenter' => 'Front:Default',
));
Editoval LM (18. 6. 2008 15:44)

- phx
- Člen | 651
Mohl by mi nekdo vice osvetlit vyznam @?
Chapu, ze u @layout.phtml je to kuli odliseni view od layoutu,
ale jaky ma vyznam u view ci u presenteru?
Ha pockat… neni to proto, ze diky @ nelze podvrhnout v URL a nacist dany soubor?
Ale ZDE paranoiq uvadi @ pred adresarem presenteru. Jaky to ma vyznam?

- David Grudl
- Nette Core | 8285
LM napsal(a):
Jak použít moduly se SimpleRoutrem? Předpokládal bych že když v příkladu s moduly nahradím rewrite routy za:
$router[] = new SimpleRouter(array( 'module' => 'Front', 'presenter' => 'Default', ));bude to fungovat, ale nedokáže to vytvořit odkaz na cokoliv v admin modulu (a ani ho převést na request).
edit. aha takže asi spíš takhle:
$router[] = new SimpleRouter(array( 'presenter' => 'Front:Default', ));
Přesně tak. Parametr Module slouží jako povinný prefix, aby se dal omezit prostor, kam se SimpleRouterem uživatel může dostat. Z pole výchozích hodnot se vyřízne. Nejsem si jist, jestli to není trošku zavádějící, váhal jsem nad tím dát modul jako další parameter.

- David Grudl
- Nette Core | 8285
phx napsal(a):
Mohl by mi nekdo vice osvetlit vyznam @?
Chapu, ze u
@layout.phtmlje to kuli odliseni view od layoutu, ale jaky ma vyznam u view ci u presenteru?Ha pockat… neni to proto, ze diky @ nelze podvrhnout v URL a nacist dany soubor?
Presne tak. Soubory prefixované znakem @ nelze podstrčit jako view, tedy mohou být ve stejné složce se šablonami views. Lze to použít i pro „podšablony“, které se do jiných šablon inkludují (viz akrabat).
layout.phtml v adresáři modulu (tedy nikoliv v adresáři
presenteru) teoreticky mít prefix nemusí, protože tam je v bezpečí, ale
v důvodu konzistentního pojmenování bych ho doporučil používat
i tam.
Ale ZDE paranoiq uvadi @ pred adresarem presenteru. Jaky to ma vyznam?
Takovou strukturu paranoiq navrhoval, Nette ji však nepoužívá.

- Jod
- Člen | 701
Ahoj, neviem ako mám nastaviť templatesDir, či niečo iné, keď chcem
mať ukladanie pohromade ako je v dokumentácií.
variable.templatesDir = %appDir%/presenters v config mi nefunguje
konkrétne vloženie layoutu presenters/AdminModule/templates/. Zato
o adresáre vyššie v presenters/@layout.phtml. alebo
o adresár nižšie
v presenters/AdminModule/templates/nejaky_presenter/@layout.phtml
ide.
Pozeral som sa aj do Presenter::formatLayoutTemplateFiles(), ale
ani jedna z vrátených ciest mi k tomu nepasuje.
Ďík =)
Editoval Jod (2. 10. 2008 1:48)

- Jan Tvrdík
- Nette guru | 2595
Reakce na revizi 75:
To že nefunguje cesta templates/MyModule/@layout.phtml je
záměr?
Konkrétně jde o řádek 522 a řádky mu předcházející.
Editoval Jan Tvrdík (3. 10. 2008 18:01)