ARCHIV |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
PHP (17) - Dokončujeme kalendářV této části seriálu o PHP dokončíme kalendář, který
jsme začali psát v minulém dílu. Připomeňme jen, že v minulém dílu jsme začali sestavovat kalendář, který bude nakonec vypadat nějak takhle:
Už jsme vyřešili jak zjistit počet dnů v měsíci a rovněž jak
stanovit, který den v týdnu připadne na prvního. Dnes nás čeká napsat
kód na zjištění počtu sloupců, kód na sestavení jednotlivých buněk a
musíme to celé nějak dostat dohromady. Počet sloupcůJe zřejmé, že jeden sloupec bude muset být vždy rezervován na názvy
dnů. Dále je zřejmé, že vlastní kalednář si může vyžádat čtyři (únor v
nepřechodném roce začínající pondělím), pět nebo i šest sloupců pro
svoje data. Počet sloupců musíme znát ještě dříve, než budeme tabulku
sestavovat. Sám jsem při psaní kódu podlehl chybě popisované v minulém díle, a sice té, že jsem se pokusil sestavit matematické pravidlo, z něhož by počet sloupců vypadl. Jde to však jednodušeji - postačí nám donutit PHP k tomu, aby nám řeklo, zda daný měsíc zabírá rozmezí čtyř, pěti nebo šesti týdnů. Neboli, v kolikátém týdnu roku je prvního v měsíci a v kolikátém týdnu je posledního. Protože už máme funkci PocetDnu, je zjištění obojího záležitost jednoho řádku kódu: <?
$sloupcu = date("W", mktime(0, 0, 0, $mesic, $PocetDnu, $rok)) - date("W", mktime(0, 0, 0, $mesic, 1, $rok))+2; ?> Dva sloupce se přičítají proto, že jeden je na názvy dnů, kdežto
druhý je kvůli matematickému rozdílu mezi základními a řadovými
číslovkami (31. mínus 27. týden je 5 ne 4). Korektura: To jsem tomu dal! Praxe ukázala, že to v některých
případech nebude fungovat. Například první leden roku 2000 má číslo
týdne 52, zatímco poslední prosinec roku 2007 spadá do týdne číslo 1
následujícího roku. Je to snad nějaká chyba? Ani ne. Kdybych si přečetl
manuál, zjistím, že PHP funkce date se při
vracení pořadového čísla týdne v roce chová podle normy ISO-8601.
Tato norma specifikuje formáty data a mimo jiné stanoví způsob, jakým
se číslují týdny na přelomu měsíců prosince a ledna. jednoduše řečeno
je to tak, že pokud více než tři dny přelomového měsíce spadají do
ledna, je týden považován za první v novém roce, v opačném případě je
považován za poslední týden v roce minulém. Dlouho jsem přemýšlel, jak to jednoduše ošetřit, aniž bych zjišťování týdnů musel nějak dramaticky od základu přepsat. Výsledek je, že zjišťuji a odečítám ne počet týdnů mezi prvním a posledním dnem v měsíci, ale počet týdnů mezi osmým dnem od začátku a osmým dnem od konce. Vynechané dva týdny sice musím v závěru přičíst, ale zase se úplně vyhnu problémům s prosinci a ledny některých let. Opravený a funkční způsob zjištění počtu sloupců tedy je: <?
$sloupcu = date("W", mktime(0, 0, 0, $mesic, $PocetDnu-7, $rok)) - date("W", mktime(0, 0, 0, $mesic, 1+7, $rok))+4; ?> Aneb: Člověk se stále učí. Sestavení buňekJe zřejmé, že dobrý nápad by byl použít dvě vnořené smyčky a sestavovat tabulku zleva doprava a odzhora dolů (ostatně jinak to ani nejde). Naspišme si tedy funkci, které pošleme řádek, sloupec, který den je prvního a kolik má měsíc dnů - a chtějme po ní jako výsledek obsah buňky kalendáře! Mohlo by to vypadat nějak takto: <? První dva řádky jsou myslím jasné; jestliže je v proměnné $sloupec
jednička, nemůže to dopadnout jinak než že vrátíme zkratku dne. Ve
třetím řádku zjišťujeme pomocí matematiky, jaké číslo v dané buňce
pravděpodobně bude. Pravděpodobně proto, že to není jisté. Neexistují
totiž záproné dny a nemůžeme zobrazit víc dnů, než kolik jich daný
měsíc opravdu má. Což se testuje na řádku čtvrtém. Pokud jsme "v
rozsahu", vrátí funkce dané číslo, pokud ne, vrátí HTML kód
neoddělitelné mezery. To proto, abychom se vyhnuli problémům při
zobrazování prázdných buněk v tabulkách. VýsledekVýsledkem našeho snažení bude funkce, která převezme dvě proměnné (měsíc, rok), sestaví kalendář a pošle jej do prohlížeče. Bude to vypadat takto: <? Ukázat skript | Spustit skript Při psaní reálného kódu je potřeba příliš nespoléhat na to, že
vstupní parametry budou v pořádku, a proto je hned v úvodu funkce
ověřujeme. Je zřejmé, že pokus o zobrazení například kalendáře za
třináctý měsíc by skončil chybou, takže to víceméně musíme udělat. Co
se týče vlastního kódu, začíná tím, že vypíše záhlaví tabulky. Protože
už v té době víme, kolik bude sloupců, můžeme si troufnout i na tabulku
s pevně danou šířkou (je to mimo jiné hezčí). Pak se píše záhlaví
(například "červenec 2004") a nakonec se ve dvou vnořených smyčkách
tvoří jednotlivé buňky; jejich hodnoty jsou zjišťovány opakovaným
voláním funkce Bunka(). Pokud Vám nejsou jasné některé souvislosti, podívejte se v
prohlížeči na zdrojový kód stránky, která kalendář zobrazuje. Věci,
které patří spíše do znalostí HTML než k PHP (jako je třeba použití
stylu) tady vysvětlovat nebudeme. Jedna věc by Vám ale přesto mohla
vrtat hlavou, a to je způsob použití proměnné $sloupcu jako hodnoty
atributu colspan ve druhém příkazu echo. Pokud to tak je, pak vězte, že
se jedná o tzv. automatickou expanzi proměnné. Automatická expanze proměnnéZa tímto strašným názvem se skrývá mechanismus, který nám při psaní kódu v PHP ušetří něco málo času při práci s řetězci. Nejlépe to vysvětlíme na příkladu. Následující kód provede dvakrát totéž: <? Neboli, pokud píšete řetězec v uvozovkách, můžete v něm použít proměnnou a ona se automaticky expanduje. Není to nic převratného, ale může to ušetřit nějaký čas při psaní kódu. V dalším díle našeho seriálu se podíváme na fukce, které jsme zatím přeskočili - jsou to funkce pro práci s poli.
Související články
Předchozí Celou kategorii (seriál) Další
PHP (1) - Historie a budoucnost
PHP (2) - Jak to funguje PHP (3) - Instalace PHP (4) - Základy syntaxe PHP (5) - Příkaz Echo; formátování kódu PHP (6) - Typy proměnných PHP (7) - Pole PHP (8) - Výrazy, konstanty, inkrementace PHP (9) - Přetypování proměnných PHP (10) - Logické výrazy a operátory PHP (11) - Operátory porovnání; priorita operátorů PHP (12) - Podmínky PHP (13) - Příkazy cyklu PHP (14) - Cyklus for PHP (15) - Funkce PHP (16) - Vyrobme si kalendář PHP (18) - Funkce pro práci s poli PHP (19) - Objekty PHP (20) - Objekty podruhé PHP (21) - Vkládání souborů PHP (22) - Regulární výrazy PHP (23) - Neztraťte se ve funkcích PHP (24) - Pracujeme s formuláři PHP (25) - Formuláře - nikomu nevěřte PHP (26) - Formuláře na sto způsobů PHP (27) - Příklady na formuláře PHP (28) - Chybovati je lidské PHP (29) - Soubory a adresáře PHP (30) - Počitadlo pomocí souborů PHP (31) - Upload a download souborů PHP (32) - Příklad na BLOG PHP (33) - HTTP hlavičky PHP (34) - Úvod do databází PHP (35) - Uložení dat v databázi PHP (36) - Připojujeme se k MySQL PHP (37) - Tvorba tabulek v MySQL PHP (38) - Dolujeme data z MySQL PHP (39) - Zobrazujeme a stránkujeme data PHP (40) - PHP a vkládání záznamů do databází PHP (41) - Měníme data v databázích PHP (42) - Odstraňujeme databázová data PHP (43) - MySQL rychleji a rychleji PHP (44) - MySQL ještě rychleji PHP (45) - Jsou data v databázi v bezpečí? PHP (46) - Importujeme data do databáze PHP (47) - Exportujeme data PHP (48) - Práce s binárními daty (BLOB) PHP (49) - Kam kráčíš, MySQL? PHP (50) - Ověřování uživatelů PHP (51) - Přenos dat mezi stránkami PHP (52) - Cookies PHP (53) - Sessions PHP (54) - Dodržování webových standardů PHP (55) - Odesílání e-mailů PHP (56) - Tisk a PDF PHP (57) - XML PHP (58) - XML lépe a radostněji PHP (59) - zapisujeme XML PHP (60) - Rozsáhlejší projekty 1. PHP (61) - Rozsáhlejší projekty 2. PHP (62) - Rozsáhlejší projekty 3. PHP (63) - Rozsáhlejší projekty 4. PHP (64) - Ladění kódu PHP (65) - Ladění kódu 2. PHP (66) - PHP debugger PHP (67) - Zdroje informací o PHP PHP (68) - Stavíme portál PHP (69) - Stavíme portál 2. PHP (70) - Registrace uživatelů na portálu PHP (71) - Přihlašování uživatelů na portál PHP (72) - Hrátky s uživateli PHP (73) - Frontend a backend PHP (74) - Administrátorské rozhraní portálu PHP (75) - Pokračujeme na portále PHP (76) - Zobrazujeme data na portále PHP (77) - Portál, databáze a relace PHP (78) - Informační obsah portálu PHP (79) - Triky s formuláři a ergonomie webu PHP (80) - Administrace diskografie hudebního portálu PHP (81) - Uživatel versus programátor PHP (82) - zabezpečení vstupů formulářů PHP (83) - Ukládání textů písní na hudebním portále PHP (84) - Ještě k registraci PHP (85) - ukládání souborů do databáze na portálu PHP (86) - zobrazení dat a stahování soborů pro registrované PHP (87) - finišujeme portál PHP (88) - provoz ve Windows PHP (89) - cesta do hlubin php.ini PHP (90) - Poťouchlé konfigurační volby PHP (91) - php.ini potřetí a naposledy PHP (92) - funkce pro interakci s operačním systémem PHP (93) - příkazový řádek PHP (94) - GUI PHP (95) - GUI podruhé PHP (96) - (ne)bezpečné PHP PHP (97) - bezpečnost ještě jednou PHP (98) - PHP 5. PHP (99) - Budoucnost PHP PHP (100) - Závěr PHP (101) - Apríl: Příklady z praxe php rewrite Byte order mark a PHP Předchozí Celou kategorii (seriál) Další Ke stažení jako HTML nebo jako PDF.
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||||||||||||||||||||||||||||||||||||||||||||||||||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |