INF.03-08-24.06-SGCzerwiec 2024 · 52 kroki · ok. 88 min · 43 kryteria z klucza
Rozwiązanie krok po kroku: Rejestracja użytkownika sklepu (Nowoczesny kod (grid))
To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza klienci z czterema zapytaniami, plakietka z przezroczystym tłem i strona rejestracja.html z trzema zakładkami formularza, paskiem postępu i danymi wypisywanymi w konsoli - i tak samo spełnia każde kryterium klucza. Inna jest droga:
siatka CSS na całej stronie: grid-template-areas stawia blok boczny obok banera, bloku głównego i paska postępu, a szerokości 25% i 73% stoją w grid-template-columns (klucz R.4.5 przyjmuje je wprost). Kod HTML ma kolejność treści - baner, formularz, pasek, promocje, stopka,
kolory w zmiennych CSS i zakładka widoczna dzięki klasieactive: skrypt przestawia klasę, a o wyglądzie decyduje arkusz stylów,
podpisy pól w znacznikach <label> wewnątrz akapitów z arkusza i pasek postępu opisany dla czytników ekranu,
skrypt bez atrybutów w HTML-u: zdarzenia podpina pętla w skrypcie, const, querySelectorAll, stałe zamiast „magicznych liczb”,
SQL czytelniej: aliasy tabel, JOIN ... ON, warunek na datę jako zakres i nieujemny typ kolumny.
Na końcu krótkie porównanie z wersją podstawową (zakładka obok). Baza i grafika pochodzą z prawdziwego archiwum pliki8, zapytania zostały wykonane na tej bazie w MariaDB z XAMPP-a, a skrypt jest sprawdzony w prawdziwej przeglądarce Chrome: przełączanie zakładek, szerokości paska po kolejnych polach, napis w konsoli i położenie bloków.
Jak liczą się punkty. Klucz ma 43 kryteria (R.1.1 - R.5.9), każde za 1 punkt. Próg zdania to 75%, czyli 33 punkty. Przy każdym kroku jest napisane, które kryteria spełnia.
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 43 kryteriów (pkt)
Krok 1: Baza danych klienci
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie klienci, z zestawem polskich znaków (np. utf8_unicode_ci)
Archiwum pliki8.zip rozpakuj hasłem _Rejestr@cja_ (podkreślenia na obu końcach, małpa zamiast „a”) do folderu z numerem zdającego. W phpMyAdmin Nowa → klienci, porównywanie utf8_unicode_ci, albo zapytaniem:
CREATE DATABASE klienci CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Krok 2: Import tabel z pliku baza.sql
ok. 2 min
Polecenie z arkusza
Do bazy zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum
Zaznaczona baza klienci, Import → baza.sql. Trzy tabele z obrazu 1: osoby (7 osób z datą urodzenia dataUr) oraz adresy i telefony - obie z kluczem obcym Osoby_id, który wskazuje właściciela. Jedna osoba może mieć kilka adresów i kilka telefonów, dlatego są to osobne tabele (relacja jeden do wielu).
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonano import tabel do bazy danych klienci czynność udokumentowano plikiem o nazwie import w formacie PNG
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG i nazwij 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.
Cały ekran z paskiem zadań, w PNG. Zrzuty zapytań idą później do JPEG (kw1.jpg - kw4.jpg).
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: osoby urodzone po 2000 roku
Kryteria: ,
R.1.2 Zapisano plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonano zapytanie 1 wybierające jedynie imiona i nazwiska osób urodzonych po 2000 roku. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT imie, nazwisko FROM osoby WHERE dataUr >="2001-01-01"; (lub dataUr > "2000-12-31") oraz wynik działania udokumentowano zrzutem, na którym są widoczne jedynie dane: Anna Kowalewska, Ewa Kowalska, Andrzej Nowak
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie imiona i nazwiska osób urodzonych po 2000 roku
SELECT imie, nazwisko - tylko dwa pola, jak każe polecenie,
WHERE dataUr >= '2001-01-01' - „po 2000 roku” to od 1 stycznia 2001. Warunek zapisany jako początek zakresu czyta się wprost („od tego dnia”) i działa na samej kolumnie, więc baza może użyć indeksu na dataUr. YEAR(dataUr) > 2000 daje ten sam wynik, ale liczy funkcję dla każdego wiersza.
Każda klauzula w osobnej linii - przy dłuższych zapytaniach od razu widać, co jest warunkiem, a co listą pól. Wynik: Anna Kowalewska, Ewa Kowalska, Andrzej Nowak, jak w kluczu. Zapytania zapisz w kwerendy.txt, zrzut jako kw1.jpg.
Typowe błędy
dataUr >= '2000-01-01' łapie też osoby urodzone w 2000 roku - a te nie są urodzone „po 2000 roku”.
Krok 5: Zapytanie 2: miasta bez powtórzeń, alfabetycznie
Kryteria:
R.1.4 Wykonano zapytanie 2 wybierające nazwy miast, z których pochodzą klienci posortowane alfabetycznie rosnąco. Nazwy miast nie mogą się powtarzać. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT DISTINCT miasto FROM `adresy` ORDER BY miasto; oraz wynik działania udokumentowano zrzutem, na którym są widoczne dokładnie 4 rekordy w kolejności: Kraków, Poznań, Warszawa, Wrocław
ok. 2 min
Polecenie z arkusza
Zapytanie 2: wybierające nazwy miast, z których pochodzą klienci posortowane alfabetycznie rosnąco. Nazwy miast nie mogą się powtarzać
DISTINCT usuwa powtórzenia (Poznań i Warszawa są w adresach po dwa razy), ORDER BY miasto ASC sortuje rosnąco - ASC jest domyślne, ale zapisane wprost mówi czytającemu, że kierunek jest zamierzony. Polskie litery sortują się poprawnie dzięki porównywaniu utf8_unicode_ci tabeli. Wynik: Kraków, Poznań, Warszawa, Wrocław. Zrzut: kw2.jpg.
kwerendy.txtTekstzmienione: 5 linii
-- Zapytanie 1SELECT imie, nazwiskoFROM osobyWHERE dataUr >= '2001-01-01';-- Zapytanie 2SELECT DISTINCT miastoFROM adresyORDER BY miasto ASC;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: osoby z numerami telefonów
Kryteria:
R.1.5 Wykonano zapytanie 3 wybierające jedynie imiona i nazwiska osób oraz odpowiadające im numery telefonów. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT imie, nazwisko, telefony.numer FROM osoby JOIN telefony ON osoby.id = telefony.Osoby_id; (możliwe również INNER JOIN lub porównanie kluczy po WHERE) oraz wynik działania udokumentowano zrzutem, na którym jest widocznych dokładnie 9 rekordów z czego dla Anny Kowalewskiej i Anny Nowak są dwa numery telefonu
ok. 2 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie imiona i nazwiska osób oraz odpowiadające im numery telefonów. Należy posłużyć się relacją
aliasy tabelo (osoby) i t (telefony) - przy każdej kolumnie widać, skąd pochodzi. Przy numer to konieczne: kolumna o tej nazwie jest też w adresy,
JOIN telefony AS t ON t.Osoby_id = o.id - relacja: do osoby dołączany jest każdy jej telefon; warunek złączenia stoi przy złączeniu, a nie w WHERE,
ORDER BY o.nazwisko, o.imie - dodatek: oba numery jednej osoby stoją obok siebie. Bez ORDER BY kolejność wierszy zależy od planu zapytania i może się zmienić.
Wynik: 9 wierszy - Anna Kowalewska i Anna Nowak po dwa razy, bo mają po dwa numery (jak w kluczu). Zrzut: kw3.jpg.
kwerendy.txtTekstzmienione: 6 linii
-- Zapytanie 1SELECT imie, nazwiskoFROM osobyWHERE dataUr >= '2001-01-01';-- Zapytanie 2SELECT DISTINCT miastoFROM adresyORDER BY miasto ASC;-- Zapytanie 3SELECT o.imie, o.nazwisko, t.numerFROM osoby AS oJOIN telefony AS t ON t.Osoby_id = o.idORDER BY o.nazwisko, o.imie;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: nowa kolumna numerMieszkania
Kryteria:
R.1.6 Wykonano zapytanie 4 dodające do tabeli adresy kolumnę numerMieszkania typu całkowitego, po kolumnie numer. W pliku z kwerendami lub na zrzucie istnieje zapis np.: ALTER TABLE adresy ADD COLUMN numerMieszkania INT AFTER numer; (dowolny typ całkowity, poprawnie również bez słowa COLUMN) oraz wynik działania udokumentowano zrzutem, na którym widoczne jest poprawnie wykonane zapytanie lub struktura tabeli z dodaną kolumną
ok. 2 min
Polecenie z arkusza
Zapytanie 4: Dodające kolumnę numerMieszkania typu całkowitego, do tabeli Adresy po kolumnie numer
ALTER TABLE adresy - zmiana struktury tabeli (w bazie nazwa jest małą literą, arkusz pisze „Adresy”),
ADD COLUMN numerMieszkania SMALLINT UNSIGNED NULL - typ całkowity dobrany do danych: numer mieszkania nie bywa ujemny ani większy niż 65 535, więc SMALLINT UNSIGNED (2 bajty) wystarcza. NULL zapisane wprost: dom jednorodzinny nie ma numeru mieszkania, a istniejące adresy dostaną w tej kolumnie NULL,
AFTER numer - miejsce kolumny: zaraz po numer, a nie na końcu tabeli.
Klucz przyjmuje dowolny typ całkowity - INT z wersji podstawowej jest tak samo poprawny. Na zrzucie kw4.jpg struktura tabeli: id, Osoby_id, ulica, numer, numerMieszkania, miasto.
Typowe błędy
Bez AFTER numer kolumna trafia na koniec tabeli, za miasto.
kwerendy.txtTekstzmienione: 4 linie
-- Zapytanie 1SELECT imie, nazwiskoFROM osobyWHERE dataUr >= '2001-01-01';-- Zapytanie 2SELECT DISTINCT miastoFROM adresyORDER BY miasto ASC;-- Zapytanie 3SELECT o.imie, o.nazwisko, t.numerFROM osoby AS oJOIN telefony AS t ON t.Osoby_id = o.idORDER BY o.nazwisko, o.imie;-- Zapytanie 4ALTER TABLE adresyADD COLUMN numerMieszkania SMALLINT UNSIGNED NULL AFTER numer;
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-30 · po tym etapie masz 20 z 43 kryteriów (pkt)
R.2.1 Plik obraz.png przeskalowano z zachowaniem proporcji do wysokości 200 px, jest on przezroczysty oraz widoczna jest na nim jedynie niebieska plakietka z pętelką
ok. 5 min
Polecenie z arkusza
Plik obraz.jpg wypakowany z archiwum należy skadrować, tak aby była widoczna tylko niebieska plakietka z pętelką (patrz obraz 2), ustawić tło przezroczyste oraz przeskalować z zachowaniem proporcji do wysokości 200 px. Obraz zapisać pod tą samą nazwą w formacie PNG
Grafika jest taka sama jak w wersji podstawowej. W GIMP-ie:
kadr wokół prawej plakietki - do niebieskiej plakietki należy zielona nitka zaczepiona w jej otworze (tak jest na obrazie 2),
przezroczystość: Warstwa → Przezroczystość → Dodaj kanał alfa, Zaznaczanie rozmyte na białym tle, z klawiszem Shift także białe pole wewnątrz pętelki i otwór na nitkę, potem Usuń. Białego procentu i koszyka nie zaznaczaj - są częścią plakietki,
skala: Obraz → Skaluj obraz, łańcuch zamknięty, wysokość 200 px,
Plik → Wyeksportuj jakoobraz.png - JPEG nie ma przezroczystości.
Podgląd: oryginał i gotowa plakietka na szachownicy, która pokazuje przezroczyste miejsca.
Typowe błędy
Zapis do JPEG - przezroczyste tło zamienia się na białe, a klucz wymaga przezroczystości.
Podgląd strony po tym kroku
Krok 9: Plik rejestracja.html w HTML5
ok. 1 min
Polecenie z arkusza
Składa się ze strony o nazwie rejestracja.html zapisanej w języku HTML5
Deklaracja <!DOCTYPE html> i szkielet z sekcjami head i body. Strona nie ma PHP, więc otwiera się ją prosto z folderu.
R.2.2 Witrynę internetową zapisano w pliku rejestracja.html oraz zapisano jawnie standard kodowania polskich znaków i deklarację HTML5 <!DOCTYPE HTML> i zadeklarowano język witryny polski np.<HTML lang="pl">. Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Jawnie zastosowany właściwy standard kodowania polskich znaków
<meta charset="UTF-8"> jako pierwszy element <head> (z deklaracją HTML5, językiem i nazwą pliku to R.2.2). Obok viewport - telefon nie pomniejsza wtedy strony do rozmiaru ekranu komputera.
R.3.8 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl.css , formatowanie CSS pochodzi jedynie z tego arkusza Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)
ok. 1 min
Polecenie z arkusza
Arkusz stylów w pliku o nazwie styl.css prawidłowo połączony z kodem strony
<link rel="stylesheet" href="styl.css"> - całe formatowanie pochodzi z tego pliku, bez atrybutów style w HTML-u.
Typowe błędy
Klucz odbiera R.3.8 także wtedy, gdy choć jeden selektor nie trafia w blok (np. kropka zamiast #).
R.2.4 Układ strony zdefiniowano dzieląc ją na bloki: boczny, baner, główny, blok paska postępu oraz stopkę. Zastosowano semantyczne znaczniki sekcji HTML5 zgodnie z ich znaczeniem, w tym do części nagłówkowej - header, stopki - footer, dopuszcza się zagnieżdżenie bloków div w znacznikach semantycznych
ok. 2 min
Polecenie z arkusza
Podział strony na blok boczny i obok niego bloki: baner, główny, blok paska postępu oraz na dole blok stopki. Podział zrealizowany wyłącznie za pomocą semantycznych znaczników sekcji języka HTML 5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2
Baner <header>, blok główny <main>, pasek postępu <section id="progress">, blok boczny z promocjami <aside> (treść poboczna wobec formularza), stopka <footer> (R.2.4). Kolejność w kodzie to kolejność treści: nagłówek strony, formularz, jego postęp, potem promocje. Tak czyta stronę czytnik ekranu i tak ułoży ją telefon. W wersji podstawowej <aside> musiał stać pierwszy, bo float układa bloki w kolejności z kodu; siatka CSS umieści każdy blok w jego miejscu niezależnie od kolejności.
R.2.7 W bloku bocznym umieszczono tabelę zgodną z Obrazem 3 arkusza egzaminacyjnego, której pierwszy wiersz ma komórki nagłówkowe, zastosowano znaczniki <table>, <tr>, <th>, <td>
ok. 2 min
Polecenie z arkusza
Tabela, której pierwszy wiersz jest złożony z komórek nagłówkowych, wypełniona treściami widocznymi na obrazie 3
Pierwszy wiersz z komórkami <th> („co?”, „ile taniej?”) w <thead>, wiersze z danymi w <tbody>. scope="col" mówi, że nagłówek opisuje kolumnę - czytnik ekranu przy „15%” przeczyta „ile taniej?”. Klucz wymaga table, tr, th i td - są wszystkie (R.2.7).
R.2.8 W bloku głównym umieszczono trzy przyciski o treściach „Klient”, „Adres”, „Kontakt”
ok. 2 min
Polecenie z arkusza
Zawartość bloku głównego: Trzy przyciski o treściach: „Klient”, „Adres”, „Kontakt”, wciśnięcie dowolnego z nich wywołuje funkcję aktywującą kolejno blok pierwszy, drugi, trzeci
Trzy <button> z type="button" - przycisk niczego nie wysyła, tylko przełącza. Atrybut data-tab niesie identyfikator zakładki, którą przycisk pokaże: skrypt odczyta go przez dataset.tab, więc w HTML-u nie ma wywołań funkcji. Klucz R.2.8 ocenia treść przycisków.
Blok pierwszy z kontrolkami: Paragraf „Imię”, następnie pole edycyjne z podpowiedzią „Wpisz dane...”
zakładka to <div> z klasą tab (wspólny wygląd) i identyfikatorem client. Druga klasa, active, oznacza zakładkę widoczną - pierwszą od początku. Którą klasę ukrywa arkusz stylów, a którą pokazuje, ustali CSS,
podpis stoi w akapicie, jak każe arkusz, ale w akapicie jest <label for="firstName"> - napis jest powiązany z polem: kliknięcie „Imię” ustawia kursor w polu, a czytnik ekranu przy wejściu w pole przeczyta jego podpis,
placeholder - szara podpowiedź znikająca po wpisaniu tekstu. Nie zastępuje podpisu, dlatego jest i jedno, i drugie.
R.3.2 Pierwszy blok z kontrolkami ma dwa pola edycyjne oraz jedno typu date, dla pola do wpisywania imienia zdefiniowano placeholder "Wpisz dane..."
ok. 1 min
Polecenie z arkusza
Paragraf „Data urodzenia”, następnie pole edycyjne typu daty
Pole type="date" - przeglądarka pokazuje maskę dd.mm.rrrr i kalendarz (obraz 2), a wartość pola zawsze ma postać RRRR-MM-DD, niezależnie od wyświetlania (widać to w konsoli na obrazie 6). Pierwszy blok ma komplet: dwa pola tekstowe, pole daty i podpowiedź (R.3.2).
Paragraf „Numer”, następnie pole edycyjne typu numerycznego
Pole type="number" ze strzałkami. min="1" - numer domu nie bywa zerem ani liczbą ujemną, więc strzałka w dół zatrzyma się na 1, a przeglądarka oznaczy niepoprawną wartość. Walidacji w skrypcie nie ma (arkusz każe ją pominąć) - to tylko podpowiedź w samym polu.
R.2.9 W bloku głównym znajdują się trzy bloki, w każdym z nich umieszczono przynajmniej jedno pole edycyjne oraz przynajmniej jeden podpis w paragrafie
ok. 1 min
Polecenie z arkusza
Blok trzeci z kontrolkami: Paragraf „Numer komórkowy”, następnie pole edycyjne typu numeru telefonu
Trzecia zakładka (id="contact"), pole type="tel" - telefon otwiera przy nim klawiaturę numeryczną, a autocomplete="tel" pozwala przeglądarce podpowiedzieć zapisany numer. Każdy z trzech bloków ma już pole i podpis w akapicie (R.2.9).
R.3.4 Trzeci blok z kontrolkami ma jedno pole typu tel i jedno typu checkbox
ok. 1 min
Polecenie z arkusza
Pole wyboru podpisane „Akceptuję RODO”
Pole wyboru type="checkbox" stoi wewnątrz<label> - podpis i pole są powiązane bez for/id, a klikalny jest cały napis. Akapit przenosi zgodę do nowej linii pod telefonem (obraz 5), bez <br>. Trzeci blok ma pole tel i pole wyboru (R.3.4).
W sekcji progress pusta sekcja bar - granatowy pasek, którego szerokość zmieni skrypt. Blok jest pusty, ale czytnik ekranu i tak go rozpozna: role="progressbar" z aria-valuemin, aria-valuemax i aria-valuenow mówi czytnikowi ekranu, że to wskaźnik postępu i ile wynosi (na start 4). Skrypt będzie aktualizował aria-valuenow razem z szerokością.
R.2.5 W bloku bocznym zapisano nagłówek h2 "Sprawdź promocje" , w banerze zapisano nagłówek h1: "Zarejestruj się w sklepie" , w bloku stopki nagłówek h4: "Rejestrację do sklepu wykonał:" z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość stopki: nagłówek czwartego stopnia o treści: „Rejestrację do sklepu wykonał: ”, dalej wstawiony numer zdającego
<h4>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL), tu stoi autor rozwiązania. Komplet nagłówków h1, h2 i h4 to R.2.5.
Domyślne formatowanie wszystkich selektorów: krój czcionki Cambria
Kolory, które powtarzają się w kilku regułach, trafiają do zmiennych CSS na :root: SteelBlue (bloki i przyciski), Navy (przycisk pod kursorem, pasek, ramka tabeli), LightBlue (zakładki). Zmiana koloru firmowego to wtedy jedna linia. Selektor * z Cambrią i zapasowym krojem szeryfowym (R.4.1).
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z obrazem 2 w arkuszu egzaminacyjnym, w bloku głównym może być widoczny jeden blok z kontrolkami, wszystkie trzy lub żaden (prawidłowo zastosowano właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid)
ok. 3 min
Polecenie z arkusza
Dla ciała dokumentu: kolor tła Linen
Tło Linen dla body, a przy okazji całe rozmieszczenie bloków z obrazu 2 w jednym miejscu:
grid-template-columns: 25% 73% - kolumna bloku bocznego i kolumna banera, bloku głównego i paska; to od razu szerokości z arkusza (klucz R.4.5 przyjmuje je w tej postaci),
column-gap: 2% - odstęp między kolumnami, który w wersji podstawowej dawały marginesy bloku bocznego (25% + 2% + 73% = 100%),
grid-template-areas rysuje układ słowami: blok boczny w lewej kolumnie przez trzy wiersze, obok niego baner, blok główny i pasek, na dole stopka na całą szerokość,
align-items: start - bloki mają swoje wysokości z arkusza, zamiast rozciągać się do wysokości wiersza.
Każdy blok dostaje nazwę pola przez grid-area. Kolejność w HTML-u nie ma znaczenia - <aside> stoi w kodzie przedostatni, a trafia na lewą stronę (R.3.1).
R.4.8 Ustawiono dla bloku bocznego: box-shadow: 4px 4px 5px DimGray
ok. 2 min
Polecenie z arkusza
Dodatkowo dla bloku bocznego: szerokość 25%, wysokość 510 px, margines zewnętrzny górny i dolny 0, lewy i prawy 1%, cień bloku o przesunięciu 4 px w obu osiach, rozmyciu 5 px i kolorze DimGray
szerokość 25% daje kolumna siatki - dopisane width: 25% liczyłoby się od kolumny, więc blok miałby ćwierć z 25%,
margin: 0 1% - góra i dół 0, boki po 1%, jak każe arkusz (R.4.7). Uwaga na siatkę: procentowy margines elementu siatki liczy się od szerokości jego pola (kolumny 25%), a nie całej strony, więc wychodzi drobniejszy niż w wersji podstawowej. Główny odstęp od formularza daje column-gap,
box-shadow: 4px 4px 5px DimGray - przesunięcie w poziomie, w pionie, rozmycie, kolor: cień pada w prawo i w dół (R.4.8).
R.4.3 Ustawiono biały kolor czcionki dla bloków bocznego, banera i stopki oraz przycisków
R.4.6 Ustawiono wyrównanie tekstu do środka dla bloków bocznego, banera i stopki oraz rozmiar czcionki 130% dla przycisków
ok. 2 min
Polecenie z arkusza
Dla wszystkich przycisków: kolor tła SteelBlue, biały kolor czcionki, szerokość 20%, marginesy wewnętrzne 15 px, margines zewnętrzny górny 30 px, rozmiar czcionki 130%, bez obramowania
Selektor button obejmuje cztery przyciski. Szerokość 20% liczy się od rodzica: zakładek - od bloku głównego, „Zatwierdź dane” - od jego zakładki, dlatego jest węższy (obraz 5). cursor: pointer (dodatek) pokazuje rączkę - przycisk bez ramki wygląda wtedy na klikalny. Biel czcionki domyka R.4.3, rozmiar 130% razem z wyśrodkowaniem bloków - R.4.6.
R.4.10 Gdy kursor znajduje się na przycisku jego kolor tła zmienia się na Navy
ok. 1 min
Polecenie z arkusza
Gdy kursor znajduje się na przycisku jego kolor tła zmienia się na Navy
:hover - przycisk pod kursorem (obraz 2 pokazuje granatową zakładkę „Klient”). Ten sam kolor dostaje :focus-visible: przycisk wybrany klawiszem Tab - bez tego osoba bez myszy nie widzi, który przycisk jest aktywny, bo border: none zabrało ramkę (R.4.10).
Krok 39: Bloki z kontrolkami: wygląd i widoczna tylko zakładka aktywna
Kryteria:
R.5.5 W stanie początkowym jest pokazany pierwszy blok z imieniem i nazwiskiem, a pozostałe są utworzone i ukryte (w skrypcie lub CSS)
ok. 2 min
Polecenie z arkusza
Dla trzech bloków z kontrolkami: kolor tła LightBlue, margines zewnętrzny prawy 80 px, marginesy wewnętrzne 10 px. W stanie początkowym jest widoczny tylko pierwszy blok z kontrolkami
Klasa .tab - wspólny wygląd trzech bloków i display: none dla wszystkich. Druga reguła, .tab.active (oba warunki naraz), przywraca blok, który ma klasę active - w stanie początkowym tylko pierwszy (R.5.5). Pozostałe są w kodzie strony, tylko niewidoczne. Skrypt nie będzie już ustawiał stylów - przestawi klasę, a wygląd zostaje w CSS.
R.4.2 Ustawiono kolor tła Linen dla body, SteelBlue dla bloków bocznego, banera i stopki oraz przycisków, LightGrey dla bloku paska postępu oraz LightBlue dla bloków z kontrolkami
R.4.7 Ustawiono marginesy wewnętrzne (padding) 15px dla przycisków, 10px dla bloków z kontrolkami oraz marginesy zewnętrzne (margin) dla bloku bocznego: jedynie lewy i prawy 1%, górny 30px dla przycisków, prawy 80px dla bloków z kontrolkami i dolny 10px dla paska postępu
R.5.2 W stanie początkowym pasek postępu ma szerokość 4% (w skrypcie lub CSS)
R.4.4 Ustawiono wysokość bloku bocznego 510px, banera 80px, głównego 400px oraz 30px dla paska postępu
ok. 1 min
Polecenie z arkusza
Dla pustego bloku w bloku paska postępu: kolor tła Navy, szerokość 4%, wysokość 30 px
Granatowy pasek o szerokości 4% szarego tła - stan początkowy (R.5.2). Wysokość 30 px nadaje wysokość całemu paskowi. transition: width 0.3s (dodatek) sprawia, że pasek wydłuża się płynnie, a nie skokiem. Komplet wysokości z R.4.4: 510, 80, 400 i 30 px.
R.4.5 Ustawiono szerokość bloku bocznego 25%, banera, głównego oraz paska postępu 73% (width lub grid-template-columns lub flex) oraz 20% dla przycisków i 100% dla tabeli
R.4.9 Ustawiono obramowanie tabeli linią kropkowaną o szerokości 1 px i kolorze Navy oraz brak obramowania dla przycisków
ok. 1 min
Polecenie z arkusza
Dla tabeli: szerokość 100%, obramowanie linią kropkowaną o szerokości 1 px i kolorze Navy
Linia kropkowana to dotted. Ta reguła domyka szerokości (R.4.5: kolumny 25% i 73%, przyciski 20%, tabela 100%) i obramowania (R.4.9: kropkowana tabela, przyciski bez ramki).
Kroki 43-50 · po tym etapie masz 43 z 43 kryteriów (pkt)
Krok 43: Funkcja aktywująca: ukrycie wszystkich zakładek
Kryteria:
R.5.1 Skrypt zapisano w języku JavaScript i zawiera on przynajmniej jedną instrukcję
ok. 2 min
Polecenie z arkusza
Funkcja aktywująca: ukrywa wszystkie zakładki
Skrypt stoi na końcu <body> - gdy przeglądarka go czyta, wszystkie elementy strony już istnieją. Zostaje w pliku strony, bo klucz każe sprawdzać skrypt „w kodzie strony”.
const tabs - lista trzech zakładek znaleziona raz, selektorem CSS .tab. const, bo zmienna nie dostanie innej listy,
showTab(tabId) - pętla for ... of zdejmuje wszystkim klasę active. Ukrywa je reguła .tab z arkusza stylów, skrypt nie dotyka style.display.
Pokazuje jedynie tę zakładkę (blok), której przycisk wybrano
Po zdjęciu klasy wszystkim jedna linia dodaje ją wybranej. Kolejność „najpierw wszystkim zdejmij, potem jednej dodaj” sprawia, że nie trzeba pamiętać, która zakładka była otwarta.
R.3.6 Przynajmniej jeden przycisk zakładek ma zdefiniowane zdarzenie onClick z przypisaną funkcją
R.5.6 Po kliknięciu w dowolny przycisk (nazwę bloku) jest pokazywany odpowiadający mu blok, a pozostałe są ukrywane
ok. 3 min
Polecenie z arkusza
Funkcja aktywująca jest wywoływana przez wciśnięcie dowolnego przycisku zakładki w bloku głównym
Pętla po przyciskach z atrybutem data-tab przypisuje każdemu obsługę kliknięcia: funkcję strzałkową, która wywołuje showTab z nazwą zakładki odczytaną z dataset.tab. Nowa zakładka w formularzu nie wymaga zmian w skrypcie - wystarczy przycisk z data-tab.
Dlaczego właściwość onclick, a nie addEventListener("click", ...)? addEventListener jest ogólniejszy (kilka niezależnych obsług jednego zdarzenia), ale klucz w R.3.6 mówi wprost o zdarzeniu onClick z przypisaną funkcją - właściwość onclick jest dokładnie tym zapisem, tylko w skrypcie zamiast w HTML-u. Jedna obsługa na przycisk w zupełności tu wystarcza. W podglądzie zakładki już działają: „Adres” (obraz 4), „Kontakt” (obraz 5).
R.5.3 Po opuszczeniu przynajmniej jednego pola edycyjnego pasek postępu zwiększa swoją szerokość o 12%
ok. 3 min
Polecenie z arkusza
Funkcja modyfikuje właściwość stylu dla pustego bloku wewnątrz bloku paska postępu, w ten sposób, że jego szerokość jest zwiększana o 12%, np. po utracie focusa za pierwszym razem wartość wynosi 16%; za drugim razem jest to 28%, trzecim 40% i tak dalej
stałePROGRESS_START i PROGRESS_STEP na górze skryptu - liczby 4 i 12 mają nazwy, a zmiana kroku to jedna linia (wielkie litery to zwyczaj dla stałych konfiguracyjnych),
let progress stoi poza funkcją, więc pamięta wartość między wywołaniami; let, bo wartość się zmienia,
Krok 47: Każde pole edycyjne wywołuje funkcję po utracie focusa
Kryteria:
R.3.5 Przynajmniej jedno pole edycyjne ma zdefiniowane zdarzenie onBlur lub onFocusOut z przypisaną funkcją
ok. 2 min
Polecenie z arkusza
Dla wszystkich pól edycyjnych – utrata focusa powoduje wywołanie funkcji zmieniającej wartość paska postępu
Utrata focusa to zdarzenie blur (kliknięcie obok albo Tab). Selektor .tab input:not([type=checkbox]) wybiera wszystkie pola w zakładkach oprócz pola wyboru - pole RODO nie jest polem edycyjnym. Wychodzi siedem pól: imię, nazwisko, data, ulica, numer, miasto, telefon.
Pętla przypisuje każdemu właściwość onblur - z tego samego powodu co onclick przy zakładkach: klucz R.3.5 nazywa wprost zdarzenie onBlur. Uwaga: increaseProgress bez nawiasów - przypisana jest funkcja, a nie wynik jej wywołania. W podglądzie: kliknięcie w pole imienia i potem obok wydłuża pasek do 16%.
Typowe błędy
field.onblur = increaseProgress() (z nawiasami) wywołuje funkcję raz, przy wczytaniu strony, i przypisuje jej wynik undefined - pasek skacze na 16% i dalej już nie rośnie.
R.5.4 Szerokość paska postępu nie może być większa niż 100%, zastosowano warunek
ok. 2 min
Polecenie z arkusza
Należy zabezpieczyć funkcję, aby wartość szerokości nigdy nie była wyższa niż 100%
4 + 8 · 12 = 100, więc po ósmej utracie focusa pasek jest pełny, a po dziewiątej miałby 112%. Warunek przycina wartość do stałej PROGRESS_MAX, zanim trafi do stylu. Krócej byłoby Math.min(progress + PROGRESS_STEP, PROGRESS_MAX), ale klucz R.5.4 mówi „zastosowano warunek” - jawny if nie zostawia wątpliwości.
Krok 49: Funkcja zatwierdzająca: wartości w konsoli
Kryteria: ,
R.5.7 Po kliknięciu w przycisk zatwierdzający wyświetlone są w konsoli przeglądarki wartości wpisane w pola edycyjne
R.5.8 W funkcji zatwierdzającej zastosowano funkcję lub zestaw funkcji odwołujących się do wszystkich pól edycyjnych i pola wyboru na stronie
ok. 3 min
Polecenie z arkusza
Funkcja zatwierdzająca pobiera wartość z każdego pola edycyjnego i pola wyboru. Wartości wyświetlane są w konsoli przeglądarki (obraz 6). Dla uproszczenia wszelką walidację należy pominąć
Funkcja korzysta z listy editFields, którą skrypt już ma:
[...editFields] zamienia listę elementów w tablicę, a map robi z każdego pola jego wartość - siedem odczytów value jedną linią, w kolejności pól na stronie,
pole wyboru dokłada .checked (true albo false). Obraz 6 pokazuje przy zgodzie „on”, ale to .value pola wyboru, które wynosi „on” zawsze, także bez zaznaczenia - nic nie mówi o zgodzie,
join(", ") skleja wartości przecinkami w jeden napis, jak na obrazie 6.
Funkcja odwołuje się do wszystkich pól edycyjnych i pola wyboru (R.5.8). Walidacji nie ma - tak każe arkusz.
Krok 50: Przycisk „Zatwierdź dane” wywołuje funkcję
Kryteria: ,
R.3.7 Przycisk do zatwierdzenia danych ma zdefiniowane zdarzenie onClick z przypisaną funkcją
R.5.9 Zastosowano znaczące nazewnictwo dla wszystkich zmiennych i funkcji w języku polskim lub angielskim. Nazwy odzwierciedlają cel zastosowania
ok. 1 min
Polecenie z arkusza
Funkcja zatwierdzająca jest wywoływana po wybraniu przycisku „Zatwierdź dane”
Właściwość onclick przycisku #confirm dostaje funkcję confirmData - znowu bez nawiasów (R.3.7). Wynik widać w konsoli (F12, Console). Nazwy mówią, co robią i co przechowują: showTab, increaseProgress, confirmData, editFields, consentBox, PROGRESS_STEP (R.5.9).
właściwości onclick i onblur ustawiane pętlą w skrypcie
odczyt pól
siedem getElementById(...).value
map po liście pól i join
SQL
> '2000-12-31', pełne nazwy tabel
>= '2001-01-01', aliasy, ORDER BY, SMALLINT UNSIGNED
Na egzaminie wersja podstawowa jest szybsza do napisania i trzyma się funkcji z tabeli 1 arkusza. Nowoczesna jest krótsza tam, gdzie pola się powtarzają, i łatwiej ją rozbudować: nowe pole albo nowa zakładka nie wymagają zmian w skrypcie. Jeśli używasz siatki, pilnuj szerokości w grid-template-columns, a nie w width bloków.
Krok 52 · po tym etapie masz 43 z 43 kryteriów (pkt)
Krok 52: 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 nazwa przeglądarki, w której sprawdzana była strona. W folderze z numerem zdającego: import.png, kw1.jpg - kw4.jpg, kwerendy.txt, obraz.png, przeglądarka.txt, rejestracja.html, styl.css. 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.