Modifikátory a pole, objekty, skaláry
- David Grudl
- Nette Core | 8227
Co se stane, pokud v šabloně použijete modifikátor např.
webalize
na pole? Nejspíš to nebude fungovat. Vhodnější by ale
asi bylo, kdyby se vrátilo opět pole, jen se všemi prvky webalizovanými.
U některých modifikátorů to ale není tak samozřejmé. Například
length
– spíš se očekává, že aplikován na pole vrátí
počet jeho prvků, než aby vrátil pole, kde všechny prvky budou nahrazeny
jejich délkou.
Díval jsem se, jak tuto věc řeší Smarty – k rozlišení používají znak
zavináče @
. Ten způsobí, že se modifikátor aplikuje na
všechny prvky pole. Chování je tak sice determinované, ale kodér musí
zavináč psát téměř před každým polem (hádám).
Další otázka je, jak naložit s hlubšími poli (tj. co když prvkem pole je opět pole) nebo objekty.
- Tomik
- Nette Evangelist | 485
jasir napsal(a):
A co takhle kdyby prostě helpery pracovala podle selského rozumu, tj.
lenght
by vždy vrátil počet prvků,webalize
by vždy pracovala nad všemi poli?
Hlasuju proti tomuto, Tebou uvedené příklady jsou jasné, ale určitě
jsou nebo budou jiné helpery, které tak jasné nebudou, a nebo jak bys
rozhodnul takové chování u uživatelských helperů? Je nutné to nějak
označit. Můj návrh je např. ~
nebo možná #
(mě
to evokuje tabulky, tedy že to chci aplikovat na celou tabulku), jinak platí
to, co jsem psal výše.
- jasir
- Člen | 746
Tomik napsal(a):
jasir napsal(a):
Hlasuju proti tomuto, Tebou uvedené příklady jsou jasné, ale určitě jsou nebo budou jiné helpery, které tak jasné nebudou, a nebo jak bys rozhodnul takové chování u uživatelských helperů? Je nutné to nějak označit. Můj návrh je např.
~
nebo možná#
(mě to evokuje tabulky, tedy že to chci aplikovat na celou tabulku), jinak platí to, co jsem psal výše.
No já se přiznám, teď ani nevím, co bych s tím vráceným polem
vlastně udělal. Například u toho webalize:
Co se stane když udělám {$array |webalize}
? Vypíšou se
všechny prvky postupně? Je to užitečné? Možná až po aplikování
například |cat
…
Ale – odhlédnuto od užitečnosti – chápu helpery jako sadu filtrů
s jasně definovanými vstupy a výstupy.
Podle mě je nesmyslné chtít po helperu ‚count‘ aby dělal něco jiného
než vrátil počet znaků ve stringu nebo počet prvků v poli. Díval jsem se
na Davidem odkazovanou stránku a ani u jednoho filtru mi nepřišlo, že by
bylo užitečné umožnit oba způsoby chování. Například count
se tak musí ve smarty psát vždy se zavináčem.
- Karel Klíma
- Člen | 31
xificurk napsal(a):
Přesně, jak píše jasir – má někdo vůbec nějaký příklad ze života, kdy je vhodné volat helper nad polem?
Co třeba vypsání pole jako jednoduchý seznam oddělený čárkou?
- Jakub Šulák
- Člen | 222
To že helpery volané nad polem mají svůj význam nebudu řešit.
Ale možnost nějakého znaku, který změní funkčnost helperu se mi zdá jako hrozné řešení. Uvědomte si, že šablony by měly být to nejjednodušší v celém frameworku, protože s nimi nepracují (jen) programátoři.
Vše nejednoznačné je pak důvod pro vznik chyb. Každý helper by měl být specifikován jako zobrazení A->B a jednoznačně.
Raději bych viděl například prefixový zápis speciálních helperů nad poli (a_lenght, array_lenght), nebo nějak podobně.
- Honza Kuchař
- Člen | 1662
Jo, na tom něco bude. Ale jestli používat prefix array_ nebo modifikátor je v podstatě jedno.
- Jakub Šulák
- Člen | 222
To právě není – modifikátorů je v Nette šablonách již pár a moje zkušenost je fakt taková, že co není napsáno, to je nepochopitelné.
Proto fakt doporučuji v šablonách i za cenu delšího zápisu používat pro helpery přesné značení (aby z názvu bylo patrné, co dělá).
V samotném Nette pak dělají již programátoři, takže tam tato konvence být nemusí.
- Petr Motejlek
- Člen | 293
Tak já taky přidám svoji trošku: Helpery nepoužívám, používám makra ;) Makra mají oproti helperům tu zásadní výhodu, že si už při jejich namontování do šablony říkám, jak se budou vyhodnocovat a můžu je teda parametrizovat, např. {money $price, true} v mém případě naformátuje objekt price jako peníze a to true říká, že se má vypsat i měna ;).
Další výhoda maker je taková, že už z principu se jejich výstup automaticky neobaluje htmlspecialchars, což ne vždycky potřebuju a když už to potřebuju, tak to dám přímo do toho makra.
- Ondřej Mirtes
- Člen | 1536
Petr Motejlek napsal(a):
Tak já taky přidám svoji trošku: Helpery nepoužívám, používám makra ;) Makra mají oproti helperům tu zásadní výhodu, že si už při jejich namontování do šablony říkám, jak se budou vyhodnocovat a můžu je teda parametrizovat, např. {money $price, true} v mém případě naformátuje objekt price jako peníze a to true říká, že se má vypsat i měna ;).
Další výhoda maker je taková, že už z principu se jejich výstup automaticky neobaluje htmlspecialchars, což ne vždycky potřebuju a když už to potřebuju, tak to dám přímo do toho makra.
Helperům můžeš parametry přidat taky:
{$item |money:true} {* money je registrovaný helper *}
A tento výstup také není obalen escapováním, jen ta položka $item (tj. pokud helper vrací nějaký HTML kód, ten už escapovaný není).
- Petr Motejlek
- Člen | 293
To jsem nevěděl, hned jsem se dozvěděl něco nového ;). Žil jsem v domění, že helpery už z principu ty parametry nemají a teď tady běží diskuze, jak jim je přidat, proto jsem doporučil ty makra, protože vím, že u nich ty parametry jdou řešit moc pěkně.
Pokud už teď mají helpery parametry, tak ale nevidím důvod, proč řešit, jak jim předávat nějaké modifikátory ;).
- Ondřej Mirtes
- Člen | 1536
Petr Motejlek napsal(a):
Pokud už teď mají helpery parametry, tak ale nevidím důvod, proč řešit, jak jim předávat nějaké modifikátory ;).
Ono se tu řeší, jak se má helper (který primárně používáme na string, např. length nebo upper) zachovat, když mu bude předhozeno pole nebo objekt.
- Petr Motejlek
- Člen | 293
To ano, ale řeší se tu nějaké modifikátory – já říkám nedělejte modifikátory, když už máte parametry ;)
- jasir
- Člen | 746
Jakub Šulák napsal: To že helpery volané nad polem mají svůj význam nebudu řešit.
Mě by to docela zajímalo… ;-) Takhle, význam asi mohou mít, ale je
zapotřebí zvnějšku „vysvětlovat“ helperu jak má chápat data? Není
lepší napsat helper tak, aby se zachoval podle typu který mu přijde?
A speciální případy řešit například nějakým dalším řetězeným
helperem? {$array |specialarrayfilter |count}
- Petr Motejlek
- Člen | 293
S tím souhlasím, jsou prostě dva modely: buď dělam jeden univerzální, kterej umí dělat všechno a musí se mu parametry říkat, co má dělat, a nebo dělám víc jednoúčelovejch.
- Petr Motejlek
- Člen | 293
honzakuchar napsal(a):
Jeee, to řetězení je moc fajn nápad. :)
Mě se taky víc líbí ;). Nový weby už zkusím dělat bez maker a uvidímě, jak to půjde.