Nowy Blog, Dla programisty, PrestaShop

PrestaShop 8: dostosuj swoje rozwiązania

PrestaShop 8 w wersji Beta została wydana kilka dni temu. Jeśli jesteś osobą pracującą w ekosystemie PrestaShop z modułami, szablonami lub pracujesz z klientami posiadającymi sklepy na tym oprogramowaniu, to jest to świetna okazja by przetestować rozwiązania używane tam by upewnić się, że będą kompatybilne.

W tym artykule skoncentruje się na zmianach, które mogą wpłynąć na Waszą pracę. Przeczytasz tutaj o zmianach, które nie są kompatybilne wstecz, takich które mogą wymagać zmian w Twoich rozwiązaniach.

Warto podkreślić, że PrestaShop 8 to nowe wydanie główne. Nie jest to rewolucja, a ewolucja ale znajdziecie tam szereg zmian, które mogą znacznie wpłynąć na Waszą pracę.

Jak zwykle, zespół PrestaShop stara się aktualizować informacje o zmianach w dokumentacji dla programistów.  Ten artykuł do wstęp i wyjaśnienie treści, które tam znajdziecie.


PHP 8 i 8.1

PrestaShop 8 przynosi wsparcie dla… PHP 8 i 8.1. Jest to jeden z najważniejszych elementów tego wydania. Każda nowa wersja PHP to lepsza wydajność, a także nowe funkcje, które ułatwiają życie developerom. Zmiana ta nie oznacza jednak, że PrestaShop wymaga PHP 8.1 do działania, minimalna kompatybilność została ustalona na PHP 7.2.5, jednak zawsze rekomenduję używanie najwyższej możliwej wersji. Bezpieczeństwo aplikacji ma znaczenie (zawsze), a PHP 8.1 gwarantuje wsparcie z aktualizacjami security do listopada 2024.

Zaleca się by Wasze rozwiązania były kompatybilne z takim samym zakresem wersji PHP jakie wspiera samo oprogramowanie (czyli 7.2 do 8.1). Dlatego aby tego dokonać ważnym jest by nie zawierały one kodu, który został dodany do języka po PHP 7.2. Z drugiej strony, aby posiadać kod, który jest zgodny z PHP 8.1, musicie wziąć pod uwagę wszelkie zmiany, które PHP wprowadziło, jak np. usunięte funkcje czy oznaczenie niektórych elementów języka jako przestarzałych.
Lista zmian, które nie są kompatybilne wstecz i sposób na to jak migrować do PHP 8 i 8.1 opisana została w dwóch artykułach na stronie PHP:

Kod PrestaShop również musiał zostać dostosowany by być kompatybilnym z tymi wersjami PHP. Możesz znaleźć szczegóły prac związanych z tym w tych dwóch Pull Requestach na stronie projektu:

To da Wam pogląd jakich zmian można spodziewać się przy aktualizacji.

Jedną z bardzo dużych zmian jaka może mieć bezpośredni wpływ na Wasze rozwiązania, jest zmiana klasy Attribute, która została zmieniona na ProductAttribute. Słowo Attribute jest zarezerwowane w PHP stąd potrzeba takiej zmiany.

Aktualizacja PHP i Symfony wymagała równiez aktualizacji zależności używanych w projekcie. Możecie znaleźć listę wszelkich zmian na Liście zaktualizowanych zależności w dokumentacji dla programistów.

Jednym z przykładów jest biblioteka Guzzle, która została zaktualizowana z wersji 5.3 do 7.4. Warto o tym pamiętać ponieważ wiem, że z Guzzle korzysta wiele rozwiązań w ekosystemie PrestaShop i używa go jako zależności. Nowa wersja znacząco różni się od wersji 5.3 i istnieje bardzo duża szansa, że jeżeli jej używaliście, będziecie musieli wprowadzić odpowiednie zmiany.

Więcej informacji na ten temat w repozytorium Guzzle: Przewodnik aktualizacji w Guzzle


Symfony 4.4

PrestaShop 1.7 to była rewolucja, która rozpoczęła migrację do Symfony, najpierw z wersją 2.8 we wczesnych wydaniach, a potem 3.4 od PrestaShop 1.7.4. PrestaShop 8 wprowadza Symfony 4.4. W przyszłości, gdy zostaną wydane główne wersje PrestaShop, możecie się spodziewać aktualizacji frameworka Symfony. To również może mieć wpływ na Wasze rozwiązania.

Zauważalne zmiany, które mają bezpośredni wpływ na użytkowników PrestaShop są dostępne tutaj: Zmiany związane z aktualizacją Symfony.

Jeśli macie moduły oparte na Symfony i zauważycie jakieś elementy, które wymagają wyjaśnienia w dokumentacji, proszę dodajcie je lub dajcie nam znać.

Wszystkie zmiany związane z dostosowaniem PrestaShop do Symfony 4.4 możecie znaleźć w tym Pull Request: Upgrade do Symfony 4.4.


Kod uznany jako przestarzały i usunięte elementy

Jest to prawdopodobnie jedna ze zmian, która może mieć największy wpływ na Wasze rozwiązania.

Wiele klas i metod oznaczonych jako „deprecated” w poprzednich wersjach zostało usuniętych w PrestaShop 8. Były to metody, które nie były już używane przez silnik systemu lub których nie było sensu utrzymywać, jak np. wrappery wokół natywnie dostępnych funkcji PHP. Typowym przykładem takich funkcji są Tools::jsonEncode() i Tools::jsonDecode().

W tym przypadku zmiana jest prosta, Tools::jsonEncode() należy zastąpić funkcją json_encode(), a Tools::jsonDecode() funkcją json_decode(). Te dwie funkcje są natywnie dostępne w PHP.

W zależności od Waszego środowiska programistycznego, mogliście już zauważyć te deprecjacje, ponieważ wiele IDE takich jak PHPStorm czy VSCode podkreśla kod, który odwołuje się do zdeprecjonowanych metod i klas. Możecie znaleźć listę usuniętych metod, klas, właściwości, stałych, plików, usług Symfony i innych na tej stronie: Elementy usunięte z kodu.

Począwszy od PrestaShop 8, powinniście widzieć ostrzeżenia o kodzie oznaczonym jako deprecated w logach sklepu i front office po włączeniu trybu deweloperskiego. Alternatywnie możecie skonfigurować wyświetlanie tych błędów, ustawiając dyrektywę error_reporting w konfiguracji PHP na E_DEPRECATED.

Zachęcam do zapoznania się z tą listą, a jeśli znajdziecie jakieś brakujące elementy, dajcie nam znać.


Zmiany w metodach i ich zachowaniu

Usunięte klasy czy metody to nie jedyne zmiany, które mogą wymagać zmian w Waszych rozwiązaniach.

Niektóre metody posiadają zmodyfikowane sygnatury, ich typy zwrotów, typy parametrów czy ich wewnętrzne zachowanie. Pełna lista zmian może dać Wam lepsze zrozumienie jakie zmiany należy wprowadzić do produktów, które tworzysz. Zmiany te mogą miec wpływ na Wasze rozwiąznia szczególnie gdy używacie, nadpisujecie czy dekorujecie niektóre z serwisów czy klas dostępnych w silniku. Spodziewamy się jednak, że większość rozwiązań będą potrzebowały tylko minimalnych zmian, albo nie będą potrzebować ich wcale.


Zmiany w komponencie Hook

W wersji 8, PrestaShop będzie bardziej restrykcyjna jeżeli chodzi o implementacje i używanie hook w modułach. Warto żebyście mieli świadomość dwóch zmian, które mogą mieć wpływ na Wasze rozwiązania.

Pierwsza zmiana dotyczy rejestracji Hook w modułach, które realnie ich nie używają. Jeżeli PrestaShop wykryje, że moduł zarejestrował Hook ale nie zaimplementował metody, która by go obsługiwała, w trybie developerskim zostanie zwrócony wyjątek. Wiadomość z błędem ma na celu jedynie pomoc developerom, nie powinna mieć żadnego wpływu na moduły działające w trybie produkcyjnym.

Drugą zmianą jest ostrzeżenie o używaniu aliasów dla hook. Dla przykładu, jeżeli rejestrujecie hookLeftColumn zamiast jego nowej alternatywy czyli hookDisplayLeftColumn, w przypadku gdy macie włączony tryb developerski bądź konfiguracja PHP wskazuje na pokazywanie błędów E_DEPRECATED, zobaczycie odpowiednie ostrzeżenia na froncie sklepu.


Bezpieczeństwo

Wraz z wprowadzeniem nowej funkcji zarządzania polityką haseł w PrestaShop 8, niektóre rozwiązania mogą wymagać aktualizacji. Na przykład te, które generują hasła dla klientów lub tworzą fałszywych użytkowników dla celów integracji z zewnętrznymi serwisami.

Zwróćcie szczególną uwagę na definicje pól klas Customer i Employee. Od tej pory klasy te wymagają haseł podanych jako hash o odpowiedniej sile zgodnie z ustawieniami z back office.

Jeśli macie kod podobny do tego:
$customer = new Customer();
$customer->passwd = ‘SomeWeakPassword’;
//…
$customer->save();

Może nie działać w tej wersji, ponieważ sprawdzanie poprawności wyniku hasła może się nie powieść.

Ponieważ metoda Validate::isPasswd() została usunięta, oto lepszy sposób na rozwiązanie:

use PrestaShop\PrestaShop\Adapter\ServiceLocator;
use PrestaShop\PrestaShop\Core\Crypto\Hashing;

$customer = new Customer();
$crypto = ServiceLocator::get(Hashing::class);
$customer->passwd = $crypto->hash(Tools::passwdGen(64));
//…
$customer->save();

Ten przykład pochodzi z pliku aktualizacji modułu psgdpr, który musiał zostać zmodyfikowany właśnie z tego powodu.

Aby dowiedzieć się więcej, zobaczcie implementację nowej polityki haseł w tym Pull Request: Implement a new password policy based on zxcvbn.


Front office i szablon Classic

PrestaShop 8 nie zawiera zbyt wielu istotnych zmian w szablonie Classic. Listę można zobaczyć tutaj: Changes in the classic theme.

Nowa funkcja polityki haseł ma jednak wpływ również na front sklepu. Można tam umieścić specjalny widget, który mierzy i pokazuje siłę hasła. Aby dowiedzieć się, jak to zostało wdrożone w Classic zerknijcie na ten pull request.

Poza tym, jeśli jesteś autorami szablonów, możecie być zainteresowani śledzeniem ulepszeń zaimplementowanych w oficjalnym repozytorium Classic i przeniesieniem ich do własnego szablonu.


Wasz feedback jest kluczowy

Zespół opiekunów projektu open source dokłada wszelkich starań, aby dokumentacja była na bieżąco aktualizowana o wszystkie ważne zmiany. Jednakże, jeśli widzicie jakieś nieprawidłowości lub zauważycie zachowania, które powinny być udokumentowane, zachęcam do przesłania nam zmian do dokumentacji.

W nadchodzących artykułach, przedstawię Wam nowe funkcje dla deweloperów zawarte w PrestaShop 8.

Oryginał tego artykułu możesz znaleźć na oficjalnym blogu projektu open source PrestaShop

Zobacz inne