Vlastní CMS s moduly a routováním z DB

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

Zdravím,

zajímá mě zda má cenu (pokud někdo z vás uvažoval nad podobným řešením jako já) rozdělit CMS napsané v Nette na Moduly (pouze do složky app nakopíruji modul a v CMS jej nainstaluji a zaktivuji) nebo použít standardní Nette rozložení(při přidání nové funkčnosti musím přidat JS, CSS, Obrázky, latte atd do příslušných složek a ručně v db přidat tabulky a nastavení).

  • Nevím jak vyřešit JS(ajax) a CSS specifické pro modul (rád bych to měl vše ve složce daného modulu, ne v WWW)
  • Jakým způsobem přidávat „routy“ k danému modulu → chci z DB automaticky generovat aktivní moduly (cms-routy-best-practice)
  • Jak vyřešit permalink na články z DB (nechci mít nazevwebu/clanky/1/, ale nazevwebu/clanky/nazev_clanku/)
  • Jak řešit stránkování, sorting a ordering (přes session ? nebo je i lepší způsob přes COOL URL bez rovnítek a otazníků ?)

Pokud budu mít moduly, mám i lepší řízení rolí a jejich oprávnění (z DB). Moduly chci jednak kvůli jednoduché rozšiřitelnosti CMS, ale i pro lepší správu.

Venne CMS se dá stáhnou pouze přes composer a zatím jsem na něj nekoukal, hledám nějakou jednodušší variantu a zda se do toho vůbec pouštět, kdysi jsem se chtěl alespoň inspirovat Starší dotaz. Chci na to znát váš názor, zda se do toho vůbec pouštět a pokud ano, jak co řešit, na co dát bacha co nového z nete využít atd:.

Díky moc

Editoval Joacim (12. 1. 2016 13:21)

iguana007
Člen | 970
+
+1
-
  • Nevím jak vyřešit JS(ajax) a CSS specifické pro modul (rád bych to měl vše ve složce daného modulu, ne v WWW)

https://componette.org/search/?…

  • Jakým způsobem přidávat „routy“ k danému modulu → chci z DB automaticky generovat aktivní moduly (cms-routy-best-practice)

http://blog.jsifalda.name/…e-nette-rout

  • Jak vyřešit permalink na články z DB (nechci mít nazevwebu/clanky/1/, ale nazevwebu/clanky/nazev_clanku/)

Routerem, resilo se to tady uz 100×, hledej ;) https://forum.nette.org/…37-routovani

  • Jak řešit stránkování, sorting a ordering (přes session ? nebo je i lepší způsob přes COOL URL bez rovnítek a otazníků ?)

Na cool URL se uz moc nehraje, ale muzes to taky vyresit pomoci routeru, kde jeden z parametru bude aktualni stranka pagingu.

Joacim
Člen | 229
+
0
-

iguana007 napsal(a): . . . . .

Modulem jsem měl na mysli TOTO

Tzn: ve složce app budu mít např: modulRezervace (který bude obsahovat model presenter i templaty), přes Venne Moduly to jde asi taky, ale přijde mi to spíš jako nette moduly (extensions), asi jsem to špatně pochopil. Chci jen modul přes FTP nakopírovat a dál vše nastavovat pouze přes webové rozhraní. Tím nechci říci aby mě někdo poslal celé řešení, jen ukázat cestu nejschůdnější.

Co jsem hledal musím vždy někam něco dopsat (config.neon, extension.php atd:.)
Staticky si moduly umím přidat, teď hledám způsob, jak to udělat automatizovaně.

V app/ bych měl složku modules/ a při každém zapnutí aplikace by se prošly složky a zjistilo se zda tam není nová (přidán nový modul), v CMS bych měl odkaz moduly a tam bych viděl že je nový modul (našlo to složku, která obsahuje install.php a data název adresáře není schodný s názvy modulů v DB)

Editoval Joacim (12. 1. 2016 14:58)

akadlec
Člen | 1326
+
+1
-

Toto řeším u sebe v cms, co snad jednou spatří světlo světa jako os :D co modul to „složka“ kde má modul vše při ruce co potřebuje. Každý modul má svůj vlastní config (aktuálně to řeším přes neon, kdy se výstup z konfiguračního formu transformuje na soubor). To jaký modul je zapnutý a vypnutý je řízeno neonem. Na ty moduly mám udělanou malou extenstion která se tak trochu stará o jejich správu. imho ale jen ftp upload je málo. Většinou k tomu potřebuješ i nějaké tabulky atd, tak je vhodné pouvažovat o nějakém instaleru.

Router si každý modul řeší sám, tj. vytáhne si službu routeru z DI a přidá do něj vlastní routy které potřebuje.

Statické soubory (js,css) si moduly taky řeší samy, vytáhnou si službu assets loaderu a předají mu svůj seznam souborů.

Permalinky řeší router, tam není co vymýšlet.

Filtry, stránkování apod. by imho mělo být v url, osobně mě dokáže docela dost nasrat když sem např. někde v eshopu, klikám si filtr a pak jej chcu někde poslat a mám smolíka protože je v session apod. a nebo si to vzájemně nepamatuje filtr vs stránkovač apod.

Joacim
Člen | 229
+
0
-

akadlec napsal(a): . . . . . . . .

Přesně takhle to chci taky udělat.
S tím, že každý modul bude potřebovat DB tabulky atd:. počítám a instalátor tam udělám.
Jen u extension modulů nemáš dokumentaci koukám.

Nemáš alespoň ukázkový projekt s jedním modulem (jen ukázka nastavení) ?

Editoval Joacim (12. 1. 2016 15:22)

akadlec
Člen | 1326
+
+1
-

No dokumentace není :( ale teď ty jednotlivé extensiony procházím a vyhezkávám, takže i chybějící dokumentace dopisuji. Hele, jako fakt light ukázka může sloužit modul pro správu uživatelů ale brát to fakt s rezervou, jednak tam nemám spoustu věcí ještě commitlých a jednak je to těžce pracovní/testovací verze.

Joacim
Člen | 229
+
0
-

akadlec napsal(a):

No dokumentace není :( ale teď ty jednotlivé extensiony procházím a vyhezkávám, takže i chybějící dokumentace dopisuji. Hele, jako fakt light ukázka může sloužit modul pro správu uživatelů ale brát to fakt s rezervou, jednak tam nemám spoustu věcí ještě commitlých a jednak je to těžce pracovní/testovací verze.

Koukám, že mi odkaz Composer v NB nevezme (budu to muset vyřešit jinak).

config,neon je stejně společný a musím do něk přidat extension.

Já s tím měl problém už i při instalaci CMS, mám instal page, kde jsou základní nastavení jako DB atd:., ale musím přepsat config.neon přes PHP za dodržení formátování.

akadlec
Člen | 1326
+
0
-

Neon souborů můžeš mít více, né jen jeden. A pokud myslíš odkaz na ten bitbucket, tak to by sis musel dokonfigurovat, pro tohle repo není package.

Editoval akadlec (12. 1. 2016 16:11)

Joacim
Člen | 229
+
0
-

akadlec napsal(a):

Neon souborů můžeš mít více, né jen jeden. A pokud myslíš odkaz na ten bitbucket, tak to by sis musel dokonfigurovat, pro tohle repo není package.

Aha, já jsem vždy zatím používal klasický config.neon, lze mít tedy pro každý Modul clastní sločku config se eouborem config.neon ? (jakým způsobem mám tedy přidat config.neon z modulu do $configurator->addConfig ?)

akadlec
Člen | 1326
+
0
-

Ty ho nepotřebuješ přidávat, stačí ho jen zpracovat a o to se tě stará extension loader.

Joacim
Člen | 229
+
0
-

akadlec napsal(a):

Ty ho nepotřebuješ přidávat, stačí ho jen zpracovat a o to se tě stará extension loader.

Takže nemusím do config.neon přidávat novou servisu ? Tzn. pokud si vytvořím v modulu nový model, který chci používat i v jiných modulech ? (P.S. – Občas mě trvá něco pochopit déle)

Zpracovat znamená co ? Myslel jsem, že stačí načíst konfiguraci a přidat do ní moje services.

Editoval Joacim (13. 1. 2016 14:59)

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

Uděláš si CompilerExtension a tam dáš:

public function loadConfiguration()
	{
		parent::loadConfiguration();

		$this->compiler->parseServices(
			$this->getContainerBuilder(), $this->loadFromFile(__DIR__ . '/config.neon')
		);
	}

tím se zpracuje ten config.neon a přídá se do kontejneru

Joacim
Člen | 229
+
0
-

Jiří Nápravník napsal(a):

Uděláš si CompilerExtension a tam dáš:

public function loadConfiguration()
	{
		parent::loadConfiguration();

		$this->compiler->parseServices(
			$this->getContainerBuilder(), $this->loadFromFile(__DIR__ . '/config.neon')
		);
	}

tím se zpracuje ten config.neon a přídá se do kontejneru

To chápu (ZDE) jsem se trošku inspiroval, napíšu si novou třídu CompilerExtension(app/modules), injektnu do presenteru daného modulu(app/modules/nazev_modulu/presenters) a přidám do bootstrap.php + v app/config přidám jako servisu.

Předem se omlouvám za hloupou otázku, ale nemám ještě 100% znalosti Nette. – Poté mohu v prezenteru modulu zavolat tuto servisu a přes ní přidat konfiguraci ? (Myslím, že jsem to špatně pochopil, jelikož by měla bejt konfigurace načtena hned při startu aplikace a ne až po tom co se dostanu do daného presenteru modulu)

app/
	config/
	modules/
		Modul-1/
			config/
			presenters/
				templates/
			models/
		Modul-2/
			config/
			presenters/
				templates/
			models/
	model/
	presenters/
	router/

Editoval Joacim (13. 1. 2016 17:03)

akadlec
Člen | 1326
+
0
-

Jop, špatně si to pochopil. Uděláš si modul, třeba jak sem tě odkazoval na správu uživateů. Tento modul je vlastně extension která rozšíří DI a pomocí metody jak psal @JiříNápravník ti vytvoří její služby. Ty pak jen do config neonu co má tvoje aplikace přidáš tuto novou extension:

extensions:
	tvujmodul: TvujModulExtension

A pokud tvůj modul vytváří nové služby tak je vytvoří, přidá do DI a máš je pak k dispozici i jinde. A ty moje zmíněné doplňky řeší to ruční přidávání služby do neonu, aby se přidávaly dynamicky.

Joacim
Člen | 229
+
0
-

akadlec napsal(a):

Jop, špatně si to pochopil. Uděláš si modul, třeba jak sem tě odkazoval na správu uživateů. Tento modul je vlastně extension která rozšíří DI a pomocí metody jak psal @JiříNápravník ti vytvoří její služby. Ty pak jen do config neonu co má tvoje aplikace přidáš tuto novou extension:

extensions:
	tvujmodul: TvujModulExtension

A pokud tvůj modul vytváří nové služby tak je vytvoří, přidá do DI a máš je pak k dispozici i jinde. A ty moje zmíněné doplňky řeší to ruční přidávání služby do neonu, aby se přidávaly dynamicky.

  1. Pro každý modul musím mít extension (CompilerExtension) nebo stačí jeden pro všechny moduly ? a u každého modulu mu jen předám parametry, které bych jinak musel psát do config.neonu ručně ?
  2. Kde si budu CompilerExtension volat v Modulu, abych inicioval parametry předávané do compileru (parametry neonu)?

Editoval Joacim (13. 1. 2016 18:22)

akadlec
Člen | 1326
+
+1
-
  1. To je na tobě jak si to navrhneš, já mám co modul do extension, jen je to obaleno balíčkovačem co se stará o drobnosti kolem.
  2. Co nevoláš ty přímo, ale volá si to nette, tím že tu extension registruješ mezi ostatní.
Joacim
Člen | 229
+
0
-

akadlec napsal(a):

  1. To je na tobě jak si to navrhneš, já mám co modul do extension, jen je to obaleno balíčkovačem co se stará o drobnosti kolem.
  2. Co nevoláš ty přímo, ale volá si to nette, tím že tu extension registruješ mezi ostatní.

Ok, takže nette se automaticky postará o loadConfiguration (zde budu mít parametry, které bych jinak napsal do modul/config/config.neon) a tuto extensio si jen regnu v hlavním config.neonu