Textové widgety pro redaktory
- mcmatak
- Člen | 504
Řešil už někdo dát možnost redaktorům nějakého ckeditoru přidávat widgety do textu?
Představte si že přidáte anketu takto
např.
{widget anketa}
nebo
{widget contactForm}
kdysi jsem to na takovém systému mimo nette měl, ale existuje v současné době funkční implementace?
bude tady asi hodně otázek ohledně bezpečnosti, ohledně toho aby widgety nekolidovali s těmi běžnými v systému, ohledně syntaxe atd.
řešil to někdo?
- nanuqcz
- Člen | 822
Hned nazačátku, při vytváření pluginu pro (tehdy ještě) FCKEditor :-)
Do obsahu jsem pomocí toho pluginu vložil něco jako
<img src="gallery.png" class="gallery-{id}">
. Před
zobrazováním jsem ten obrázek pak nahradil PHP skriptem pro generování
galerie (tehdy jsem ještě nedělal v Nette, takže žádný {widget gallery,
$id} se nekonal :-)).
Chtěl jsem, aby se ve FCKEditoru zobrazil náhled přímo té galerie (ne nějaká obecná ikonka galerie) a abych když na něho kliknu pravým, mohl tu galerii upravit. Na to jsem už ale byl krátký, takže se teď do podobné věci pouštět nechci, i když by se mi to hodilo.
- Ot@s
- Backer | 476
No… Zatím to řeším speciální komponentou Webpage (zobrazující pouze
obsah stránky v rámci CMSka). V ní mám definované továrničky na ony
povolené widgety (ankety, diskuse, FB nástroje atd.). V rámci WYSIVYG
editoru pak používám rozšířené tagy
<widget modul="inquiry">Anketa</widget>
, které pomocí
reguláru převedu na latté zápis {control inquiry}
. Takto
vygenerovaný obsah stránky pak proženu latte enginem.
Vadí mě ten převod tagu na latte. Tj. hodil by se ekvivalent PHP strip_tags
pro latte (= vyjmenoval bych pouze povolené latte zápisy).
Editoval Ot@s (22. 2. 2012 15:32)
- mcmatak
- Člen | 504
hm nahled ve wysiwig by mne až tak netrápil,
tohle asi otázka syntaxe no
<widget modul=„inquiry“>Anketa</widget>
každopádně asi něco takového bych taky volil, jako továrnička, která obsluhuje ty žádané komponenty a může spravovat jejich povolené parametry atd.
můžeš prozdradit více? třeba o tom druhém prohnání latte
- Filip111
- Člen | 244
Ahoj, taky jsem to řešil – zkusím nastínit moje řešení ačkoliv to neni asi stoprocentně přenositelný. Neumožňuji redaktorům přidávat libovolné komponenty ale jen předem definované. V praxi jsem redaktorem, který přidává komponenty jen já, takže to není problém a předem si nadefinuji co potřebuji (to normální redaktor nesmí).
Konkrétně – mám speciální tabulku (+admin rozhraní) kde jsou
definované použitelné kódy. Např. nadefinuji kód Anketa1
a
přiřadím mu hodnotu {control anketa 1}
.
Při editaci článku pak pak mohu použít konstrukci
[[Anketa1]]
.
Text článku je potřeba validovat, aby tam nic jiného zneužitelného
neprolezlo.
Při zobrazení článku nahradím kód [[Anketa1]]
za hodnotu
definovanou v administraci, tedy již renderovatelný control.
Výsledek pak proženu přes latte.
Opravdu dlouho jsem řešil jak se vyhnout továrničkám komponent, které jsou vytvořené pro konkrétního zákazníka a tady mi v posledních měsících pomohly novinky v Nette. Komponentu zadefinuji v konfigu:
factories:
klientContactForm:
class: \klient\ContactForm
arguments: [@database]
Upravená metoda createComponent pak zkusí najít komponentu nejdřív v kontejneru:
protected function createComponent($name) {
if (method_exists($this->getContext(), $method = 'create'.ucfirst($name))) {
$component = $this->getContext()->$method($name);
return $component;
}
return parent::createComponent($name);
}
Většinu věcí jsem tu nějak vyzjistil na fóru od zkušenějších hlav. Nicméně zatím mi to řešení vyhovuje. Pokud bych ale chtěl umožnit redaktorům přidávat libovolně komponenty podle potřeby nebo je nechat určitou komponentu libovolně parametrizovat, muselo by se to nějak upgradovat.