zpracovat text z db jako šablonu

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

Nette 0.9.3

Mám následující problém:

Je text dejme tomu článku, který se načte z databáze. A chtěl bych aby se do článku dalo vkládat stejně jako třeba obrazek atd .. např. karta produktu.

Moje představa článku:
text článku uložený v db:
<p> text </p>
<p> text </p>
{include produkt.phtml, ‚produkt‘ ⇒ 25}
<p>text</p>

šablona clanek.phtml

<?php
...
{$text}
...
?>

nebo něco v tom smyslu .. karta produktu mám svoji stále stejnou strukturu.. údaje o produktu se načtou z db.

Jak zařídit aby {$text} se vyhodnotil ještě v LatteFiltru?

Asi to je spíše problém návrhu.. to načítání údajů o produktu až v šabloně.. kdy předám šabloně vypiš kartu produktu id 25.

A také jak

Napadá někoho hezké řešení?

Podobné by to mohlo být u vkládání odkazů:
Uživatel – vytváří text článků a v něm chce odkazovat třeba na ten daný prodkut .. nechci aby vkládal klasickou url adresu.. ale dám mu vybrat na jaký prodkut chce odkaz -tzn. do šablony se vloží {link Prodkut:25} a až Nette z něj udělá odkaz při renderu..jako u klasické šablony.

Oggy
Člen | 306
+
0
-

honzakuchar napsal(a):

https://api.nette.org/…eFilter.html

Já nějak nerozumím.. co tím chce básník říct? :-)

Petr Motejlek
Člen | 293
+
0
-

I když nejsem básník, tak si troufám říct, že se ti snaží naznačit, že máš LatteFilter pustit na ten tvůj $text ručně.

Achich, kolikrát tady už podobný dotaz zazněl, to už radši ani nepočítám. Hledej ve fóru texty jako šablona ze stringu, StringTemplate, etc.

@Ostatní: Nejdřív zkuste hledat, než se budete ptát na věci, co se řešily už mockrát, akorát mi zbytečně zacpáváte RSS ;).

Honza Kuchař
Člen | 1662
+
0
-

Dobře upřesním: Volej tuhle metodu. Ale pozor tahle statická je deprecated!

Honza Kuchař
Člen | 1662
+
0
-

Nebo zkus StringTemplate.

Oggy
Člen | 306
+
0
-

dobře.. děkuju

Oggy
Člen | 306
+
0
-

Tak ještě budu zacpávat RSS :-) ..

nějak se mi nedaří tak jak bych si to představoval..

nejhezčí řešení uživateslky bych viděl nastavit si zpracování LatteFilterem jako Helper:
to jak psal honza shoří předpokládám na to, že invoke je deprecated

<?php
$this->template->registerHelper('template', 'Helpers::template');

public static function template($text) {
            return LatteFilter::__invoke($text);
        }

{$article->text|template}
?>

Jak tedy nejlépe pustit LatteFilter v šabloně na text z db ručně?

redhead
Člen | 1313
+
0
-

a co:

public static function template($text) {
	$filter = new LatteFilter;
	return $filter->invoke($text);
}
Oggy
Člen | 306
+
0
-

text z databaze:
{include test.phtml}
<p>text</p>

při tomto {$article->text|template} zpracování vrací php kód

<?php $_cb = LatteMacros::initRuntime($template, NULL, ‚7ce9a5caa0‘); unset($_extends); ?><?php if (SnippetHelper::$outputAllowed) { ?> <?php LatteMacros::includeTemplate(„test.phtml“, $template->getParams(), $_cb->templates[‚7ce9a5caa0‘])->render() ?> <p>text</p>

při {!$article->text|template} vrací toto:

getParams(), $_cb->templates[‚edad753a1f‘])->render() ?> text

kde je prosím problém?

Ondřej Mirtes
Člen | 1536
+
0
-

Jo, to mě taky napadlo, že tenhle způsob nebude fungovat, že se ti jednoduše vypíše PHP kód :)

Oggy
Člen | 306
+
0
-

Ondřej Mirtes napsal(a):

Jo, to mě taky napadlo, že tenhle způsob nebude fungovat, že se ti jednoduše vypíše PHP kód :)

No nějak nevím jak s tím naložit..

Jak jinak docílit tohoto

Editoval Oggy (28. 2. 2010 21:16)

Panda
Člen | 569
+
0
-

Zkusil bych toto:

public static function template($text) {
	$filter = new LatteFilter;
	$output = $filter->invoke($text);
	ob_start();
	LimitedScope::evaluate($output);
	return ob_get_clean();
}
Oggy
Člen | 306
+
0
-

Panda napsal(a):

Zkusil bych toto:

public static function template($text) {
	$filter = new LatteFilter;
	$output = $filter->invoke($text);
	ob_start();
	LimitedScope::evaluate($output);
	return ob_get_clean();
}

je potřeba vola __invoke

ale stejně je tu nějaká chybka:

Notice: Undefined variable: template in …libs/Nette/Loaders/LimitedScope.php(48) : eval()'d code on line 2

Panda
Člen | 569
+
0
-

Hm, tak to asi budeš muset použít v tom helperu Davidův StringTemplate, LatteFilter je moc silně svázaný s šablonou.

Oggy
Člen | 306
+
0
-

Panda napsal(a):

Hm, tak to asi budeš muset použít v tom helperu Davidův StringTemplate, LatteFilter je moc silně svázaný s šablonou.

Hm.. děkuju za pomoc.
Koukám na StringTemplate .. jak jí aplikovat jen na tu danou část textu? ..

Panda
Člen | 569
+
0
-

Použít v tom helperu (doufám, že se to používá takto):

public static function template($text) {
	$template = new StringTemplate();
	$template->registerFilter(new LatteFilter);
	$template->content = $text;
	return $template->__toString();
}
Oggy
Člen | 306
+
0
-

díky

ještě to má chybičku.. např, při plinku to nezná presenter..
Notice: Undefined variable: presenter in libs/Nette/Loaders/LimitedScope.php(48) : eval()'d code on line 6 Call Stack

Panda
Člen | 569
+
0
-

Mno to si tam tu proměnnou ovšem musíš přiřadit, že. ;-)

$template->presenter = Environment::getApplication()->getPresenter();