Detekce použitých maker v šabloně

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

Zdravím, dělám na projektu který nevyužívá celý Nette FW, ale jen některé části.

Před vyrenderováním šablony, potřebuji detekovat, zda-li je v ní použito makro {bundle}.
Káždé použité {bundle} makro následně uložit do kolekce i se specifikovanými hodnotami.

Teprve potom renderovat šablonu.

Latte a registrace makra

$latte_engine = new Latte\Engine;

$macro_set = new MacroSet($latte_engine->getCompiler());

$macro_set->addMacro('bundle', function ($node, $writer){
    return $writer->write('dump([%node.args])');
});

// TODO: něco takového
// dump($latte_engine->getUsedMacros());

$latte_engine->render( __DIR__ . '/myDir/@homepage.latte', $param);

Použití v šabloně

{bundle variable, homepage.nav.top, extra => [myFirstParam => NULL, mySecondParam => 10]}
GEpic
Člen | 562
+
0
-

jzapletal napsal(a):

Zdravím, dělám na projektu který nevyužívá celý Nette FW, ale jen některé části.

Před vyrenderováním šablony, potřebuji detekovat, zda-li je v ní použito makro {bundle}.
Káždé použité {bundle} makro následně uložit do kolekce i se specifikovanými hodnotami.

Teprve potom renderovat šablonu.

Latte a registrace makra

$latte_engine = new Latte\Engine;

$macro_set = new MacroSet($latte_engine->getCompiler());

$macro_set->addMacro('bundle', function ($node, $writer){
    return $writer->write('dump([%node.args])');
});

// TODO: něco takového
// dump($latte_engine->getUsedMacros());

$latte_engine->render( __DIR__ . '/myDir/@homepage.latte', $param);

Použití v šabloně

{bundle variable, homepage.nav.top, extra => [myFirstParam => NULL, mySecondParam => 10]}

To před renderem šablony neuděláš, protože před renderem latte_engine neví, kolik jich tam bude, to až metoda render potom nahradí {bundle…} za php kód.

Můžeš si ale před renderem projet obsah souboru se šablonou funkcí preg_match_all která ti vrátí počet vyhovujících záznamů (tedy počet maker)

Z hlavy:

$file = file_get_contents(__DIR__ . '/myDir/@homepage.latte');
$count = preg_match_all('~\{(bundle)([^\n]*)\}~'}, $file);

Editoval GEpic (27. 8. 2016 13:01)

jzapletal
Člen | 5
+
0
-

Napadlo mě to samé. Ale ještě by mě zajímalo, jak latte přistupuje ke {component}, když používám celý nette.

Když vlastně někde v šabloně zavolam {component myComponent}, tak se před renderem provede její logika.

Co si matně pamatuji, tak se provede teprve tehdy, když je komponenta {component myComponent} volána v šabloně.