podpora layoutu u obyč. Template

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

Ahoj, chci dosáhnout následujícího: z důvodu jednoduchosti některých šablon(na řádek) je chci zapsat rovnou v presenteru. Jelikož neexistuje setTemplate(), tak to se dá vyřešit přepsáním createtemplate a přidáním extra property:

	public $iDontWantFileTemplate = false;

	function createTemplate($class = NULL)
	{
		if (!$this->iDontWantFileTemplate)
			return parent::createTemplate();
		else
			// k tomuhle se taky vrátím *
			$class='Nette\Templating\Template';
			return parent::createTemplate($class);
	}

	function latte($source)
	{
		$this->iDontWantFileTemplate = true;
		$t = $this->template;
		$t->setSource($source);
	}

Metoda latte, mi to obalí, takže lze zapsat jen $this->latte('Ahoj{control form}');

teď jen tak na okraj (hvězdička) : nešlo by upravit createTemplate, aby kromě stringu přijímala i instanci? IDE potom může napovídat a je to komfortnější. Sice teď je to možné taky, akorát to spíš považuji za hack:

$t = new Nette\Templating\Template;
$t->blah=1; $t->registerHelper(...);
$t2 = $this->createTemplate($t); //vezme třídu $t a z ní vytvoří další instanci.
$t2->blah není;

Ale k hlavnímu problému:

(V případě, že vytvořím filetemplate, tak je vše v pořádku). Ale šablona třídy template se vykreslí bez layoutu.

  • Pokud přidám ‚{extends mujalyout.latte}‘ do šablony, tak mi po 6 sekunách a 60 MB shoří php s chybou:

Errors1× PHP Warning: include(C:\we..ce9.php): failed to open stream: Too many open files in C:\w..\LimitedScope.php:73
1× PHP Warning: include(): Failed opening 'C:\we..e9.php' for inclusion (include_path='.') in C:\we..ls\LimitedScope.php:73

Zkusil jsem tedy ještě do metody latte přidat

		$file=__DIR__."/../templates/@layout.latte";
		$t->_extends=$file;
		$t->extends=$file;
		$t->layout=$file;

Ale opět bez výsledku.

Nevíte, jak s tím pomoci, nebo jsem něco dělám špatně? Zběžně jsem se díval do zdrojáku a mám podezření na CoreMacros::includetemplate.

EDIT. Vážně zakopaný pes je Zde . Totiž layout(což má být filetemplate) se vytvoří pomocí clone aktální template, což je Template, Nedojde k zavolání setFile… Nevíte jak z toho ven? To by asi chtělo přepsat továrničku na šablony, aby se používalo něco chytřejšího než clone a oddělit předávání paramentrů typu basepaj, user…

Teď mě napadlo předat do šablony $_extends přímo objekt FileTemplate …

Editoval bojovyletoun (8. 1. 2012 19:21)