Použití helperů v marku link

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

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

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}?).

jtousek
Člen | 951
+
0
-

@DG: Je mi jasné, že se to líp řekne než udělá, ale +1 aby to fungovalo. :)

David Grudl
Nette Core | 8170
+
0
-

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 :-))

jtousek
Člen | 951
+
0
-

Toho jsem si plně vědom. XD

<OT>Davide, mohl bys pls nějak fixnout tohle? Zatím jsem nucen to obcházet pomocí metody isAjax, aby při renderování vracela false, což není zrovna šťastné.</OT>

Vyki
Člen | 388
+
0
-

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

{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}

jtousek
Člen | 951
+
0
-

Na paramtery helperů se používá myslím dvojtečka, nebo se mýlím?

David Grudl
Nette Core | 8170
+
0
-

Lze použít obojí. Dvojtečku používá Smarty, čárka je zase běžnější v PHP.

Vyki
Člen | 388
+
0
-

jtousek napsal(a):

Na paramtery helperů se používá myslím dvojtečka, nebo se mýlím?

Myslel jsem si to samé, ale nebylo by to v Nette poprvé, kdy vede k cíli více cest :o)

Editoval Vyki (20. 10. 2010 19:19)

jtousek
Člen | 951
+
0
-

Když by se měla zavést podpora pro to, o čem Viky mluvil na začátku, nejspíše by to znamenalo zrušení těch čárek. Ovšem ukazuje se že o čárkách dost lidí ani neví, že je lze použít, stejně tak v dokumentaci jsou všude dvojtečky takže bych v odstranění čárek neviděl problém.

David Grudl
Nette Core | 8170
+
0
-

Dvojtečka nic neřeší. Stále není zřejmé, co udělá {link this, $cond ? $currDir|upper : $currDir|lower}

jtousek
Člen | 951
+
0
-

To vypadá opravdu na problém… Nic lepšího než detekce podle mezer kolem mě nenapadá.

jansfabik
Člen | 193
+
0
-

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)}
jtousek
Člen | 951
+
0
-

jansfabik napsal(a):

Co takhle povinné uzávorkování:

Závorky jsou přesně to, čemu se Latté vyhýbá jak jen může. ;)

jansfabik
Člen | 193
+
0
-

jtousek napsal(a):

jansfabik napsal(a):

Co takhle povinné uzávorkování:

Závorky jsou přesně to, čemu se Latté vyhýbá jak jen může. ;)

Pořád lepší než $template->helper(...) :) Ale nenapadá mě jak to jinak řešit třeba u toho ternárního operátoru.

jtousek
Člen | 951
+
0
-

U toho ternárního operátoru se mi to nějak nechce líbit… Latté totiž na mnoha místech používá normální PHP syntaxi a jsem pro to, tenhle standard zachovat. Rozšiřovat tu syntaxi kdekoli o použití helperů mi dvakrát nevoní, má to moc velký WTF faktor.

westrem
Člen | 398
+
0
-

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

  1. v spetnej kompatibilite {makro $variable|lower} – toto by bol pruser ak by sa zacalo chovat inak
  2. 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

  1. 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
  2. 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.

Vyki
Člen | 388
+
0
-

westrem napsal(a):
{link this, $currDir||upper}

Ten dvojtý znak | pro specifikaci helperu pro parametr mi přijde jako docela dobrý nápad.

David Grudl
Nette Core | 8170
+
0
-

|| 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.

jtousek
Člen | 951
+
0
-

@DG: Čistě teoreticky | je také operátor v PHP (bitové or) i když se moc nepoužívá.

Vyki
Člen | 388
+
0
-

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á.

jtousek
Člen | 951
+
0
-

Zbývá vykřičník…

pekelnik
Člen | 462
+
0
-

Závorkování se mi zdá jako nejsrozumitelnější.

westrem
Člen | 398
+
0
-

@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.

redhead
Člen | 1313
+
0
-

Závorky vypadají rozhodně líp

David Grudl
Nette Core | 8170
+
0
-

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

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.

jtousek
Člen | 951
+
0
-

Co takhle #? Pokud vím taky k ničemu neslouží.

Filip Procházka
Moderator | 4668
+
0
-

závorkování +1

Vyki
Člen | 388
+
0
-

jtousek napsal(a):

Co takhle #? Pokud vím taky k ničemu neslouží.

Sharp evokuje souvislost s ajaxem. Pokud by to bylo ještě navíc v makru link, tak tam to platí dvojnásob.

dakota
Člen | 148
+
0
-

Tiež som za použitie zátvoriek. Asi umožní zapísať

{var $fullName = $name.' '.($surname|upper)}
{var $fullName = ($surname|upper).', '.$name}

Editoval dakota (22. 10. 2010 8:35)

norbe
Backer | 405
+
0
-

Taky se mi ty závorky líbí nejvíc, nevím proč vymýšlet nějaké paznaky, když to stejně nepovede k jednoznačnosti, závorky jsou na tohle naprosto ideální a každý na první pohled vidí, jak se to bude chovat…