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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8220
+
0
-

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:add
  • link('Submodule:Presenter:view') → Module:Submodule:Presenter:view
  • link(':AnotherModule:Presenter:') → AnotherModule:Presenter:default
David Grudl
Nette Core | 8220
+
0
-

Na čem teď pracuju

  1. handlování výjimek mezi Presenterem a Application
  2. AJAX a formuláře
ViliamKopecky
Nette hipster | 230
+
0
-

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

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

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
LM
Člen | 206
+
0
-

Tahle struktura šablon možná bude lepší i pro šablony komponent, nebo je umísťujete jinam?

David Grudl
Nette Core | 8220
+
0
-

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 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?

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

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

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á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.

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

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

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

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 @.

ViliamKopecky
Nette hipster | 230
+
0
-

Zavináč je dobrej :)

phx
Člen | 651
+
0
-

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.

David Grudl
Nette Core | 8220
+
0
-

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.

phx
Člen | 651
+
0
-

Mozna by stalo tuto celou logiku implementovat v nejake jedne tride a kdyz se to nekomu nebude libit tak at si ji predela (podedi a upravi). At si tam misto Presenter prilepi treba Zobrazovac.

David Grudl
Nette Core | 8220
+
0
-

Ano, stačí změnit příslušné metody formatXYZ() ve třídě Presenter nebo PresenterFactory.

paranoiq
Člen | 392
+
0
-

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)
paranoiq
Člen | 392
+
0
-

David Grudl napsal(a):

Ano, stačí změnit příslušné metody formatXYZ() ve třídě Presenter nebo PresenterFactory.

super. to mi také uniklo. díky

David Grudl
Nette Core | 8220
+
0
-

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.

paranoiq
Člen | 392
+
0
-

tím bylo myšleno, že jméno „Default“ by bylo v rámci modulů jméno zakázané (či rezervované). z mého uživatelského hlediska je to vyhovující řešení. z tvého pohledu bych to asi viděl jinak. jistě se dříve nebo později najde někdo, kdo bude takové jméno modulu požadovat..

David Grudl
Nette Core | 8220
+
0
-

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

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

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

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

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

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)

David Grudl
Nette Core | 8220
+
0
-

je tam chybka, opravím

Jan Tvrdík
Nette guru | 2595
+
0
-

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)

David Grudl
Nette Core | 8220
+
0
-

to je bug – opraveno