Adresářová struktura v řešení modul – submodul

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

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

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
		-....
akadlec
Člen | 1326
+
0
-

hmm tvé řešení je na zváženou, je to v podstatě tak jak mám já, jen moduly jsou združené pod submoduly. Jak máš řešený namespace? \app\DefaultModule\AdminModule | \app\DefaultModule\FrontModule ?

duskohu
Člen | 778
+
0
-

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)

akadlec
Člen | 1326
+
0
-

Díky za tip, tohle řešení se mi líbí.

duskohu
Člen | 778
+
0
-

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

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

akadlec
Člen | 1326
+
0
-

hmm asi něco dělám blbě :( mapping v neonu mám ok, ten sem takhle měl i předtím. Když upravím router podle tvého příkladu tak na mě řve že nemůže najít presenter:

url: http://superstranka.tld/admin/forum/sign/in
hleda: Nas\DefaultModule\AdminModule\ForumPresenter
duskohu
Člen | 778
+
0
-

podla toho co pises mas zle router, Mas to isto takto? Vsini si ze module odkazuje na modul a submodul.

$router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
            'module' => 'Default:Admin',
akadlec
Člen | 1326
+
0
-

jj toho jsem si všil, v routru to tak mám, zkoušel jsem to nastavit celé podle tebe ale pořád mě tam cpe ten default modul a z modulu co je v url udělá presenter.

duskohu
Člen | 778
+
0
-

vies to niekde hodit napr. git? Popripade by som sa na to vedel pozriet.

bene
Člen | 82
+
0
-

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

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

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

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

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

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',
        ));
akadlec
Člen | 1326
+
0
-

A ty to takto řešíš? Protože to mi nepříjde moc košér, psát routu pro každý modul.

duskohu
Člen | 778
+
0
-

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

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.

duskohu
Člen | 778
+
0
-

No ako som pisal, je tu este cesta vlastneho routru. Ja osobne na to este cas nemam :-( mozno neskor.

webdata
Člen | 153
+
0
-

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.

akadlec
Člen | 1326
+
0
-

@webdata: no dá se říct že tak nějak to teď mám ;) každý modul má vlastní routu.

Jiří Nápravník
Člen | 710
+
0
-

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

fucikm
Člen | 4
+
0
-

Asi mi nedochází nějaká základní věc, ale k čemu je v každém modulu separátní config a jak ho Nette donutit načítat?

Jiří Nápravník
Člen | 710
+
0
-

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

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.

akadlec
Člen | 1326
+
0
-

normálně si v tom neodu nadefinuješ služby toho modulu, komponenty, parametry atd a pak jen stačí si to do nového projektu vložit jak si uvedl přes extension a je to, máš modul připraven k práci.