OpenCart 3 PHP 7.4: исправление ошибки Twig с imgsrc вместо img src

Показывать справа: 0

При обновлении версии PHP с 7.3 на 7.4 в некоторых проектах на OpenCart 3 может появиться необычная ошибка при выводе изображений через Twig.

HTML-код, который раньше формировался корректно:

<img src="/image.jpg" alt="Название товара">

после перехода на PHP 7.4 начинает превращаться в:

<imgsrc="image.jpg" alt="Название товара">

В результате браузер перестаёт воспринимать такой тег как обычное изображение. Особенно часто проблема проявляется в шаблонах OpenCart 3 с Lazy Load, где атрибуты формируются через Twig-выражения.

Причина ошибки imgsrc в OpenCart 3

Причина находится не в HTML и не в шаблоне магазина. Проблема связана со старой версией Twig, которая используется в OpenCart 3.0.2.0 и некоторых последующих версиях.

Старый Twig при определённых условиях неправильно обрабатывает пробел между обычным HTML-кодом и динамическим выражением:

<img {{ lazyload ? 'src="image.gif" data-lazy' : 'src' }}="{{ thumb }}">

После обработки шаблона пробел перед атрибутом может быть удалён:

<imgsrc="image.gif" data-lazy="image.webp">

Как исправить ошибку Twig в OpenCart 3

Исправление выполняется в библиотеке Twig. Не требуется менять все шаблоны темы или переписывать вывод изображений.

Откройте файл:

system/library/template/Twig/Lexer.php

Найдите функцию lexData(). В старых версиях Twig может находиться код, который без проверки удаляет пробелы перед динамическими выражениями.

Необходимо изменить обработку удаления пробелов, чтобы очистка выполнялась только для действительно заданных специальных случаев.

Найдите в функции lexData() примерно такой код:

if (isset($this->positions[2][$this->position][0])) {

    $text = rtrim($text);

}

И замените его на:

if (

    isset($this->positions[2][$this->position][0]) &&

    ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0])

) {

    $text = rtrim($text);

}

После исправления необходимо очистить кэш OpenCart:

system/storage/cache/ system/storage/modification/

Также рекомендуется выполнить обновление модификаторов через административную панель OpenCart.

Почему ошибка проявляется только на PHP 7.4

OpenCart 3 создавался под более старые версии PHP. При переходе на PHP 7.4 старая библиотека Twig начинает работать в новых условиях выполнения PHP, из-за чего проявляются ошибки, которые раньше не были заметны.

При этом сам шаблон остаётся правильным. Например:

<img src="/{{ thumb }}">

будет работать нормально, а проблема появляется только при динамическом формировании атрибутов:

<img {{ attribute }}="{{ image }}">

Проверка после исправления

После внесения изменений итоговый HTML должен снова выглядеть правильно:

<div class="sku__thumbs-item"> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" data-lazy="image.webp" alt="Название товара"> </div>

Другие возможные проблемы OpenCart после обновления PHP

Переход на новую версию PHP часто выявляет проблемы в старых интернет-магазинах: несовместимость модулей, ошибки шаблонов, проблемы интеграций и нестандартных доработок.

Выполняю доработку сайтов OpenCart с исправлением ошибок, адаптацию старых модулей и настройку существующего функционала.

Также занимаюсь разработкой решений для OpenCart, включая создание новых модулей и интеграций под задачи магазина.

При необходимости выполняю PHP-разработку и исправление нестандартного кода в проектах на CMS.

Заключение

Ошибка с заменой img src на imgsrc в OpenCart 3 после перехода на PHP 7.4 связана со старым Twig Lexer. Исправление библиотеки Twig позволяет сохранить существующую тему и избежать массового изменения шаблонов.

Покупка готового скрипта joomla 3

или просто напишите в телеграмм https://t.me/webalan