# dfsavecart: zapis koszyka magicznym linkiem

> Prezentacja dfsavecart dodaje funkcję „Zachowaj na później” na stronie koszyka Twojego sklepu PrestaShop 8 albo 9. Odwiedzający, zalogowany albo gość, podaje swój adres e-mail i otrzymuje bezpieczny link („magiczny link”),…

- Strona: <https://www.datafirefly.com/pl/documentation/dfsavecart/>
- Język: pl
- Zaktualizowano: 2026-08-01
- Inne języki: [fr](https://www.datafirefly.com/documentation/dfsavecart/index.md), [en](https://www.datafirefly.com/en/documentation/dfsavecart/index.md), [es](https://www.datafirefly.com/es/documentation/dfsavecart/index.md), [de](https://www.datafirefly.com/de/documentation/dfsavecart/index.md), [it](https://www.datafirefly.com/it/documentation/dfsavecart/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfsavecart/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfsavecart/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

## Prezentacja

dfsavecart dodaje funkcję „Zachowaj na później” na stronie koszyka Twojego sklepu PrestaShop 8 albo 9. Odwiedzający, zalogowany albo gość, podaje swój adres e-mail i otrzymuje bezpieczny link („magiczny link”), który odtwarza jego dokładny koszyk: te same produkty, te same ilości, na dowolnym urządzeniu, w dowolnym momencie w skonfigurowanym okresie ważności.

Moduł jest nieinwazyjny: nie wpływa na ścieżkę zamówienia, checkout ani inne moduły. Działa z natywnym systemem e-mail PrestaShop, a więc z Twoim istniejącym SMTP.

## Wymagania

- PrestaShop 8.0.x do 9.x
- PHP 8.1 albo nowsze
- MySQL 5.7+ albo MariaDB 10.3+
- Działająca wysyłka e-mail (Parametry zaawansowane > E-mail: przetestuj wysyłkę przed instalacją modułu)

## Instalacja

1. Pobierz plik `dfsavecart.zip` ze swojego konta DataFirefly.
2. W back office PrestaShop przejdź do **Moduły > Menedżer modułów**.
3. Kliknij **Wgraj moduł** i wybierz plik ZIP.
4. PrestaShop instaluje moduł automatycznie: tworzona jest tabela `ps_df_savecart`, a hooki zostają zarejestrowane.
5. Kliknij **Konfiguruj**, aby przejść do ustawień.

Nie jest instalowany żaden override klasy ani kontrolera: deinstalacja jest czysta i nie zostawia śladów (tabela i konfiguracje są usuwane).

## Konfiguracja

Wszystkie ustawienia mieszczą się na jednej stronie: **Moduły > Menedżer modułów > dfsavecart > Konfiguruj**.

### Ustawienia główne

- **Włącz moduł**: wyłącznik ogólny. Po wyłączeniu blok znika z frontu bez deinstalacji modułu.
- **Pozycja przycisku**: _Stopka koszyka_ (zalecane, hook `displayShoppingCartFooter`), _Wewnątrz koszyka_ (hook `displayShoppingCart`) albo _Oba miejsca_. Wybór zależy od Twojego motywu: po zmianie sprawdź render na stronie koszyka.
- **Czas ważności linku**: od 1 do 365 dni, domyślnie 30. Po tym czasie link wygasa, a wpis jest usuwany.

### Bezpieczeństwo i ochrona przed spamem

- **Limit na adres e-mail dziennie**: maksymalna liczba wysyłek na ten sam adres w ruchomym oknie 24 h (domyślnie 10). Wpisz 0, aby wyłączyć. Licznik opiera się na solonym hashu adresu: adres nie jest przechowywany jawnie na potrzeby tej funkcji.
- **Link jednorazowy**: po włączeniu link staje się nieważny po pierwszym odtworzeniu. Przydatne przy koszykach o charakterze poufnym (B2B, oferty).

### Zachowanie przy odtwarzaniu

- **Opróżnij bieżący koszyk przed odtworzeniem**: włączone domyślnie. Po wyłączeniu produkty z linku dopisują się do bieżącego koszyka (kumulacja).

### RODO i e-mail

- **Wymagaj zgody RODO**: wyświetla obowiązkowe pole wyboru przed wysyłką (włączone domyślnie, zalecane).
- **Wyślij kopię ukrytą do sprzedawcy**: dodaje adres kontaktowy sklepu w polu BCC przy każdej wysyłce, na potrzeby wewnętrznego śledzenia.
- **Temat e-maila (per język)**: konfigurowalny dla każdego aktywnego języka sklepu. Dostępne zmienne: `{shop_name}` i `{firstname}`.

## Działanie po stronie klienta

1. Klient dodaje produkty do koszyka i otwiera stronę koszyka.
2. Widzi blok „Zachowaj ten koszyk na później” z polem e-mail (wypełnionym automatycznie, jeśli jest zalogowany).
3. Podaje adres e-mail, zaznacza zgodę, jeśli jest wymagana, i klika **Wyślij link**.
4. Otrzymuje e-mail z podsumowaniem koszyka (produkty, ilości, szacowana suma), datą wygaśnięcia i przyciskiem **Odtwórz mój koszyk**.
5. Kliknięcie przycisku odtwarza dokładny koszyk i przekierowuje na stronę koszyka z komunikatem potwierdzającym.

### Przypadki szczególne przy odtwarzaniu

- **Produkt wyłączony albo usunięty**: pozycja jest pomijana, a klient dostaje komunikat z listą niedostępnych produktów.
- **Niewystarczający stan magazynowy**: ilość jest korygowana do dostępnego maksimum, z komunikatem informującym o korekcie.
- **Link wygasły albo już użyty** (tryb jednorazowy): wyświetla się prosta strona błędu z odnośnikami do bieżącego koszyka i strony głównej.
- **Język i waluta**: odtwarzane są te z pierwotnego koszyka.

## E-maile

Szablony HTML i tekstowe są dostarczane po **francusku, angielsku, hiszpańsku i niemiecku** w `modules/dfsavecart/mails/{iso}/savecart.html` oraz `savecart.txt`. Używany jest język koszyka z momentu zapisu.

Zmienne dostępne w szablonach: `{firstname}`, `{shop_name}`, `{restore_link}`, `{cart_items_html}`, `{cart_items_txt}`, `{cart_total}`, `{expiry_date}`.

Aby personalizacja szablonów przetrwała aktualizacje, skopiuj je do katalogu mails swojego motywu, zamiast modyfikować te dostarczone z modułem: te zostaną nadpisane przy aktualizacji.

## Bezpieczeństwo

- **Token 256-bitowy**: generowany przez `random_bytes(32)`, kryptograficznie bezpieczny generator PHP. 64 znaki szesnastkowe w adresie URL.
- **Przechowywanie w postaci hasha**: w bazie zapisywany jest wyłącznie odcisk SHA-256 tokenu. W razie naruszenia bazy danych nie da się odtworzyć żadnego linku.
- **CSRF**: endpoint AJAX zapisu weryfikuje token sesji PrestaShop.
- **Ścisła walidacja**: format tokenu jest sprawdzany po stronie serwera (`[a-f0-9]{64}`) przed jakimkolwiek zapytaniem do bazy.

## RODO

- Jawna zgoda przed wysłaniem e-maila, konfigurowalna.
- Na potrzeby limitu antyspamowego adres e-mail nie jest przechowywany jawnie: używany jest wyłącznie solony hash (z sekretnym kluczem sklepu).
- Wygasłe wpisy są usuwane automatycznie (czyszczenie): patrz sekcja poniżej.
- Żadne dane nie są przekazywane usługom zewnętrznym: wszystko zostaje w Twojej bazie PrestaShop.
- W razie żądania usunięcia danych przez klienta usuń jego wiersze z tabeli `ps_df_savecart` (kolumna `email`).

## Czyszczenie wygasłych linków

Trzy możliwości, od najprostszej do najbardziej zautomatyzowanej:

1. **Przycisk ręczny**: na stronie konfiguracji modułu, „Wyczyść wygasłe wpisy”.
2. **Moduł CronJobs**: zainstaluj bezpłatny moduł CronJobs od PrestaShop: hook `actionCronJob` modułu jest wywoływany automatycznie i uruchamia czyszczenie.
3. **Systemowy crontab**: zaplanuj regularne wywołanie crona swojego sklepu zgodnie z konfiguracją serwera.

## Statystyki

Strona konfiguracji pokazuje cztery liczniki w czasie rzeczywistym: **łącznie zapisanych**, **aktywnych** (niewygasłych), **wygasłych** (oczekujących na wyczyszczenie) i **odtworzonych** (linki użyte co najmniej raz). Stosunek odtworzonych do łącznej liczby daje współczynnik konwersji tej funkcji.

## Multistore

Moduł jest zgodny z multistore: każdy zapis zapamiętuje identyfikator sklepu źródłowego, używany przy odtwarzaniu. Konfiguracja odbywa się w standardowym kontekście sklepu PrestaShop.

## Rozwiązywanie problemów

### E-mail nie dociera

- Sprawdź globalną wysyłkę e-mail sklepu: **Parametry zaawansowane > E-mail > Przetestuj wysyłkę**.
- Sprawdź folder spam u odbiorcy.
- Zajrzyj do logów: **Parametry zaawansowane > Logi** (błędy modułu mają prefiks `[dfsavecart]`).

### Blok nie pojawia się na stronie koszyka

- Sprawdź, czy moduł jest włączony w swojej konfiguracji.
- Sprawdź, czy koszyk zawiera przynajmniej jeden produkt (przy pustym koszyku blok jest ukrywany).
- Sprawdź wybraną pozycję: niektóre motywy nie implementują hooka `displayShoppingCartFooter`, przełącz się wtedy na „Wewnątrz koszyka” albo „Oba miejsca”.
- Wyczyść cache: **Parametry zaawansowane > Wydajność > Wyczyść cache**.

### Komunikat „Nieprawidłowy token bezpieczeństwa”

- Strona koszyka pozostawała otwarta zbyt długo i sesja wygasła: odśwież stronę i spróbuj ponownie.

### Komunikat „Zbyt wiele żądań dla tego adresu”

- Dzienny limit antyspamowy dla tego adresu został osiągnięty. Zwiększ limit w konfiguracji albo odczekaj 24 h.

## Deinstalacja

Deinstalacja usuwa tabelę `ps_df_savecart` (wszystkie zapisane koszyki przepadają) oraz wszystkie klucze konfiguracji. W bazie ani w plikach nie zostają żadne resztki.
