Šablona z řetězce (Nette2.2)

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

Ahoj,
podobných otázek jsem našel na fóru hned několik, ale ne řešení, které potřebuji nebo by fungovalo.

Tedy mám latte řetězec a potřebuji ho vyrenderovat do řetězce. V latte mohou být libovolná makra a helpery včetně controlu, např.:

{control regForm}

Našel jsem řešení jak zprovoznit render šablony do řetězce pomocí Latte\Engine.

<?php
$latte = new \Latte\Engine;
$latte->onCompile[] = function($latte) {
	Nette\Bridges\ApplicationLatte\UIMacros::install($latte->getCompiler());
	Nette\Bridges\FormsLatte\FormMacros::install($latte->getCompiler());
};
$latte->setLoader(new \Latte\Loaders\StringLoader);
$html = $latte->renderToString('vypis promenne {$test}', array('test' => 'TEST OK'));	// ok
$html = $latte->renderToString('vypis  {control nazevKomponenty}', array());	// tohle už ne
?>

Pokud ale použiju {control nazevKomponenty} dostanu chybu
Undefined variable: _control

Další navrhované řešení v diskuzi bylo použít templateFactory, což je super, pokud nastavim jako zdroj latte soubor, ale nikoliv řetězec.

Asi nejvíc jsem čerpal z diskuze https://forum.nette.org/…-latte-textu
která ovšem není dořešená.
Potom tady
https://forum.nette.org/…u-v-databazi
kde jsem si při pohledu na {=$latte->render($widget->content, [])|noescape} začínal rvát vlasy.

Díky, Filip

David Matějka
Moderator | 6445
+
0
-

zkus pouzit tu TemplateFactory, vrati ti to Template, kde je metoda getLatte(), ktera vrati instanci Latte\Engine

Editoval matej21 (28. 8. 2014 13:47)

Filip111
Člen | 244
+
0
-

To jsem zkoušel, ale taky neúspěšně:

  1. výpis z latte
<?php
$s = 'test {$test} {control testForm}';
$template = $this->templateFactory->createTemplate($this);
$latte = $template->getLatte();
$latte->setLoader(new \Latte\Loaders\StringLoader);
$html = $latte->renderToString($s, array('test' => 'TEST OK'));
echo $html;
?>

Vypíše proměnnou test a pak skončí chybou Undefined variable: _control.

  1. výpis pomocí template

To si myslim, by měl být správný způsob, aby měla kompoenta vazbu na presenter apod.
Nicméně, nedaří se mi nastavit jako zdroj latte kódu řetězec. Kód níže neprovede nic a o způsobu jak Template podstrčit vlastní Latte\Engine nevim. Zkoušel jsem třeba tohle:

<?php
$s = 'test {$test} {control testForm}';
$template = $this->templateFactory->createTemplate($this);
$latte = $template->getLatte();
$latte->setLoader(new \Latte\Loaders\StringLoader);
$latte->compile($s);
$template->test = 'TEST OK';
echo $template->__toString();
?>

upravuji: TemplateFactory jsem ještě nezkoušel, možná je to cesta

Editoval Filip111 (28. 8. 2014 14:08)

David Matějka
Moderator | 6445
+
0
-

budes do ty renderToString metody take pripojit parametry z getParameters v te Template

Filip111
Člen | 244
+
0
-

To vypadá dobře, takhle mi to už funguje. Díky.

<?php
$s = 'test {$test|truncate:2} {control testForm}';
$template = $this->templateFactory->createTemplate($this);
$template->test = 'TEST OK';
$latte = $template->getLatte();
$latte->setLoader(new \Latte\Loaders\StringLoader);
$html = $latte->renderToString($s, $template->getParameters());
?>

Editoval Filip111 (28. 8. 2014 14:30)

lumen
Člen | 32
+
0
-

Ahoj, dostal jsem se ke stejnému problému. Výše uvedený kód mi také funguje. Nicméně je problém, pokud do latte kódu chci vložit snippet (ať už pomocí {snippet x} nebo n:snippet="x"). Pak se mi v proměnné $html objevuje místo HTML cesta k souboru @layout.latte, který na stránce používám, nechápu proč.

Zkoušel jsem i něco takového:

$s = '{snippet A}test {$test|truncate:2}{/snippet}';
$latteTemplate = $this->templateFactory->createTemplate($this);
$latte = $latteTemplate->getLatte();
$latte->onCompile[] = function($latte){
    Nette\Bridges\ApplicationLatte\UIMacros::install($latte->getCompiler());
    Nette\Bridges\FormsLatte\FormMacros::install($latte->getCompiler());
};
$latte->setLoader(new \Latte\Loaders\StringLoader);
$latte->setTempDirectory('/tmp/test');

$latteTemplate->test = 'TEST OK';

$this->template->html = $latte->renderToString($s, $latteTemplate->getParameters());

Pak v latte:

{$html|noescape}

To také nepomohlo. Netuší někdo? Díky za jakýkoli komentář.

lumen
Člen | 32
+
0
-

Nebo se zeptám ještě jinak. Je vůbec možné dávat do includované šablony snippet?

bazo
Člen | 620
+
0
-

nie. snippet musi byt okolo includovanej sablony

Casper
Člen | 253
+
0
-

lumen napsal(a):

Nebo se zeptám ještě jinak. Je vůbec možné dávat do includované šablony snippet?

Mělo by to jít takto:

{snippetArea area}
      {include ./test.latte}  {* some "test" snippet inside *}
{/snippetArea}
$this->redrawControl("area");
$this->redrawControl("test");