Dynamické vkladanie komponent

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

Dobrý den,
riešim nasledovný problém.
Mám články v databáze a vypisujem ich v šablóne. Chcem sa spýtať, akým spôsobom sa dá urobiť to, že ak budem mať v článku nejaké „makro“ (napr. {include gallery}) tak mi to vloží komponentu gallery.

Ďakujem

Felix
Nette Core | 1247
+
+3
-

Tohle muzes vyresit vice zpusoby, nejjednodussi je, ze projdes obsah clanku napriklad pres preg_match_all a na urcite makro sam zavolas createComponent<>.

Slozitejsi varianta muze byt, ze pouzijes primo latte engine. Budes ale muset nasimulovat presenter, aby se spravne sparoval kontext maker s createComponent<> na presenteru.

Tak ci onak, idealni je si vystup cachovat, aby se makra nemusela hledat pri kazdem requestu.


Konkretne je to fce preg_replace_callback, viz http://php.net/…callback.php.

Jak psal @Antik (https://forum.nette.org/…ie-komponent#…)

Editoval Felix (8. 8. 2016 17:33)

Lubtor
Člen | 7
+
0
-

Dakujem za odpoved.
Obsah clanku mam prechadzat v presentery a ako potom poviem sablone, ze na ktorom mieste ma vykreslit komponentu? Chcel by som to tak, aby bol obsah clanku napriklad
Nejaky text…
......
{include gallery}
......... text

Martk
Člen | 661
+
0
-
preg_replace_callback('#{include\s*(.*?)}#', function ($m) {
	$componentName = $m[1];
	// zpracování komponenty
	// vrácení textu, kterým to chceš nahradit
}, $text);
GEpic
Člen | 566
+
+2
-

Na to pozor, nepovoloval bych asi klasickému „uživateli“ pracovat s include… může ti to pěkně rozbít :) :D

Mám zkušenost že lidé nedokážou změnit ani tučné na kurzívu… :D

Kdyby to bylo na mě, určitě bych tuto možnost povolil, ale vymyslel si vlastní makro (třeba [_gallery(parametry)_] (to už je na tobě), které před výpisem budu hledat (tak jako include) a ostatní znaky jako sou {} <? ?> převedl na html entity (protože tak či tak budeš muset použít noescape a tady by byl potom problém).

Navíc nepředpokládám že komponenta bude vracet statický obsah, určitě budeš chtít udělat například stránkování, signály, podobné věci, takže to bude docela živá featura.

Editoval GEpic (6. 8. 2016 19:44)

Felix
Nette Core | 1247
+
0
-

Premyslim, ze udelam nejaky jednoduchy doplnek, ktery by tohle umoznoval nejak jednoduse resit. Parkrat jsem to uz take potreboval a psat to porad dokola, komu by se to chtelo, zejo.. :-)

GEpic
Člen | 566
+
+2
-

Není to nic složitého, stačí doopravdy jedno makro simulující createComponent jako si popisoval nahoře, ale je potřeba mít někde seznam těchto dostupných komponent (třeba je definovat config.neon společně s jejich factory classes). My takto máme komponenty, které můžeš vkládat přímo do obsahu a nepotřebuješ přitom znát syntaxy, stačí si v panelu nakliknout dostupnou komponentu, vyplnit parametry (třeba limit novinek, do kolika sloupců se novinky vypíšou, apod.).

Uživatel nepotřebuje znát přitom téměř vůbec nic, napíše si novinku, vybere si makro pro galerii, vybere jako parametr ID galerie a kód se sám vloží do contentu (většina toho je client-side a javascript).

Tak jen takový tip.

Editoval GEpic (8. 8. 2016 18:09)

kejlicz
Člen | 201
+
0
-

Já to mám tak, že si předám do šablony objekt $contentManager a pak v šabloně volám např. {$contentManager->getGallery(„slug“) a ta třída mi pak vrátí co potřebuju. Je to u CMSka, kde já vytvořím v latte kostru a jen určím, kde je editovatelný text, galerie, přihlašovací form a podobně. Např. další fotogalerii si sám uživatel nepřidá a jen edituje předpřipravené „prvky“. Je tento způsob nějak špatný?

GEpic
Člen | 566
+
0
-

kejlicz napsal(a):

Já to mám tak, že si předám do šablony objekt $contentManager a pak v šabloně volám např. {$contentManager->getGallery(„slug“) a ta třída mi pak vrátí co potřebuju. Je to u CMSka, kde já vytvořím v latte kostru a jen určím, kde je editovatelný text, galerie, přihlašovací form a podobně. Např. další fotogalerii si sám uživatel nepřidá a jen edituje předpřipravené „prvky“. Je tento způsob nějak špatný?

To záleží na klientech. U nás si může zákazník přidat do novinky klidně slideshow, nebo vypsat obsah jiného boxu, kde box může obsahovat další boxy (samozřejmě ošetřené proti nastavenému nesting levelu), vše jde vypsat všude. Dost to pomáhá i při „zvláštních“ požadavcích zákazníků, kdy neni třeba vymýšlet pro každý projekt různé „hardcode“ záležitosti a ušetří nám to se vším dost času. No a pokud jsou požadavky zákazníka doopravdy nad rámec, napíšeme pro něj vlastní modul, který neovlivňuje jiné globálně použitelné moduly.

Editoval GEpic (9. 8. 2016 19:08)