Slevový týden - Červenec C# týden
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se C#

Kalendář

Jednoduchý kalendář v PHP s možností ukládání poznámek.

Databáze:

--
-- Struktura tabulky `calendar`
--
CREATE TABLE IF NOT EXISTS `calendar` (
  `event_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `date` date NOT NULL,
  `description` text COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`event_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ;

Zdrojový kód:

České názvy měsíců:

$monthNames = array(1 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');

Výpis kalendářního měsíce:

// hlavička kalendáře
echo('
    <table id="calendar">
        <tr>
            <th colspan="7">' .
                // měsíc slovně -> první písmeno velké - bere i s diakritikou
                mb_convert_case($this->monthNames[$month], MB_CASE_TITLE, 'UTF-8') . ' ' . $year
        . '</th>
        </tr>
        <tr id="calendar-dayrow">
            <td>Po</td><td>Út</td><td>St</td><td>Čt</td><td>Pá</td><td>So</td><td>Ne</td>
        </tr>
        <tr>');

// počet dnů pro daný měsíc v roce
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);

// zjištění začátku týdne
$weekDay = idate("w", mktime(0, 0, 0, $month, 1, $year));
if ($weekDay == 0) // začíná nedělí, ta je u nás však 7., 0. pozici vynecháme
    $weekDay = 7;

// vynecháme místo
for ($i = $weekDay; $i > 1; $i--)
    echo('<td>&nbsp;</td>');

// vypsání jednotlivých dnů
for ($day = 1; $day <= $daysInMonth; $day++)
{
    echo('<td');
    // pokud je aktuální měsíc a rok, označí se den -> lze pak zvýraznit pomocí css
    if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
        echo(' id="calendar-today" ');
    echo('>');

    echo('<a href="?show=' . $year . '-' . $month . '-' . $day . '">' . $day . '</a>');

    // řádkování podle týdnů
    if (($weekDay % 7) == 0)
        echo('</tr><tr>');

    $weekDay++;
    if ($weekDay > 7)
        $weekDay = 1;
}

$previousMonth = ($month - 1) > 0 ? $month - 1 : 12;
$nextMonth = ($month % 12) + 1;

$previousYear = $previousMonth > $month ? $year - 1 : $year;
$nextYear = $nextMonth < $month ? $year + 1 : $year;

// navigace
echo('
        </tr>
        <tr>
            <td colspan="4">
                <a href="?date=' . $previousYear . '-' . $previousMonth . '">
                    ' . $this->monthNames[$previousMonth] . '
                </a>
            </td>
            <td colspan="4" align="right">
                <a href="?date=' . $nextYear . '-' . $nextMonth . '">
                    ' . $this->monthNames[$nextMonth] . '
                </a>
            </td>
        </tr>
    </table>
');
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Přídání a výpis událostí k vybranému datu

// kontrola data
if (!checkdate($month, $day, $year))
{
    $year = idate('Y');
    $month = idate('m');
    $day = idate('d');
    echo('Datum není platné. Nastavuji dnešní.');
}

// přeformátování 2012-7-16 -> 2012-07-16
$date = date_create_from_format('Y-n-j', $year . '-' . $month . '-' . $day)->format('Y-m-d');

echo('Datum:' . $day . '. ' . $month . '. ' . $year);

$result = mysql_query('SELECT `event_id`, `name`
                        FROM `calendar`
                        WHERE `date` = "' . mysql_real_escape_string($date) . '"
                    ');
// vypsání existujících událostí k tomuto datu
while ($event = mysql_fetch_assoc($result))
{
    echo('<p>
            <a href="?edit=' . $event['event_id'] . '">' . $event['name'] . '</a>
            <a href="?delete=' . $event['event_id'] . '">( X )</a>
        </p>'
        );
}

echo('
    <form method="post">
        <input type="text" name="event_name" placeholder="Název údálosti" /><br />
        <input type="date" name="event_date" value="' . $date . '" /><br />
        <textarea name="event_description" placeholder="Popis události"></textarea><br />
        <input type="submit" name="add_event" value="Přidat" />
    </form>
');

Editace vybrané události

$result = mysql_query('SELECT * FROM `calendar`
                        WHERE `event_id` = ' . mysql_real_escape_string($eventId));

// vezme pole, které vrátí db -> { ['name'] => "Jméno události", ['date'] => "yyyy-mm-dd", ... }
// a nahraje je do proměnných -> $name = "Jméno události", $date = ...
extract(mysql_fetch_assoc($result));

echo('
    <form method="post">
        <input type="text" name="event_name" placeholder="Název údálosti" value="' . $name . '" /><br />
        <input type="date" name="event_date" value="' . $date . '" /><br />
        <textarea name="event_description" placeholder="Popis události">' . $description . '</textarea><br />
        <input type="hidden" name="event_id" value="' . $eventId . '" />
        <input type="submit" name="edit_event" value="Upravit" />
    </form>
');

Vkládání do db:

// načte z pole 2012-7-16 -> { [0] => 2012, [1] => 7, [2] => 16 } do daných proměnných v daném pořadí
list($year, $month, $day) = explode('-', $eventDate);
if (checkdate($month, $day, $year))
{
    // ošetření injekce
    $eventName = mysql_real_escape_string($eventName);
    $eventDate = mysql_real_escape_string($eventDate);
    $eventDescription = mysql_real_escape_string($eventDescription);

    mysql_query('INSERT INTO calendar(name, date, description)
                    VALUES("' . $eventName . '", "' . $eventDate . '", "' . $eventDescription . '")
                ');
}
else
    echo('Chybné datum!');

Aktualizace záznamu v db:

list($year, $month, $day) = explode('-', $eventDate);
if (checkdate($month, $day, $year))
{
    $eventId = mysql_real_escape_string($eventId);
    $eventName = mysql_real_escape_string($eventName);
    $eventDate = mysql_real_escape_string($eventDate);
    $eventDescription = mysql_real_escape_string($eventDescription);

    mysql_query('UPDATE `calendar`
                    SET `name` = "' . $eventName . '",
                        `date` = "' . $eventDate . '",
                        `description` = "' . $eventDescription . '"
                    WHERE `event_id` = ' . $eventId . '
                ');
    echo('Editováno!');
}
else
    echo('Chybné datum!');

Smazání záznamu z db:

mysql_query('DELETE FROM `calendar`
                WHERE `event_id` = ' . mysql_real_escape_string($eventId));
echo('Smazáno!');

Vyhledání brzkých událostí:

$result = mysql_query('SELECT `event_id`, `name`, DATE_FORMAT(`date`, "%e. %m. %Y") AS `date`
                        FROM `calendar`
                        WHERE `date` BETWEEN CURDATE() AND CURDATE() + INTERVAL 7 DAY
                        ORDER BY `date` ASC
                    ');

echo('Brzké události:');
while ($event = mysql_fetch_assoc($result))
{
    echo('<p>
            <a href="?edit=' . $event['event_id'] . '">
                ' . $event['date'] . ': ' . $event['name']. '
            </a>
        </p>');
}

Galerie


 

Stáhnout

Staženo 1016x (8.77 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP OOP

 

Všechny články v sekci
Zdrojákoviště pro OOP v PHP
Program pro vás napsal David Jančík
Avatar
Jak se ti líbí článek?
2 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity (2)

 

 

Komentáře
Zobrazit starší komentáře (48)

Avatar
samo007
Redaktor
Avatar
samo007:3.12.2012 13:01

Ďakujem za rady. Skúsim to teda presunť na web. Ale vyzerá to, že to bude fungovať celkom dobre. Ak, tak to skúsim na Endore.

Len by som chcel vedieť, ako vymazať možnosť upravovať poznámky. (Aby sa iba zobrazily)

 
Odpovědět
3.12.2012 13:01
Avatar
Kit
Redaktor
Avatar
Kit:3.12.2012 14:49

Koukám, že při vypisování kalendáře děláš zbytečně moc výpočtů. Podle mne je lepší použít třídu DateTime a iterovat datum. Ještě výhodnější bývá tahání takových údajů z databáze, ale to by v daném případě asi nebylo tak názorné.

Nepochopil jsem, proč je v SQL dotazu

DEFAULT CHARSET=latin1
Editováno 3.12.2012 14:52
Odpovědět
3.12.2012 14:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík:3.12.2012 15:15

S tou iterací data je to dobrý nápad, jdu si to vyzkoušet.

Kódování jsem opravil. Měl jsem na lokálu špatně nastavené porovnávání a všechno mi to tvořilo v latin1.

Odpovědět
3.12.2012 15:15
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík:3.12.2012 15:54

Jenom mi na tom docela vadí, že když dám $date->add(new DateInterval('P1D')); tak se výsledná hodnota automaticky přiřadí danému objektu. Pokud tedy chci zjistit informace o předchozím měsíci musím to udělat takhle:

$date = date_create_from_format('Y-n-j', $year . '-' . $month . '-1');
// předchozí měsíc
$dateSub = date_create_from_format('Y-n-j', $year . '-' . $month . '-1')->sub(new DateInterval('P1M'));

Takhle jsem to udělal: http://www.itnetwork.cz/dev-lighter/32

Můžeš na to prosím mrknout a napsat mi k tomu nějaké připomínky?

Odpovědět
3.12.2012 15:54
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Redaktor
Avatar
Kit:3.12.2012 15:56

Jenom škoda, že DateTime::add() funguje až od PHP 5.3.

Dá se použít DateTime::modify() od PHP 5.2, ale moc nefunguje podle mých představ.

Odpovědět
3.12.2012 15:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík
Kit:3.12.2012 19:35

Je to trochu nešikovné, ale je to objektové řešení. Vždy se bráním přepisování hodnot proměnných a tady je toho až moc.

Raději bych viděl databázové řešení (zkusím na nějaké přijít), protože řešení přes PHP občas bývá zdrojem chyb. Zejména pokud je databáze a PHP na různých serverech a trochu se jim "rozjedou" hodiny.

Odpovědět
3.12.2012 19:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
samo007
Redaktor
Avatar
Odpovídá na Kit
samo007:3.12.2012 19:49

Tak teraz neviem, čo mám vlastne použiť. Ktorý kód je najlepší a pasuje k mysql databáze?

 
Odpovědět
3.12.2012 19:49
Avatar
Kit
Redaktor
Avatar
Odpovídá na samo007
Kit:3.12.2012 20:00

Použij kód, který napsal David Jančík. Třeba tě mezitím napadne jiné a lepší řešení.

Odpovědět
3.12.2012 20:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
samo007
Redaktor
Avatar
Odpovídá na Kit
samo007:3.12.2012 21:12

Mne sa ten kalendar páči. Keď bude všetko fungovať podľa mojich predstáv, tak si vytvorím k tomu nejaký pekný dizajn.

 
Odpovědět
3.12.2012 21:12
Avatar
michal Čepelák:9.8.2017 13:39

Nevím co dělám špatně ale když otevřu na webu calendar.php tak my vyskočí error 500

 
Odpovědět
9.8.2017 13:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 58. Zobrazit vše