„{syntax double}“ z vložených šablon se objevuje v renderovaném souboru

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

PHP 5.3.3–7, Nette Framework 2.0-alpha 2

Generuju pomocí Latte výstup v LaTeXu, takže používám v každé šabloně i podšabloně {syntax double} a řádek s tímto kódem mi občas zůstane ve výsledném vyrenderovaném souboru. Zajímavé je, že se tam objevuje jen někdy. Dělá to i když double použiju jen v podšablonách a hlavní šablona volá podšablonu z režimu latte. Bohužel nemám zrovna čas to víc řešit, tak se jen chci zeptat, jestli na to někdo narazil a jestli se toho dá nějak zbavit (jinak, než prohnad výsledný soubor regulákem).
Díky.

Mikulas Dite
Člen | 756
+
0
-

Neřeší to sice tvůj problém, ale můžeš použít n:syntax="double" jako parametr nějakého obalujícího hmtl elementu. Jestli se to (jako teď tobě) občas vypíše, tak to alespoň nebude vidět.

David Grudl
Nette Core | 8228
+
0
-

To vypadá na nějaký bug, můžeš mi poslat emailem příklad?

Martin
Člen | 171
+
0
-

Nazdar. Mám podobný problém, možná ale jde jen o špatné použití mně zatím neznámých funkcí Nette. Nezabývejte se tím zbytečně dlouho a případně mne odkažte do správné sekce. Sem jsem to dal jen proto, že při vyhledávání mi to přišlo jako nejpodobnější tomu, co se tu řeší.

Ať ukončím syntaxi kterýmkoli ze čtyř následujících způsobů, ani jedním z nich se čtení šablony nevrací k syntaxi latte.

  1. ukončení tagu … n:syntax=‚double‘> … </…
  2. ukončení pomocí {{/syntax}} nebo {{/syntax double}} nebo {{syntax latte}} (zkoušel jsem vše, nevím, co z toho je správně)
  3. pomocí konstrukce
<?php
	$filters = $template->getFilters();
	$filter = $filters[0];
	$cb = $filter->getNative();
	Nette\Debug::barDump($cb);
	$handler=$cb->getHandler();
	$handler->macroSyntax('latte');
	$cbw = clone($cb);
	Nette\Debug::barDump($cbw);
?>

4. pomocí volání

<?php
 $filter->getNative()->setDelimiters('\\{(?![\\s\'"{}])', '\\}');
?>

podobně jako v předchozím kódu.

Přitom ve všech třech případech mi to pod debuggerem prochází touto větví case:

<?php
	public function macroSyntax($var)
	{
		switch ($var) {
		case '':
		case 'latte':
...
?>

a ve všech v setDelimiters(…) nastavuje znaky správně. V druhých dvou případech to zdánlivě správně ukončuje i {syntax off} (kvůli tomu jsem to původně začal dělat, ten kód 0×100 se mi v UTF8 nějak nepodařilo procpat :-). Laděnka ukazuje správně změnu z double (nebo off) na latte (viz výpis dole), ale většinou ke změně čtení syntaxe nedojde. Naopak někdy nezafunguje ani to první {syntax double}. Pokaždé nastane chyba, pokud nesmažu cache, většinou ale i po smazání. Nemůže to s cachováním a exspirací nějak souviset? Nebo něco nastavuji špatně? Není celý problém v tom, že se o to pokouším vprostřed šablony? Používám aktuální vývojové verze.

<?php

Nette\Templates\LatteFilter(9) ▼ {
   "handler" private => Nette\Templates\LatteMacros(9) ► {
   "macroRe" private => "
			(?:\r?\n?)(?P<comment>\{\*.*?\*\}[\r\n]{0,2})|
			(?P<indent>\n[\ \t]*)?
			\{\{(?![\s'"{}])
				(?P<macro>(?:'(?:\\.|[^'\\])*'|"(?:\\.|[^"\\] ... " (213)
.........
}
________________________________________

Nette\Templates\LatteFilter(9) ▼ {
   "handler" private => Nette\Templates\LatteMacros(9) ► {
   "macroRe" private => "
			(?:\r?\n?)(?P<comment>\{\*.*?\*\}[\r\n]{0,2})|
			(?P<indent>\n[\ \t]*)?
			\{(?![\s'"{}])
				(?P<macro>(?:'(?:\\.|[^'\\])*'|"(?:\\.|[^"\\])* ... " (209)
.........
}
?>

Editoval Martin (12. 3. 2011 2:00)

David Grudl
Nette Core | 8228
+
0
-

A tohle v distribuci tests\Templates\LatteFilter.macros.009.phpt taky nefunguje?

Martin
Člen | 171
+
0
-

Ahoj. Bohužel, jak jsem již říkal a psal, o PHP vím málo a o Nette ještě méně. Takže pokud se nechceš zdržovat dotazy vyplývajícími z neznalosti, pokusím se ptát jinde. Do hlášení chyb to pravděpodobně nepatří, jen jsem nechtěl zakládat nové vlákno, když mi tady první dotaz připadal na podobné téma.

_____________

Ten příklad jsem si měl zkusit pustit, nebo použít, co je v něm? Zkusil jsem to přidat do šablony, kde se mi při čtení nevrací syntaxe. Výsledkem je:

„filters“ private ⇒ array(2) [
0 ⇒ Nette\Callback(1) {
„cb“ private ⇒ Nette\Templates\LatteFilter(9) { … }
}
1 ⇒ Nette\Callback(1) {
„cb“ private ⇒ Nette\Templates\LatteFilter(9) { … }
 }

a stále stejné chování. To <?php ->setCacheStorage(new MockCacheStorage(TEMP_DIR)); ?> tam musí být? Zkoušel jsem to obojí vložit před začátkem renderování, před změnou syntaxe i těsně před pokusem o změnu zpět, ale na chování se nic nemění, jen mám navíc soubory na disku.
Teď ale koukám, že mít jakýkoli php kód v šabloně, kterým se pokouším cosi měnit ohledně filtrování, je asi nesmysl, protože se tento kód provádí až při čtení z cache, ve které to už ale mám „vyfiltrované“ špatně. To jsou asi základní věci, které bych měl znát. Tak se tím nezabývej, až trochu pochopím podstatu, zjistím, zda jde opravdu o nějakou chybičku (jakože téměř jistě ne) a pak bych to poslal i s opravou. Zatím mám dost problémy, protože xdebug mi v NetBeans padá při pokusu ukázat proměnné a phpEd mám také nějaký nestabilní. Až někde zprovozním krokování kódu se zobrazením proměnných, nebude mi snad činit problémy odvodit si chování a možnosti Nette ze zdrojových kódů. Holt jsem rozmazlený komfortem MSVC.