Latte sablony trochu podrobnejsie

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

Zdravim, asi 3 mesiace dozadu som sem pisal na forum nieco o latte sablonach, konkretne tento post. Vidim ze je zase nova verzia Nette tak tam bude pravdepodobne vela veci pomenenych. Potrebujem vytvorit nieco ako Java Server Faces do Nette. Mohol by mi niekto skuseny priblizit ako funguju Latte sablony?

  • Zatial som si do nette/application/ui/presenter.php pridal zobrazovanie .xhtml sablon
  • ak spravne chapem tak registracia latte filtra prebieha v nette/application/ui/control.php ? konkretne
<?php
public function templatePrepareFilters($template)
{
    $template->registerFilter($this->getPresenter()->getContext()->nette->createLatte());
    //takze sem by som si pridal nieco ako registerFilter(...->nette->createFaces());
}
?>

nemozem vsak najst metodu createLatte() aby som si pozrel ako vyzera

  • dalej studujem zdrojaky Nette/Latte ale viem z toho vycitat velmi malo ked nevidim ako sa tie metody volaju, v akom poradi atd..
  • ako to vidim ja: najskor sa asi na cely text sablony zavola Nette/Utils/Tokenizer ktory spracuje text do tokenov. V \Latte\Engine.php sa vytvori novy Parser a Compiler a predpokladam ze dalej sa pole tokenov najskor parsuje(nahradzuju sa makra za dalsi kod) a po parsovani sa cely text este skompiluje(v pripade ze tam je nejaky php kod, ako trebars pri {foreach} atd.. ?

Dik moc za kazdu odpoved!

Filip Procházka
Moderator | 4668
+
0
-

Potrebujem vytvorit nieco ako Java Server Faces do Nette.

Schválně jsem si načetl co to je a moc moudrej z toho nejsem. Přijde mi to tak samozřejmé, že nechápu, naco je tam tak šílená onanie s XMLkem, ale možná jsem jenom moc rozmazlenej Lattečkem :)

Zatial som si do nette/application/ui/presenter.php pridal zobrazovanie .xhtml sablon

To by mě zajímalo jak jsi to udělal, protože Nette používá koncovky .latte a v šabloně může být jak XML, tak XHTML, i HTML(5).

ak spravne chapem tak registracia latte filtra prebieha v nette/application/ui/control.php ? konkretne

V UI\Control je nastavení šablony pro komponentu (takže i presentery). Takže ano, v UI\Control se připojuje Latte Engine.

nemozem vsak najst metodu createLatte() aby som si pozrel ako vyzera

Ta se totiž generuje do zkompilovaného DI Containeru jako továrnička. Více zde.

dalej studujem zdrojaky Nette/Latte ale viem z toho vycitat velmi malo ked nevidim ako sa tie metody volaju, v akom poradi atd..

Nejdříve se načte šablona, předá se do Nette\Latte\Parser, který udělá z šablony tokeny. Pole tokenů se následně předá do Nette\Latte\Compiler, který celé pole proiteruje a zkouší na jednotlivé tokeny aplikovat makra (pokud se jedná o makra). Jde o horkou novinku, dříve tohle celé bylo v jedné třídě.

Na pozadí se samozřejmě využívá stavový automat, protože samotným tokenizerem, který je v Nette, by to nešlo, jelikož Parser má různé kontexy a potřebuje měnit způsob zpracování zbytku šablony, na základě aktuálního tokenu.

Ale samotný obsah maker ti už na pozadí obstarává Nette\Utils\Tokenizer, což je ale celkem detail.

Editoval HosipLan (29. 1. 2012 12:06)

hizo
Člen | 48
+
0
-

Diky, na tie odkazy sa hned pozriem. Java Server Faces – v podstate ide o to, ze si v html elemente definujes namespace pre nejaku sadu znaciek, napriklad < html xmlns:h=„http://www.neco.cz/html“ >, v dokumente potom mozes pouzivat znacky z tejto sady, dajme tomu < h:inputText / > co by mi moj filter zmenil vo vyslednom kode na < input type=„text“ >…samozrejme html netreba nahradzat,to bol len priklad. Takze potreboval by som vediet ako pracuje ten stavovy automat a ako sa nahradzaju makra pri zisteni ze ide o nejake makro(tak isto by som nahradzal svoje znacky pri najdeni nejakeho prefixu). Staci mi teda spravit si novy Compiler?

k tej podpore xhtml sablon: viem ze sa to da napchat vsetko do latte, no veduci chcel aby sa sablony dali od seba odlisit(.xhtml je tiez zatial len testovacie, moze tam byt .xml alebo hocico ine), preto v Nette/Application/UI/Presenter.php:

<?php
public function formatTemplateFiles()
	{
		$name = $this->getName();
		$presenter = substr($name, strrpos(':' . $name, ':'));
		$dir = dirname(dirname($this->getReflection()->getFileName()));
		return array(
			"$dir/templates/$presenter/$this->view.latte",
			"$dir/templates/$presenter.$this->view.latte",
			"$dir/templates/$presenter/$this->view.phtml",
			"$dir/templates/$presenter.$this->view.phtml",
			"$dir/templates/$presenter/$this->view.xhtml",
			"$dir/templates/$presenter.$this->view.xhtml",
		);
	}
?>
Filip Procházka
Moderator | 4668
+
0
-

Java Server Faces

To je hrozny psycho :)

Takze potreboval by som vediet ako pracuje ten stavovy automat a ako sa nahradzaju makra pri zisteni ze ide o nejake makro (tak isto by som nahradzal svoje znacky pri najdeni nejakeho prefixu).

Hromady šílené teorie. Zkus si prostě prostudovat kód Latte ;) Stejně tomu potřebuješ porozumět do hloubky (dej tomu aspoň den, dva)

Staci mi teda spravit si novy Compiler?

Mě pořád nejde do hlavy, že máš znovu-vynalézat kolo jako školní práci… To je prostě na hlavu :)

k tej podpore xhtml sablon…

Takže žádná „podpora“ se nekoná, jenom jsi upravil formatter, aby přijímal i jiné koncovky :)