„{syntax double}“ z vložených šablon se objevuje v renderovaném souboru
- zirafka
- Člen | 12
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
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.
- Martin
- Člen | 171
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.
- ukončení tagu … n:syntax=‚double‘> … </…
- ukončení pomocí {{/syntax}} nebo {{/syntax double}} nebo {{syntax latte}} (zkoušel jsem vše, nevím, co z toho je správně)
- 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
A tohle v distribuci
tests\Templates\LatteFilter.macros.009.phpt
taky nefunguje?
- Martin
- Člen | 171
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.