Latte nezná macro {cache}

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

Ahoj,
chci stránku vykreslit jen pomocí Latte s využitím cache a autoloaderu z Nette. Mám tak nějak všechno nastavené, vytvořenou složku temp i se do ní vytvoří nějaký soubor, ale laděnka mi hlásí chybu, že nezná macro {cache}:
Latte\CompileException
Unknown macro {cache} in sablony/obsah…html:8

index.php

require __DIR__ . '/Nette/loader.php';
Tracy\Debugger::enable();

// Configure application
$configurator = new Nette\Config\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
$configurator->createRobotLoader()
	->addDirectory(__DIR__ . '/tridy')
	->register();


$tpl = new Latte\Engine();
$tpl->setTempDirectory(__DIR__ . '/temp');


$web = new tridy\Uvod();
$tplVars['obsah'] = $web->getParametry();
$tplVars['test_cache'] = 'test';

$tpl->render('sablony/obsah.html', $tplVars);

obsah.html

{extends 'web.html'}

{block obsah}
<main>
	<p>a já jsem obsah</p>
	{$obsah}
	{cache $test_cache}
	<p>a já obsah v keši</p>
	{/cache}
<main>
{/block}
Jan Endel
Člen | 1016
+
0
-

Musíš vzít ještě jako závislost do composeru „nette\caching“ které mimo jiné obsahuje i bridge pro latte pro zprovoznění tohoto makra.

Karel_243
Člen | 9
+
0
-

Děkuji, ale já composer nepoužívám a bohužel nevím, jak to přidat přes php.

Jan Tvrdík
Nette guru | 2595
+
+1
-

@Karel_243 Čas začít, máme na to v dokumentaci pěkně popsáno

mkoubik
Člen | 728
+
0
-
$tpl->addMacro('cache', new CacheMacro($tpl->getCompiler()));
Karel_243
Člen | 9
+
0
-

Děkuji, ale skončil jsem zase u jiné chyby:
Argument 1 passed to Nette\Bridges\CacheLatte\CacheMacro::createCache() must implement interface Nette\Caching\IStorage, null given, called in… line 16

 <p>a já jsem obsah</p>
14:        <?php echo Latte\Runtime\Filters::escapeHtml($obsah, ENT_NOQUOTES) ?>
15:
16:    <?php if (Nette\Bridges\CacheLatte\CacheMacro::createCache($netteCacheStorage, 'sg7xnjn6t1', $_g->caches, array($test_cache))) { ?>
17:        <p>a já obsah v keši</p>
18:    <?php $_l->tmp = array_pop($_g->caches); if (!$_l->tmp instanceof stdClass) $_l->tmp->end(); } ?>
public static function createCache(Nette\Caching\IStorage $cacheStorage, $key, & $parents, array $args = NULL)
$cacheStorage	NULL
$key			"sg7xnjn6t1" (10)
$parents		NULL
$args			array (1)
					0 => "test" (4)

Nevím, jestli to pomůže, ale pro vytvoření instance CacheMacro ji volám s celou cestou, jinak mi to nejde:

$tpl->addMacro('cache', new Nette\Bridges\CacheLatte\CacheMacro($tpl->getCompiler()));
Zax
Člen | 370
+
0
-
$tpl->addMacro('cache', new Nette\Bridges\CacheLatte\CacheMacro($tpl->getCompiler()));

===

use Nette\Bridges\CacheLatte\CacheMacro;

$tpl->addMacro('cache', new CacheMacro($tpl->getCompiler()));

Namespaces v PHP fungují strašně jednoduše, nechápu, že je to tady jeden z nejčastěji řešených problémů…

Karel_243
Člen | 9
+
0
-

O tom vím, use se používalo v nějaké starší verzi PHP, kde nebyly namespace. Asi mám nějak blbě nastavený autoload.

David Kudera
Člen | 455
+
+1
-

@Karel_243 promiň, nechci určitě rýpat, ale spíš bych řekl, že nevíš… use se používá aktuálně, rozhodně ne předtím, než byly namespace. Právě tím use totiž řekneš, jaká namespace se má použít (ostatní využití use teď neřeším). Předtím by to ani nefungovalo..

No a k příspěvku trochu výše, tak namespace není žádná cesta. To může být max tak cesta souboru, ale to není to stejné jako namespace ;-)

David Matějka
Moderator | 6445
+
+1
-

to makro vyzaduje, aby v parametru sablony netteCacheStorage bylo nejake cache storage. Takze pri vykreslovani treba

$latte->render(..., array(
	....,
	'netteCacheStorage' => new Nette\Caching\Storages\FileStorage('adresar'),
));
Karel_243
Člen | 9
+
0
-

matej21,
děkuji moc, už to šlape, jak jsem chtěl :)