Czego się nauczysz?
- Wczytywania danych z pliku JSON
- Losowania elementów z tablicy (array_rand)
- Filtrowania danych po autorze/kategorii
- Dodawania nowych rekordów do kolekcji
- Tworzenia atrakcyjnej prezentacji tekstu
Stworzysz Generator losowego cytatu - aplikację wyświetlającą inspirujące cytaty z kolekcji zapisanej w pliku JSON. Użytkownik może losować nowe cytaty, filtrować je według autora i dodawać własne do bazy.
Czego się nauczysz?
W prawdziwej pracy...
Losowanie treści jest podstawą wielu aplikacji - od “cytat dnia” w aplikacjach motywacyjnych, przez losowe rekomendacje produktów, po systemy A/B testów. Umiejętność pracy z losowością, filtrowaniem i dynamiczną prezentacją treści jest fundamentem dla każdego programisty tworzącego aplikacje contentowe i marketingowe.
Przycisk losowania Użytkownik klika przycisk “Losuj cytat” i widzi losowo wybrany cytat z kolekcji wraz z autorem.
Wyświetlenie cytatu Cytat jest prezentowany w czytelnej formie - treść w cudzysłowie, autor poniżej, stylizacja graficzna.
Obsługa błędów Jeśli plik jest pusty lub nie istnieje, system wyświetla odpowiedni komunikat zamiast błędu.
Baza cytatów Cytaty są przechowywane w pliku JSON z autorem i opcjonalnie kategorią.
Przykładowa struktura pliku JSON:
{ "quotes": [ { "id": 1, "text": "Jedynym sposobem na świetną pracę jest kochanie tego, co robisz.", "author": "Steve Jobs", "category": "motywacja", "created_at": "2026-01-01" }, { "id": 2, "text": "Wyobraźnia jest ważniejsza od wiedzy.", "author": "Albert Einstein", "category": "nauka", "created_at": "2026-01-01" }, { "id": 3, "text": "Kod jest jak humor. Kiedy musisz go wyjaśniać, jest zły.", "author": "Cory House", "category": "programowanie", "created_at": "2026-01-01" }, { "id": 4, "text": "Prostota jest szczytem wyrafinowania.", "author": "Leonardo da Vinci", "category": "design", "created_at": "2026-01-01" }, { "id": 5, "text": "Najtrudniejszą rzeczą na świecie jest prostota.", "author": "Charlie Chaplin", "category": "życie", "created_at": "2026-01-01" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na stronę i klika “Losuj cytat”. Pojawia się: “Jedynym sposobem na świetną pracę jest kochanie tego, co robisz.” — Steve Jobs. Po kolejnym kliknięciu wyświetla się inny cytat.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik wybiera autora “Albert Einstein” z listy i klika “Losuj”. Pojawia się jeden z cytatów Einsteina. Może kliknąć ikonę kopiowania, aby skopiować cytat do schowka.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik dodaje własny cytat przez formularz. System sprawdza, czy nie istnieje podobny. W historii widzi ostatnie 10 wylosowanych cytatów. Może oznaczyć cytat jako ulubiony klikając serduszko.
Wczytywanie cytatów z pliku:
function loadQuotes(string $filePath): array { if (!file_exists($filePath)) { return []; }
$content = file_get_contents($filePath); $data = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) { return []; }
return $data['quotes'] ?? [];}Losowanie cytatu:
function getRandomQuote(array $quotes): ?array { if (empty($quotes)) { return null; }
$randomIndex = array_rand($quotes); return $quotes[$randomIndex];}
// Użycie$quotes = loadQuotes('data/quotes.json');$quote = getRandomQuote($quotes);
if ($quote) { echo "\"{$quote['text']}\" — {$quote['author']}";} else { echo "Brak cytatów do wyświetlenia";}Filtrowanie po autorze:
function filterByAuthor(array $quotes, string $author): array { if (empty($author)) { return $quotes; }
return array_filter($quotes, function($q) use ($author) { return $q['author'] === $author; });}
function getUniqueAuthors(array $quotes): array { $authors = array_column($quotes, 'author'); $unique = array_unique($authors); sort($unique); return $unique;}
// Użycie$authors = getUniqueAuthors($quotes);// Wynik: ['Albert Einstein', 'Charlie Chaplin', 'Cory House', ...]Filtrowanie po kategorii:
function filterByCategory(array $quotes, string $category): array { if (empty($category)) { return $quotes; }
return array_filter($quotes, function($q) use ($category) { return ($q['category'] ?? '') === $category; });}
function getUniqueCategories(array $quotes): array { $categories = array_column($quotes, 'category'); $unique = array_unique(array_filter($categories)); sort($unique); return $unique;}Dodawanie nowego cytatu:
function addQuote(array &$quotes, string $text, string $author, string $category = ''): int { $newId = empty($quotes) ? 1 : max(array_column($quotes, 'id')) + 1;
$newQuote = [ 'id' => $newId, 'text' => trim($text), 'author' => trim($author), 'category' => trim($category), 'created_at' => date('Y-m-d'), ];
$quotes[] = $newQuote; return $newId;}
function saveQuotes(string $filePath, array $quotes): bool { $data = ['quotes' => array_values($quotes)]; $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); return file_put_contents($filePath, $json) !== false;}JavaScript - kopiowanie do schowka:
function copyQuote(text, author) { const fullQuote = `"${text}" — ${author}`;
navigator.clipboard.writeText(fullQuote).then(() => { showNotification('Skopiowano do schowka!'); }).catch(err => { console.error('Błąd kopiowania:', err); });}
function showNotification(message) { const notification = document.createElement('div'); notification.className = 'notification'; notification.textContent = message; document.body.appendChild(notification);
setTimeout(() => notification.remove(), 2000);}Sprawdzanie duplikatów:
function isDuplicate(array $quotes, string $text): bool { $normalizedText = strtolower(trim($text));
foreach ($quotes as $quote) { $existingText = strtolower(trim($quote['text'])); // Porównanie z tolerancją (np. usuń interpunkcję) if (similar_text($normalizedText, $existingText) / strlen($normalizedText) > 0.9) { return true; } }
return false;}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!