Weryfikacja wieku w PrestaShop: blokujące okno dla CBD, alkoholu, e-papierosów i branży medycznej
Pełna dokumentacja modułu dfagegate: instalacja, konfiguracja trybów (standardowy CBD/alkohol/e-papierosy/broń oraz medyczny), personalizacja wielojęzyczna, zgodność z RODO i diagnostyka.
Moduł dfagegate dodaje blokujące okno weryfikacji wieku do Twojego sklepu PrestaShop 8 lub 9. Pokrywa dwa odrębne rynki: tryb standardowy dla produktów regulowanych progiem wieku (CBD, alkohol, e-papierosy, broń, zapalniczki, produkty od 18 lat) oraz tryb medyczny dla wyrobów medycznych zastrzeżonych dla profesjonalistów ochrony zdrowia.
Zgodność: PrestaShop 1.7.7+, 8.x i 9.0. PHP 7.4 minimum, zalecane 8.1+. Multistore i wielojęzyczność (FR/EN/ES/DE uzupełnione przy instalacji).
Instalacja
Instalacja przebiega standardowym trybem PrestaShop. Po zakupie w DataFirefly otrzymujesz plik ZIP dfagegate-X.Y.Z.zip.
Przez panel administracyjny (zalecane)
- Zaloguj się do panelu administracyjnego PrestaShop
- Przejdź do Moduły → Katalog modułów
- Kliknij Wgraj moduł w prawym górnym rogu
- Wybierz plik ZIP
dfagegate-X.Y.Z.zip - Po zakończeniu przesyłania kliknij Zainstaluj
Przez FTP
- Rozpakuj plik ZIP lokalnie
- Wgraj katalog
dfagegate/do katalogumodules/Twojego PrestaShop - Przejdź do Moduły → Katalog modułów
- Wyszukaj „DataFirefly Age Gate” i kliknij Zainstaluj
Ważne: po instalacji moduł jest domyślnie wyłączony. To celowe: pozwala skonfigurować teksty i tryb, zanim zablokujesz sklep. Przejdź do konfiguracji modułu i włącz przełącznik w zakładce Ogólne, gdy wszystko będzie gotowe.
Pierwsza konfiguracja
Wejdź w konfigurację: Moduły → Zainstalowane moduły → DataFirefly Age Gate → Konfiguruj.
Konfiguracja jest podzielona na 6 zakładek:
- Ogólne: aktywacja, tryb, typ weryfikacji, minimalny wiek
- Treść: teksty wielojęzyczne (tytuł, komunikat, przyciski, informacje prawne)
- Wygląd: logo, kolory, rozmycie tła
- Zachowanie: ciasteczko, przekierowanie, wykluczenia
- Tryb medyczny: zawody i numer uprawnień (pojawia się wyłącznie w trybie medycznym)
- Logi i RODO: dziennik zdarzeń i diagnostyka
Zakładka Ogólne
Tutaj konfigurujesz główne zachowanie modułu.
- Włącz moduł: przełącznik tak/nie, steruje globalnym wyświetlaniem okna
- Tryb: standardowy (CBD, alkohol, e-papierosy, broń) albo medyczny (profesjonaliści ochrony zdrowia)
- Typ weryfikacji: przycisk tak/nie, data urodzenia albo deklaracja zawodu
- Minimalny wiek: domyślnie 18, wartość 21 dla wybranych rynków (na przykład część stanów USA przy alkoholu)
Który typ weryfikacji wybrać? Przycisk tak/nie sprawdza się w większości przypadków (CBD, alkohol dla szerokiego odbiorcy, e-papierosy): jest szybki, ma niskie tarcie i wystarczający efekt odstraszający przy kontroli Inspekcji Handlowej lub sanepidu. Data urodzenia jest bardziej rygorystyczna i zalecana przy broni oraz płynach z nikotyną. Deklaracja zawodu jest zarezerwowana dla trybu medycznego.
Zakładka Treść
Każdy język włączony w Twoim PrestaShop ma własny blok tekstów. Wartości domyślne są uzupełnione w FR, EN, ES i DE. Dla każdego języka możesz skonfigurować:
- Tytuł: wyświetlany dużą czcionką na górze okna (domyślnie: „Weryfikacja wieku”)
- Komunikat: główny tekst wyjaśniający, znaki końca linii są zachowywane
- Przycisk potwierdzenia: etykieta przycisku pozytywnego (domyślnie: „Mam 18 lat lub więcej”)
- Przycisk odmowy: etykieta przycisku negatywnego
- Informacja prawna: tekst na dole okna (domyślnie ostrzeżenie o szkodliwości nadużywania alkoholu)
- Komunikat przy odmowie: ekran wyświetlany, gdy użytkownik odmówi, przed przekierowaniem
HTML: treść jest sanityzowana przy zapisie (wyłącznie czysty tekst). Znaki końca linii są zamieniane na znaczniki łamania wiersza podczas renderowania, przez automatyczny filtr nl2br.
Polska wersja językowa: teksty domyślne nie są uzupełnione po polsku. Po instalacji wejdź w zakładkę Treść i wpisz sześć pól dla języka polskiego. Sugerowana informacja prawna dla sklepu z alkoholem to standardowa formuła o szkodliwości spożywania alkoholu, dla sklepu z e-papierosami komunikat o zakazie sprzedaży osobom poniżej 18 lat.
Zakładka Wygląd
Dostosuj wygląd okna do swojej identyfikacji wizualnej:
- Logo: PNG, JPG, SVG albo WEBP, maksymalnie 2 MB, wyświetlane na górze okna
- Kolor tła: kolor głównej karty (domyślnie biały)
- Kolor podstawowy: tytuł i przycisk główny (domyślnie czarny #111111)
- Kolor tekstu: treść komunikatu
- Kolor przesłony: warstwa za oknem, przyjmuje formaty CSS
rgba()i hex (domyślnie:rgba(15,15,20,0.85)) - Rozmycie tła: efekt rozmycia w tle, działa we wszystkich aktualnych przeglądarkach
Zakładka Zachowanie
Steruje trwałością wyboru i przypadkami wykluczeń.
- Czas życia ciasteczka: w dniach (domyślnie 90). Wartość
0daje ciasteczko sesyjne (usuwane po zamknięciu przeglądarki) - Adres przekierowania przy odmowie: zostaw pusty, aby wyświetlić wyłącznie komunikat odmowy, albo wpisz adres zewnętrzny (wyszukiwarka, strona informacyjna, strona dostawcy)
- Wykluczenie po IP: lista adresów IP (po jednym w wierszu), dla których okno się nie wyświetla. Idealne dla Ciebie i zespołu podczas testów
- Wykluczenie adresów URL: częściowe ścieżki wyłączone z blokady. Domyślnie uzupełnione francuskimi ścieżkami:
/legal,/contact,/cgv,/mentions-legales,/politique-confidentialite - Wykluczenie zalogowanych klientów: gdy włączone, klienci już zalogowani nie widzą okna (przydatne, jeśli Twój sklep jest zastrzeżony dla zweryfikowanych kont)
Dla polskiego sklepu zastąp domyślne ścieżki francuskie odpowiednikami z Twojego adresowania: /regulamin, /kontakt, /polityka-prywatnosci, /informacje-prawne. Wykluczenie działa na fragmentach adresu, więc wpisanie samego /regulamin pokryje wszystkie warianty tej ścieżki.
Zakładka Tryb medyczny
Ta zakładka ma zastosowanie wyłącznie wtedy, gdy tryb jest ustawiony na medyczny, a typ weryfikacji na deklarację zawodu.
- Lista zawodów: po jednym w wierszu. Domyślnie: lekarz, farmaceuta, pielęgniarka lub pielęgniarz, fizjoterapeuta, dentysta, lekarz weterynarii, inny profesjonalista ochrony zdrowia. W pełni konfigurowalna pod Twoją grupę docelową
- Numer uprawnień obowiązkowy: gdy włączone, w oknie pojawia się dodatkowe pole. Walidacja przez wyrażenie regularne akceptujące od 9 do 11 cyfr. Numer nie jest przechowywany, służy wyłącznie walidacji po stronie serwera
Zgodność prawna: tryb medyczny materializuje oświadczenie w rozumieniu francuskiego artykułu L5122-9 Kodeksu zdrowia publicznego, który zastrzega reklamę wybranych wyrobów medycznych dla uprawnionych profesjonalistów ochrony zdrowia. Polskim odpowiednikiem jest ustawa o wyrobach medycznych, która także ogranicza reklamę części wyrobów do profesjonalistów. Moduł nie zastępuje przeglądu prawnego Twojego katalogu przez wyspecjalizowanego prawnika. Skonsultuj konfigurację ze swoim doradcą.
Numer PWZ: walidacja regex została zaprojektowana pod francuskie rejestry RPPS i ADELI (od 9 do 11 cyfr). Polski numer prawa wykonywania zawodu lekarza ma 7 cyfr, więc domyślny wzorzec go odrzuci. Masz dwie ścieżki: wyłącz obowiązkowość numeru i pozostaw samą deklarację zawodu z polem oświadczenia (to wystarcza do materializacji deklaracji), albo dostosuj wzorzec w kodzie kontrolera AJAX do formatu polskiego.
Zakładka Logi i RODO
Opcjonalny dziennik zdarzeń i informacje o zgodności.
- Loguj odmowy: zapisuje każdą odmowę w tabeli
ps_dfagegate_logz adresem IP zahashowanym w SHA-256 (nigdy jawnym), datą i powodem
Zakładka wyświetla również ściągawkę RODO:
- Zakładane ciasteczko:
dfagegate_ok - Kategoria: ściśle niezbędne (spełnienie obowiązku prawnego dotyczącego dostępu)
- Dane: wartość „1″, konfigurowalny czas życia, SameSite=Lax, Secure przy HTTPS
Konfiguracja pod Twój rynek
Kilka gotowych konfiguracji dla inspiracji.
Sklep CBD dla szerokiego odbiorcy
- Tryb: standardowy
- Typ weryfikacji: przycisk tak/nie
- Minimalny wiek: 18
- Czas życia ciasteczka: 90 dni (dobry kompromis między zgodnością a wygodą)
- Adres przekierowania: pusty (sam komunikat odmowy)
- Informacja prawna: „Kannabidiol może wchodzić w interakcje z niektórymi lekami. Skonsultuj się z lekarzem.”
Sklep z alkoholami premium
- Tryb: standardowy
- Typ weryfikacji: data urodzenia (ściślejsza kontrola dla rynków premium)
- Minimalny wiek: 18 (lub 21 dla części rynków zagranicznych)
- Adres przekierowania: dowolna oficjalna strona informacyjna o profilaktyce uzależnień
- Informacja prawna: standardowa formuła o szkodliwości nadużywania alkoholu
Sklep z e-papierosami i płynami z nikotyną
- Tryb: standardowy
- Typ weryfikacji: data urodzenia (zdecydowanie zalecane przy nikotynie)
- Minimalny wiek: 18
- Loguj odmowy: tak (przydatne przy kontroli sanepidu)
Sklep z bronią
- Tryb: standardowy
- Typ weryfikacji: data urodzenia (obowiązkowo)
- Minimalny wiek: 18
- Wykluczenie adresów URL: dodaj
/przepisy,/pozwolenie-na-bron - Loguj odmowy: tak
Sklep ze sprzętem medycznym (wyroby dla profesjonalistów)
- Tryb: medyczny
- Typ weryfikacji: deklaracja zawodu
- Lista zawodów: lekarz, farmaceuta, fizjoterapeuta, osteopata (dostosuj do swojego katalogu)
- Numer uprawnień obowiązkowy: tak po dostosowaniu wzorca, w przeciwnym razie nie
- Wykluczenie zalogowanych klientów: tak (jeśli weryfikujesz zawód już przy rejestracji)
Jak działa weryfikacja przez datę urodzenia
W odróżnieniu od zwykłego przycisku weryfikacja przez datę urodzenia wykonuje obliczenie po stronie serwera, a nie w przeglądarce. Pełny przebieg:
- Odwiedzający wpisuje dzień, miesiąc i rok w oknie
- JavaScript wysyła te wartości do kontrolera AJAX
DfagegateAjaxModuleFrontController - PHP waliduje datę przez
checkdate(), a następnie wylicza wiek przezDateTimeImmutable::diff() - Jeśli wiek jest niższy od skonfigurowanego progu, serwer zwraca odpowiedź JSON
success=false, denied=truewraz z komunikatem błędu - Okno wyświetla komunikat odmowy i przekierowuje po 2 sekundach
- Jeśli wiek jest równy progowi albo wyższy, zakładane jest ciasteczko
dfagegate_ok, a okno się zamyka
Dlaczego po stronie serwera? Kontrolę wyłącznie w JavaScripcie da się obejść przez narzędzia deweloperskie w mniej niż 10 sekund. Obliczenie serwerowe gwarantuje, że użytkownik poniżej progu wieku nie uzyska dostępu do strony, nawet mając wiedzę techniczną. To kluczowe, aby obronić się przy kontroli.
Zwróć uwagę, że data urodzenia nigdy nie jest przechowywana: służy przez czas obliczenia, po czym zostaje zapomniana. Zachowywana jest wyłącznie binarna walidacja (zaakceptowano lub odrzucono) w postaci ciasteczka.
Jak działa tryb medyczny
Tryb medyczny działa podobnie, ale na innych polach:
- Okno wyświetla listę rozwijaną zawodów (konfigurowalną) i ewentualnie pole numeru uprawnień
- Obecne jest obowiązkowe pole wyboru z oświadczeniem
- Kontroler AJAX sprawdza, czy zawód został wybrany
- Jeśli numer uprawnień jest obowiązkowy, serwer waliduje format wyrażeniem regularnym akceptującym od 9 do 11 kolejnych cyfr
- Brak przechowywania: ani zawód, ani numer nie trafiają do bazy, a ciasteczko
dfagegate_okmaterializuje wyłącznie fakt pomyślnego przejścia
Decyzja projektowa: przepisy o reklamie wyrobów medycznych wymagają materializacji deklaracji, niekoniecznie weryfikacji w czasie rzeczywistym wobec rejestru centralnego. Nasze podejście to minimalna wykonalna zgodność: prosimy o deklarację, walidujemy ją formalnie, zapisujemy odmowę, jeśli logi są włączone, ale nie zbieramy zbędnych danych osobowych. Jeśli potrzebujesz weryfikacji w czasie rzeczywistym wobec Centralnego Rejestru Lekarzy albo francuskiego rejestru ANS, to osobne wdrożenie na zamówienie.
Multistore
Moduł jest w pełni zgodny z multistore. Wszystkie konfiguracje (tryb, typ weryfikacji, teksty wielojęzyczne, kolory, wykluczenia) są przechowywane per kontekst sklepu przez id_shop_group i id_shop. Oznacza to, że w jednym PrestaShop możesz mieć:
- Sklep CBD PL w trybie standardowym z progiem 18 lat i tekstami po polsku
- Sklep e-papierosy UK w trybie standardowym z progiem 18 lat i tekstami po angielsku
- Sklep sprzęt medyczny DE w trybie medycznym z obowiązkowym numerem uprawnień i tekstami po niemiecku
Aby skonfigurować konkretny podsklep:
- W selektorze kontekstu na górze panelu administracyjnego wybierz docelowy podsklep
- Otwórz konfigurację modułu
- Zmień wartości: zostaną zapisane wyłącznie dla tego sklepu
Hooki są rejestrowane we wszystkich sklepach w momencie instalacji przez Shop::getCompleteListOfShopsID(), co pozwala uniknąć klasycznej pułapki modułu działającego wyłącznie na bieżącym sklepie.
Zgodność z motywami własnymi
Moduł korzysta ze standardowego hooka displayBeforeBodyClosingTag, aby wstrzyknąć okno tuż przed zamknięciem znacznika body. Ten hook powinien być uniwersalny od PrestaShop 1.7.5+.
Niestety część motywów własnych nie wywołuje tego hooka w swoim layoucie. Na ten przypadek dfagegate zawiera mechanizm awaryjny w JavaScripcie:
- PHP prerenderuje pełny kod HTML okna i przekazuje go do JS przez
Media::addJsDef - Przy zdarzeniu
DOMContentLoadedskrypt sprawdza, czy element o identyfikatorzedfagegate-modalistnieje w DOM - Jeśli tak, wszystko jest w porządku: hook zadziałał
- Jeśli nie, skrypt sam wstrzykuje okno przez
insertAdjacentHTML('beforeend', ...) - Komunikat
console.infopotwierdza uruchomienie mechanizmu awaryjnego, informując, że okno zostało wstrzyknięte przez JS, ponieważ motyw nie wyzwala hooka
Praktyczny efekt: moduł działa na dowolnym motywie PrestaShop 1.7.5+, także na niekompletnych motywach własnych, bez konieczności modyfikowania layoutu. Możesz go wdrożyć bez koordynacji z agencją odpowiadającą za motyw.
Diagnostyka i debugowanie
Po aktywacji dfagegate dodaje komentarz HTML w sekcji head każdej strony frontu, w postaci informacji o wersji modułu, stanie włączenia i tym, czy okno powinno się wyświetlić.
Ten komentarz to Twój pierwszy punkt diagnostyczny. Otwórz kod źródłowy dowolnej strony frontu (Ctrl+U albo Cmd+U) i wyszukaj „dfagegate”.
| Komentarz | Interpretacja |
|---|---|
| Brak komentarza | Hook displayHeader nie jest zarejestrowany: sprawdź, czy moduł jest zainstalowany i aktywny |
enabled=0 |
Przełącznik „Włącz moduł” jest ustawiony na nie w zakładce Ogólne |
enabled=1 should_display=0 |
Aktywne jest wykluczenie: Twój adres IP jest na białej liście, bieżący adres URL pasuje do wykluczonej ścieżki albo jesteś zalogowanym klientem przy włączonym wykluczeniu |
enabled=1 should_display=1 |
Po stronie serwera wszystko jest w porządku. Jeśli okno się nie pojawia, sprawdź konsolę przeglądarki pod kątem komunikatu mechanizmu awaryjnego albo błędu |
Okno nadal się nie pojawia?
Szybka lista kontrolna:
- Czy komentarz diagnostyczny jest obecny z wartością
should_display=1? Jeśli nie, popraw konfigurację - Otwórz sklep w trybie prywatnym. Ciasteczko
dfagegate_okmogło zostać założone w poprzedniej sesji - Sprawdź swój adres IP w wykluczeniach w zakładce Zachowanie
- Otwórz konsolę przeglądarki (F12). Wyszukaj
[dfagegate]pod kątem komunikatów wstrzykiwania awaryjnego albo błędów - Sprawdź logi PrestaShop w Ustawienia zaawansowane → Logi, filtrując po „dfagegate”
- Wyczyść cache PrestaShop po każdej zmianie konfiguracji: Ustawienia zaawansowane → Wydajność → Wyczyść pamięć podręczną
Zresetowanie ciasteczka po stronie przeglądarki
Aby przetestować okno bez zmiany adresu IP:
- Otwórz narzędzia deweloperskie (F12)
- Zakładka Application (Chrome) albo Storage (Firefox)
- Sekcja Cookies → Twoja domena
- Usuń wiersz
dfagegate_ok - Przeładuj stronę
Zgodność z RODO
Moduł został zaprojektowany tak, aby był zgodny z RODO domyślnie.
Ciasteczko dfagegate_ok
- Typ: ściśle niezbędne do spełnienia obowiązku prawnego dotyczącego dostępu
- Podstawa prawna: zwolnione z obowiązku uprzedniej zgody na podstawie przepisów wdrażających dyrektywę ePrivacy, które wyłączają z tego obowiązku ciasteczka niezbędne do świadczenia usługi żądanej przez użytkownika
- Wartość: binarna (
1= potwierdzone) - Czas życia: konfigurowalny (domyślnie 90 dni) albo sesyjny przy wartości 0
- Atrybuty:
SameSite=Lax, automatycznySecureprzy HTTPS,Path=/
W praktyce: nie musisz dodawać tego ciasteczka do swojego banera zgód. Mieści się w tej samej kategorii co ciasteczko sesji PrestaShop albo ciasteczko CSRF: niezbędne do zgodnego z prawem działania strony, a więc zwolnione.
Logi odmów
Jeśli włączysz opcję Loguj odmowy, każda odmowa jest zapisywana w tabeli ps_dfagegate_log wraz z:
id_shop: którego podsklepu dotyczyreason: powód odmowy (user_refusedalbodob_under_age)age: zadeklarowany wiek, jeśli dotyczyprofession: zadeklarowany zawód, jeśli dotyczyip_hash: SHA-256 adresu IP, nigdy adres jawnydate_add: znacznik czasu
Haszowanie SHA-256 sprawia, że adres IP jest nieodwracalny, a jednocześnie pozwala deduplikować próby (ten sam adres IP zawsze da ten sam skrót). To kompromis zalecany przy statystyce dostępu, akceptowany przez organy ochrony danych.
Dane weryfikacyjne
- Data urodzenia przechodzi przez AJAX na potrzeby obliczenia, ale nigdy nie jest przechowywana
- Numer uprawnień jest walidowany po stronie serwera, a następnie zapominany, nigdy nie trafia do bazy
- Zachowywana jest wyłącznie binarna walidacja, w postaci ciasteczka
Struktura techniczna i integracja
Dla deweloperów, którzy chcą pójść dalej albo wpiąć moduł we własny proces.
Wykorzystywane hooki
displayHeader: wstrzykuje komentarz diagnostycznyactionFrontControllerSetMedia: rejestruje CSS i JS, przekazuje konfigurację oraz prerenderowany kod HTML okna do JSdisplayBeforeBodyClosingTag: renderuje okno po stronie serwera (mechanizm awaryjny w JS, jeśli hooka brakuje w motywie)
Punkty wejścia AJAX
Kontroler AJAX odpowiada pod adresem /module/dfagegate/ajax i przyjmuje dwie akcje:
action=confirm: z parametrami zależnymi od typu weryfikacji (żadnych przy tak/nie, day/month/year przy dacie urodzenia, profession/rpps w trybie medycznym)action=refuse: zapisuje odmowę i zwraca adres przekierowania
Odpowiedzi są w formacie JSON. Potwierdzenie zwraca success=true. Odmowa z powodu niewystarczającego wieku zwraca success=false, denied=true oraz odpowiedni komunikat błędu. Błąd walidacji zwraca success=false z komunikatem. Odmowa użytkownika zwraca success=true oraz redirect_url ze skonfigurowanym adresem przekierowania.
Schemat bazy danych
Tworzona jest jedna tabela: ps_dfagegate_log. Zawiera kolumny id_log (klucz główny z autoinkrementacją), id_shop, reason (varchar 64), age (dopuszcza null), profession (varchar 128, dopuszcza null), ip_hash (char 64 na skrót SHA-256) oraz date_add (datetime). Dwa indeksy wtórne optymalizują zapytania raportowe: idx_shop_date na (id_shop, date_add) i idx_reason na reason.
Odinstalowanie
Dwa poziomy odinstalowania:
Wyłączenie bez usuwania
Moduły → Zainstalowane moduły → DataFirefly Age Gate → Wyłącz. Konfiguracja zostaje zachowana, tabela logów również. Możesz w każdej chwili włączyć moduł ponownie bez ponownej konfiguracji.
Pełne odinstalowanie
Moduły → Zainstalowane moduły → DataFirefly Age Gate → Odinstaluj. Ta operacja:
- Usuwa tabelę
ps_dfagegate_log - Usuwa wszystkie wpisy konfiguracji (18 kluczy skalarnych i 6 kluczy wielojęzycznych)
- Wyrejestrowuje hooki
- Usuwa moduł z systemu
Uwaga: odinstalowanie jest nieodwracalne. Jeśli chcesz zachować historię logów odmów (na przykład na potrzeby audytu ochrony danych), wyeksportuj tabelę wcześniej.
Wsparcie i aktualizacje
Każda licencja obejmuje:
- 12 miesięcy aktualizacji: zgodność z PrestaShop, poprawki, usprawnienia
- Wsparcie techniczne przez e-mail: odpowiedź w ciągu 24 godzin roboczych, FR i EN
- Zwrot w 30 dni bez pytań
- Niezaszyfrowany kod źródłowy: możesz swobodnie dostosować moduł do swoich potrzeb
W razie pytań technicznych albo zgłoszenia błędu skontaktuj się z nami z poziomu swojego konta DataFirefly. Podaj wersję PrestaShop, wersję PHP, wersję modułu (widoczną na górze ekranu konfiguracji) i w miarę możliwości komentarz diagnostyczny obecny w sekcji head Twojego sklepu.