Press "Enter" to skip to content

PrestaShop 1.6 – niedziałająca strona z modułami w adminie: Fatal error in module file

Admin 0

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!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Zobacz także !
Wybór faktury i paragonu w PrestaShop. W przypadku faktury -…