Якщо ваша версія OpenCart нижче 3.0.3.9, то ваша система не сумісна з PHP 8. На жаль, в OpenCart 3 немає автоматичного оновлення, щоб можна було перейти на найновішу на даний момент версію 3.0.4.0. Проте проблему сумісності можна вирішити, зробивши адаптацію старої версії OpenCart під вимоги PHP 8.x.
Наша інструкція призначена для OpenCart 3.0.2.0, 3.0.3.1, 3.0.3.2, 3.0.3.3, 3.0.3.5, 3.0.3.6, 3.0.3.7, 3.0.3.8. Не забудьте зробити повну резервну копію сайту перед виконанням операцій.
Існує кілька методів оновлення старої версії OpenCart 3.0 для підтримки PHP 8:
- Клонувати бібліотеки і окремі файли OpenCart з найновішої збірки у вашу систему
- Зробити оновлення бібліотек через composer і внести деякі правки.
- Створити новий сайт на OpenCart 3.0.4.0 і перенести шаблон, базу даних та всі модулі на нову систему.
Метод 1. Клонування файлів з найновішої збірки OpenCart 3
Цей метод є найпростішим і найшвидшим, ось що потрібно зробити:
- Потрібно завантажити найновішу версію OpenCart 3, на даний момент це 3.0.4.0
- Розпакувати завантажений архів у себе на ПК та відкрити папку upload
- Скопіювати папку system на ваш сайт, з заміною відповідних папок і файлів
- Скопіювати папку system/storage на ваш сайт у ваш каталог 'storage' (у вас він може знаходитись за межами каталог домена, оскільки OpenCart після установки вимагає перемістити storage за межі каталогу домена). Якщо ви не знаєте, де у вас знаходиться storage, відкрийте config.php та знайдіть DIR_STORAGE.
- Скопіювати з заміною файл catalog/controller/event/theme.php
- Виправити дрібні помилки PHP (перелік можливих помилок і виправлення дивіться нижче)
Метод 2. Оновлення бібліотек через composer через термінал
- Визначити розміщення каталогу storage на вашому сайті - відкрийте config.php та знайдіть DIR_STORAGE, там вказано шлях до каталогу.
- Завантажте в цей каталог файл composer.json (скачати)
- Відкрийте термінал (консоль) на сервері і виконайте послідовно такі команди:
cd шлях/до/каталогу/storage
composer update - Якщо у вас OpenCart нижче 3.0.3.7 - потрібно замінити деякі файли системи:
catalog/controller/event/theme.php (скачати)
system/library/template/twig.php (скачати) - Виправити дрібні помилки PHP (перелік можливих помилок і виправлення дивіться нижче)
Метод 3. Новий сайт з міграцією даних
Це, мабуть, найскладніший метод, оскільки вимагає створення нового сайту з послідовним переносом усіх даних. Ми не радимо розглядати цей метод оскільки він рівноцінний створенню нового сайту. В такому випадку можна розробити сайт на новій збірці, на даний момент це OpenCart 4.1.0.3, і отримати повну сумісність з PHP 8, а також використання новіших бібліотек і фреймворків.
Якщо ви все таки вирішили зробити міграцію на новий сайт на OpenCart 3 з сумісністю з PHP 8, ось коротка інструкція:
- Завантажити і встановити найновішу версію OpenCart 3, на даний момент це 3.0.4.0.
- Підмінити базу даних на вашу - видалити таблиці та імпортувати ваш дамп бази даних.
- Скопіювати папку image з вашого старого сайту на новий
- Встановити шаблон та всі необхідні модулі для OpenCart 3
Перелік можливих помилок PHP і їх виправлення
Після переходу OpenCart 3.0 на нові версії PHP, особливо PHP 8.0, 8.1, 8.2, 8.3, 8.4, часто з’являються помилки, попередження (warnings) та застарілі повідомлення (deprecations). Це пов’язано з тим, що OpenCart 3 створювався ще для PHP 7.0–7.3. Нижче наведемо найпоширеніші помилки, їх пояснення та рекомендації:
Unknown: mysqli::real_escape_string(): Passing null to parameter #1 ($string) of type string is deprecated in /system/library/db/mysqli.php on line 46
Причина: в PHP 8.1+ не можна передавати null
замість обов’язкового параметра string
.
Вирішення: додати перевірку або приведення типу проблемної змінної:
return $this->connection->real_escape_string($value);
замінюємо на:
return $this->connection->real_escape_string((string)$value);
Unknown: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in /catalog/model/catalog/product.php on line 45
Причина: в PHP 8 виклик round(null)
більше не допускається — null
не є допустимим типом аргументу.
Вирішення: Перед викликом round()
потрібно переконатися, що аргумент не є null
або зробити приведення типу:
'rating' => round($query->row['rating']),
замінюємо на:
'rating' => round((float)$query->row['rating']),
Unknown: Automatic conversion of false to array is deprecated in /system/library/cart/user.php on line 43
Причина: Значення, що було
false
автоматично приводиться до array
, що тепер
застаріло і потенційно небезпечно
Вирішення: Потрібно додати перевірку на масив перед проблемним рядком: if (is_array($var))
Unknown: Creation of dynamic property Request::$request is deprecated in /system/library/request.php on line 26
Unknown: Creation of dynamic property Session\DB::$db is deprecated in/system/library/session/db.php on line 8
Unknown: Creation of dynamic property Proxy::$getTranslations is deprecated in /system/engine/proxy.php on line 30
Unknown: Creation of dynamic property Cart\Cart::$config is deprecated in /system/library/cart/cart.php on line 7
Причина: в PHP 8.2+ не можна створювати властивості об'єктів "на льоту".
Вирішення: Оголосіть властивість у класі заздалегідь, на початку php класу, наприклад:
private $request;
private $db;
private $proxy;
private $cart;