Jak vytvořit PHP kalendář?

Publikováno v sekci PHP v Sobotu 12.1.2008 - 12:01

Potřebujete PHP kalendář? Hledal jsem na internetu a nacházel jsem příliš robustní třídy či velmi ošklivé kódy, které začátečník nemůže chápat. Napsal jsem vlastní kalendář, jehož kód je velmi krátký a myslím, že nikomu nebude dělat problémy.

<?php
// odkazy na konkretni dny
$selected_days[2009][2][24] = true;
$selected_days[2009][2][27] = true;
$selected_days[2009][3][5]  = true;
$selected_days[2009][3][17] = true;
$selected_days[2009][4][20] = true;

// prvotni inicializace, nastavime aktualni cas,  mesic a rok
$date = time();
$day = date('d', $date);
$month = date('m', $date);
$year = date('Y', $date);


// pokud v GETu existuje mesic ci rok, tak "aktualni" mesic a rok je ten z URL
if ($_GET["year"]) $year = (int) $_GET["year"];
if ($_GET["month"]) $month = (int) $_GET["month"];

// pro dalsi zobrazeni potrebujeme prvni den v mesici, pocet dni v mesici ...
$first_day = mktime(0,0,0,$month, 1, $year);
$title = date('n', $first_day);
$day_of_week = date('D', $first_day);
$days_in_month = date('t', $first_day);


// ceske mesice
$cz_months = array( 
                    1 => "Leden",
                         "Únor",
                         "Březen",
                         "Duben",
                         "Květen",
                         "Červen",
                         "Červenec",
                         "Srpen",
                         "Září",
                         "Říjen",
                         "Listopad",
                         "Prosinec"
                );

$prevY = $nextY = $year;
$prevM = $nextM = $month;

// nastaveni odkazu pro predchozi a nasledujici mesic / rok
if ($month - 1 < 1) { $prevM = 12; $prevY--;} else {$prevM = $month - 1;}; 
if ($month + 1 > 12){ $nextM = 1; $nextY++;} else {$nextM = $month + 1;};  

$prev = "<a href='?month=".($prevM)."&year=".($prevY)."'><<</a>";
$next = "<a href='?month=".($nextM)."&year=".($nextY)."'>>></a>";

// timto si vyplnime v kalendari prazdne bunky, 1 den v mesici a prvniho neni vzdy pondeli ...
$emptyTD = array("Mon" => 0, "Tue" => 1, "Wed" => 2, "Thu" => 3, "Fri" => 4, "Sat" => 5, "Sun" => 6);
$blank = $emptyTD[$day_of_week];

// vykresleni kalendare
echo "<table border=1 align=center id=calendar>";
echo "<tr><th>$prev</th><th colspan=5> ".$cz_months[$title]." $year</th><th>$next</th></tr>";
echo "<tr><td width=42>M</td><td width=42>T</td><td width=42>W</td><td width=42>T</td><td width=42>F</td><td width=42>S</td><td width=42>S</td></tr>";

$day_count = 1;

echo "<tr>";

// zde prave zjistime pocet prazdnych bunek pred 1 dnem v mesici 
while ( $blank > 0 )
{
  echo "<td></td>";
  $blank--;
  $day_count++;
}

$day_num = 1;


// veskere dny v kalendari
while ($day_num <= $days_in_month)
{
    
    if (isset($selected_days[$year][$month][$day_num]))
    {
    
      if($day_num == $day)
      {
        echo "<td class='today'><b><a href='?year=$year&month=$month&day=$day_num'>$day_num</a></b></td>";
      }
      else
      {
        echo "<td class='days'><a href='?year=$year&month=$month&day=$day_num'>$day_num</a></td>";
      }
    
    }
    else
    {
        echo "<td class='days'>$day_num</td>";  
    }   
    
    


  $day_num++;
  $day_count++;
  
  if ($day_count > 7)
  {
    echo "</tr><tr>";
    $day_count = 1;
  }
}


// timto zajistime spravne zobrazeni kalendare a dopocitani prazdnych bunek
while ($day_count >1 && $day_count <=7)
{
  echo "<td> </td>";
  $day_count++;
}

echo "</tr></table>";
?>
Soubor ke stažení (kalendar.zip)

27 komentářů « Zpět


Komentáře

No já tedy nevím, ale mě se zdá, ukazuje nějak divně né? A jak se nastavuje startday - jsme v čechách... :-(
reagovat #2 Roman Janko: (Administrátor) admin@rjwebdesign.net
13.03.08 20:44
[1] Pavel Kraus Co se ti ukazuje divne? Jinak zahlavi dnu , na to staci jednoduche pole ne?
01.01.09 20:15
Velice dobrý a funkční příklad - mám ještě dotaz, jak by se to dalo udělat, že bych si u vybraných dní mohl změnit jednoduše barvu pozadí k danému dni a např. udělat i z čísla odkaz. _ poradíš? Díky
reagovat #4 Roman Janko: (Administrátor) admin@rjwebdesign.net
07.01.09 13:34
[3] Ross
Velmi jednodusse, vecer priklad rozsirim
18.02.09 09:27
Pěkné, a co kdyby měsíce byly česky? Tu část s odkazy na jednotlivé dny bych taky potřeboval :P

Díky
reagovat #6 Roman Janko: (Administrátor) admin@rjwebdesign.net
21.02.09 22:52
Kód upraven (pouze v prikladu, ne v souboru kalendar.zip )
reagovat #7 Jane:
04.05.09 21:19
Ahoj, tak se si tento kalendář stáhla, ale nezobrazí se mi.. Nevim, v čem je chyba... Poradíte pls?? Dělám to v programu Evrsoft First Page 3.0
reagovat #8 Roman Janko: (Administrátor) admin@rjwebdesign.net
07.05.09 13:14
[7] Jane Tady je asi kazda rada zbytecna ... Je nutne si uvedomit ze to je dynamicky kod, bez podpory PHP a APACHE to nespustite. Prectete si o tom neco na linuxsoft.cz/php
reagovat #9 Aleš:
30.10.09 09:14
Ahoj, není mě jasný význam proměnných $selected_days, může mi to někdo vysvětlit? Díky
reagovat #10 Aleš:
30.10.09 10:31
[9] Aleš tak už nic :-)
reagovat #11 j.ree:
27.04.10 14:49
je to sice pekny skript, ale docela mi tam vadi, ze nemas osetreny fakt, ze aktualni datum se zvyraznuje jak v budoucich tak i v minulych mesicich. Cize, dneska je 27.4., zvyrazneno budu mit i 27.5, 27.3 apod ... :)
reagovat #12 Roman Janko: (Administrátor) admin@rjwebdesign.net
28.04.10 00:18
[11] j.ree To se da lehce opravit :]
reagovat #13 j.ree:
28.04.10 15:33
[12] Roman Janko Vsak jsem si to taky opravil, stacila jedna podminka navic :)
05.05.10 20:52
Ahoj,mám takovej blbej dotaz..trochu se tu orientuju v tom kódě, ale některý věci mi pořád nejsou tak úplně jasný. Nemáš k tomu přesnější popisek? Trochu v tom plavu a newim co je co :D jinak obdivuju samozrejme ;)dyžtak mi písni na maila=)
08.10.10 13:06
Děkuju na stotisíckrát, po pár úpravách se jedná o velmi povedený kalendář
reagovat #16 Roman Janko: (Administrátor) admin@rjwebdesign.net
11.10.10 13:30
[15] er No dík :)
04.04.11 12:49
Ddal bych tam isset($_GET["year"]) a pod tim isset($_GET["mounth"]) ... když nebudou existovat, PHP by hodilo error.
[17] Drahomír Hanák Ano, ale je to pouze notice, na produkčním vyplé povětšinou. Navíc tento skript je staršího data a rozhodně není ideální a to ani nikde netvrdím. Je to pouze jakýsi nástin, jako ostatně všechno, nikoliv pro rozené "pastery" ctr+c -> ctr+v
reagovat #19 David Tomek:
09.06.11 22:12
poradí někdo jak zvýraznit aktuální den??? nwm jak na to
Kdyžtak mi pošlete ten script.

Děkuji předem
reagovat #20 Vasek:
01.07.11 16:02
Čau. Koukal jsem na vygenerovaný kod a na konci to vzdy generuje navic . Coz neni validni ale jinak je to ok :)
reagovat #21 Vasek:
01.07.11 16:03
jedno otevřený a uzavreny trko
reagovat #22 ¨RJ:
01.07.11 20:13
[21] Vasek Oprav a uverejnim nebo si casem udelam cas :)

Validita není nic
reagovat #23 Vašek:
02.07.11 12:40
Tak už jsem na to přišel. Chceš to poslat na mail? Sem totiž nejdou vkladat některý znaky.
Nejde mi TO stiahnuť...
NO, skutočne to nejde stiahnuť. A skopírovaný kód z príkladu nie je ošetrený napr. tým, že každý mesiac označuje aktuálny deň...
Not Found!
I přesto se s tím dají dělat blbiny a funkční, stačí si lehce pohrát:
www.zbelitovsko.cz/zbemeteo.php
Romane díky za inspiraci, ještě to šlechtím...

Přidat komentář

Nový vzkaz

* Tato pole jsou povinná, [smajlíci]

  • na jiné komentáře odkazujte pomocí odkazu reagovat
  • vaše IP adresa bude zaznamenána
  • používají se gravatary
  • můžeme si tykat
  • HTML tagy vypnuty. PHP kód se také neprovede. Pokud potřebuju přiložit ukázku vašeho kódu, použijete službu pastebin, nebo jej vložte mezi značky [code] [/code]
  • vulgární, rasistické či jinak nepřípustné komentáře budou smazány