Przejdź do głównej zawartości

Rejestr celow rocznych

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?

  • 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

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.

  1. Formularz dodawania celu Użytkownik wpisuje tresc celu, wybiera priorytet (niski, sredni, wysoki) i opcjonalnie termin realizacji.

  2. Lista celow że statusami System wyświetla liste wszystkich celow z mozliwoscia zmiany statusu (otwarte → w trakcie → ukonczone).

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

  • Formularz z polami: tytuł celu, priorytet (wybor z listy)
  • Dodawanie celow do pliku JSON
  • Wyswietlanie listy wszystkich celow
  • Prosty interfejs CSS (czytelna lista)
  • Walidacja - tytuł nie może być pusty

Przykładowy scenariusz:

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

Ocena: 3.0

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:

  • 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!