Nette 2.2beta1 – získání HTML výstupu z Latte textu
- vymak
- Člen | 92
Ahoj, zkouším nové Nette 2.2b1, zatím funguje všechno ale narazil jsem na jeden problém. V databázi mám uložený text ve formátu pro Latte. Jak lze v novém Nette prohnat tato data a vrátit „čistý“ HTML kód?
Ve verzi 2.1 jsem používal tento kód:
protected final function templateParse($data, $variable = 'text') {
$template = $this->createTemplate('Nette\Templating\Template');
$template->setSource($data);
$this->template->$variable = $template;
}
Když tento kód spustím v novém Nette vyskočí tahle vyjímka:
Nette\MemberAccessException
Call to undefined method Nette\Bridges\ApplicationLatte\Template::setSource()
- David Grudl
- Nette Core | 8218
Latte má nové API:
$latte = new Latte\Engine;
$latte->setTempDirectory('/path/to/tempdir');
$params['a'] = ...;
$params['b'] = ...;
$latte->render('template.latte', $params);
Pokud místo souboru chceš použít string, stačí ještě nastavit:
$latte->setLoader(new Latte\Loaders\StringLoader);
$latte->render($templateString, $params);
- vymak
- Člen | 92
Díky za nakopnutí :) Trochu jsem to zkoušel, ale jaksi se s tím pořád nemůžu domluvit :D
Z databáze si vytáhnu například takový text:
<p>
<strong>Nerezové jehly</strong> slouží jako doplněk k <a n:href=":Front:Doplnky:view ram-na-opekani">rámu
na opékání</a>. Na tyto nerezové jehly lze napíchnout 10 kusů ryb či čehokoliv jiného. Jehly jsou vyrobeny
z kvalitní oceli, která zaručuje dlouhou trvanlivost.
</p>
Tento text bych jen potřeboval projet přes „compilátor“ abych z něj získal HTML kód bez n:maker a dalších proměnných. Tento vygenerovaný HTML kód bych potom potřeboval uložit do proměnné text, která je v šabloně.
Zkoušel jsem to nějak takhle, kde proměnná dataFromDatabase je text výše:
protected final function templateParse($dataFromDatabase) {
$latte = new \Latte\Engine;
$latte->setLoader(new \Latte\Loaders\StringLoader);
$html = $latte->renderToString($dataFromDatabase);
$this->template->text = $html;
}
Omlouvám se za blbé dotazy, ale tohle je po dlouhé době první věc u které jsem se zasekl :D
- David Grudl
- Nette Core | 8218
Standardní Latte n:href nemá, to je potřeba ještě doinstalovat:
$latte = new Latte\Engine;
$latte->onCompile[] = function($latte){
Nette\Bridges\ApplicationLatte\UIMacros::install($latte->getCompiler());
Nette\Bridges\FormsLatte\FormMacros::install($latte->getCompiler());
};
- vymak
- Člen | 92
Díky, po chvíli odmlky jsem se k tomuto problému zase vrátil a už to
alespoň něco vygenerovalo.
Zasekl jsem se ale na Notice
Undefined variable: _control
na tomto řádku:
a majitele rodinných domků. <a title="Odkaz" href="<?php echo htmlSpecialChars($_control->link(":Front:Produkty:view", array('zahradni-krb'))) ?>
a pak ještě
Undefined variable: basePath
na
z jednotlivých dílců dle <a rel="prettyPhoto" href="<?php echo htmlSpecialChars(Latte\Runtime\Filters::safeUrl($basePath)) ?>/images/img.jpg
kód pro získání výstupu je takovýto:
$latte = new Engine;
$latte->setTempDirectory('../temp/cache/template');
$latte->onCompile[] = function($latte) {
UIMacros::install($latte->getCompiler());
FormMacros::install($latte->getCompiler());
};
$latte->setLoader(new StringLoader);
$output = $latte->renderToString($dataFromDatabase);
$this->template->$variable = $output;
Editoval vymak (20. 4. 2014 21:49)
- vvoody
- Člen | 910
Síce si zaregistroval nette makrá (link..) ale to nestačí. https://api.nette.org/…ory.php.html#… táto trieda v nette 2.2 generuje šablóny pre presentery. Buď sa ňou inšpiruj alebo si ju injectni kde potrebuješ, je zaregistrovaná ako služba.
- vymak
- Člen | 92
@David Grudl: V Nette 2.1 mi fungovalo to jak jsem psal v prvním příspěvku. Web ale předělávám do Nette 2.2 tak zkouším jak to rozchodit. Zatím se s tím nějak nemůžu zžít :(
@vvoody: Službu jsem si injectnul do basepresenteru, kde mám tu metodu, která se stará o převedení latte na HTML. Nicméně vůbec netuším co do metody createTemplate předat za Control. Mohl by si kdyžtak postnout nějakou jednoduchou ukázku použití?
- vymak
- Člen | 92
Takže by to mohlo být třeba nějak takto?
/** @var \Nette\Bridges\ApplicationLatte\TemplateFactory @inject */
public $templateFactory;
protected final function templateParse($dataFromDatabase) {
$template = $this->templateFactory->createTemplate($this);
$template->setFile('../app/templates/test.latte');
$template->setParameters(['text' => $dataFromDatabase]);
$this->template->text = $template;
}