Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kalenteripohja

Sivun loppuun

Pitfall [03.03.2005 22:59:22]

#

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>&lt;</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>&gt;</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\">&nbsp;</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

Meitsi [04.03.2005 23:51:29]

#

Aika hieno. :P

sooda [05.03.2005 08:18:24]

#

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 -> &lt; ja &gt;, muuten ei validia
- Jee kiva 42 <3 :P

Olga [05.03.2005 09:49:43]

#

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.

T.M. [05.03.2005 15:32:14]

#

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.

sooda [05.03.2005 15:49:25]

#

Joo, kopsin vahingossa tekstin väärästä kohdasta kun näyttivät niin samalta. :)

Olga [06.03.2005 17:21:08]

#

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.

T.M. [07.03.2005 01:25:16]

#

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 :)

Pitfall [07.03.2005 11:52:57]

#

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.

T.M. [07.03.2005 12:20:45]

#

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ä?

Pitfall [07.03.2005 12:33:07]

#

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..

str4nd [08.03.2005 08:07:22]

#

Ensimmäisen päivämäärärivin TR puuttuu.
& -merkit merkitään &amp; -merkinnällä, jos käytössä on HTML 4.01 Transitional ja meta Content-Type kannattaisi merkitä myös.

SysRq868 [08.03.2005 10:36:03]

#

Ja joku esimerkki vois olla ihan kiva... :P

lahtis [08.03.2005 20:27:09]

#

siisti ja näyttävä kalenteri.

Pitfall [12.03.2005 13:32:54]

#

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.

Hagrid [13.03.2005 14:02:54]

#

Hyvä kalenteri! Tulisi tarpeeseen myös viikonnumerot kalenterin jompaankumpaan reunaan, mutta yritän säätää ite kuhan muilta kiireiltäni joudan...

PulZi [23.06.2006 14:41:34]

#

Ei kukaan osaisi tehdä tästä koodista tapahtuma kalenteria??
Semmoiselle kun olisi käyttöä!

a.salminen [25.06.2006 03:11:36]

#

Oivallinen kalenteri, mutta viitsisikö joku neuvoa PHP:tä osaamattomalle, miten kalenterin aikaa saa taaksepäin? Kalenterissa kun päivä vaihtuu kotisivullani klo 02:00.

Jonzku [19.02.2008 21:28:42]

#

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.

talikko [22.02.2010 15:04:27]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta