INF.03-04-26.06-SGCzerwiec 2026 · 64 kroki · ok. 106 min · 39 kryteriów z klucza
Rozwiązanie krok po kroku: Strona rezerwacji biura podróży (Wersja podstawowa)
Rozwiązanie buduje stronę rezerwacji biura podróży: baza wyprawy (wycieczki i rezerwacje) i cztery zapytania - SELECT z warunkiem, COUNT z dwoma warunkami, złączenie tabelJOIN i suma z grupowaniem GROUP BY - potem grafika z przezroczystym tłem, strony rezerwacja.html i wycieczki.html z formularzem w dwóch sekcjach i dziewięcioma zdjęciami w bloku bocznym, style w styl.css (układ na pływających blokach, przyciski z różnymi marginesami w pionie i poziomie) oraz skrypt JavaScript: przyciski „Uczestnik” i „Rezerwacja” włączają kontrolki jednej sekcji i wyłączają drugiej, a znaki « i » przewijają zdjęcia wycieczek z zawinięciem.
Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Skrypt jest najpierw pisany najprościej: funkcje wywoływane atrybutem onclick, każda kontrolka osobno przez document.getElementById, przewijanie z instrukcją if. Na końcu skrypt zostaje przerobiony na wersję z prawdziwych projektów: <fieldset disabled> zamiast wyłączania pól po kolei, reszta z dzielenia przy przewijaniu, zdjęcia bloku bocznego z pętli i nasłuchiwacze zdarzeń. W tym arkuszu nie ma PHP - strona rezerwacja jest zapisana jako HTML, co arkusz dopuszcza.
Obok jest druga wersja tego rozwiązania - zakładka Nowoczesny kod (grid, fieldset): te same punkty, ale układ na siatce CSS, grupy pól <fieldset>, stan przycisków w atrybucie aria-pressed i skrypt w osobnym pliku z nasłuchiwaczami zdarzeń od pierwszej linijki.
Baza i grafiki pochodzą z prawdziwego archiwum pliki4 (załącznik do arkusza, hasło w treści zadania). Zrzuty wyników zapytań są odtworzone z tej bazy - na egzaminie robisz je sam, z całego ekranu. Skrypt został sprawdzony w prawdziwej przeglądarce: kolory przycisków, aktywność kontrolek i kolejność zdjęć zgadzają się z ilustracjami 4 i 5 oraz z kolejnością podaną w arkuszu.
Jak liczą się punkty. Klucz ma 39 kryteriów (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 9 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Baza danych
Kroki 1-7 · po tym etapie masz 6 z 39 kryteriów (pkt)
Krok 1: Baza danych wyprawy
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie wyprawy, z zestawem polskich znaków (np. utf8_polish_ci)
Rozpakuj pliki4.7z z pulpitu (hasło RezErw@cjE - wielkie R, E i E, małpa zamiast „a”) i załóż folder z numerem zdającego. W phpMyAdmin: Nowa, nazwa wyprawy, porównywanie utf8_polish_ci.
Krok 2: Import tabel z pliku wyprawy.sql
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabele z pliku wyprawy.sql
Zaznacz bazę wyprawy, potem Import → wyprawy.sql → Wykonaj. Dwie tabele z ilustracji 1: wycieczki (Barcelona, Rzym, Londyn) i rezerwacje (10 rezerwacji). Klucz obcy Wycieczki_id wskazuje wycieczkę, osob mówi, dla ilu osób jest rezerwacja, a wyzywienie to 1 - śniadania, 2 - śniadania i obiadokolacje, 3 - all inclusive.
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabel do bazy danych wyprawy - plik import.png
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie PNG pod nazwą import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel
Print Screen, wklejasz do edytora grafiki i zapisujesz jako import.png - w tym arkuszu wszystkie zrzuty są w PNG.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: rezerwacje z all inclusive
Kryteria: ,
R.1.2 W pliku kwerendy.txt zapisane co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonane zapytanie 1 wybierające jedynie imiona i nazwiska osób rezerwujących wycieczki z wyżywieniem typu 3. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT imie, nazwisko FROM rezerwacje WHERE wyzywienie = 3; oraz na zrzucie są dokładnie 4 rekordy dla: Anny, Jana, Judyty i Jolanty
ok. 1 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie imiona i nazwiska osób rezerwujących wycieczki z wyżywieniem typu 3 (all inclusive)
Dwie kolumny i warunek wyzywienie = 3. Wynik: Anna, Jan, Judyta i Jolanta - jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT imie, nazwisko FROM rezerwacje WHERE wyzywienie = 3;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: liczba rezerwacji do Rzymu z Warszawy
Kryteria:
R.1.4 Wykonane zapytanie 2 zliczające rezerwacje na wycieczkę o id równym 2 i wylocie z Warszawy. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT COUNT(*) FROM rezerwacje WHERE Wycieczki_id = 2 AND wylot = "Warszawa"; oraz na zrzucie jest widoczna wartość 2
ok. 2 min
Polecenie z arkusza
Zapytanie 2: zliczające rezerwacje na wycieczkę o id równym 2 i wylocie z Warszawy
COUNT(*) - liczy wiersze spełniające warunek, zamiast je wypisywać,
WHERE Wycieczki_id = 2 AND wylot = 'Warszawa' - oba warunki naraz.
Wynik: 2. Sam warunek na wycieczkę dałby 5 - tyle jest wszystkich rezerwacji do Rzymu. Zrzut: kw2.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM rezerwacje WHERE wyzywienie = 3;-- Zapytanie 2SELECT COUNT(*) FROM rezerwacje WHERE Wycieczki_id = 2 AND wylot = 'Warszawa';
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: miejsca wycieczek z rezerwującymi
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie miejsca wycieczek i odpowiadające im imiona i nazwiska rezerwujących. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT miejsce, imie, nazwisko FROM wycieczki JOIN rezerwacje ON wycieczki.id = Wycieczki_id; (lub porównanie kluczy po WHERE ) oraz na zrzucie jest dokładnie 10 rekordów
ok. 2 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie miejsca wycieczek i odpowiadające im imiona i nazwiska rezerwujących. Należy posłużyć się relacją
SELECT miejsce, imie, nazwisko - miejsce z wycieczki, osoba z rezerwacje,
FROM wycieczki JOIN rezerwacje - złączenie tabel,
ON wycieczki.id = rezerwacje.Wycieczki_id - klucz główny wycieczki równa się kluczowi obcemu rezerwacji.
Wynik: 10 wierszy, po jednym dla każdej rezerwacji. Zrzut: kw3.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM rezerwacje WHERE wyzywienie = 3;-- Zapytanie 2SELECT COUNT(*) FROM rezerwacje WHERE Wycieczki_id = 2 AND wylot = 'Warszawa';-- Zapytanie 3SELECT miejsce, imie, nazwisko FROM wycieczki JOIN rezerwacje ON wycieczki.id = rezerwacje.Wycieczki_id;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: liczba osób na każdej wycieczce
Kryteria:
R.1.6 Wykonane zapytanie 4 wybierające jedynie miejsca wycieczek i sumujące liczbę osób, dla których została zarezerwowana wycieczka. Jedna osoba (jeden rekord) może rezerwować wycieczkę dla kilku osób. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT miejsce, SUM(osob) FROM wycieczki JOIN rezerwacje ON wycieczki.id = Wycieczki_id GROUP BY miejsce; (lub porównanie kluczy po WHERE ) oraz na zrzucie są dane: Barcelona 5, Londyn 4, Rzym 10
ok. 3 min
Polecenie z arkusza
Zapytanie 4: wybierające jedynie miejsca wycieczek i sumujące liczbę osób, dla których została zarezerwowana wycieczka. Jedna osoba (jeden rekord) może rezerwować wycieczkę dla kilku osób. Należy posłużyć się relacją i grupowaniem
To samo złączenie, a do tego GROUP BY miejsce - wiersze z tym samym miejscem zlewają się w jeden, a SUM(osob) dodaje liczby osób z wszystkich rezerwacji grupy. Wynik: Barcelona 5, Londyn 4, Rzym 10. Zrzut: kw4.png.
Typowe błędy
COUNT(*) zamiast SUM(osob) liczy rezerwacje, nie osoby: Barcelona 3, Londyn 2, Rzym 5 - arkusz uprzedza, że jedna rezerwacja może być dla kilku osób.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM rezerwacje WHERE wyzywienie = 3;-- Zapytanie 2SELECT COUNT(*) FROM rezerwacje WHERE Wycieczki_id = 2 AND wylot = 'Warszawa';-- Zapytanie 3SELECT miejsce, imie, nazwisko FROM wycieczki JOIN rezerwacje ON wycieczki.id = rezerwacje.Wycieczki_id;-- Zapytanie 4SELECT miejsce, SUM(osob) FROM wycieczki JOIN rezerwacje ON wycieczki.id = rezerwacje.Wycieczki_id GROUP BY miejsce;
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-35 · po tym etapie masz 20 z 39 kryteriów (pkt)
Krok 8: Grafika osoba.png: przezroczyste tło
ok. 3 min
Polecenie z arkusza
Tło przezroczyste
osoba.png ma 640 × 640 px i jasnoszare tło. W GIMP-ie najpierw Warstwa → Przezroczystość → Dodaj kanał alfa (bez niego usunięte tło zamieni się w kolor), potem Zaznaczenie rozmyte z progiem ok. 15 i klik w tło, Edycja → Wyczyść. Sylwetka jest ciemniejsza od tła, więc różdżka jej nie zaznaczy. Usuń tło na pełnej rozdzielczości, dopiero potem przeskaluj - na dużym obrazie granica jest dokładniejsza.
Podgląd strony po tym kroku
Krok 9: Grafika osoba.png: szerokość 100 px
Kryteria:
R.2.1 Grafika osoba.png ma wymiary 100 px na 100 px i tło przezroczyste
ok. 2 min
Polecenie z arkusza
Cechy grafiki osoba.png: Przeskalowana z zachowaniem proporcji do szerokości 100 px
Obraz → Skaluj obraz, szerokość 100 px przy zamkniętym łańcuchu - obraz jest kwadratowy, więc wysokość też wychodzi 100 px (klucz: 100 × 100 z przezroczystym tłem). Eksport do PNG, żeby zachować kanał alfa.
Podgląd strony po tym kroku
Krok 10: Plik rezerwacja.html w HTML5
ok. 2 min
Polecenie z arkusza
Cechy strony rezerwacja: Zapisana w języku HTML5
Arkusz pozwala zapisać stronę rezerwacja jako PHP albo HTML. Nie ma tu żadnego skryptu po stronie serwera, więc wybierasz rezerwacja.html - otworzy się nawet bez XAMPP-a. Deklaracja <!DOCTYPE html> i szkielet strony.
Witryna składa się z podstron o nazwach rezerwacja (format PHP lub HTML), wycieczki.html. W pliku wycieczki.html należy zapisać „Strona w trakcie budowy”
Druga strona to sam napis w szkielecie HTML5. Zapisz ją teraz, żeby odnośnik „Do strony głównej” miał dokąd prowadzić.
wycieczki.htmlHTMLnowy plik
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wycieczki</title></head><body> <p>Strona w trakcie budowy</p></body></html>
Podgląd strony po tym kroku (wycieczki.html)
Krok 16: Bloki: nagłówek, główny, stopka
Kryteria:
R.2.4 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: header, main -> nav + section + section + aside, footer (dopuszcza się stosowanie bloków pomocniczych)
ok. 3 min
Polecenie z arkusza
Podział strony na bloki: nagłówkowy, główny i stopki. Blok główny zawiera bloki: nawigacyjny, dwa bloki sekcji i blok boczny. Podział zrealizowany za pomocą semantycznych znaczników języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z ilustracją 3
Klucz wymaga header, w main znaczników nav, dwóch section i aside, potem footer (R.2.4). Blok boczny piszesz w <main>jako pierwszy: na ilustracji 3 sięga od góry bloku nawigacyjnego do dołu sekcji, a element pływający w prawo (float: right) zaczyna się najwyżej tam, gdzie stoi w kodzie. Postawiony za sekcjami zacząłby się dopiero na ich wysokości.
Zawartość bloku bocznego: 9 obrazów z tekstem alternatywnym „wycieczki”. Obrazy są zapętlone: 1.jpg, 2.jpg, 3.jpg, 1.jpg itd. Sposób realizacji dowolny
Dziewięć <img> w kolejności 1, 2, 3, 1, 2, 3, 1, 2, 3 - „sposób dowolny”, więc najprościej wpisać je w HTML-u. Wersję z pętlą pokażesz w dobrych praktykach. Na razie zdjęcia są w pełnym rozmiarze; zmniejszy je styl bloku bocznego.
Poniżej etykieta „Imię” oraz pole edycyjne z nią powiązane
<br> przenosi etykietę pod obraz. <label for="firstName"> łączy się z polem po id - tego samego identyfikatora użyje skrypt, żeby pole włączać i wyłączać.
R.2.7 W bloku sekcji pierwszej znajduje się obraz osoba.png z tekstem alternatywnym "Klient" w bloku sekcji drugiej - 1.jpg z tekstem alternatywnym "Wycieczka" w bloku bocznym znajduje się 9 obrazów (w HTML lub skrypcie, część z nich może być ukryta)
ok. 1 min
Polecenie z arkusza
Obraz 1.jpg z tekstem alternatywnym „wycieczka”
Identyfikator tripImage - skrypt będzie podmieniał src tego obrazu. Z tym krokiem są wszystkie obrazy z klucza: osoba.png, 1.jpg i dziewięć zdjęć w bloku bocznym.
R.2.9 Na stronie znajdują się dwa znaczniki <span> ze znakami « i »
ok. 1 min
Polecenie z arkusza
Ogólny znacznik liniowy <span> ze znakiem », jego kliknięcie powoduje zmianę zdjęcia w bloku sekcji drugiej
Encja ». Oba znaki i obraz to elementy liniowe, więc stoją w jednym wierszu, a znaki wyrównują się do dolnej krawędzi zdjęcia - jak na ilustracji 2.
Krok 31: Pole liczby osób: 1 - 4, wartość 2, nieaktywne
ok. 2 min
Polecenie z arkusza
Etykieta „Liczba osób:” oraz pole edycyjne z nią powiązane. Pole jest typu numerycznego, przyjmuje wartości od 1 do 4, wyświetla wartość 2. Pole jest nieaktywne
type="number" z min="1" i max="4" - strzałki pola nie wyjdą poza ten zakres. value="2" to wartość na starcie, a atrybut disabled wyłącza pole: jest wyszarzone i nie da się w nim pisać.
Poniżej etykieta „Miejsce wylotu:” oraz pole listy rozwijanej z nią powiązane. Opcje listy: „Warszawa”, „Kraków”, „Wrocław”. Pole listy jest nieaktywne
R.3.6 Pole z liczbą osób jest typu number, przyjmuje wartości od 1 do 4, wyświetla wartość 2 (value lub placeholder) W danym momencie może być wybrane tylko jedno pole opcji, domyślnie pierwsze pole opcji jest zaznaczone
ok. 2 min
Polecenie z arkusza
Poniżej zgrupowane trzy pola opcji (w jednym momencie możliwe jest wybranie tylko jednego pola), powiązane z etykietami „Śniadania”, „Śniadania i obiadokolacje”, „All inclusive”. Wszystkie pola są nieaktywne, pierwsze jest zaznaczone
Pola type="radio" z tym samym name="food" tworzą grupę - zaznaczenie jednego odznacza pozostałe. Pierwsze dostaje checked, wszystkie disabled. Teraz wszystkie pola drugiej sekcji są nieaktywne, jak w stanie początkowym na ilustracji 2.
Typowe błędy
Różne wartości name przy polach opcji pozwalają zaznaczyć wszystkie trzy naraz - klucz wymaga, by można było wybrać tylko jedno (R.3.6).
R.2.8 W bloku sekcji pierwszej znajdują się dwa pola edycyjne W bloku sekcji drugiej - pole edycyjne, lista rozwijana, trzy pola opcji i przycisk. Co najmniej jedno pole ma powiązaną etykietę (label z for i id lub zagnieżdżenie kontrolki w label)
ok. 1 min
Polecenie z arkusza
Poniżej przycisk „Sprawdź cenę”. Przycisk nie ma funkcjonalności
Zwykły <button> bez obsługi kliknięcia. Arkusz nie każe go wyłączać, więc zostaje aktywny i skrypt go nie przełącza.
R.2.5 W bloku nagłówkowym znajduje się <h1>: "Rezerwacja wycieczek" w blokach sekcji <h2>: "Dane Klienta" i "Dane rezerwacji" oraz <h4>: "Barcelona", w stopce <p> z numerem zdającego
R.2.10 Numer zdającego jest w znaczniku <em>
ok. 1 min
Polecenie z arkusza
Zawartość bloku stopki: paragraf o treści „Autor strony: ”, dalej wstawiony numer zdającego. Numer zdającego jest zapisany w semantycznym znaczniku oznaczającym tekst uwypuklony, formatowany domyślnie jako pochylony
Tekst uwypuklony to <em> (kursywa). Na egzaminie w <em> wpisujesz swój numer zdającego (PESEL); tutaj stoi imię i nazwisko autora rozwiązania. Z tym krokiem są wszystkie nagłówki z klucza.
R.4.4 wysokość: oba bloki sekcji - 640px, blok boczny - 700px
R.4.10 w przypadku przepełnienia (overflow) bloku bocznego zawartość wystająca poza blok jest ukryta
ok. 2 min
Polecenie z arkusza
Dla bloku bocznego: szerokość 10%, wysokość 700 px, w przypadku przepełnienia bloku zawartość wystająca poza blok jest ukryta
overflow: hidden - to, co nie mieści się w 700 px, zostaje obcięte bez paska przewijania. Teraz zdjęcia mają jeszcze pełny rozmiar, więc widać fragment pierwszego; po zmniejszeniu do szerokości bloku ich wysokość zależy od szerokości okna, a na szerokim ekranie dziewięć zdjęć przekracza 700 px - na ilustracji 2 ostatnie jest ucięte w połowie.
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 3 w arkuszu egzaminacyjnym (prawidłowo zastosowane właściwości CSS decydujące o układzie bloków na stronie, np. float i clear albo display flex albo grid albo position; żaden blok nie zachodzi na inne bloki - sprawdzić w inspektorze)
ok. 3 min
Polecenie z arkusza
Podział zrealizowany za pomocą semantycznych znaczników języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z ilustracją 3
Arkusz nie mówi, jak ustawić bloki - wybierasz float, bo szerokości z arkusza składają się dokładnie na 100%: blok boczny (pierwszy w kodzie) pływa w prawo od samej góry, blok nawigacyjny (90%) staje obok niego, a dwie sekcje po 45% mieszczą się w kolejnym rzędzie, nadal po lewej stronie bloku bocznego (700 px wysokości). Stopka dostaje clear: both, żeby zaczęła się pod wszystkimi pływającymi blokami. Równie dobra jest siatka grid z szerokościami w grid-template-columns - klucz przyjmuje oba sposoby (R.3.1, R.4.3), a siatkę pokazuje wersja nowoczesna (zakładka obok).
Typowe błędy
Blok boczny postawiony w kodzie za sekcjami z float: right zaczyna się na wysokości sekcji, a nie bloku nawigacyjnego - układ różni się od ilustracji 3.
Jedynie dla obrazów w bloku bocznym: szerokość 100%
Selektor potomka aside img - „jedynie” znaczy, że osoba.png i zdjęcie wycieczki zostają w swoim rozmiarze. Sam selektor img rozciągnąłby wszystkie obrazy.
Krok 45: Przyciski: marginesy w pionie i w poziomie
Kryteria: , , ,
R.4.2 kolor tła: ciało strony - AliceBlue, blok nagłówkowy, stopki, przycisków - SkyBlue
R.4.3 szerokość: blok nawigacyjny - 90%, oba bloki sekcji - 45%, blok boczny - 10% (width lub grid-template- columns lub flex ), obraz jedynie w bloku bocznym - 100%, przyciski 45%
R.4.6 marginesy wewnętrzne (padding ): blok nagłówkowy, stopka - 1px, przyciski - górny i dolny - 15px, pozostałe - 40px
Dla przycisku: kolor tła SkyBlue, szerokość 45%, zaokrąglenie rogów 15 px, marginesy wewnętrzne górny i dolny 15 px, pozostałe 40 px, marginesy zewnętrzne górny i dolny 3 px, pozostałe 2%
Skrót z dwiema wartościami: pierwsza to góra i dół, druga lewa i prawa - padding: 15px 40px i margin: 3px 2%. Dwa przyciski po 45% plus marginesy po 2% z każdej strony mieszczą się w jednym wierszu bloku nawigacyjnego.
Kroki 47-59 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 47: Stan początkowy: przycisk „Uczestnik” wyróżniony
Kryteria: ,
R.5.1 Skrypt w języku JavaScript zawiera przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania
R.5.3 Odwołania do istniejących elementów DOM (np. document.getElementById) są zapisane zgodnie ze składnią
ok. 2 min
Polecenie z arkusza
Stan początkowy: Kolor tła przycisku „Uczestnik” jest ustawiony na DodgerBlue
Skrypt w <script> na końcu <body> - przyciski już istnieją, gdy się wykonuje. Instrukcja poza funkcją działa raz, przy wczytaniu strony. Nazwy właściwości CSS z myślnikiem w JavaScripcie piszesz łącznie, z wielką literą: background-color → backgroundColor.
R.5.2 Zastosowana przynajmniej jedna zmienna lub funkcja oraz nazewnictwo jest w języku polskim lub angielskim i odzwierciedla cel zastosowania
ok. 2 min
Polecenie z arkusza
Funkcja uczestnika wywoływana po wciśnięciu przycisku „Uczestnik”: Zmieniane są kolory tła przycisków: „Uczestnik” na DodgerBlue, „Rezerwacja” na SkyBlue
Funkcja participant (uczestnik) ustawia kolor obu przycisków - zawsze obu, bo przed kliknięciem nie wiadomo, który był wyróżniony.
Krok 50: Funkcja uczestnika: pola rezerwacji nieaktywne
ok. 2 min
Polecenie z arkusza
Kontrolki drugiego bloku sekcji są nieaktywne
Pięć kontrolek drugiej sekcji - liczba osób, lista wylotów i trzy pola opcji - dostaje disabled = true. Każdą trzeba wyłączyć osobno; w dobrych praktykach zrobisz to jedną linią.
Funkcja rezerwacji wywoływana po wciśnięciu przycisku „Rezerwacja”: Zmieniane są kolory tła przycisków: „Uczestnik” na SkyBlue na, „Rezerwacja” na DodgerBlue
Funkcja booking (rezerwacja) to lustrzane odbicie: kolory zamienione miejscami. Drugie „na” w poleceniu to literówka arkusza.
R.5.4 Po kliknięciu w przycisk jego kolor tła jest ustawiany na DodgerBlue, drugiego przycisku na SkyBlue (sprawdzić dla obu przycisków )
R.5.5 Po kliknięciu w każdy przycisk, kontrolki odpowiedniej sekcji są aktywne, w sąsiedniej sekcji są nieaktywne
ok. 1 min
Polecenie z arkusza
Przycisk o treści „Rezerwacja”, którego kliknięcie powoduje wywołanie funkcji rezerwacji
Kliknij „Rezerwacja” w podglądzie: przycisk robi się ciemnoniebieski, pola klienta szarzeją, a liczba osób, lista i pola opcji dają się zmieniać - jak na ilustracji 5. „Uczestnik” przywraca stan z ilustracji 4.
Funkcja wywoływana po wciśnięciu znaku «: Zmienia się obraz oraz nazwa miejsca wycieczki na poprzedni, w przypadku pierwszego – na ostatni (obrazy są przewijane do tyłu)
Dwie tablice w tej samej kolejności - zdjęcie i nazwa pod tym samym indeksem - oraz zmienna current z numerem pokazywanej wycieczki (0 = Barcelona). Funkcja zmniejsza current, a gdy spadnie poniżej zera, przeskakuje na ostatni element: images.length - 1. Potem ustawia src obrazu i treść <h4>. Kolejność do tyłu: Barcelona → Londyn → Rzym → Barcelona, jak w arkuszu.
R.5.7 Po kliknięciu w znak przewijania w prawo obraz zmienia się na następny, z zawinięciem: Barcelona -> Rzym - > Londyn -> Barcelona
ok. 1 min
Polecenie z arkusza
Ogólny znacznik liniowy <span> ze znakiem », jego kliknięcie powoduje zmianę zdjęcia w bloku sekcji drugiej
Kliknij » trzy razy: Rzym, Londyn i znów Barcelona. Obie funkcje korzystają z tej samej zmiennej current, więc można przewijać na zmianę w obie strony.
Kroki 60-63 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 60: Grupa pól fieldset zamiast wyłączania po kolei
ok. 4 min
Polecenie z arkusza
Kontrolki drugiego bloku sekcji są nieaktywne
Wersja z egzaminu wyłącza siedem kontrolek osobno w każdej funkcji. Znacznik <fieldset> grupuje pola formularza, a jego atrybut disabled wyłącza wszystkie kontrolki w środku naraz. Każda sekcja dostaje swoją grupę (clientFields, bookingFields), druga zaczyna z disabled, a funkcje przełączają po jednej właściwości - dodanie nowego pola nie wymaga już zmian w skrypcie. Ramkę, którą przeglądarka rysuje wokół fieldset, zdejmujesz w CSS. Sprawdzone w przeglądarce: przyciski dają ten sam efekt co wcześniej. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
Krok 61: Jedna funkcja przewijania z resztą z dzielenia
ok. 3 min
Polecenie z arkusza
Zmienia się obraz oraz nazwa miejsca wycieczki na następny, w przypadku ostatniego – na pierwszy
Funkcje „do tyłu” i „do przodu” różnią się tylko kierunkiem, więc zostaje jedna: showTrip(step) z krokiem -1 albo 1. Zawinięcie robi reszta z dzielenia %: przy trzech zdjęciach (2 + 1) % 3 daje 0, a dodane images.length sprawia, że krok w tył z zera daje (0 - 1 + 3) % 3 = 2, a nie liczbę ujemną. Sprawdzone w przeglądarce: ta sama kolejność w obie strony. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
Zawartość bloku bocznego: 9 obrazów z tekstem alternatywnym „wycieczki”. Obrazy są zapętlone: 1.jpg, 2.jpg, 3.jpg, 1.jpg itd. Sposób realizacji dowolny
„Sposób realizacji dowolny” zostawia miejsce na pętlę: for od 0 do 8 tworzy obraz (document.createElement("img")), bierze plik z tablicy images pod indeksem i % images.length (0, 1, 2, 0, 1, 2...) i dokleja go do bloku bocznego. Ta sama reszta z dzielenia co przy przewijaniu, a zmiana liczby zdjęć to jedna liczba zamiast przepisywania HTML-a. Klucz uznaje obrazy dodane skryptem (R.2.7). Na egzaminie wystarczy wersja wcześniejsza z dziewięcioma znacznikami.
Przycisk o treści „Uczestnik”, którego kliknięcie powoduje wywołanie funkcji uczestnika
Na koniec HTML bez atrybutów onclick: znaki dostają identyfikatory previous i next, a skrypt przypina obsługę przez addEventListener("click", ...). Funkcje z parametrem (showTrip(-1)) opakowujesz w funkcję anonimową - podanie samego showTrip(-1) wywołałoby ją od razu, przy wczytaniu strony. Sprawdzone w przeglądarce cały zestaw kliknięć z ilustracji 4 i 5. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
rezerwacja.htmlHTMLzmienione: 9 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Biuro turystyczne</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Rezerwacja wycieczek</h1> </header> <main> <asideid="gallery"> </aside> <nav> <buttonid="participant">Uczestnik</button> <buttonid="booking">Rezerwacja</button> </nav> <section> <h2>Dane Klienta</h2> <imgsrc="osoba.png"alt="Klient"> <fieldsetid="clientFields"> <labelfor="firstName">Imię</label> <inputtype="text"id="firstName"> <br> <labelfor="lastName">Nazwisko</label> <inputtype="text"id="lastName"> </fieldset> <p><ahref="wycieczki.html">Do strony głównej</a></p> </section> <section> <h2>Dane rezerwacji</h2> <spanid="previous">«</span> <imgsrc="1.jpg"alt="wycieczka"id="tripImage"> <spanid="next">»</span> <h4id="tripName">Barcelona</h4> <fieldsetid="bookingFields"disabled> <labelfor="people">Liczba osób:</label> <inputtype="number"id="people"min="1"max="4"value="2"> <br> <labelfor="departure">Miejsce wylotu:</label> <selectid="departure"> <option>Warszawa</option> <option>Kraków</option> <option>Wrocław</option> </select> <br> <inputtype="radio"name="food"id="food1"checked> <labelfor="food1">Śniadania</label> <inputtype="radio"name="food"id="food2"> <labelfor="food2">Śniadania i obiadokolacje</label> <inputtype="radio"name="food"id="food3"> <labelfor="food3">All inclusive</label> </fieldset> <br> <button>Sprawdź cenę</button> </section> </main> <footer> <p>Autor strony: <em>Bartosz Bryniarski</em></p> </footer> <script>document.getElementById("participant").style.backgroundColor = "DodgerBlue";function participant() {document.getElementById("participant").style.backgroundColor = "DodgerBlue";document.getElementById("booking").style.backgroundColor = "SkyBlue";document.getElementById("clientFields").disabled = false;document.getElementById("bookingFields").disabled = true;// wersja z egzaminu: osobno firstName, lastName (false) i people, departure, food1-food3 (true) }function booking() {document.getElementById("participant").style.backgroundColor = "SkyBlue";document.getElementById("booking").style.backgroundColor = "DodgerBlue";document.getElementById("clientFields").disabled = true;document.getElementById("bookingFields").disabled = false; }var images = ["1.jpg", "2.jpg", "3.jpg"];var places = ["Barcelona", "Rzym", "Londyn"];var current = 0;for (var i = 0; i < 9; i++) {var photo = document.createElement("img"); photo.src = images[i % images.length]; photo.alt = "wycieczki";document.getElementById("gallery").appendChild(photo); }function showTrip(step) { current = (current + step + images.length) % images.length;document.getElementById("tripImage").src = images[current];document.getElementById("tripName").innerHTML = places[current]; }// wersja z egzaminu: previousTrip() i nextTrip() z instrukcją ifdocument.getElementById("participant").addEventListener("click", participant);document.getElementById("booking").addEventListener("click", booking);document.getElementById("previous").addEventListener("click", function () { showTrip(-1); });document.getElementById("next").addEventListener("click", function () { showTrip(1); });// wersja z egzaminu: atrybuty onclick przy przyciskach i znakach </script></body></html>
Podgląd strony po tym kroku (rezerwacja.html)
Etap 6: Oddanie pracy
Krok 64 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 64: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
Po zakończeniu pracy utwórz plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowana była poprawność działania witryny. Umieść go w folderze z numerem zdającego. Nagraj płytę z rezultatami pracy.
W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz stronę.
W folderze z numerem zdającego: 1.jpg, 2.jpg, 3.jpg, import.png, kw1.png - kw4.png, kwerendy.txt, osoba.png, przeglądarka.txt, rezerwacja.html, styl.css, wycieczki.html. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.
Autor rozwiązania: Bartosz Bryniarski. Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.