CurlyBracketsFil­ter – cyklus foreach

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

Po delší době jsem se pořádně podíval na novou verzi Nette a našel jsem pár drobností ohledně cyklu foreach:

V dokumentaci je uvedena možnost použití {foreachelse}, ale nějak se v šabloně nepřekládá a nikde ve zdrojácích jsem o něm nenašel zmínku. Zatoulal se někde commit, nebo je jen dokumentace kousek napřed?

Metody SmartCachingIterator::isOdd() a SmartCachingIterator::isEven() nevrací úplně přesné výsledky. Sudé řádky jsou totiž označeny jako liché a opačně. Vnitřní $counter je počítaný od nuly, takže pro první řádek platí 0 % 2 == 0.

David Grudl
Nette Core | 8228
+
0
-

foreachelse nakonec podporovaný není, z dokumentace jsem ho odstranil.

Popis čítače jsem v dokumentaci upravil, počítá se od nuly, tudíž je to „počet průchodů – 1“.

stpnkcrk
Generous Backer | 190
+
0
-

A z jakého důvodu jsi ho odstranil? Přišlo mi to jako fajn fičurka.

Honza Marek
Člen | 1664
+
0
-

1091-rev-151-novinky-v-curlybracket-sfilter

David Grudl
Nette Core | 8228
+
0
-

Spíš jsem to nikdy nenaprogramoval, jen nadhodil v diskusi námět.

Ale je super vidět, jak aktivně kluci tvoří dokumentaci, že někdy i předběhne vývoj software :-)

Panda
Člen | 569
+
0
-

David Grudl napsal(a):

foreachelse nakonec podporovaný není, z dokumentace jsem ho odstranil.

Popis čítače jsem v dokumentaci upravil, počítá se od nuly, tudíž je to „počet průchodů – 1“.

Mno, mě ani tak nešlo o popis v dokumentaci, jako o to, že funkce isOdd() (jeLichý) vrací true pro sudé řádky a isEven() (jeSudý) zase naopak pro liché řádky. Podle názvu by tomu mělo být přesně naopak. Vím, že je to prkotina, ale když logiku, tak všude, ne? :)

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

Spíš jsem to nikdy nenaprogramoval, jen nadhodil v diskusi námět.

Ale je super vidět, jak aktivně kluci tvoří dokumentaci, že někdy i předběhne vývoj software :-)

To se jim nesmíš divit, že si mysleli že to je funkční když si napsal:

David Grudl napsal(a):

Všechno je implementované a mělo by to být funkční.

David Grudl
Nette Core | 8228
+
0
-

Mno, mě ani tak nešlo o popis v dokumentaci, jako o to, že funkce isOdd() (jeLichý) vrací true pro sudé řádky a isEven() (jeSudý) zase naopak pro liché řádky. Podle názvu by tomu mělo být přesně naopak. Vím, že je to prkotina, ale když logiku, tak všude, ne? :)

Jak říkám, řádky jsou číslované od nuly. A v kódu problém snad není.

To se jim nesmíš divit, že si mysleli že to je funkční když si napsal:

Šak v poho :-)

Ola
Člen | 385
+
0
-

Právě že by to mělo být opačně, když teď zavolám v šabloně {$iterator->isEven()} tak dostanu jedničku u všech lichých komentářů (ale měla by být u všech sudých)..
př:

$this->template->data = array('prvni', 'druhy');

 

{foreach $data as $key=>$value}
	{if $iterator->isEven()}
		{$value}
	{/if}
{/foreach}

Současný výstup = prvni

ale správně by to mělo vypsat druhy ..

Editoval Ola (15. 12. 2008 15:09)

David Grudl
Nette Core | 8228
+
0
-

Zkus $this->template->data = array('nulty', 'prvni', 'druhy');

Ola
Člen | 385
+
0
-

já to chápu, dělí to čítač číslovanej od nuly – ale někdo (třeba jako já :)) by mohl očekávat trochu jiný výstup ..

Editoval Ola (15. 12. 2008 16:48)

phx
Člen | 651
+
0
-

Kdyz kouknu na pole

	array('nulty', 'prvni', 'druhy');

ze sude prvky budou 'prvni' a liche budou 'nulty' a 'druhy'.

I kdyz na druhou stranu vsechna pole v PHP a jinych jazycich jsou vzdy od nuly. Ale sudy vs. lichy jsem zatim nepotkal (napr: get_odd_items(array);), tak tezko rict co je spravne.

Editoval phx (15. 12. 2008 17:38)

Honza Marek
Člen | 1664
+
0
-

Mojí výhodou je, že si nepamatuju anglicky kterej je kterej…

Ale jinak bych řek, že pokud řádky počítám od nuly, tak to stejně nic nemění na tom, že ten co se nejdřív vypíše je první, tudíž lichý :-D Chtěl jsem najít pro svůj názor podporu u nějaké morální autority, ale zjistil jsem, že chlapci od jQuery to chápou stejně jako David.

David Grudl
Nette Core | 8228
+
0
-

Honza M. napsal(a):

Mojí výhodou je, že si nepamatuju anglicky kterej je kterej…

Na to mám mnemotechnickou pomůcku: je to přesně naopak, než bych intuitivně předpokládat. A pro sichr si to ještě ověřím ve slovníku ;)

Ale jinak bych řek, že pokud řádky počítám od nuly, tak to stejně nic nemění na tom, že ten co se nejdřív vypíše je první, tudíž lichý :-D Chtěl jsem najít pro svůj názor podporu u nějaké morální autority, ale zjistil jsem, že chlapci od jQuery to chápou stejně jako David.

Problém je, že ty stále uvažuješ (resp. vy stále uvažujete) o prvním řádku tabulky, ale tady nejde ani o tabulku, ani o řádky, ale o to, jestli $iterator->getCounter() vrací sudé nebo liché číslo.

V pascalu byla zvyklost cokoliv číslovat od jedničky, v C zase od nuly (obojí má něco do sebe). PHP používá céčkovou konvenci. Takže v poli $arr = array('a', 'b', 'c') je první položka $arr[0]. Z hlediska čítače není rozhodující slovo „první“, ale číslo „0“.

Ola
Člen | 385
+
0
-

Jak jsem psal – chápu to. Ale nechceš to změnit? (neříkám, aby se counter počítal od 0 ale aby se v tom ověřovacim cyklu k $counter přičetla 1, nebo u těch dvou cyklů přehodit názvy) – „zlidštilo“ by se to :)

Editoval Ola (15. 12. 2008 22:44)

_Martin_
Generous Backer | 679
+
0
-

David Grudl napsal(a):

V pascalu byla zvyklost cokoliv číslovat od jedničky, v C zase od nuly (obojí má něco do sebe). PHP používá céčkovou konvenci. Takže v poli $arr = array('a', 'b', 'c') je první položka $arr[0]. Z hlediska čítače není rozhodující slovo „první“, ale číslo „0“.

Jestli tomu rozumím, tak 'a' by bylo liché – což mi přijde logické, je přece první (z mého pohledu v reálném světě počítám jako první, druhý, třetí,… – a první je přeci liché číslo).

Editoval _Martin_ (15. 12. 2008 22:53)

Honza Marek
Člen | 1664
+
0
-

Na to mám mnemotechnickou pomůcku: je to přesně naopak, než bych intuitivně předpokládat. A pro sichr si to ještě ověřím ve slovníku ;)

Ta je dobrá… Akorát ji člověk nesmí aplikovat dvakrát za sebou. Každopádně jsem vymyslel novou – even má sudý počet písmenek a odd lichý. (Chápu, že bylo děsně důležité se pochlubit :-D)

Tomik
Nette Evangelist | 485
+
0
-

Taky jsem pro, aby pro položku $arr[0], resp. $arr['prvni'] to vracelo liché číslo, je úplně jedno jak se to počítá, jestli od nuly, či od 1. Prostě mám např. v poli uloženy záznamy o uživatelích a chci každá lichý vypsat v modrým pozadím – pak $arr[0] bude první položka, bude tedy lichá… Přijde mi to logické. :) (Ale mě přijde docela logických spousta nelogických věcí.) ;)

Edit: vložení polí do <code>

Editoval Tomik (16. 12. 2008 1:40)

Jan Tvrdík
Nette guru | 2595
+
0
-

Taky se přimlouvám, aby $array[0] (první řádek) byl lichý a $array[1] (druhý řádek) byl sudý. Ale chápu, že i opačný názor má své důvody. Holt vše má své pro a proti.

phx
Člen | 651
+
0
-

Nadruhou stranu by jsme sli proti konvenci PHP (jQuery), C a spol.

Ale jelikoz je to urcene k renderovani tak prece jen clovek vidi prvni radek a ne nulty radek.

romansklenar
Člen | 655
+
0
-

Je to sranda jak tahle blbost dokáže zaplnit celé jedno vlákno příspěvky…

Prostě to tak je, smiřte se s tím nebo to nepoužívejte :)

Tohle by snad přece mohlo uspokojit oba tábory ne? (nevyzkoušeno)

array(1 => 'prvni', 'druhy', 'treti');

PS: Davide nenech se zviklat ;)

hrach
Člen | 1838
+
0
-

vzhledem k tomu ze to ma (snad) usnadnit praci koderovi, kteryho nezajima, jestli je to v PHP nebo v Pascalu, respektive jak to kdo kde pocita, tak by to melo byt tak, jak on to vidi, to jest, prvni zaznam ma liche cislo.

_Martin_
Generous Backer | 679
+
0
-

hrach napsal(a):

vzhledem k tomu ze to ma (snad) usnadnit praci koderovi, kteryho nezajima, jestli je to v PHP nebo v Pascalu, respektive jak to kdo kde pocita, tak by to melo byt tak, jak on to vidi, to jest, prvni zaznam ma liche cislo.

Tečka =)

David Grudl
Nette Core | 8228
+
0
-

hrach napsal(a):

vzhledem k tomu ze to ma (snad) usnadnit praci koderovi, kteryho nezajima, jestli je to v PHP nebo v Pascalu, respektive jak to kdo kde pocita, tak by to melo byt tak, jak on to vidi, to jest, prvni zaznam ma liche cislo.

Docela se divím že nikomu nevadí, že getCounter() vrací na prvním řádku nulu a ne jedničku.

Honza Marek
Člen | 1664
+
0
-

romansklenar napsal(a):

Tohle by snad přece mohlo uspokojit oba tábory ne?

Mám taky jeden nápad za všechny prachy. Třeba isEven počítat od nuly a isOdd počítat od jedničky. Sice to bude vracet to samé, ale nevadí. Prostě kdo bude chtít počítat řádky od nuly, bude používat isEven() a !isEven() a kdo od jedničky, tak bude používat isOdd() a !isOdd() :-D

P.S.: Není to jedno, jak je to číslovaný? Většinou jde stejně jen o to, aby se třeba střídaly dvě barvy pozadí řádku tabulky.

David Grudl
Nette Core | 8228
+
0
-

Honza M. napsal(a):

P.S.: Není to jedno, jak je to číslovaný? Většinou jde stejně jen o to, aby se třeba střídaly dvě barvy pozadí řádku tabulky.

Nene! Tohle je základní fundamentální problém! Možná kvůli tomu vznikne i fork Nette.

A jestli ne, tak můžeme otevřít jinou zásadní otázku, jestli se mají řádky case v bloku switch odsazovat nebo ne.

:-)

romansklenar
Člen | 655
+
0
-

:) za chvíli tu s takovou bude větší zábava než na webtrhu…

Davide, dají se zde na fóru uzamykat vlákna? ;)

Jod
Člen | 701
+
0
-

Ja tu stále nechápem čo riešiťe :D Šaq nultý riadok má byť normálny a prvý nenormálny(odd) ne? :D

BTW: Ja zásadne case odsadzujem a break som začal dávať zarovno s kódom predním :D:D:D

Jan Tvrdík
Nette guru | 2595
+
0
-

David Grudl napsal(a):

Můžeme otevřít jinou zásadní otázku, jestli se mají řádky case v bloku switch odsazovat nebo ne.

Za mě odsazovat.

Ola
Člen | 385
+
0
-

Samozřejmě, že case odsazovat (vč. breaku)

Editoval Ola (17. 12. 2008 17:27)

Jod
Člen | 701
+
0
-

Ale brejk odsadiť dvojito =D

A.
Člen | 87
+
0
-

vim neodsazuje

Jod
Člen | 701
+
0
-

Nie vim, ale ty by si mal :D

Honza Marek
Člen | 1664
+
0
-

To odsazování je vcelku jasné, na tom se vesměs shodneme… Dovolím si otevřít mnohem závažnější otázky:

svišť ($proměnná) { // má být v nette { o řádku níž nebo ne?
	kejs $hodnota:
		něcoVyrob();
		break; // nemělo by toto být odsazeno o jeden tab méně?
	default:
		nicMocNedělat();
	// neměl by tu být break?
}
Jod
Člen | 701
+
0
-

V Zenďáckom štandarde programovania je myslím, že všetky konštrukcie okrem definovania tried, metód, intefacov a funkcíí májú obsahovať zátvorku hneď za sebou.

Predtým som pchal všetky pod seba, ale takto sa mi to zdá viac v pohode. Break som začal tiež o jeden tab viac odsadzovať bo smo to niekde tam čítal.

<?php
$x = 1;
swič($x) {
	kejs 1:
		//
		brejk;
	kejs 2:
		brejk;
	difoult:
		brejk;
}
?>

Keby bol nejaký problém so zátvorkami, tak sa to dá zapísať aj bez nich

<?php
swič($x):
	// teľa
endswič;
?>

Editoval Jod (18. 12. 2008 10:49)

paranoiq
Člen | 392
+
0
-

vy si z toho děláte legraci, ale odsazování je zcela zásadní věc! ;-]

python na vás!

Ola
Člen | 385
+
0
-

Jod napsal(a):

V Zenďáckom štandarde programovania je myslím, že všetky konštrukcie okrem definovania tried, metód, intefacov a funkcíí májú obsahovať zátvorku hneď za sebou.

Predtým som pchal všetky pod seba, ale takto sa mi to zdá viac v pohode. Break som začal tiež o jeden tab viac odsadzovať bo smo to niekde tam čítal.

lepší a chutnější to bude takhle ;)

<?php
sendvič($x):
 	// tělo
dalšísendvič;
?>

Editoval Ola (18. 12. 2008 13:24)

blacksun
Člen | 177
+
0
-

Já bych viděl hlavní rozpor INDEX vs POŘADÍ. Indexuje se od nuly, pořadí se určuje od jedničky. Potom záleží, k čemu se funkce isOdd() a isEven() vztahují, jestli k pořadí v poli nebo k indexu prvku pole. Pro mě je přirozenější pořadí a tudíž bych se klonil k isOdd() vrací true na prvním prvku pole, i když má index 0. Což je logičtější i při iterování přes prvky pole, které mají textový klíč.

Editoval blacksun (18. 12. 2008 14:55)

pheidrich
Člen | 11
+
0
-

David už to tady ale jednou napsal:


Problém je, že ty stále uvažuješ (resp. vy stále uvažujete) o prvním řádku tabulky, ale tady nejde ani o tabulku, ani o řádky, ale o to, jestli $iterator->getCounter() vrací sudé nebo liché číslo.

Nemůžeš chtít po iterátoru (SmartCachingIterator), aby ti vracel sudé a liché podle nějaké tvojí logiky, kterou čísluješ řádky tabulky. Iterátor o ní nic neví. On pouze ví, že jeho hodnota je sudá nebo lichá.

David Grudl
Nette Core | 8228
+
0
-

No moment, to nejde říct jen „odsazovat!“, je potřeba ještě prodiskutovat a odhlasovat, jakým a kolika znaky se má odsazovat. Ač se to tak nemusí jevit, jde o nesmírně závažné záležitosti. Mnozí mohou oprávněně namítnout, že přesně v tomto bodě byl celý framework nenávratně poškozen a degradován na úroveň Zendu s CakePHP dohromady!

Honza Marek
Člen | 1664
+
0
-

Ač se to tak nemusí jevit, jde o nesmírně závažné záležitosti.

V tom případě musím upozornit na skutečně ostudný rozpor skutečnosti s dokumentací. Coding standard není v dokumentaci udržován aktuální! Four spaces, class prefixed with namespace – nic z toho jsem ve frameworku neviděl!!

phx
Člen | 651
+
0
-

Osobne nenavidim odsazovani mezerama! Fuj. Jedine tabulatory.

pmg
Člen | 372
+
0
-

Proč Nette srovnávat s pseudoobjektovou jQuery? Profíci se samozřejmě neobejdou bez knihoven typu MooTools, které svou objektovost mají už v názvu. A jak že to tedy řeší? Posuďte sami.

Co se týče správného odsazování, tady snad není pochyb. Odsazovat! Ale opět jako profíci. Doufám, že už je to všem jasné.

Jan Tvrdík
Nette guru | 2595
+
0
-

Honza M. napsal(a):

V tom případě musím upozornit na skutečně ostudný rozpor skutečnosti s dokumentací. Coding standard není v dokumentaci udržován aktuální! Four spaces, class prefixed with namespace – nic z toho jsem ve frameworku neviděl!!

Na to jsem již upozorňoval dávno, ale nic se nezměnilo. Těch nesrovnalostí je tam mimochodem mnohem více.

David Grudl napsal:

je potřeba ještě prodiskutovat a odhlasovat, jakým a kolika znaky se má odsazovat.

Za mě 1× tabulátor + uvažovat o aktualizace Coding standard (i když je to zbytečnost)

David Grudl
Nette Core | 8228
+
0
-

Tak jeden vánoční dáreček :-)

SmartCachingIterator počítá od jedné. Tj. při prvním průchodu vrací getCounter() jedničku a isOdd() TRUE.

kravčo
Člen | 721
+
0
-

David Grudl napsal(a):

Tak jeden vánoční dáreček :-)

SmartCachingIterator počítá od jedné. Tj. při prvním průchodu vrací getCounter() jedičku a isEven() TRUE.

Zrejme preklep, no isEven (je párny/sudý) by pre jednotku malo vrátiť FALSE, nie?

Honza Marek
Člen | 1664
+
0
-

:-D

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

Tak jeden vánoční dáreček :-)

SmartCachingIterator počítá od jedné. Tj. při prvním průchodu vrací getCounter() jedničku a isOdd() TRUE.

Vánoční, jako že po svátcích se zase vrátí zpátky ;]. Ale vážně co tak zničehonic? Jaký k tomu máš důvod? (pro pořádek jsem toho zastánce, vidím rozdíl mezi indexem a pořadím)