Latte escapuje prázdný string na uvozovky

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

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
+
+1
-

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
+
0
-

Díky za odpověď! Myslím, že jsme se ale nepochopili, já nepřidávám další třídu, ale další atribut do html tagu. Například selected u vybrané možnosti v tagu <option> v <select>. Pokud je proměnná s prázdným stringem uvedena v jiném kontextu v html kódu, negeneruje se nic.

Bogi
Člen | 24
+
0
-

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…

GEpic
Člen | 566
+
0
-

Kdybys udělal místo tohoto:

<div class="form-group" {$variable}>

Toto:

<div class="form-group {$variable}">

Tak máš vystaráno.

Já třeba hodně často používám toto:

<div class="col-lg-{$width}"></div>

a pod.

Editoval GEpic (21. 8. 2016 2:15)

Bogi
Člen | 24
+
+1
-

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
+
+1
-

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
+
+1
-

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
+
0
-

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
+
+2
-

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.

Bogi
Člen | 24
+
0
-

@DavidMatějka Díky za objasnění! :-)