Przejdź do głównej zawartości

Przypominacz (mini)

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?

  • 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

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.

  1. Formularz dodawania przypomnienia Użytkownik podaje tytuł przypomnienia, date terminu i opcjonalnie dodatkowy opis.

  2. Lista przypomnien System wyświetla wszystkie przypomnienia z wyroznieniem nadchodzacych terminow.

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

  • Formularz z polami: tytuł, data, opis (opcjonalny)
  • Walidacja danych w PHP (niepusty tytuł, poprawna data)
  • Lista wszystkich przypomnien
  • Zapis przypomnien do pliku JSON
  • Prosty interfejs CSS (czytelny formularz i lista)

Przykładowy scenariusz:

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

Ocena: 3.0

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:

  • Pokazac postepy - nawet małe kroki się licza
  • Wyjaśnić watpliwosci - pytaj, nie zgaduj
  • Skonsultowac rozwiązania - feedback pomoze Ci się rozwijac

Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!