Přechod z vlastního frameworku na Nette

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

Mám následující dotaz. Ale ještě než ho položím, tak bych chtěl říct že za dobu (cca. 1.5 roku) co jsem naposledy zkoušel Nette udělal David velkej kus práce. A myslím si že nastal čas abych svůj e-shop postavil právě na Nette a dibi.

Moje dosavadní řešení je na mém vlastním mini frameworku, kde je nevýhodou to že postupem času se ukazuje, že navrhnout dobrý framework je docela záhul. Můj framework je postavený tak, že lze na projektu může dělat několik lidí, aplikaci lze rozšířit o další funkci v podobě modulu, nebo lze vytvořit zcela jinou a třeba použít již stávající moduly bez úprav nebo s úpravami, které si přeje zákazník. Právě proto se rozhoduji nad Nette.

Můj framework funguje následovně:

Samotná aplikace pokud nemá v adresáři Modules žádný modul neprovede nic. Ale pokud se tam nějaký modul nachází, tak ho spustí. Když je tam více modulu, tak se spustí ten co byl jako první nalezený a nebo lze určit v konfigu, který se má spustit jako první. Pokud ten co není v konfigu spustí se ten co byl první nalezený.

Takže dost zamotané, že? A aby toho nebylo moc tak všechny moduly mají společnou šablonu. Ale také jí mít nemusí pokud neobsahují ve svém template @layout.phtm. V Nette @lauout.phtm. Kde je klasická html struktura. Ve stylu:

<html>
<head>
	<title></title>
</head>
<body>
	{moduleList} // Zde se vypíše seznam modulu, může se nastylovat jako CSS menu
	{moduleBody} // Zde se vypíše GUI modulu
</body>
</html>

Seznam modulu může vypadat následovně:

  • Katalog
    • Kategorie
    • Produkty
    • Výrobce
  • Prodej
    • Objednávky
    • Zákazníci

A teď přejdu ke struktuře mé stávající aplikace tak jak by asi měla vypadat v Nette:

.application
	.app
		.log
		.temp
		bootstrap.php
		config.ini
	.modules
		.catalogueModule
			.categoryModule
				.presenters
				.model
				.templates
			.productModule
				.presenters
				.model
				.templates
			.manufacturerModule
				.presenters
				.model
				.templates
			.presenters
			.model
			.templates
		.saleModule
			.orders
				.presenters
				.model
				.templates
				.customers
			.customers
				.presenters
				.model
				.templates
				.customers
			.presenters
			.model
			.templates
	.presenters
	.templates
		@layout.phtm (základní šablona společná pro všechny moduly)
.libs
	.nette
	.dibi
.styles
	.images
	favicon.ico
	style.css
.htaccess
index.php
robot.txt

Šílený že? Ale pokud prostě smažu nějaký modul tak aplikace běží dále bez něj. Tedy pokud není na něm závislí jiný modul. Jediná závislost modul může být třeba na modulu loginModul. V případě že některý modul chce aby byl uživatel přihlášený kontroluje to přes tento modul a když není tak se prostě zobrazí login dialog přes hlavní šablonu a nebo přes @layout.phtm v template loginModul. V opačném případě se zobrazí rozhraní daného modulu a do buď přes hlavni @layout.phtm a nebo přes svůj pokud se nachází v daném modulu v template @layout.phtm Závislost mezi moduly se dědí. Takže moduly závislé na loginModule dědí jeho presenter.

Samozřejmě že pak můžu udělat to že pro FRONT-END použiju model z BACK-END a nebo napíšu vlastní třeba z důvodu že všechny BACK-END moduly smažu a zbavím tak e-shop administrace.

Doufám, že jste můj popis pochopily. Mě zajímá zda toto řešení mohu přenést na Nette a nebo zda budu muset předělat celou architekturu.

Předem dík za odpovědi.

PS: Sorry, že je popis tak strohy ale celý systém je poměrně dost strukturovaný což už nemusí zajímat programátora modul. Ten se soustředí jen na výstup a obsluhu událostí. Případně pokud budete mít nějaké dotazy či si myslíte, že je tam nějaká chyba která v budoucnu může dělat potíže tak se neváhejte ozvat.

Ani
Člen | 226
+
0
-

Předělat to určitě jde.

Tu strukturu máš možná zbytečně složitou, ale můžeš to udělat jak chceš.

.modules
         .catalogueModule
                 .presenters
				CategoryPresenter
				ProductPresenter
				ManufacturerPresenter
                 .model
                 .templates
         .saleModule
webdata
Člen | 153
+
0
-

jj, dik, ale i když je ta struktura možná složita. Tak třeba v případě že zákazník nemá potřebu zadávat vyrobce tak jednoduše smažu celý adresář ManufacturerModule. Tím pádem se nikde nezobrazí žádná zmínka o výrobci, to znamená že nebude žádný listbox u produktu. Protože ten listbox se přidává z manufacturerModule.

Jednoduše řečeno. Mam nějaký dialog (např. vlastnosti zboží) kde bych potřeboval mít třeba konkurenční cenu z jiného obchodu. Tak buď vlezu do zdroje a dopisu to tam, a do tabulky v db přidám sloupec. A nebo napíšu modulplugin, který my do formuláře u zboží doplní patřičné pole a po odeslaní se vše obslouží v presenteru pro modul konkurenční cena tak i pro modul výrobek.

Takže mám pořád ZAKLADNI verzi shopu a požadavky na míru se řeší rozšířením modulu. Ještě přesněji můj dosavadní „framework“ je spíše správce modulu a jejich rozšíření, a stara se o jejich komunikaci.

A perlička která je už jen fakt jen jako bonusovka je že modul může obsahovat modulu, kde je další modul, a ten modul obsahuje rozšíření modulu dalšího rozšíření modulu. Ale to už je fakt hardcore které nepoužívám ale je možné to tak udělat.

Ani
Člen | 226
+
0
-

Tak to pak jo. Jinak to v nette půjde i ta složitější varianta. Načítání modulů v nette není nijak řešené a máš volnou ruku.

https://forum.nette.org/…ura-a-moduly?… (asi nejvíce odkazovaný příspěvěk) :)

webdata
Člen | 153
+
0
-

Dík za info. Případný úspěch budu publikovat jako skeleton + nějakou základní aplikaci (musím to stejně na něčem ladit a dělat rovnou celou aplikaci nemá cenu), zde na foru. Podle zatím pročtené dokumentace Nette hodně práce udělá netterobot a generovaní formulářů můj framework taky neumí tím pádem se zpřehlední i šablony, tedy pokud jsem dobře pochopil nový šablonovací systém. A podle dokumentace mě sice nutí Nette dodržovat nějakou štábní kulturu ale zároveň my davá volnou ruku udělat si to podle svého což může být někdy do budoucna rozšiřitelnosti pro mne na škodu. Takže už to jen celé dobře navrhnout.