Modifikátory a pole, objekty, skaláry

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

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

Co to udělat obráceně, tj. nějaký speciální znak, když nechci aplikovat na jednotlivé prvky pole, ale na celé pole?

jasir
Člen | 746
+
0
-

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?

Tomik
Nette Evangelist | 485
+
0
-

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

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.

xificurk
Člen | 121
+
0
-

Přesně, jak píše jasir – má někdo vůbec nějaký příklad ze života, kdy je vhodné volat helper nad polem?

Osobně používám helpery většinou jako poslední mezivrstvu před samotným vypsání obsahu.

Karel Klíma
Člen | 31
+
0
-

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

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

Jo, na tom něco bude. Ale jestli používat prefix array_ nebo modifikátor je v podstatě jedno.

Jakub Šulák
Člen | 222
+
0
-

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

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

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

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

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

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

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

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.

Honza Kuchař
Člen | 1662
+
0
-

Jeee, to řetězení je moc fajn nápad. :)

Petr Motejlek
Člen | 293
+
0
-

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.