Textové widgety pro redaktory

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

Ř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
+
0
-

Řešil jsem to, a nakonec vzdal. Kdyby někdo měl funkční řešení, taky bych byl vděčný :-)

mcmatak
Člen | 504
+
0
-

na čem to kixlo?

nanuqcz
Člen | 822
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.