Zawartość artykułu
Objawy problemu
Jeśli używasz (jeszcze) sklepu internetowego PrestaShop w wersji 1.6 możesz natrafić na bład typu:
[PrestaShop] Fatal error in module file :/var/www/prestashop/classes/module/Module.php(1361) : eval()'d code: syntax error, unexpected 'use' (T_USE)
Czyli zamiast strony z modułami pojawia się biała strona i dostep do jakiegokolwiek modułu jest niemożliwy..
Niestety błąd nic nie mówi poza wskazaniem pliku w którym występuje.
W gruncie rzeczy błąd dotyczy zainstalowanej wersji PHP na serwerze. Jeśli Twój serwer można przełączyć na wersję PHP 5.6 – wtedy ten błąd ustąpi, a moduły będzie można przeglądać.
W naszym przykładzie wersja PrestaShop to:
1.6.1.24
a wersja PHP:7.1.33
Jednak może też tak być, że już zainstalowane modułu nie zadziałają w wersji PHP 5.6 (albo kluczowe elementy w funkcjonowaniu sklepu będą nie działać) np.
Uniemożliwia to po prostu wykonanie zamówienia na sklepie… i oznacza to, że trzeba wrócić do wersji PHP 7. Czyli mamy tutaj błędne koło..
Jak temu zaradzić?
Znalezienie problematycznego modułu
Mimo, że błąd wskazuje plik:
/var/www/prestashop/classes/module/Module.php
to w gruncie rzeczy dotyczy któregoś z modułu zainstalowanego w Twoim sklepie PrestaShop.
Ww. skrypt jest tak skonstruowany, że (uproszczając) „przelatuje” po każdym zainstalowanym w sklepie module i odczytuje jego kod. Jeśli natrafi na kod niezgodny z zastaną wersją PHP może albo wyświetlić ostrzeżenie albo zatrzymać skrypt sygnalizując
Fatal error
jak na ww. przykładzie.
Pytanie jak znaleźć moduł, który zatrzymuje skrypt?
Naprawa problemu
Otwórz plik:
/var/www/prestashop/classes/module/Module.php
Znajdź fragment kodu:
if (substr($file, -2) == '?>') { $file = substr($file, 0, -2); } // If (false) is a trick to not load the class with "eval". // This way require_once will works correctly if (eval('if (false){ '.$file."\n".' }') !== false) { require_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php'); } else { $errors[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($file_path, strlen(_PS_ROOT_DIR_))); }
Umieść w nim funkcję var_dump
zwracającą nazwę bieżącego modułu ktory jest sprawdzany:
if (substr($file, -2) == '?>') { $file = substr($file, 0, -2); } var_dump($module); // If (false) is a trick to not load the class with "eval". // This way require_once will works correctly if (eval('if (false){ '.$file."\n".' }') !== false) { require_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php'); } else { $errors[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($file_path, strlen(_PS_ROOT_DIR_))); }
Następnie wejdź na problematyczną stronę modułów w adminie Twojego sklepu. Tym razem poza pierwotnym błędem wyświetli się lista kolejno sprawdzanych modułow:
string(8) "bankwire" string(15) "blockcategories" string(12) "blockcontact" string(17) "blockcontactinfos" string(13) "blockfacebook" string(16) "blockreinsurance" string(12) "blocksharefb" string(11) "blocksocial" string(12) "blocktopmenu" string(9) "cartsguru" string(14) "cashondelivery" string(6) "cheque" string(12) "dashproducts" string(12) "deleteorders" string(9) "eicaptcha" string(12) "mailchimppro" string(11) "mbeshipping" [PrestaShop] Fatal error in module file :/home/klient.dhosting.pl/multipak/e-opakowania/classes/module/Module.php(1363) : eval()'d code: syntax error, unexpected 'use' (T_USE)
Jak widać ostatnim modułem, którego nazwę wyświetlono jest: mbeshipping
zapewne to on sprawia problem. Spróbuj skopiować zawartość folderu:
modules/mbeshipping
Na dysk twardy Twojego komputera (tak stworzysz jego kopię bezpieczeństwa) następnie usuń ten folder. Prawdopodobnie po wykonaniu tej czynności – strona modułów będzie już działać.
Wersja modułu odpowiednia dla wersji PHP
Ostatnim krokiem jest próba znalezienia wersji modułu, która zadziała z obecną na sklepie (tutaj 7.1.33) wersją PHP. Oczywiście jeśli taki moduł jest niezbędny do prowadzenia sprzedaży. Wtyczkę dopasowaną do wersji PHP należy ponownie zainstalować w Twoim sklepie PrestaShop. Przeważnie wystarczy zgłosić się do twórcy modułu w tej sprawie. Dane kontaktowe do twócy są dostępne w pierwszych liniach skryptu:
modules/jakis-modul-prestashop/jakis-modul-prestashop.php
Czyli po prostu nazwa skruptu PHP jest taka sama jak nazwa modułu. Jeśli takiego modułu nie ma – zastanów się nad alternatywą lub zleć napisanie modułu odpowiedniej firmie.
Powodzenia!