Kombinace texyElements vs. curlyBrackets

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stpnkcrk
Generous Backer | 190
+
0
-

Začal jsem v app používat filtr texyElements. Ano, vím, že je teprve ve fázi vývoje, ale prostě <texy> ... </texy> se mi líbí více než {block|texy} ... {/block}.

Relativně to funguje. Problém ovšem nastává, pokud uvnitř <texy> ... </texy> používám jakoukoliv curlyBrackets syntaxi. Zkusil jsem obě pořadí registrace filtrů, ale obě zlobí. Problémy jsou:

Pokud je nejdřív texyElements a až poté curlyBrackets, nelze používat objektové proměnné (> totiž Texy nahradí za &rt; dřív, než prijde ke slovu curlyBrackets a ten potom řve, že takovou proměnnou nezná), pokud je nastaven imageModule->root a pro název obrázku se používá výpis proměnné, tak je nemožné používat absolutní cestu, protože v době zpracovávání Texy je tam [* {$promenna} *] a Texy tam přidá ten root.

Pokud je nejdřív curlyBrackets a poté až texyElements (řekl bych logičtější postup), nastává chyba při jakém koliv výpisu proměnné přes curlyBrackets, protože místo obsahu to vypíše něco na způsob @php:p10@. A zkoušel jsem jak {$promenna}, tak {!$promenna}.

Napadá někoho z Vás, jak z toho ven?

Editoval skocourek (24. 1. 2009 17:36)

kravčo
Člen | 721
+
0
-

Podobný problém som riešil dávnejšie, vyriešil som ho tak, že som opustil texyElements…

V tvojom prípade totiž nie je ani jedno poradie správne, v tom je ten problém…

Zoberme si jednoduchý príklad:

<texy>{!$data->text}</texy>

Na chvíľu predpokladajme, že by to nevypísalo tie divné značky ale to, čo má:

  1. poradie texy, curly:

    To, čo je medzi texy tagmi zožerie texy, vypľuje XHTML – minimálne zobáky escapuje, teda curlysyntax pokazí. Výsledkom je

    <p><?php echo $data-&gt;text ?></p> // Parse error: ...
  2. poradie curly, texy:

    Prebehne náhrada curly. To čo vygenerovalo curly dostane Texy ako vstup, sparsuje to a dá výsledok

    <p>&lt;?php echo $data-&gt;text ?&gt;</p>

    čo nie je celkom to, čo by sme očakávali, že áno…

Ako to funguje naozaj:

Od revízie 179 (28.12.2008) je php kód chránený pred filtrami tak, že namiesto neho filtrami prechádzajú značky, vtedy v tvare <php:p číslo >, od revízie 197 (21.01.2009) v tvare \x01@php:p číslo @\x02. Ani jedna z týchto značiek neprejde cez Texy nezmenená, zrejmé je, že zobáky escapne, čo je však menej zrejmé je, že \x01 a \x02 sa v ňom stratia, Texy ich totiž používa na svoje interné značenia… a tak sa značky neprevedú späť na kód a vypíšu sa ich zmenené podoby namiesto toho, aby sa vykonal kód, ktorý zastupujú.

Prečo tieto dva filtre v takomto spojení nie sú dobré?

Oni totiž nebudú fungovať tak, ako by mali. V prípade, že napríklad značky zameníš za @@php:p číslo @@@, bude to robiť to, čo od toho očakávaš, ale nie to, čo by malo – totiž texy síce prebehne text, ktorý je v šablóne natvrdo, ale nie hodnoty, ktoré sa doň dostávajú dynamicky.

Vráťme sa k príkladu a nech $data->text je povedzme

"príklad":http://example.com

Tento text nám šablóna z pôvodného príkladu vypíše AS IS, zatiaľ čo, ak šablónu upravím takto:

{block|texy}{!$data->text}{/block}

vypíše mi odkaz – to čo by som normálne očakával.

filter texyElements sa dá použiť na statický text, v ktorom nie sú žiadne premenné, ale tým, že už funguje aj {block|texy}, stáva sa len akousi oldschoolovou alternatívou…

Editoval kravco (24. 1. 2009 19:21)