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 позволяет сохранить существующую тему и избежать массового изменения шаблонов.