Šablona z řetězce (Nette2.2)
- Filip111
- Člen | 244
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
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
To jsem zkoušel, ale taky neúspěšně:
- 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.
- 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
budes do ty renderToString metody take pripojit parametry z getParameters v te Template
- Filip111
- Člen | 244
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
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ář.