Kalendář

PHP Ostatní 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>
');

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 814x (8.77 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (1)

Program pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Ostatní tutoriály v PHP
Miniatura
Následující článek
Šablonovací systém PHP_JUI - Úvod

 

 

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

Avatar
Kit
Redaktor
Avatar
Kit:

Na Endoře je PHP Version 5.3.17.

Odpovědět 3.12.2012 12:34
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:

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

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
Odpovídá na Kit
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Kit:

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ů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

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:

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:

Použij kód, který napsal David Jančík [sczdavos]. 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:

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
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 57. Zobrazit vše