Czego się nauczysz?
- Obsługi formularzy HTML z wyborem statusu i priorytetu
- Aktualizacji istniejacych rekordow w pliku JSON
- Filtrowania i sortowania danych w PHP
- Tworzenia raportow i statystyk
Stworzysz Rejestr celow rocznych - aplikacje umozliwiajaca zapisywanie celow (np. nauka, sport, rozwoj osobisty), przypisywanie im priorytetu i sledzenie postepow realizacji. Użytkownik może dodawać cele, zmieniac ich status (otwarte, w trakcie, ukonczone) i przegladac podsumowanie. Wszystkie dane sa zapisywane do pliku JSON.
Czego się nauczysz?
W prawdziwej pracy...
Systemy zarzadzania celami (OKR, KPI) sa podstawa w każdej firmie. Aplikacje typu “goal tracker” ucza pracy że stanami (statusami), priorytetami i raportowaniem postepow - to umiejetnosci kluczowe przy budowie systemow zarzadzania projektami, CRM-ow i narzedzi do produktywnosci.
Formularz dodawania celu Użytkownik wpisuje tresc celu, wybiera priorytet (niski, sredni, wysoki) i opcjonalnie termin realizacji.
Lista celow że statusami System wyświetla liste wszystkich celow z mozliwoscia zmiany statusu (otwarte → w trakcie → ukonczone).
Zapis i aktualizacja danych Cele sa zapisywane do pliku JSON, a zmiany statusu aktualizuja istniejace rekordy.
Przykładowa struktura pliku JSON:
{ "goals": [ { "id": 1, "title": "Zdac egzamin INF.03", "description": "Przygotowac się do części praktycznej i teoretycznej", "priority": "high", "status": "in_progress", "deadline": "2026-06-30", "created_at": "2026-01-15 10:00:00", "updated_at": "2026-02-10 14:30:00" }, { "id": 2, "title": "Przeczytac 12 książek", "description": "Minimum jedna książka miesiecznie", "priority": "medium", "status": "open", "deadline": "2026-12-31", "created_at": "2026-01-01 09:00:00", "updated_at": "2026-01-01 09:00:00" }, { "id": 3, "title": "Ukonczyc kurs programowania", "description": "Kurs PHP i MySQL online", "priority": "high", "status": "done", "deadline": "2026-03-31", "created_at": "2026-01-10 11:00:00", "updated_at": "2026-03-20 16:45:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na strone i widzi formularz. Wpisuje cel “Zdac INF.03” i wybiera priorytet “wysoki”. Po kliknieciu “Dodaj” cel pojawia się na liscie ponizej formularza. Dane sa zapisane w pliku JSON.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik widzi liste celow z kolorowymi oznaczeniami (czerwony = wysoki priorytet, zielony = ukonczony). Klika przycisk “Rozpocznij” przy celu - status zmienia się na “w trakcie”. Może przefiltrowac liste, żeby zobaczyc tylko cele o wysokim priorytecie.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi na górze strony podsumowanie: “Ukonczone: 3/10 | W trakcie: 4 | Do zrobienia: 3”. Cele z terminem w ciagu 7 dni sa oznaczone żółtym ostrzezeniem. Może posortowac liste po priorytecie lub edytować istniejacy cel. Na koniec eksportuje liste do CSV.
Dodawanie nowego celu:
$data = json_decode(file_get_contents('goals.json'), true) ?? ['goals' => []];
$newGoal = [ 'id' => count($data['goals']) + 1, 'title' => htmlspecialchars($_POST['title']), 'priority' => $_POST['priority'], 'status' => 'open', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s')];
$data['goals'][] = $newGoal;file_put_contents('goals.json', json_encode($data, JSON_PRETTY_PRINT));Zmiana statusu celu:
function updateGoalStatus($goalId, $newStatus) { $data = json_decode(file_get_contents('goals.json'), true);
foreach ($data['goals'] as &$goal) { if ($goal['id'] == $goalId) { $goal['status'] = $newStatus; $goal['updated_at'] = date('Y-m-d H:i:s'); break; } }
file_put_contents('goals.json', json_encode($data, JSON_PRETTY_PRINT));}
// Użycie (z formularza):if (isset($_POST['change_status'])) { updateGoalStatus($_POST['goal_id'], $_POST['new_status']);}Filtrowanie celow po statusie:
function filterGoalsByStatus($goals, $status) { if ($status === 'all') { return $goals; } return array_filter($goals, function($goal) use ($status) { return $goal['status'] === $status; });}
// Użycie:$filteredGoals = filterGoalsByStatus($data['goals'], $_GET['status'] ?? 'all');Raport statystyczny:
function generateReport($goals) { $report = [ 'total' => count($goals), 'open' => 0, 'in_progress' => 0, 'done' => 0 ];
foreach ($goals as $goal) { $report[$goal['status']]++; }
$report['completion_rate'] = $report['total'] > 0 ? round(($report['done'] / $report['total']) * 100) : 0;
return $report;}Walidacja priorytetu jako enum:
function validatePriority($priority) { $allowed = ['low', 'medium', 'high']; if (!in_array($priority, $allowed)) { return "Priorytet musi być jednym z: " . implode(', ', $allowed); } return null;}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!