Переводим Magento 1 на PHP7, часть 2

Итак, в прошлой статье мы перевели нашу (вашу) Magento на PHP7. Увы, весьма часто возникают ситуации, когда несмотря на установку патчей и плагинов совместимости, под свежим PHP, Мадженто работает некорректно. Давайте же рассмотрим основные риски и способы их устранения.

  1. Устаревшая версия Magento. За последние 2 года система развивалась очень бурно. Разработчики практически несколько раз в год выпускали новые версии. Поблагодарить за это, в том числе, стоит и хакеров, которые внезапно очень пристально обратили на Magento свой взор. Но тем и лучше, т.к. ни одна другая система электронной коммерции не получала настолько подробного стресс-тестирования. Тем не менее, минусом данной ситуации стоит считать то, что обладатель или админ старенькой версии Magento, вроде 1.4 или 1.5 вынужден будет поставить большое количество патчей, чтобы закрыть основные дыры в безопасности. А ведь патчи могут быть «капризными», и если ваша система в чем-то была модернизирована (поправили какие-то системные файлы, не создавая копии в local), то «вычесывание блох» и натягивание патчей может занять много времени. Так что, оптимальным вариантом для перехода на PHP7 следует считать версию Magento от 1.9, а еще лучше самую последнюю на текущий момент (речь идет только о семействе 1-й версии, разумеется). Итак: владельцам старых версий Magento проще будет проапгрейдить свою систему до актуального варианта, чем лепить заплатки на устаревшую версию.

  2. Устаревшие плагины. Увы, в отличие от того же WordPress, Magento не умеет автоматически обновлять плагины. В лучшем случае, плагин предложит вам обновиться, показав всплывающее окно при входе в админку, и оставит напоминание на страничке системных новостей. Однако, подавляющая часть плагинов такого функционала не имеет. Так что, если вы испытываете какие-либо проблемы с некорректной работой системы после перехода на PHP7, то для начала отключите все сторонние (не-Mage) плагины, и проверьте, не ушла ли ошибка. Отключать плагины лучше посредством замены ключа <active>true</active> на <active>false</active> в настроечном файле плагина. XML-файлы настроек находятся в папке app/etc/modules. И не забудьте перед правкой отключить компиляцию! Также, имейте в виду, что плагины на самом деле не выключаются при выборе опции «отключить вывод плагина» в разделе конфигурации системы (система > конфигурация > расширенные). После отключения нештатных плагинов, можно по одному включать их, и проверять работу системы. Так же, нелишним будет обновить плагины до последних версий.

  3. Неполная правка системных файлов. Для корректной работы Magento с PHP7, увы, недостаточно только поправить файл Layout.php, например, при помощи патча из варианта №1 прошлой статьи. После правки Layout.php система, разве что, начинает запускаться и более-менее полноценно работать. Но, также возможны и проблемы, рассмотрим их ниже:

Внимание: при необходимости правки системного файла (из какой-либо подпапки app/code/core/Mage), обязательно создавайте local-копию этого файла (app/code/local/Mage/полный/путь/источника), и все правки вносите только в копию. Если вы поправите системный файл прямо в папке core, то в дальнейшем будет затруднена установка новых системных патчей.

  • Не работает экспорт товара. Правим файл:
app\code\core\Mage\ImportExport\Model\Export\Entity\Product\Type\Abstract.php

перенеся его в
app\code\local\Mage\ImportExport\Model\Export\Entity\Product\Type\Abstract.php

Строчку:

$data['filter_options'] = $this->$data['options_method']();

заменяем на:

$data['filter_options'] = $this->{$data['options_method']}();
  • Не работает экспорт клиентов. Правим:
app\code\core\Mage\ImportExport\Model\Export\Entity\Customer.php

Строчку:

$data['filter_options'] = $this->$data['options_method']();

заменяем на:

$data['filter_options'] = $this->{$data['options_method']}();
  • Не работает загрузчик файлов в админке. Правим:
lib\Varien\File\Uploader.php -- его можно поправить прямо по месту

Строчку:

$params['object']->$params['method']($this->_file['tmp_name']);

заменяем на:

$params['object']->{$params['method']}($this->_file['tmp_name']);
  • Покупатели не могут войти в систему. Правим:
app\code\core\Mage\Core\Model\Resource\Session.php
строка 218 (или рядом где-то, зависит от версии)

Строчку:

return $data;

заменяем на:

return (string)$data;
  • Некорректно считается общая сумма заказа. Скачиваем и устанавливаем плагин.

После всех произведенных правок, обязательно производим перекомпиляцию (если включена компиляция) и обновляем кэш системы.