Latte escapuje prázdný string na uvozovky
- Bogi
- Člen | 24
K čemu je dobré escapovat prázdný string v Latte na 2 dvojité uvozovky? Děje se tak pouze, pokud se proměnná/výraz vypisuje v html tagu:
{php $variable = '';}
<div class="form-group" {$variable}>
výsledek:
<div class="form-group" "">
Narazil jsem na toto chování poprvé u zkráceného ternárního operátoru:
<option value="hodnota" {$variable ? 'selected'}>
jmeno
</option>
což vytvoří toto:
<option value="hodnota" "">
jmeno
</option>
- CZechBoY
- Člen | 3608
Lepsi pouzit atribut n:class
<div n:class="form-group, $variable">
https://latte.nette.org/cs/tags#…
Editoval CZechBoY (20. 8. 2016 21:15)
- Bogi
- Člen | 24
Děkuji! Můj problém je vyřešen :-)
Konkrétně můj use case je tento (jedná se o legacy code, proto hodně
logiky v šabloně :-( ):
<option n:attr="selected => $editing && $product['category'] == $row['id']">
Přesto by mě i tak zajímala odpověď na mou původní otázku, k čemu je dobré escapovat prázdný řetězec na uvozovky…
- Bogi
- Člen | 24
Díky za odpověď, ale jak už jsem psal výše, nepřidávám další class, ale atribut do html tagu :)
Nejlepší řešení je pro mě n:attr makro, jak uvedl @DavidMatějka, tady ještě jednou v jednodušší verzi:
<option n:attr="selected => $variable">
nebo případně
<option n:attr="selected => expression">
abych dostal
<option selected>
nebo pouze
<option>
Ale jenom tak pro informaci by mě stále zajímala odpověď na mou původní otázku…
- GEpic
- Člen | 566
https://doc.nette.org/…y-protection#…
Mrkni na toto a koukni se do výpisu:
{php $var = ""}
<script>
var test = {$var};
</script>
A pak zkus toto:
{php $var = ""}
<script>
var test = {$var|noescape};
</script>
Dle mého tam latte escapuje uvozovky protože se jedná o use-case, kde by se měli použít n:makra a s tímto případem nepočítá.
Editoval GEpic (21. 8. 2016 4:42)
- hitzoR
- Člen | 51
GEpic napsal(a):
https://doc.nette.org/…y-protection#…
Mrkni na toto a koukni se do výpisu:
{php $var = ""} <script> var test = {$var}; </script>
A pak zkus toto:
{php $var = ""} <script> var test = {$var|noescape}; </script>
Dle mého tam latte escapuje uvozovky protože se jedná o use-case, kde by se měli použít n:makra a s tímto případem nepočítá.
No jo, ale neřeší tohle náhodou context-aware escaping? Uprostřed javascriptu to samozřejmě smysl dává, ale mezi atributy HTML tagů je to dost zvláštní.
- Bogi
- Člen | 24
Ano, jak říkáte, určitě to způsobuje Context-Aware Escaping, jen mi vrtá hlavou, k čemu je to dobré v html tagu. Ale možná existuje případ, kdy je to potřeba… anebo to nikdo nikdy neřešil, protože je to natolik okrajový případ a jak píše @GEpic, měly by se v takovém případě použít n:makra…
- David Matějka
- Moderator | 6445
iirc, uvnitr html tagu escapuje latte vzdy jako by to byla hodnota atributu,
neni tak chytre, aby to dokazalo rozpoznat nazev atributu a jeho hodnotu. a
jelikoz by treba value=
nebylo validni, tak to vypise jako prazdny
retezec.