Rozdělení rendrování a kompilace šablony
- h4kuna
- Backer | 740
Zdravím je možné nějak rozdělit chování metody render(), která přeloží + uloží do tempu a zároveň vykreslí šablonu? Nyní to řeším vlastní třídou, ale jestli jsem něco nepřehlédnul?
Používám překladač a před spuštění poeditu potřebuji mít zkompilované šablony, včetně šablon pro maily, komponenty atd… V presenteru si spouštím takovýto kód.
$tpl = $this->template;
foreach (\Nette\Utils\Finder::findFiles('*.latte')->from($this->context->parameters['appDir']) as $file) {
$tpl->setFile($file->getPathname());
$tpl->compileTemplate();
}
Pokud to rozdělené není, myslel jsem si že by to bylo vhodné do budoucna?
Přetížení
class Template extends \Nette\Templating\FileTemplate {
/**
* @return string
* @throws Nette\InvalidStateException
* @throws \Nette\Templating\FilterException
*/
public function compileTemplate() {
if ($this->getFile() == NULL) { // intentionally ==
throw new Nette\InvalidStateException("Template file name was not specified.");
}
$cache = new Caching\Cache($storage = $this->getCacheStorage(), 'Nette.FileTemplate');
if ($storage instanceof Caching\Storages\PhpFileStorage) {
$storage->hint = str_replace(dirname(dirname($this->getFile())), '', $this->getFile());
}
$cached = $compiled = $cache->load($this->getFile());
if ($compiled === NULL) {
try {
$compiled = "<?php\n\n// source file: $this->getFile()\n\n?>" . $this->compile();
} catch (FilterException $e) {
$e->setSourceFile($this->getFile());
throw $e;
}
$cache->save($this->getFile(), $compiled, array(
Caching\Cache::FILES => $this->getFile(),
Caching\Cache::CONSTS => 'Nette\Framework::REVISION',
));
$cached = $cache->load($this->getFile());
}
$storage = $this->getCacheStorage();
if ($cached !== NULL && $storage instanceof Caching\Storages\PhpFileStorage) {
return $cached;
}
return $compiled;
}
/**
* Renders template to output.
* @return void
*/
public function render() {
$source = $this->compileTemplate();
if (is_array($source)) {
Nette\Utils\LimitedScope::load($source['file'], $this->getParameters());
} else {
Nette\Utils\LimitedScope::evaluate($source, $this->getParameters());
}
}
}
Editoval h4kuna (13. 10. 2012 8:27)
- h4kuna
- Backer | 740
enumag napsal(a):
Možná hledáš tohle
To nefunguje jak bych si představoval, to už jsem zkoušel. Vyhazuje to exception ‚Cannot include undefined block‘.
Jak jsem psal potřebuju přeložit šablony před použitím poeditu, tuto funkcionalitu potřebuju jen na localhostu nikam na produkci.
- h4kuna
- Backer | 740
Překladač funguje tak že přeloží
{!_n'%s dog', '%s dogs', $count}
na
echo sprintf(ngettext('%s dog', '%s dogs', $count), $count);
Poeditem projedu temp/cache/_Nette.FileTemplate na localhostu a abych měl jistotu všech šablon, tak si spustím metodu na projití app adresáře a nechám si je všechny šablony vygenerovat, případně aktualizovat.
Doufám že to tak stačí…
Editoval h4kuna (16. 10. 2012 20:15)
- Filip Procházka
- Moderator | 4668
Takže v podstatě potřebuješ šablonu jen naparsovat, ale né kompilovat
- voda
- Člen | 561
GettextExtractor umí extrahovat řetězce přímo za Latte šablony a pak není potřeba nic kompilovat.
- h4kuna
- Backer | 740
voda napsal(a):
GettextExtractor umí extrahovat řetězce přímo za Latte šablony a pak není potřeba nic kompilovat.
Tohle nechci nepříjde mi dobré mít další externí nástroj, když to po malé úpravě může být integrované. Tak jako tak musíš spustit skript. Potřebuju zajistit aby všechny šablony byly naparsované v tempu, před použitím poeditu.
Editoval h4kuna (17. 10. 2012 16:07)
- h4kuna
- Backer | 740
HosipLan napsal(a):
Takže v podstatě potřebuješ šablonu jen naparsovat, ale né kompilovat
Omlouvám se zda jsem se vyjádřil špatně. Ano chci *.latte převést na *.php a uložit do tempu, ale nespouštět. Doufal jsem že z kódu to bude jasné. Metoda která je podobné metodě render jen skončí zde
- h4kuna
- Backer | 740
Zakopanej pes bude asi v tom, aby se nejprve ujasnilo jak funguje překladač. Pak bude jasný proč potřebuju zparsovat šablony. Kód v 1. příspěvku je naprosto funkční jen oddělí od sebe volání Nette\Utils\LimitedScope::load a Nette\Utils\LimitedScope::evaluate od výše umístěného kódu v metodě render().
- používám naprosto čistý gettext žádný ITranslator
- abych zajistil nalezení textů poeditem v šablonách spustím výše popsaný foreach cyklus
- pak stačí projet všechny zdrojáky poeditem a přeložit nalezené texty
Proto jsem si myslel že metoda dělá moc úkonů a zasloužila by rozdělit. Pokud ne i tak to budu řešit svou třídou.
- jkufner
- Člen | 3
Soucítím s tebou, h4kuna. Je až trapné jak mizerně na tom je Nette s lokalizací aplikací do jiných jazyků.
To co popisuješ je dobrý nápad a doufám, že to bude začleněno i přes to, že nikdo nechápe, k čemu to vlastně je.
Pro vás, co neví, která bije (všichni ostatní v této diskusi) doporučuju nastudovat jak funguje gettext, jak se používá a co to umí. Je to léty ověřený nástroj používaný na tisícovkách projektů. Zejména věnujte pozornost nástroji xgettext, který slouží pro extrakci přeložitelných řetězců ze zdrojového kódu. Pak by totiž nikoho ani nenapadlo, aby vůbec existovala metoda setTranslator.
- h4kuna
- Backer | 740
jkufner napsal(a):
To co popisuješ je dobrý nápad a doufám, že to bude začleněno i přes to, že nikdo nechápe, k čemu to vlastně je.
Jsem rád, že se objevil někdo, kdo chápe problematiku. :)
Neřekl bych že je to úplně chyba Nette. Já si používám gettext a Nette mě nikterak neomezuje. Jen jsem dal podnět k tomu že tu je v jedný metodě zbytečně moc logiky a když se rozdělí tak mám pro to využití.
Editoval h4kuna (21. 11. 2012 13:42)