Czego się nauczysz?
- Obsługi formularzy HTML i walidacji danych w PHP
- Pracy z datami i ich porownywania
- Implementacji statusow i filtrowania
- Zapisu i odczytu danych z plikow JSON
Stworzysz Przypominacz - aplikacje do zapisywania przypomnien o ważnych terminach i wydarzeniach. Użytkownik może dodawać przypomnienia z data i opisem, przegladac nadchodzace terminy i oznaczac je jako wykonane. Wszystkie dane sa zapisywane do pliku JSON.
Czego się nauczysz?
W prawdziwej pracy...
Systemy przypomnien sa podstawa aplikacji do zarzadzania zadaniami, kalendarzy i asystentow osobistych. Od prostych todo list po zaawansowane systemy CRM - wszystkie wykorzystuja mechanizmy terminow i powiadomien. To praktyczna umiejetnosc w każdym projekcie.
Formularz dodawania przypomnienia Użytkownik podaje tytuł przypomnienia, date terminu i opcjonalnie dodatkowy opis.
Lista przypomnien System wyświetla wszystkie przypomnienia z wyroznieniem nadchodzacych terminow.
Zarzadzanie przypomnieniami Użytkownik może oznaczyc przypomnienie jako wykonane lub usunąć je z listy.
Przykładowa struktura pliku JSON:
{ "reminders": [ { "id": 1, "title": "Oddac miniprojekt", "description": "Projekt z PHP na zaliczenie", "date": "2026-02-28", "status": "active", "created_at": "2026-02-17 10:00:00" }, { "id": 2, "title": "Urodziny mamy", "description": "Kupic prezent!", "date": "2026-03-15", "status": "active", "created_at": "2026-02-17 10:30:00" }, { "id": 3, "title": "Wizyta u dentysty", "description": "", "date": "2026-02-10", "status": "done", "completed_at": "2026-02-10 15:00:00", "created_at": "2026-02-01 09:00:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na strone i widzi formularz. Wpisuje “Oddac projekt”, wybiera date 28.02 i dodaje opis. Po kliknieciu “Dodaj” przypomnienie pojawia się na liscie. Dane sa zapisywane do pliku JSON.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik widzi liste posortowana po dacie. Przypomnienia na dzisiaj sa oznaczone na żółto, na jutro - na pomaranczowo. Klika “Wykonane” przy wizycie u dentysty - zmienia status i kolor. Przy probie dodania przypomnienia z wczorajsza data widzi błąd.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Na górze strony użytkownik widzi sekcje “Najblizsze 7 dni” z 3 przypomnieniami. Filtruje po “aktywne” - widzi tylko niezrealizowane. Statystyki pokazuja: “Ten tydzien: 5 przypomnien, Ten miesiac: 12”. Eksportuje liste do CSV.
Walidacja danych przypomnienia:
$errors = [];$title = trim($_POST['title'] ?? '');$date = $_POST['date'] ?? '';$description = trim($_POST['description'] ?? '');
if (empty($title)) { $errors[] = "Tytuł przypomnienia jest wymagany";}if (empty($date) || !strtotime($date)) { $errors[] = "Podaj poprawna date";}
// Dla nowych przypomnien - data nie z przeszłości$reminderDate = new DateTime($date);$today = new DateTime('today');if ($reminderDate < $today) { $errors[] = "Data przypomnienia nie może być z przeszłości";}Sortowanie po dacie (najblizsze najpierw):
usort($data['reminders'], function($a, $b) { return strtotime($a['date']) - strtotime($b['date']);});Sprawdzanie czy przypomnienie jest dzisiaj/jutro:
function getReminderUrgency($date) { $reminderDate = new DateTime($date); $today = new DateTime('today'); $tomorrow = new DateTime('tomorrow');
if ($reminderDate->format('Y-m-d') === $today->format('Y-m-d')) { return 'today'; } if ($reminderDate->format('Y-m-d') === $tomorrow->format('Y-m-d')) { return 'tomorrow'; } if ($reminderDate < $today) { return 'overdue'; } return 'upcoming';}Filtrowanie nadchodzacych 7 dni:
function getUpcoming7Days($reminders) { $today = new DateTime('today'); $weekLater = new DateTime('+7 days');
return array_filter($reminders, function($reminder) use ($today, $weekLater) { if ($reminder['status'] !== 'active') return false; $date = new DateTime($reminder['date']); return $date >= $today && $date <= $weekLater; });}Oznaczanie jako wykonane:
if (isset($_POST['mark_done'])) { $reminderId = (int)$_POST['reminder_id']; $data = json_decode(file_get_contents('reminders.json'), true);
foreach ($data['reminders'] as &$reminder) { if ($reminder['id'] === $reminderId) { $reminder['status'] = 'done'; $reminder['completed_at'] = date('Y-m-d H:i:s'); break; } }
file_put_contents('reminders.json', json_encode($data, JSON_PRETTY_PRINT));}Licznik przypomnien:
function countReminders($reminders, $period = 'week') { $today = new DateTime('today');
if ($period === 'week') { $endDate = new DateTime('+7 days'); } else { // month $endDate = new DateTime('last day of this month'); }
return count(array_filter($reminders, function($r) use ($today, $endDate) { if ($r['status'] !== 'active') return false; $date = new DateTime($r['date']); return $date >= $today && $date <= $endDate; }));}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!