# Czyszczenie HTML opisów produktów i kategorii

> Instalacja Pobierz archiwum dfhtmlcleaner.zip ze swojego konta klienta DataFirefly. W back-office otwórz Moduły → Menedżer modułów, kliknij Zainstaluj moduł i upuść archiwum. Po zakończeniu instalacji zakładka HTML Cleaner pojawia się…

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

## Instalacja

1. Pobierz archiwum `dfhtmlcleaner.zip` ze swojego konta klienta DataFirefly.
2. W back-office otwórz **Moduły → Menedżer modułów**, kliknij **Zainstaluj moduł** i upuść archiwum.
3. Po zakończeniu instalacji zakładka **HTML Cleaner** pojawia się w menu **Katalog**.

Instalacja tworzy tabelę `ps_dfhtmlcleaner_backup`, przechowującą zastąpione wartości. Jest ona usuwana przy odinstalowaniu.

Wykonaj kopię zapasową bazy danych przed pierwszym realnym czyszczeniem. Moduł zachowuje nadpisane wartości i potrafi je przywrócić, ale pełna kopia pozostaje podstawową siatką bezpieczeństwa.

## Wymagania wstępne

- PrestaShop 8.0 do 9.x
- PHP 7.4 do 8.3
- Aktywne rozszerzenia PHP `dom` i `mbstring`

## Pierwszy przebieg: symuluj przed zapisem

Otwórz **Katalog → HTML Cleaner**. Panel _Uruchom czyszczenie_ znajduje się u góry strony.

1. Zaznacz treści do przetworzenia. **Produkty** i **Kategorie** są zaznaczone domyślnie; możesz dodać strony CMS, marki i dostawców.
2. Wybierz język albo zostaw _Wszystkie języki_. W multistore pojawia się także selektor sklepu.
3. Kliknij **Symuluj**. Nic nie jest zapisywane w bazie.

Po zakończeniu przebiegu otrzymujesz trzy informacje: liczbę przeanalizowanych rekordów, liczbę rekordów, które czyszczenie by zmodyfikowało, oraz łączną zaoszczędzoną wagę. Poniżej wyświetlanych jest do dziesięciu porównań przed/po obok siebie, każde z bezpośrednim linkiem do danej karty.

Jeśli liczba objętych kart Cię zaskakuje, otwórz dwa lub trzy przykłady i sprawdź wynik, zanim pójdziesz dalej. Właśnie do tego służy ten tryb.

## Czyszczenie na serio

Po zatwierdzeniu symulacji kliknij **Wyczyść naprawdę** i potwierdź. Przebieg jest identyczny, ale tym razem wartości są zapisywane.

Przetwarzanie odbywa się kolejnymi partiami w AJAX. Pasek postępu pokazuje zaawansowanie, dziennik listuje przetworzone partie, a przycisk **Zatrzymaj** czysto przerywa pracę na końcu bieżącej partii. Zostaw kartę otwartą podczas operacji.

### Rozmiar partii

Domyślnie na jedno żądanie przetwarzanych jest 50 rekordów. Na wolnym hostingu współdzielonym zejdź do 10 lub 20 w ustawieniach ogólnych. Na serwerze dedykowanym możesz wejść aż do 500.

## Reguły w szczegółach

Reguły są pogrupowane w cztery rodziny, niżej na stronie. Każda zapisana zmiana jest uwzględniana natychmiast, także przez piaskownicę.

### Stare i niebezpieczne znaczniki

- **Markup Microsoft Word / Office**: komentarze warunkowe, wyspy XML, znaczniki ``, ``, `` i atrybuty `mso-*`.
- **Komentarze HTML**.
- **Elementy script, style, object i form**. Handlery zdarzeń `onclick` i podobne są usuwane w każdym przypadku, niezależnie od opcji.
- **Iframe'y**. Trzy tryby: zachowaj wszystko, zachowaj tylko zaufanych dostawców (domyślnie), usuń wszystko. Domyślna lista obejmuje YouTube, Vimeo, Dailymotion, Google Maps, SoundCloud, Spotify i OpenStreetMap. Dodaj własne domeny w przewidzianym polu, po jednej na linię lub rozdzielone przecinkami. Weryfikacja dotyczy rzeczywistej domeny: adres typu `youtube.com.przyklad.tld` jest odrzucany.

### Atrybuty

- **Style inline**: _Zachowaj_, _Filtruj_ (domyślnie) lub _Usuń_. Tryb Filtruj usuwa `mso-*`, `font-family`, `font-size`, `line-height`, `color` i kilka innych, zachowując to, co dotyczy układu.
- **Klasy**: _Zachowaj_, _Usuń klasy edytorów_ (domyślnie: `MsoNormal`, `ql-`, `gmail_`, `x_`, `western`) lub _Usuń_.
- **Atrybuty id**: domyślnie wyłączone, bo wewnętrzne kotwice mogą od nich zależeć.
- **Atrybuty data-***: domyślnie wyłączone, niektóre motywy i moduły z nich korzystają.
- **Przestarzałe atrybuty prezentacyjne**: `align`, `bgcolor`, `border`, `cellpadding`, `face`, `valign` itd.
- **Nierozpoznane atrybuty**: zachowywana jest tylko bezpieczna lista (`href`, `src`, `alt`, `title`, `colspan`…), uzupełniona atrybutami medialnymi na `iframe`, `video`, `audio` i `source`.
- **width i height na obrazach**. Domyślnie wyłączone, bo te atrybuty ograniczają przesunięcia układu (CLS).

### Struktura

- **Rozpakowywanie span bez atrybutów** i, w opcji bardziej agresywnej, **div bez atrybutów**.
- **Rozpakowywanie znaczników font**.
- **Modernizacja przestarzałych znaczników**: `b` na `strong`, `i` na `em`, `center` na `div`, `strike` na `s`, `tt` na `code`.
- **Usuwanie pustych znaczników**. Komórki tabel, wiersze i elementy strukturalne są wykluczone z tej reguły, aby nie zniekształcać układu.
- **Biała lista znaczników**: domyślnie wyłączona. Włączona, każdy znacznik spoza listy jest rozpakowywany, a jego treść tekstowa zachowywana.

### Typografia i media

- **Twarde spacje**: serie są redukowane do jednej.
- **Kolejne łamania linii**: trzy lub więcej `` stają się dwoma, a `` przyklejone do zamknięcia bloku są usuwane.
- **Spacje i wcięcia**. Zawartość znaczników `pre`, `code` i `textarea` jest wyłączona z tej normalizacji.
- **Zabezpieczanie linków**: dodanie `rel="noopener noreferrer"` na linkach z `target="_blank"`, usunięcie adresów `javascript:`.
- **Brakujący atrybut alt** na obrazach oraz opcjonalnie **loading="lazy"**.

## Kopie zapasowe i przywracanie

Dopóki opcja **Kopia przed zapisem** jest aktywna, każda zastąpiona wartość jest kopiowana do tabeli modułu z identyfikatorem wykonania. Panel **Kopie zapasowe i przywracanie** listuje wykonania według daty i typu treści.

Przycisk **Przywróć** przywraca wszystkie pola danego wykonania, a potem usuwa odpowiadające wpisy. Retencję ustawia się w dniach w ustawieniach ogólnych; zostaw 0, aby przechowywać historię bezterminowo. Wygasłe wpisy są czyszczone przy otwarciu strony.

Automatyczne czyszczenie przy zapisie nie tworzy wpisu kopii zapasowej, w przeciwieństwie do przetwarzania partiami.

## Automatyczne czyszczenie przy zapisie

Opcja **Czyść automatycznie przy zapisie** stosuje te same reguły przy każdym zapisie produktu lub kategorii w back-office, przez hooki uruchamiane przed zapisem obiektu. Obejmuje zarówno stronę produktu v2, jak i strony historyczne.

Jest domyślnie wyłączona. Zweryfikuj reguły w symulacji przed jej aktywacją.

## Piaskownica

Panel **Piaskownica** stosuje obowiązujące reguły do wklejonego fragmentu HTML i wyświetla wynik wraz z zyskiem wagi. Nic nie jest odczytywane ani zapisywane w bazie. To najszybszy sposób sprawdzenia efektu ustawienia przed ponowną pełną symulacją.

## Po dużym czyszczeniu

- Wyczyść cache PrestaShop w **Zaawansowane → Wydajność**.
- Jeśli automatyczne indeksowanie wyszukiwania jest aktywne, a Twój indeks obejmuje opisy, przebuduj go w **Ustawienia sklepu → Wyszukiwanie**.

## Rozwiązywanie problemów

### Przyciski Symuluj i Wyczyść nie reagują

Najpierw sprawdź, czy masz wersję 1.0.1 lub nowszą, potem przeładuj stronę przez `Ctrl+F5`, aby wyczyścić cache przeglądarki. Jeśli problem trwa, otwórz konsolę przeglądarki: komunikat `dfHtmlCleanerAjaxUrl is not defined` oznacza, że plik JavaScript modułu nie został zaserwowany, zwykle przez cache serwera lub uprawnienia odczytu na `modules/dfhtmlcleaner/views/js/`.

### Przetwarzanie zatrzymuje się po kilku partiach

Zmniejsz rozmiar partii do 10 lub 20 w ustawieniach ogólnych i uruchom ponownie. Przetwarzanie zaczyna od początku, ale już czyste karty nie są modyfikowane: silnik jest idempotentny, drugi przebieg nie generuje żadnych zbędnych zapisów. Dziennik pokazuje kod HTTP zwrócony, gdy partia zawiedzie, co pozwala odróżnić timeout (504) od błędu PHP (500) czy problemu z tokenem (403).

### Osadzone wideo zniknęło

Dostawca prawdopodobnie nie jest na liście zaufanych domen. Dodaj go, potem przywróć dane wykonanie z panelu Kopii zapasowych i uruchom ponownie.

### Tabela straciła formatowanie

Atrybuty `width`, `border` i `cellpadding` tabel należą do przestarzałych atrybutów prezentacyjnych. Jeśli Twój motyw nie ma stylów CSS dla tabel, wyłącz tę regułę i przywróć wykonanie.

### Czyszczenie nic nie zmienia

To oczekiwane zachowanie na już czystym katalogu. Sprawdź w piaskownicy, czy znany problematyczny fragment jest faktycznie przekształcany i czy odpowiednie reguły są aktywne.

## Odinstalowanie

Odinstalowanie z menedżera modułów usuwa tabelę kopii zapasowych, wpisy konfiguracji i zakładkę menu. Już wyczyszczone opisy nie są przywracane: przed odinstalowaniem przywróć odpowiednie wykonania, jeśli chcesz się cofnąć.
