Adresářová struktura v řešení modul – submodul
- akadlec
- Člen | 1326
Je tady už asi poměrně dost topiců na téma adresářů ale nepodařilo se mi najít takové co by popisovalo můj problém.
Přepisuju jednu aplikaci co je na vlastním FW na Nette a nevím jak přesně řešit adresáře a následně rozdělení presenterů atd.
Původně to bylo nějak takto:
application/
libraries/
modules/
admin/
modulclanky
modulmenu
.....
front/
modulclanky
modulmenu
.....
api/
global/
modulclanky
modulmenu
.....
templates
tema1/
tema2/
...
systemoveTema/
aplikace byla rozdělena na jednotlivá rozhraní admin/front/api a každé rozhraní má vlastní sadu modulů. některé jsou napříč všemi a některé jsou jen pro dané rozhraní. Všechny ale pak dědí své moduly co jsou v global.
V nette to zkouším nějak takto:
app/
admin/
config/
..neony
modules/
modulclanky
presenters
templates
modulmenu
presenters
templates
.....
presenters
.....base presenter a dalsi globalni presentery
templates
@layout.latte
front/
config/
..neony
modules/
modulclanky
presenters
templates
modulmenu
presenters
templates
.....
libraries/
...nette a další knihovny
Je to krok správným směrem?
- duskohu
- Člen | 778
Nie je to komplikacia mat kazdy modul niekde inde? Ja osobne pouzivam v app:
presenters
.....base presenter a dalsi globalni presentery
templates
@layout.latte
config
config.neon - pre celu app
DefaultModule
-FrontModule
-config
-presenters
-templates
-models
-....
-AdminModule
-config
-presenters
-templates
-models
-....
ArticleModule
-FrontModule
-config
-presenters
-templates
-models
-....
-AdminModule
-config
-presenters
-templates
-models
-....
- duskohu
- Člen | 778
Base Presenter
namespace Nas; (Nas - nazov aplikace)
Este som zabudol ze kazdy modul ma DefaultModulePresenter od ktoreho dedia
presentre v front a admin module
@EDIT DefaultModulePresenter extends
\Nas\BasePresenter
DefaultModule
-presenters
-DefaultModulePresenter >> pre modul DefaultModule
-FrontModule
-config
-presenters
-templates
-models
-....
-AdminModule
-config
-presenters
-UserPresenter extends \Nas\DefaultModule\DefaultModulePresenter
-templates
-models
-....
DefaultModulePresenter :
namespace Nas\DefaultModule;
a nasledne presentri front a admin modulu
namespace Nas\DefaultModule\AdminModule;
namespace Nas\DefaultModule\FrontModule;
Editoval duskohu (13. 2. 2013 10:35)
- duskohu
- Člen | 778
A ked chces pouzivat rozne theme, tak ja som si template vyclenil do app
app
templates
-MyTheme1
DefaultModule
AdminModule
User
default.latte
edit.latte
FrontModule
@layout-formy-theme-1.latte
Napisal som si themeLoader, a ked zmenim temu tak vsetky sabloni hlada v danej teme
- akadlec
- Člen | 1326
Supr, takže jsem to nasadil podle tvého vzoru, libí se mi to, jen jsem tedy jednotlivé moduly združil pod adresář modules aby to bylo „čistější“ ;)
jen mě vrtají hlavou ty namespaces. Když jsem je vytvořil podle tebe:
namespace Nas\DefaultModule\AdminModule;
Tak mě to při url: admin.example.com/prefix/cs/home/sign/is – admin modul, home modul, sign presenter řve že nemůže nalézt Nas\AdminModule\HomeModule\SignPresenter
Upravoval sis tedy skládání názvu presenteru? Nebo máš naopak skladbu url? tedy prvně „submodul“ a pak „modul“ ?
Já si to zatím tedy vyřešil změnou namespace na:
namespace Nas\AdminModule\DefaultModule;
což by snad nemělo ničemu vadit, i při pozdějším rozšíření.
Editoval akadlec (14. 2. 2013 10:55)
- duskohu
- Člen | 778
[BasePresenter pre celu aplikaciu]
namespace Nas;
BasePresenter extends \Nette\Application\UI\Presenter
[Presenter pre modul DefaultModule]
namespace Nas\DefaultModule;
DefaultModulePresenter extends \Nas\BasePresenter
[AdminModule]
namespace Nas\DefaultModule\AdminModule;
DefaultPresenter extends \Nas\DefaultModule\DefaultModulePresenter
[FrontModule]
namespace Nas\DefaultModule\FrontModule;
DefaultPresenter extends \Nas\DefaultModule\DefaultModulePresenter
Potom si musis v neone urcit mapping:
nette:
application:
mapping:
*: Nas\*Module\*Presenter
A url mam riesenu pomocou routra tak ze mam:
www.mojawebka.sk/ >> smeruje na DeFaultModule/FrontModule/DefaultPredenter
www.mojawebka.sk/admin/ >> smeruje na DeFaultModule/AdminModule/DefaultPredenter
www.mojawebka.sk/forum/ >> smeruje na ForumModule/FrontModule/DefaultPredenter
www.mojawebka.sk/admin/forum/ >> smeruje na ForumModule/AdminModule/DefaultPredenter
ukazka:
$router = new RouteList();
$router[] = new Route('index.php', 'Default:Front:Default:default', Route::ONE_WAY);
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
'module' => 'Default:Admin',
'presenter' => 'Default',
'action' => 'default',
));
$router[] = new Route('<presenter>/<action>[/<id>]', array(
'module' => 'Default:Front',
'presenter' => 'Default',
'action' => 'default',
));
EDIT: Ja nepouzivam HomePresenter, ale DefaultPresenter a
v route si to prestavim
EDIT2
namespace Nas\AdminModule\DefaultModule;
// je blbost porusis zabelenie do Modulu. Vsak predca Mas Modul a submodul, nie submodul a potom modul.
Editoval duskohu (14. 2. 2013 13:56)
- bene
- Člen | 82
Pokud máš:
DefaultModule
- FrontModule
- AdminModule
ArticleModule
- FrontModule
- AdminModule
Jak v tomto případě řešíš ošetření uživatele v
AdminModule
. To v každém AdminModule
máš
SecurePresenter
, kde ošetříš přihlášeného uživatele a od
tohoto SecurePresenter
dědíš ostatní Presentery
v
AdminModule
?
V případě:
FrontModule
- DefaultModule
- ArticleModule
AdminModule
- DefaultModule
- ArticleModule
- SecurePresenter
To budeš řešit jen v jednom SecurePresenter
.
Editoval bene (15. 2. 2013 11:38)
- duskohu
- Člen | 778
Mas SecuredPresenter ktory je predkom pre vsetky dalsie presentre, tym padom tu bude cela logika.
abstract class BasePresenter extends Nette\Application\UI\Presenter
abstract class SecuredPresenter extends \BasePresenter
//a napriklad v DefaultModule
abstract class DefaultModulePresenter extends \SecuredPresenter
//DefaultModule >> FrontModule
class DefaultPresenter extends \DefaultModulePresenter
Nezabudni si spravne nastavit Namespace ;-)
Editoval duskohu (15. 2. 2013 11:58)
- bene
- Člen | 82
@duskohu: Proč by FrontModule měl mít stejný SecurePresenter jako AdminModule? Leda by jsi na FrontModule musel být přihlášený a mít oprávnění admina. Pak mi ale FrontModule nedává smysl. Pokud to tak není, tak musíš v každém XyzModule\AdminModule mít Base/SecurePresenter, který by ošetřoval oprávnění přístupu do AdminModule a všechny Presentery v AdminModule dědit od něj.
Z tvé logiky chápu:
- Nette\Application\UI\Presenter
- BaseBresenter
- SecuredPresenter
- DefaultModule\DefaultModulePresenter
- DefaultModule\FrontModule\DefaultPresenter
- DefaultModule\AdminModule\DefaultPresenter
- ArticleModule\DefaultModulePresenter
- ArticleModule\FrontModule\DefaultPresenter
- ArticleModule\AdminModule\DefaultPresenter
Zvážil bych:
- Nette\Application\UI\Presenter
- BaseBresenter
- AdminModule\SecurePresenter // zde probiha osetreni opravneni pristupu do AdminModule
- AdminModule\DefaultModule\DefaultPresenter
- AdminModule\ArticleModule\DefaultPresenter
- FrontModule\BasePresenter
- FrontModule\DefaultModule\DefaultPresenter
- FrontModule\ArticleModule\DefaultPresenter
Editoval bene (16. 2. 2013 17:07)
- duskohu
- Člen | 778
@bene Pochopil si dobre, Lenze ja mam len jeden SecuredPresenter na celu aplikaciu, logika je len jedna, a napr. ked mam aplikaciu ktora ma admina a front len pre prihlaseneho uzivatela, alebo niektory prezenter vo front potrebujem mat len pre prihlaseneho pouzivatela, tak to riesim stale len v jednom presentri, admin a fron modul neznamena ze ta cast aplikacie je pre prihlaseneho a neprihlaseneho uzivatela, ale admin = cast aplikacie kde sa spravuje aplikacia, front je bezna cast aplikacie pre pouzivatela, a pouzivatel nap ma kosik a ten je len pre prihlaseneho, nie je to administratorska zona.
- Nette\Application\UI\Presenter
- BaseBresenter
- SecuredPresenter
- DefaultModule\DefaultModulePresenter
- DefaultModule\FrontModule\DefaultPresenter
- DefaultModule\AdminModule\DefaultPresenter
- ArticleModule\DefaultModulePresenter
- ArticleModule\FrontModule\DefaultPresenter
- ArticleModule\AdminModule\DefaultPresenter
- akadlec
- Člen | 1326
Hoj, zkouším to teď ještě u druhého projektu a stále mě to cpe prvně default modul :(
v neonu:
nette:
application:
mapping:
*: SApp\SmartStart\*Module\*Presenter
v routeru:
// Setup router using mod_rewrite detection
$router = new RouteList;
// index.php defaul routing
$router[] = new Route('index.php', 'Default:Frontpage:Default:default', Route::ONE_WAY);
$router[] = new Route('//panel.smartstart.dev/<presenter>/<action>[/<id>]', array(
'module' => 'Default:Panel',
'presenter' => 'Default',
'action' => 'default',
));
$router[] = new Route('<presenter>/<action>[/<id>]', array(
'module' => 'Default:Frontpage',
'presenter' => 'Default',
'action' => 'default',
));
a pak zavolám url:
http://panel.smartstart.dh/forum/add
a nette řve že chce:
Cannot load presenter 'Default:Panel:Forum', class 'IPub\SmartStart\DefaultModule\PanelModule\ForumPresenter' was not found in xxxx
je to „čistá“ appka, nemá ještě presentery, componenty atd, prostě nic, jen bootstrap a definici rout. Je to na nette 2.1-dev
- duskohu
- Člen | 778
oki skus to takto, v podstate pre kazdy modul potrebujes routu.
// nastavenie default route
$router[] = new Route('index.php', 'Default:Front:Default:default', Route::ONE_WAY);
// admin forum
$router[] = new Route('admin/forum/<action>[/<id>]', array(
'module' => 'Forum:Admin',
'presenter' => 'Default',
'action' => 'default',
));
// front forum
$router[] = new Route('forum/<presenter>/<action>[/<id>]', array(
'module' => 'Forum:Front',
'presenter' => 'Default',
'action' => 'default',
));
// admin default
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
'module' => 'Default:Admin',
'presenter' => 'Default',
'action' => 'default',
));
// front default
$router[] = new Route('<presenter>/<action>[/<id>]', array(
'module' => 'Default:Front',
'presenter' => 'Default',
'action' => 'default',
));
- duskohu
- Člen | 778
Neviem preco by to nemalo byt koser, kolko modulov planujes mat? Predpokladam
ze ich nebude viac ako 5 v jednej aplikacii ja mam cca 3–4 a nezaznamenal
som problem s vykonom. Ja to zatial riesim takto, ale v buducnosti ked bude
cas si napisem svoj router.
EDIT Ma to vyhodu ze kazdy modul ma samoztatnu routu a vies tam
menit format url ako chces pre kazdy model.
Editoval duskohu (18. 2. 2013 22:06)
- akadlec
- Člen | 1326
Mno já jich právě více než 5 již mám a další se přidávají, navíc ten admin je rozdělený url a ty jsou k dispozici 4 takže je to ještě 4× vice rout :( samostatnou routu pro každý modul nepotřebuju, resp její tvar, všechny se budou generovat stejně. Jako pokud to nejde jinak tak to holt do toho routeru naházím separatně pro každý modul.
- webdata
- Člen | 153
Ahoj,
Libi se me rozdeleni aplikace od duskohu ale bohuzel mam stejnej problem jako akadlec. Moužívám verz 2.1-dev da se říct pře 2 dny stažena.
Už to někdo výřešil? Tohle bych bral asi jako samozřejmost. Pokud tedy nette nenutí nějak dodržovat adresařovou strukturu, tak předpokládám, že výše uvedená struktura od duskohu by neměla být problem a to same pokud bych všechny moduly chytnul a dal je do app/modules/.
Moje představa je že url:
neco.cz/admin/pages/ ← zobrazí přehled stránek
neco.cz/admin/pages/edit/25 ← edituje stranku s id 25
atd.
Predem dik za info.
- Jiří Nápravník
- Člen | 710
Neřešíte stejný problém jako jsem řešil já? 6e máte modul Forum/Admin a adresu chcete mít admin/forum/presenter/akce? Připadá mi, že ano (jen jsem to proletěl). Tak jestli jo, tak to jde řešit celkem rozumně přes filter a nemusím mít 50 „stejných“ rout. viz tady
- Jiří Nápravník
- Člen | 710
Je to kvůli myšlence, aby byly ty moduly co nejvíce samostatné a šli v podstatě copy-pastnout do nějaké další aplikace. Config je nejlepší pak načíst přes compiler extension, ostatně obecně je nejlepší aby měl každý modul svoji compiler extension
- fucikm
- Člen | 4
Jiří Nápravník napsal(a):
Je to kvůli myšlence, aby byly ty moduly co nejvíce samostatné a šli v podstatě copy-pastnout do nějaké další aplikace. Config je nejlepší pak načíst přes compiler extension, ostatně obecně je nejlepší aby měl každý modul svoji compiler extension
Takže, podle tebe, https://doc.nette.org/…n/extensions a http://filip-prochazka.com/…te-framework to chápu tak, že já si udělám modul, třeba ArticlesModule, budu v něm mít nějaký Presentery, Servisy, Entity, configy a třídu tý samotný ArticleExtension. Copy pastnu to do příslušný složky a do hlavního configu přidám jen
extensions:
articles: ArticleExtension
V tomhle případě ArticleExtension moc nechápu k čemu by mi ten config byl, ale kdyby to byla jen servisa jako třeba dibi, tak je to jasný. Jestli se pletu, tak prosím o doplnění.
Ještě bych chtěl poprosit o nakopnutí, jak na ten
ThemeLoader
.