CurlyBracketsFilter – cyklus foreach
- Panda
- Člen | 569
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
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“.
- David Grudl
- Nette Core | 8228
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
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
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
Mno, mě ani tak nešlo o popis v dokumentaci, jako o to, že funkce
isOdd()
(jeLichý
) vracítrue
pro sudé řádky aisEven()
(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
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)
- phx
- Člen | 651
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
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
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“.
- _Martin_
- Generous Backer | 679
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
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
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
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.
- romansklenar
- Člen | 655
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 ;)
- David Grudl
- Nette Core | 8228
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
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
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
:) za chvíli tu s takovou bude větší zábava než na webtrhu…
Davide, dají se zde na fóru uzamykat vlákna? ;)
- Jan Tvrdík
- Nette guru | 2595
David Grudl napsal(a):
Můžeme otevřít jinou zásadní otázku, jestli se mají řádky
case
v blokuswitch
odsazovat nebo ne.
Za mě odsazovat.
- Honza Marek
- Člen | 1664
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
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)
- Ola
- Člen | 385
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
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
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
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
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!!
- pmg
- Člen | 372
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
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
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.
- PetrP
- Člen | 587
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)