Eipä sen enempää eikä vähempää kuin hyvä ja toimiva kalenteripohja josta on hyvä lähteä kehittämään mihinpäin tahansa kun kalenteria tarvii.
Ennenkuin joku rääkäisee niin sama koodi löytyy kyllä mureakuhastakin, mutta ei muuta tilannetta etteikö se olisi minun käsialaa.. :)
<?php /* ################## KALENTERIPOHJA En ole testannut ainoatakaan noista mureakuhassa olevista kalentereista, mutta yleisön kommenteissa on ollut vihjeitä että päivämäärät olisi pissinyt joissain niistä tai että viikko on alkanut sunnuntaista tms...? Ei ollut parempaakaan tekemistä joten typettelin tämän sitten illan ratoksi: Tämä kalenteriskriptin pitäisi kyllä osata karkauspäivät ja mystis-viikot ilman sen kummempia pöllöyksiä välillä 1970 - 2037, sen enempää ei PHP:n mktime tieten osaa. Toisaalta tuskin tätä tarvitaankaan 2030 luvulla enää.. - Jos haluat käyttää skriptiä niin siitä vain. Ihan vapaasti. - Jos tuntuu että skripti helpotti elämää niin E-mailin otsikolla "Kiitti kalenterista" ilman mitään sen suurempia vuodatuksia voi lähettää osoitteeseen petteri piste jylkka ät nic piste fi :-) ################################## */ // Jos ei päivämäärä ole määritelty, tai ne on määritelty päin persettä, // ne määritellään nyte... yykaakoo.. if (!checkdate($_GET['m'],01,$_GET['y'])) { $_GET['m'] = date("m"); $_GET['y'] = date("Y"); } // Edellisen ja seuraavan kuukauden GET queryt tulee näin: $kk['edellinen'] = date("\m=m&\y=Y", mktime(0, 0, 0, $_GET['m']-1, 1, $_GET['y'])); $kk['seuraava'] = date("\m=m&\y=Y",mktime(0, 0, 0, $_GET['m']+1, 1, $_GET['y'])); // Kuussa on päiviä: $kk['paivia'] = date("t",mktime(0,0,0,$_GET['m'],1,$_GET['y'])); // Kuukauden eka viikonpäivä on: $kk['eka'] = date("w",mktime(0,0,0,$_GET['m'],1,$_GET['y'])); // Ja koska PHP elää jenkkiviikkoja niin debugataas vähän: if ($kk['eka'] == 0) $kk['eka'] = 7; // Sunnuntai on viikon viimeinen päivä eikä ensimmäinen.. // Kuukaudet on nimeltään $kuukaudet['01'] = "Tammi"; $kuukaudet['02'] = "Helmi"; $kuukaudet['03'] = "Maalis"; $kuukaudet['04'] = "Huhti"; $kuukaudet['05'] = "Touko"; $kuukaudet['06'] = "Kesä"; $kuukaudet['07'] = "Heinä"; $kuukaudet['08'] = "Elo"; $kuukaudet['09'] = "Syys"; $kuukaudet['10'] = "Loka"; $kuukaudet['11'] = "Marras"; $kuukaudet['12'] = "Joulu"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Minikalenteri</title> <style type="text/css"> .tyhja { background-color: #EEEEFF; font-size: 10px; font-family: Tahoma; } .normi { background-color: #DDDDFF; font-size: 10px; font-family: Tahoma; } .tanaan { background-color: #DDBBBB; font-size: 10px; font-family: Tahoma; border: 1px solid #FF0000; } table { border: 1px solid #000000; } </style> </head> <body> <table border=0 cellpadding="2" cellspacing="0"> <tr> <td align="center" class="tyhja"> <a href="<?php print $_SERVER['PHP_SELF'] ?>?<?php print $kk['edellinen']; ?>" style="text-decoration: none"><b><</b></a> </td> <td colspan="5" class="tyhja" align="center"> <b><?php print $kuukaudet[$_GET['m']]."kuu ".$_GET['y']; ?></b> </td> <td align="center" class="tyhja"> <a href="<?php print $_SERVER['PHP_SELF'] ?>?<?php print $kk['seuraava']; ?>" style="text-decoration: none"><b>></b></a> </td> </tr> <?php // Viikonpäivät tähän saumaan.. print "\t <tr>"; foreach(array("MA","TI","KE","TO","PE","LA","SU") as $pva) { print "\t\t<td class=\"tyhja\" align=\"center\"><b>".$pva."</b></td>\n"; } # foreach loppuu print "\t </tr>"; // Ja sitten alkaa viikkojen töhertely: // Sen lisäksi että 42 on vastaus elämään, maailmankaikkeuteen // ja kaikkeen sen sellaiseen, (Douglas Adams), // se on myös ruutujen määrä joita kalenterissa maksimissaan // voidaan tarvita joten loopataan max. 42 kertaa.. for ($i = 1; $i <= 42; $i++) { // Tehdäänkö tähän päivämerkintä vai tyhjä ruutu..? if ($i < $kk['eka'] or $counter >= $kk['paivia']) { // Tyhjä ruutu print "\n\t\t<td class=\"tyhja\"> </td>"; } else { // kalenteripäivä-ruutu print "\n\t\t<td align=\"center\""; // Selvitetään onko tulostettava päivä "tänään" // ja määritellään sen mukaan css luokka. if (date("dmY")==($counter+1).$_GET['m'].$_GET['y']) { print " class=\"tanaan\">"; } else { print " class=\"normi\">"; } print $counter+=1; print "</td>"; } # if loppuu. // jos for-loopin jakojäännös seiskalle on nolla, silloin on sunnuntai // ja tämä viikko loppuu tähän ja alkaa seuraava. if ($i%7 == 0) print "\n\t </tr>"; // Jos seuraavalle viikolle on vielä tulossa kalenteripäiviä täytyy TR avata uudelleen: if ($counter < $kk['paivia'] && $i%7 == 0) print "\n\t <tr>"; // jos seuraavalle viikolle ei ole enää tulossa kalenteripäiviä // niin turhapa sinne on tyhjiä ruutujakaan tulostella: if ($counter >= $kk['paivia'] && $i%7 == 0) break; // looppailu loppuu tähän. } # For loppuu. ?> </table> </body> </html> Demo löytyy osoitteesta: http://netti.nic.fi/~pjylkka/php/cal.php
Aika hieno. :P
Ihan kaunis, selkeän näköistä koodiaki. Pari juttua pisti silmään:
- pilkun jälkeinen väli selventäisi aika reippaasti joitain kohtia
- T.M. valittaisi että mktime(0,0,0,$_GET['m'],1,$_GET['y']) jota käytät kuussa on päiviä ja eka viikonpäivä kaksi kertaa pitäisi laittaa erilliseen muuttujaan, se hidastaa ku sitä käyttää kaks kertaa =P
- $kuukaudet tekisin tyyliin array("01" => "Tammi", "01" => "Helmi" jne, saisi lyhyemmäksi kauniisti
- näyttää jotenki hassulta ku käytät molempia // ja # -kommenttisysteemei, no ei haittaa
- kantsii korjata < ja > -linkit edelliseen ja seuraavaan -> < ja >, muuten ei validia
- Jee kiva 42 <3 :P
Juu, ihan kiva. Toi 42 asti looppaaminen vaikuttaa tosin hieman purkkaratkaisulta, vaikka toimiva onkin. Kuukauden päivien lukumäärän saa selville date-funktiolla ja sen t-parametrilla (niinkuin olet näköjään tuolla jo tehnytkin :)) ja tyhjät ruudut on sitten helppo rykäistä sinne loppuun. Ja erillisen taulukon tekeminen suomenkielisille viikonpäiville ja kuukausille on turhaa, sillä funktiot setlocale ja strftime ajavat saman asian. Lisäksi niiden avulla kalenterin saa yhtä muuttujaa muuttamalla jollekin toiselle, halutulle kielelle.
STFU sooda :D
Sitäpaitsi...
mktime(0,0,0,$_GET['m'],1,$_GET['y'])
Tuo on kaksi kertaa :)
Edit: HAh!, muokkasit häpeällisen mokasi kertomatta.
setlocale ja strftime ei toimi jokaises servus, joten toi taulukkojuttu on toimivampi ratkaisu.
Joo, kopsin vahingossa tekstin väärästä kohdasta kun näyttivät niin samalta. :)
lainaus:
setlocale ja strftime ei toimi jokaises servus, joten toi taulukkojuttu on toimivampi ratkaisu.
Toi "taulukkojuttu" on toimivampi ratkaisu ainoastaan jos tarvittu ympäristö ei ole tuettuna palvelimella. Tosin vielä sellaista palvelinta ei ole vielä tullut vastaan josta noita Suomen asetuksia ei löytyisi.
Heh, mun oma servu ei osannu laittaa suomen kielel noita. En tiedä miksei... taisin asentaa putkan oppaiden mukaisesti tämän.
Enkä näe mitään haittaakaan noiden taulukoiden käytössä. Ellei nyt tee viidellekymmenelle eri kielelle sivujaan... mut ainahan nekin voi taulukoida :)
TM: Ainoa häpeällinen moka tässä on se että sinä olet nähnyt omiasi. En ole muokannut koodia kertaakaan.
Olga:
Noudatan tuossa lähinnä vanhaa kunnon "keep it simple" meininkiä. Koodi looppaa 42:n asti JOS on tarvetta. Siellä on "break". Että purkkaratkaisu my ääs.
Jotkin kuukaudet venyvät neljän viikon ajalta kuuden viikon ajalle ja tablen TD:t pitää täyttää loppuun. Tuo on nimenomaisesti helpoin ja minusta ainakin järkevin tapa toteuttaa samalla koodilla kaikkien päivien luonti kuin alkaa erikseen rakentamaan jokin hubbabubba niitä tyhjiä ruutuja varten. Silmät auki!
Ja niinkuin TM sanoikin, Setlocalet ei toimi kaikkialla.
lainaus:
TM: Ainoa häpeällinen moka tässä on se että sinä olet nähnyt omiasi. En ole muokannut koodia kertaakaan.
Häh? Siis... toi mun kommentti liittyi soodan viestiin, kun se meni ja korjas sen mokansa siitä (väärä koodinpätkä oli pastettu)
Ja toi "häpeällinen" ei ollut tarkoitettu kirjaimellisesti otettavaksi... lähinnä läppä :)
// Kuussa on päiviä: $kk['paivia'] = date("t",mktime(0,0,0,$_GET['m'],1,$_GET['y'])); // Kuukauden eka viikonpäivä on: $kk['eka'] = date("w",mktime(0,0,0,$_GET['m'],1,$_GET['y']));
Tuossahan on 2 kertaa saman mktime() funktion kutsu identtisillä parametreillä?
Ai :D Ymmärsin väärin.
No tossahan tosiaan kutsutaan MKtimeä pari kertaa :-)
Tuo on niin pikkujuttu että ei jaksa säätää.
Tosin muutoksia tein nyt:
a) < ja > on muutettu hötömölöksi.
b) "Tänään" highlitetään nyt.
c) Koodi tulosti loppuun ylimääräisen TR:n. Se on korjattu.
d) Koodin tulostussorsaa on vähän kaunistettu..
Ensimmäisen päivämäärärivin TR puuttuu.
& -merkit merkitään & -merkinnällä, jos käytössä on HTML 4.01 Transitional ja meta Content-Type kannattaisi merkitä myös.
Ja joku esimerkki vois olla ihan kiva... :P
siisti ja näyttävä kalenteri.
lainaus:
Ensimmäisen päivämäärärivin TR puuttuu.
Kah.. toi pitää fiksata..
lainaus:
& -merkit merkitään & -merkinnällä, jos käytössä on HTML 4.01 Transitional
blablabla.. hä? & merkit merkitään & merkinnällä. ompa merkillistä merkkikieltä. Missä näit & merkin?
lainaus:
ja meta Content-Type kannattaisi merkitä myös.
Jeah. Tämähän olikin tieten HTML headeriesimerkki eikä PHP kalenteripohja.
Hyvä kalenteri! Tulisi tarpeeseen myös viikonnumerot kalenterin jompaankumpaan reunaan, mutta yritän säätää ite kuhan muilta kiireiltäni joudan...
Ei kukaan osaisi tehdä tästä koodista tapahtuma kalenteria??
Semmoiselle kun olisi käyttöä!
Oivallinen kalenteri, mutta viitsisikö joku neuvoa PHP:tä osaamattomalle, miten kalenterin aikaa saa taaksepäin? Kalenterissa kun päivä vaihtuu kotisivullani klo 02:00.
Hyvä koodi!
Olen tänään etsinyt kalenteripohjaa pieneen sivuprojektiini, ja mikään ei ole toiminut, kuin vasta tämä! Tuli etsittyä yli 1h monelta sivulta! Tämä on todella hyvä kalenteripohja. Voisit tehdä sellaisenkin version tästä, mihin voi "luoda" päiville tapahtumia.
Onhan tää jo vanha, mutta silti vielä paras mitä olen löytänyt. Mitä pitäisi tehdä jotta php5:lla ei valittaisi tuosta counter muuttujan esittelemättömyydestä?
Ja mistä lähtisi liikkeelle, että näyttäisi eventejä? Mysli-pohjaisena.
Muokkaus: Näköjään auttaa kun for-luupin ulkopuolelle laittaa $counter = 0; niin sitten ei enää valita.
Aihe on jo aika vanha, joten et voi enää vastata siihen.