lechowski / 09.01.2022

Polskie znaki czy krzaki na zapleczu PrestaShop 1.7?

Użytkownicy sklepów PrestaShop 1.7 mogą natrafić na dość nieznośny problem z kodowaniem polskich znaków. Objawia się on „krzaczkami” (czy raczej pytajnikami..) w tekstach na sklepie – opisach produktów, ich nazwach, nazwach kategorii itd.

Grafika: błędy wyświetlania polskich znaków - krzaki w sklepie na PrestaShop 1.7.
błędy wyświetlania polskich znaków / PS17

Rozwiązanie nie pomaga... wciąż są krzaki lub znaki zapytania na zapleczu w sklepie PrestaShop 1.7.x.x.

Jeżeli wprowadzona zmiana w pliku konfiguracyjnym sklepu opartego na PrestaShop 1.7, możesz dodatkowo wykonać poniższe kroki.

Bezpieczeństwo pracy w standardzie?

Użytkownicy dzielą się na dwie grupy:
tych, którzy robią kopie bezpieczeństwa i tych, którzy jeszcze jej nie robią…

Wykonuj kopię bezpieczeństwa plików i bazy danych jeżeli chcesz uniknąć niespodzianek xD

Kopia bezpieczeństwa bazy PS17

Jak wykonać kopię bezpieczeństwa bazy danych w PrestaShop? Najszybciej będzie przez panel administracyjny wykorzystując do tego celu zintegrowane funkcjonalności dostępne w zaawansowanej konfiguracji z poziomu menu nawigacyjnego na zapleczu sklepu.

KONFIGURUJ ➤ Zaawansowane ➤ Baza danych ➤ Kopia zapasowa DB

(...) - utwórz nową kopię zapasową

kopia zapasowa baza danych prestashop jak wykonać

W pliku ./app/config/doctrine.yml należy dodać "NAMES 'UTF8'" po przecinku jako parametr dla zapytania MySQL SELECT.

        options:
          1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')),"

Po edycji powinno wyglądać tak:

        options:
          1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')), NAMES 'UTF8'"

Sposób na polskie znaki w preście (sprawdzone na wersjach PrestaShop 1.7.7.8, 1.7.8.0, 1.7.8.1, 1.7.8.2).

Cała zawartość pliku doctrine.yml:

# Doctrine Configuration

doctrine:
  dbal:
    default_connection: default

    connections:
      default:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  utf8mb4
        mapping_types:
          enum: string

        options:
          1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')), NAMES 'UTF8'"

  orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    naming_strategy: prestashop.database.naming_strategy
    auto_mapping: true

    dql:
      string_functions:
        regexp: DoctrineExtensions\Query\Mysql\Regexp

Naprawa kodowania na poziomie skryptu PHP

Otwórz plik classes/db/DbPDO.php

Znajdź funkcję connect() a następnie przed linią z kodem $this->link->exec('SET SESSION sql_mode = \'\''); wstaw poniższy kod PHP:

// UTF-8 support
if ($this->link->exec('SET NAMES \'utf8\'') === false) {
throw new PrestaShopException('PrestaShop Fatal error: no utf-8 support. Please check your server configuration.'.$e->getMessage());}

Kodowanie szablonu

Włącz dowolną podstonę sklepu albo stronę główną i wciśnij: CTRL + U. W źródle strony upewnij się, że w sekcji <HEAD> na początku kodu HTML jest zawarty znacznik określający kodowanie typu:

kodowanie - obsługa polskich znaków na poziomie szablonu prestashop html w pliku .tpl
obsługa polskich znaków na poziomie szablonu i html

Ważna jest tutaj wartość atrybutu meta charset i musi być ona zdeklarowana jako "utf-8". Jeżeli u Ciebie brak tej linijki kodu html możesz skopiować i wkleić poniższy fragment:

<meta charset="utf-8"> 

Kolejnym krokiem jest oczywiście indywidualny test skuteczności i ewentualne przejście do kolejnego kroku.

    Sprawdź kodowanie bazy danych MySQL

    1. Na poziomie tworzenia bazy danych w panelu hostingowym powinna mieć ona kodowanie: UTF8. Skontaktuj się dla pewności w tej sprawie z administatorem serwera.
    2. W programie PhpMyAdmin wybierz opcję „Databases” i na liście baz danych upewij się czy baza posiada kodowanie UTF8 np. utf8_polish_ci
    3. Wybierz bazę danych i na liście tabel w kolumnie „Collation” (kodowanie) upewnij się, że tabele też mają kodowanie UFT8 np. utf8_general_ci albo utf8_polish_ci
    4. Otwórz dowolną tabelę językową np. ps_cms_lang lub pr_product_lang i upewnij się, że teksty w niej zawarte mają polskie znaki diakrytyczne (kliknij „edytuj” na dowolnym wierszu – nic nie zmieniając i nic nie zapisując)

    OK – jeśli wszystko się zgadza – baza danych ma prawidłowe kodowanie i nie jest to przyczyną błędów.

    Sprawdź jak zapisywany jest tekst z polskimi znakami

    Utwórz nową stronę CMS z tekstem z pl. literami

    1. Wejdź w dział strony CMS (jeśli nie widzisz go w menu admina sklepu wejdź pod adres: http://{adres-sklepu}.pl/{admin}/index.php?controller=AdminCmsContent&token={token} (Oczywiście w klamrach podaj dane Twojego sklepu).
    2. Dodaj nową stronę CMS, w jej treści wpisz: „zażółć gęślą jaźń ZAŻÓŁĆ GĘŚLĄ JAŹŃ” (przykładowy tekst sprawdzający wszystkie poliskie litery).
    3. Jeśli na poziomie bazy danych w programie PhpMyAdmin w tabeli ps_cms_lang zamiast poliskich liter pojawia się niezrozumiały tekst typu „zażółć gęślą jaźń ZAŻÓŁĆ GĘŚLĄ” oznacza to błędne kodowanie na poziomie skrytpu i nasz sposób naprawy powinien zadziałać.

    DrSpinner®