Použití helperů v marku link
- Vyki
- Člen | 388
Narazil jsem na zvlášní chování v případě ze použiju helper na
některý z parametrů v marku link. Například:
{link this, $currDir|upper}
provede to, že tvar celého
generovaného odkazu je velkými písmeny.
{link this, $currDir|upper, $currDir|lower}
provede to, že tvar
celého generovaného odkazu je malými písmeny, protože zde patrně platí
logika posledního volaného helperu.
Čekal bych, že se helper aplikuje pouze na parametr, u kterého jej volám.
Osobně to používám v případě, že se za proměnnou ukrývá cesta k obrázku na disku „C:\server\web/images/picture.gif“, ale v parametru odkazu chci mít cestu pouze ve tvaru „index.php?image=/images/picture.gif“. Mám na to napsán helper, který všude jinde kromě v makru link funguje.
{link this, $image|toWebPath}
očekával bych, že se helper
aplikuje na parametr $image, ale bohužel se ukazuje, že jako parametr dostane
celý generovaný link, takže to logicky nefunguje.
Nevím, možná je záměr, že to běhá takto, ale osobně mi to nepřijde
moc logické a v případě
{link this, $currDir|upper, $currDir|lower}
, kde se helpery tlučou
mi to přijde naprosto špatně.
Editoval Vyki (19. 10. 2010 23:11)
- David Grudl
- Nette Core | 8228
Helpery lze volat vždy jen na celé makro, takže
{link this, $currDir|upper, $currDir|lower}
vůbec nemůže
fungovat. Aplikování na jednotlivé parametry je trošku syntaktický
oříšek a proto ho lze (zatím) docílit jen „manuálně“, tj.
{link this, $template->upper($currDir), $template->lower($currDir)}
.
Zjednodušenému použití přes svislítko brání jednak zpětná
kompatibilita (co by mělo udělat {makro $variable|lower}
?) a
stanovení rozsahu (má se chovat stejně
{link this, 'a' . $currDir|upper}
vs.
{link this, 'a'.$currDir|upper}
?).
- David Grudl
- Nette Core | 8228
Jaksi +1 v tomto případě věc neposouvá. Tedy ani v jiných případech to nic neřeší, protože jestli na stránkách Nette něco rozhodně neexistuje, tak to je demokracie :-))
- Vyki
- Člen | 388
David Grudl napsal(a):
co by mělo udělat{makro $variable|lower}
?) a stanovení rozsahu (má se chovat stejně{link this, 'a' . $currDir|upper}
vs.{link this, 'a'.$currDir|upper}
?
V tomto případě bych to aplikovat na celý ten spojený řetězec v obou případech, ale to je pohled jednoho člověka. Diskuze nebo anketa na toto téma by nebyla špatná.
Jinak jsem do toho trochu šťoural a zjistil jsem, že se to celé chová
nějak divně. Pokud použiju link {link this, 'AHOJ', 'test'}
vygeneruje podle předpokladu
/gallery.backend.advimage/list?paramDir=AHOJ&extra=test
. Pokud
chci link {link this, 'AHOJ'|lower, 'test'|upper}
vygeneruje
/GALLERY.BACKEND.ADVIMAGE/LIST?PARAMDIR=AHOJ
to znamená, že se na
celé makro aplikuje helper uvedený za druhým parametrem, ale zárověň se
druhý parametr vytratí. Žádné errory to ale nehází a v pohodě se to
vypíše.
Editoval Vyki (20. 10. 2010 18:29)
- David Grudl
- Nette Core | 8228
{link this, 'AHOJ'}
na něj se aplikuje helper
lower
s parametrem 'test'
a na výsledek helper
upper
.
Tj. {link this, 'AHOJ' |lower,'test'|upper}
- David Grudl
- Nette Core | 8228
Lze použít obojí. Dvojtečku používá Smarty, čárka je zase běžnější v PHP.
- David Grudl
- Nette Core | 8228
Dvojtečka nic neřeší. Stále není zřejmé, co udělá
{link this, $cond ? $currDir|upper : $currDir|lower}
- jansfabik
- Člen | 193
David Grudl napsal(a):
Dvojtečka nic neřeší. Stále není zřejmé, co udělá
{link this, $cond ? $currDir|upper : $currDir|lower}
Co takhle povinné uzávorkování:
{link this, $cond ? ($currDir|upper) : $currDir|lower}
(aplikuje lower na celé makro){link this, ($cond ? ($currDir|upper) : $currDir|lower)}
{link this, $cond ? ($currDir|upper) : ($currDir|lower)}
- westrem
- Člen | 398
No musim sa priznat, ze ma trochu prekvapilo pouzitie makier v tomto smere a
vyznamu. Resp. konkretne u makra {link ..}
, vsak David ma pekny clanok o tom, co to
moze sposobovat, a ze ista konvencia je lowercase, a osobne si myslim, ze do
tejto podoby by sa mal parameter upravit uz pred sablonou (konkretne v pripade
linku).
Teraz k pouzivaniu helperov na argumenty obecne. Neviem ale kde je problem pri konkretne tomto:
{link this, $cond ? $currDir|upper : $currDir|lower} //imho dost jasne ako by sa mali aplikovat helpery
Problem vsak vidim
- v spetnej kompatibilite
{makro $variable|lower}
– toto by bol pruser ak by sa zacalo chovat inak - ako pise David v zistovani rozsahu
{link this, 'a' . $currDir|upper}
– viem si predstavit aj vecsie zveriny a neviem ako by sa dalo pekne urcit co uz spada pod kompetenciu makra a co uz nie
Napadaju ma vsak 2 pseudoriesenia
- nepouzivat na helpery pre parametry obycajnu lajnu
|
ale double||
tzn.{makro $variable||lower}
– znazornuje to akoby zanorenie o level nizsie vramci aplikacie makra, preto double lajna - anotovat zaciatok aplikacie makra pomocou striesky
^
ako pri regexpoch sa anotuje zaciatok vyrazu tzn.{link this, ^'a' . $currDir||upper}
Na zaver len otazka, David, pises, ze by to bol syntakticky oriesok, mozes to aj trochu upresnit? Cisto z dovodu, ze ma to zaujima, co tam je ako prekazka vramci parsingu, dakujem.
- David Grudl
- Nette Core | 8228
||
je docela často používaný operátor OR.
westrem napsal(a):
Na zaver len otazka, David, pises, ze by to bol syntakticky oriesok, mozes to aj trochu upresnit?
Oříšek je zvolit správnou syntaxi, aby to bylo srozumitelné, s ničím nekolidovalo a bylo zpětně kompatibilní.
jansfabik napsal(a):
Co takhle povinné uzávorkování:
{link this, $cond ? ($currDir|upper) : $currDir|lower}
(aplikuje lower na celé makro)
Jo, to dává smysl.
- Vyki
- Člen | 388
Je jasné, že aby to bylo zpětně kompatibilní, musí se pro aplikaci
helperu na parametr zavést nějaký jiný oddělovač. Když ne ||
co třeba {link this, $currDir|>upper, $parentDir|>lower}
? Je
to jenom nápad, možná je to pitomost, ale moc použitelných znaků, které
neznamenají nic moc klíčového nezbývá.
- westrem
- Člen | 398
@Vyki dakujem za sympatiu, avsak ked som to pisal, nenapadlo ma, ze v templates sa mozu na urcitych miestach vyhodnocovat aj podmienky a preto ako pise David asi by to uplne nebolo koser kvoli OR operatoru.
To uzatvorkovanie pride aj mne ako najschodnejsie, no pre pripad, ze by niekto silne chcel podla znaku tak mame na vyber asi nasledovne
~
– vyuziva sa ako nieco? Okrej bitovej negacie%
– sluzi ako modulo operator, takze by mohlo byt problematicke§
– nenapise sa na en klavesnici, co by mohlo velke minus pre niekoho@
– ak sa uz nebude praktizovat zavinacova magia, vyuziva sa na nieco?&
– tu ma nenapada ziadna prekazka
Vysledok by bol asi nasledovny:
{macro $atr~lower}
{macro $atr%lower}
{macro $atr§lower}
{macro $atr@lower}
{macro $atr&lower}
Osobne mi z toho pride najcitatelnejsie jedine to s tildou ~
.
Je to len ukazka podla mna nejakych volnych znakov k dispozicii avsak
zatvrokovaniu sa nijak nebranim.
Ostava este, co na to povie David.
- David Grudl
- Nette Core | 8228
westrem napsal(a):
Ostava este, co na to povie David.
Jsem rozhodně pro závorkování, ale ještě uvidíme, jak to bude komplikované na implementaci (nemělo by být).
- jansfabik
- Člen | 193
westrem napsal(a):
To uzatvorkovanie pride aj mne ako najschodnejsie, no pre pripad, ze by niekto silne chcel podla znaku tak mame na vyber asi nasledovne
{macro $atr~lower} {macro $atr%lower} {macro $atr§lower} {macro $atr@lower} {macro $atr&lower}
O tomhle nemá smysl ani uvažovat – UNIXová pajpa se už používá desítky let a každý si pod ní hned představí, jak se bude chovat. Třeba ta zmíněná vlnovka je zase spojená s negací, procento s modulem atd.
David Grudl napsal(a):
Jsem rozhodně pro závorkování, ale ještě uvidíme, jak to bude komplikované na implementaci (nemělo by být).
Řekl bych, že tam bude trochu problém třeba u ifů, protože tam se teď helpery používat nedají (nemá to význam), kdežto teď by to už význam mělo.