Dynamické vkladanie komponent
- Felix
- Nette Core | 1247
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)
- GEpic
- Člen | 566
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)
- GEpic
- Člen | 566
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
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
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)