Jak předat řetězec helperu?

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

Ahoj,

DOUFÁM, že je to jen mou neznalostí, ale neumím předat výraz typu řetězec helperu:

{'cosi'|truncate:1}

Tato konstrukce se bohužel nezkompiluje. Proč?
Na čísla to dle https://latte.nette.org/cs/filters#… funguje.

Díky za vysvětlení

Tirus91
Člen | 199
+
0
-

@KrawN
nemělo by to být?

{'cosi'|truncate:1}

nebo

{var $string = 'cosi'}
{$string|truncate:1}
David Matějka
Moderator | 6445
+
+3
-

melo by jit {='cosi'|truncate:1}

KrawN
Člen | 17
+
0
-

@Tirus91
První možnost jsem samozřejmě měl na mysli, jen se to tu zobrazilo jináč. Nefunguje.
Druhá možnost samozřejmě funguje, ale je těžce nepraktická. Díky.

@matej21
Děkuji, dříve jsem tam nesprávně používal !, ale účel to splnilo. = funguje, jak jsem potřeboval.

Otázky:

  1. Proč to není v dokumentaci?
  2. Je nějaký důvod proč vývojáři neumožní {‚cosi‘|truncate:1}?
David Matějka
Moderator | 6445
+
+2
-

1. je

Alternativně lze použit zápis s rovnítkem {=expression}.

Filip Procházka
Moderator | 4668
+
0
-

Prostě se nepočítá s tím, že bude někdo chtít vypisovat a upravovat „statickej“ string. Jaký má smysl taková operace? Není asi milionkrát efektivnější prostě napsat c místo {"cosi"|truncate:1} ?

David Matějka
Moderator | 6445
+
+1
-

@FilipProcházka obcas pouzivam neco jako

{="now"|date}

ale jde i o konzistenci. Kdyz jde zapsat

{=$foo}
i
{="foo"}

proc pak jde zapsat {$foo} ale uz ne {"foo"}?

Filip Procházka
Moderator | 4668
+
0
-

Protože latte je tak implementované a žádné makro {" není v latte zaregistrované. Neříkám že by to nešlo, ale prostě to Latte teď neumí :)

Pullrq? :)

David Matějka
Moderator | 6445
+
0
-

@FilipProcházka tim to neni, problem je tady, konkretne ![\\s\'"{}], kdyz ty apostrofy (a uvozovky) odmazu, tak je to funkcni, testy projdou a vsechno. Jen nevim, jestli to neco nerozbije.
U uvozovek me napada, ze by to rozbilo json retezce,

{"foo": "bar"}

by to nove bralo jako makro…
A povolenim pouze apostrofu a ne uvozovek se dostavame jeste do vetsi nekonzistence :(

David Grudl
Nette Core | 8099
+
0
-

Je to proto, aby to nekolidovalo s JSONem {"aa":123} nebo JavaScriptem {'aa':123} či { 'aa':123 }

KrawN
Člen | 17
+
0
-

Díky za vysvětlení a omlouvám se za osočení dokumentace :).

Uznávám, že JSON a javascript možná použiji častěji (ikdyž kolegové tu běsní, že ne). ALE i tak je konstrukce {'aa':123} ve smyslu js nekonzistentní se zbytkem Latte. function(){1} je javascript, ale Latte bude ty složené závorky parsovat. Kdo někdy přidával Google Analytics ví, že tam javascript koliduje s Latte a tak to má být. Správný zápis js by podle mě měl být explicitně, jak uvedl David, { 'aa':123 } či function(){ 1 }.

Díky za další reakce

Editoval KrawN (10. 9. 2014 10:09)

CZechBoY
Člen | 3608
+
0
-

A proč třeba nedávat javascript do souboru?
Já mám GA v souboru a Latte mi to neparsuje.

David Grudl
Nette Core | 8099
+
0
-

Nejde o to, že by to bylo nekonzistentní, prostě v určitých situacích si umí Latte znak = doplnit a v určitých ne.

Jan Tvrdík
Nette guru | 2595
+
+3
-

@DavidGrudl Osobně se mi víc líbilo, když Latte = nedoplňovalo nikdy a existovalo samostatné makro $. Ta současná implementace je víc magická, ale zase chápu, že je pěkné, že fungují intuitivní věci jako {$var + 1}.

KrawN
Člen | 17
+
0
-

@DavidGrudl
Dobře, ale tímpádem mi v tom trochu chybí systém.

Z pohledu uživatele jsem toho názoru, že je intuitivnější říct si „použiju literál stejným způsobem jako proměnnou“ bez přemýšlení nad tím, jestli se to někde kryje s nějakými konkrétními konstrukcemi cílového jazyka.

Filip Procházka
Moderator | 4668
+
0
-

Je fakt, že mimo kontext javascriptu by to mohlo fungovat… Ale pak jsou zase problém html attributy… u některých by to fungovat zase nesmělo, třena onclick, data- apod.

KrawN
Člen | 17
+
0
-

Možná se na to koukám moc systematicky (a ne prakticky), ale opravdu se Vám líbí takovéto "tady jo a tady ne, tady jen někdy.. ". Prostě je tu jednou Latte a to má mít svůj zápis výrazů, helperů apod. Context-awareness si představuju jinak.

David Grudl
Nette Core | 8099
+
0
-

@KrawN nevím, co je na jednoduchém a všude platném pravidlu, že po otevírací { nesmí následovat uvozovka nebo mezera, tak nesystémového a nahodilého?

KrawN
Člen | 17
+
0
-

@DavidGrudl
Davide, jsme přeci jen programátoři, takže mi dovol se pokusit opsat tvé jednoduché pravidlo jinými slovy:
Za { nesmí následovat bílý znak. Může následovat literál, ale pouze číselný, nebo řetězec bez uvozovek, který ovšem neobsahuje nějaký rezervovaný nebo jinak nemístný znak na svém začátku.
Pořád ok?

David Grudl
Nette Core | 8099
+
0
-

Zkomplikoval jsi to a udělal velmi nepřesné. Ok.

KrawN
Člen | 17
+
0
-

Zkrátka použiju {=

Myiyk
Člen | 321
+
+1
-

Tak mě napadá možnost, že by mohlo existovat makro „json“

{json 'aa':123}

A kdybych chtěl vypsat statický text, udělal bych to s uvozovkama

{"aaa"}
nebo
{'aaa'}
Filip Procházka
Moderator | 4668
+
+1
-

@KrawN těším se na tvůj pullrequest/RFC které to vyřeší :)

KrawN
Člen | 17
+
0
-

@Myiyk
Podle mě je makro json zbytečné, protože vlastně nedělá nic, co jsi už nenapsal.
{ 'aa':123 }
je dostatečné.
Účelnější je
{$array|json}

David Grudl
Nette Core | 8099
+
0
-

Dalo by se to upravit tak, aby Latte rozlišilo mezi {"aa":123} a {"aa"}, tj. rozšířit podmínku o to, zda za ukončovací uvozovkou následuje \s*:

Ale je to komplikování.