Podpora modulů (a změny v rev. 14)
- David Grudl
- Nette Core | 8220
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 | 8220
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 | 8220
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 | 8220
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_root
ně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 | 8220
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_root
není závislá například nějaká část Nette.
Nene.
- David Grudl
- Nette Core | 8220
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 | 8220
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 | 8220
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 | 8220
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 | 8220
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 | 8220
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 | 8220
phx napsal(a):
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?
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)