Rozdělení rendrování a kompilace šablony

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

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)

enumag
Člen | 2118
+
0
-

Možná hledáš tohle, ale mohl bys vysvětlit k čemu to potřebuješ? Připadá mi to jako velmi špatný nápad, bylo by lepší vymyslet jiný způsob.

h4kuna
Backer | 740
+
0
-

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.

enumag
Člen | 2118
+
0
-

Znovu: k čemu to potřebuješ?

h4kuna
Backer | 740
+
0
-

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)

enumag
Člen | 2118
+
0
-

Je mi líto, ale nechápu. Nejspíše proto že nepoužívám překlady.

Filip Procházka
Moderator | 4668
+
0
-

Takže v podstatě potřebuješ šablonu jen naparsovat, ale né kompilovat

voda
Člen | 561
+
0
-

GettextExtractor umí extrahovat řetězce přímo za Latte šablony a pak není potřeba nic kompilovat.

h4kuna
Backer | 740
+
0
-

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

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

Filip Procházka
Moderator | 4668
+
0
-

To nechápu :) Ale budiž ;)

h4kuna
Backer | 740
+
0
-

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().

  1. používám naprosto čistý gettext žádný ITranslator
  2. abych zajistil nalezení textů poeditem v šablonách spustím výše popsaný foreach cyklus
  3. 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
+
0
-

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

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)

pekelnik
Člen | 462
+
0
-

Toto je jiste regulerni pozadavek.

Poslouchaj, h4kuna, poslali voni uz pull request?

Pro ty kteri nechapou o co jde: Pomoci nastroje xgettext neni mozne projizdet nezkompilovane *.latte sablony.

h4kuna
Backer | 740
+
0
-

Jsem si nebyl jist, podle diskuse výše, tak jsem rád že jsi to posvětil :)