Nette 2.2beta1 – získání HTML výstupu z Latte textu

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

vymak
Člen | 92
+
0
-

Nenapadá někoho kde může být problém?

vvoody
Člen | 910
+
0
-

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.

David Grudl
Nette Core | 8218
+
0
-

Hele ale tohle ti urcite nefungovalo ani v 2.1, ne?

vymak
Člen | 92
+
0
-

@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í?

vvoody
Člen | 910
+
0
-

V tvojom prípade je control samotný presenter.

Tiež si myslím že v 2.1 by ti tvoj kód nefungoval. Mal by si ten istý problém ako teraz. Mohlo by to fungovať keby si nemal v latte použité makro link, s ktorým máš teraz problém.

vymak
Člen | 92
+
0
-

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;
}