Použití latte kódu v databázi

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

Ahoj, narazil jsem na jeden problém. Píšu „widgety“ a z velké části se skládají jen z html ale v pár widgetech potřebuju používat i php. Widgety dejme tomu jsou jen nějaký záznam z databáze pro příklad.

<div id="{$widget->class}">
    {$widget->content|noescape}
</div>

A pak je widget, kterej vypíše všechny články

<div id="{$widget->class}">
    <?php eval($widget->content); ?>
</div>

Problém je, že nette mi escapuje PHP do komentářů, tudíž to PHP nefunguje. Zajímavé je, že na localu to normálně funguje → na ostrém se to escapuje. Jde nějak použít latte macra, které jsou uloženy v databázi? Nebo jak to řešíte? Jestli to řešíte.

Např.: v tabuce mám ->
content a ten obsahuje

<!-- content -->
{foreach $articles as $article}
   <h1>{$article->title}</h1>
{/foreach}

a pak v sablone

<!-- template -->
{foreach $widgets as $widget}
    // tady ten content aby to fungovalo jako když to sem napíšu ručně
{/foreach}

díky

Editoval Томас (13. 7. 2014 23:29)

mkoubik
Člen | 728
+
+2
-
$latte = new Nette\Latte\Engine();
$latte->setLoader(new Nette\Latte\Loaders\StringLoader());
$this->template->latte = $latte;
{=$latte->render($widget->content, [])|noescape}
Томас
Člen | 85
+
0
-

mkoubik napsal(a):

$latte = new Nette\Latte\Engine();
$latte->setLoader(new Nette\Latte\Loaders\StringLoader());
$this->template->latte = $latte;
{=$latte->render($widget->content, [])|noescape}

Díky, skvěle funguje! :o)

Caine
Člen | 216
+
0
-

Jsem jedinej, komu tenhle zapis prijde naprosto silenej?

Editoval Caine (14. 7. 2014 8:29)

David Kudera
Člen | 455
+
0
-

Caine napsal(a):

Jsem jedinej, komu tenhle zapis prijde naprosto silenej?

Nejsi..

akadlec
Člen | 1326
+
0
-

widgety jsem taky řešil ale takto? proboha proč? eval? really?

Milo
Nette Core | 1283
+
0
-

@Caine @DavidKudera Co je na tom naprosto šíleného? Když vezmete v úvahu, že se Latte kompiluje do PHP, jak byste si to představovali?

David Kudera
Člen | 455
+
0
-

Milo napsal(a):

@Caine @DavidKudera Co je na tom naprosto šíleného? Když vezmete v úvahu, že se Latte kompiluje do PHP, jak byste si to představovali?

Tak nějak od pohledu se mi to nelíbí.. Asi tak stejně jako přistupování k db v šabloně. Třeba je to ale jen můj pocit

Milo
Nette Core | 1283
+
0
-

@DavidKudera Pokud jde jen o vzhled, dá se z toho udělat macro, např:

{latte $widget->content}

(tedy název makra bych asi použil jiný). S trochou práce se to přepíše na Latte\Loaders\FileLoader a je to i s kešováním.

David Kudera
Člen | 455
+
0
-

Milo napsal(a):

@DavidKudera Pokud jde jen o vzhled, dá se z toho udělat macro, např:

{latte $widget->content}

(tedy název makra bych asi použil jiný). S trochou práce se to přepíše na Latte\Loaders\FileLoader a je to i s kešováním.

Když tak na to koukám, tak to bude asi tím a s tímhle „schováním“ už to vypadá líp no

Томас
Člen | 85
+
0
-

akadlec napsal(a):

widgety jsem taky řešil ale takto? proboha proč? eval? really?

Jsem samozřejmě otevřenej i jinýmu řešení, ale tohle je jediný, co mě napadlo.

David Kudera
Člen | 455
+
0
-

Jak bude trochu času, tak zveřejním i svoje řešení, jen jeho největší výhoda je ve spojení s administrací, kde to funguje stejně jako widgety u wordpressu. Budu si s tím muset trochu pohrát a udělat to víc nezávislý

akadlec
Člen | 1326
+
0
-

@Томас: hele jak ty tvoje widgety vypadaji? Je to jen nějaké tupé vypsání obsahu? Já to začal řešit tak (měl jsem to v jiné appce) že widgety byly podle typu, každý prostě dělal něco jiného a dohromady skládaly obal samotné webstránky. Takže sem měl třeba widget na 10 posledních článku, top produkty z eshopu atd. Jak to dostat do nette jsem řešil i tady

Zatím to mám u ledu protože řeším aktuálně modulové části, ale fungovalo to tak že se widgety načetly z db podle podmínek a podle toho se pak vytvořily komponenty, resp. byla to jedna komponenta widget co to obalovala a přebirala info jaké (na jaké pozici) widgety má zobrazit a ty si pak interně vykreslila. V šabloně pak stačilo mít {control widget-leftBig} apod. a widget manager se postaral o načtení widgetů a jejich vykreslení.