Заглушка фото про обмене данными каталога OpenCart

OpenCart
3 мин. на чтение

Ух закрутил название статьи :) Сегодня поговорим про такую странность в OpenCart как заглушка фото товаров. Независимо от версии вашего OC (1,5 2 или 3) указанный недочет остался. Суть его в том, что заглушка для фото товаров присваивается только, если товар создан из админки.

А вот если вы импортировали товары скажем из XML или XLS файла, где в поле фото могло быть пустое значение, заглушка не появится и вместо фото или заглушки не будет ничего. Причиной тому вот этот участок кода в контроллерах, например товара:

$this->load->model('tool/image'); $this->load->model('tool/image');
if ($product_info['image']) {
   $data['popup'] = $this->model_tool_image->resize($product_info['image'], $this->config->get($this->config->get('config_theme') . '_image_popup_width'), $this->config->get($this->config->get('config_theme') . '_image_popup_height')); 
} else { 
   $data['popup'] = ''; }

if ($product_info['image']) {
  $data['thumb'] = $this->model_tool_image->resize($product_info['image'], $this->config->get($this->config->get('config_theme') . '_image_thumb_width'), $this->config->get($this->config->get('config_theme') . '_image_thumb_height'));
} else {
$data['thumb'] = ''; }

Все конечно понимают, что в случае получения из Модели пустого значения переменной массива $product_info['image'] в пользовательской части сайта никакая картинка вообще не выведется. Я до сих пор не понимаю смысла этого участка кода, однако он кочует из версии к версии. Приведенный выше пример взят из OpenCart 2.3, вот из 1.5.6.4:

if ($product_info['image']) {
$this->data['popup'] = $this->model_tool_image->resize($product_info['image'], $this->config->get('config_image_popup_width'), $this->config->get('config_image_popup_height'));
} else {
$this->data['popup'] = ''; }
if ($product_info['image']) {
$this->data['thumb'] = $this->model_tool_image->resize($product_info['image'], $this->config->get('config_image_thumb_width'), $this->config->get('config_image_thumb_height'));
} else {
$this->data['thumb'] = ''; }

А вот из OpenCart 3:

$this->load->model('tool/image');
if ($product_info['image']) {
$data['popup'] = $this->model_tool_image->resize($product_info['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height'));
} else {
$data['popup'] = '';
}
if ($product_info['image']) {
$data['thumb'] = $this->model_tool_image->resize($product_info['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_thumb_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_thumb_height'));
} else {
$data['thumb'] = '';
}

Чтобы исправить эту досадную неточность нужно в  if выражении для конструкции else изменить код, вместо $data['popup'] = ''; и $data['thumb'] = ''; подставить

$data['popup'] = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height'));

и

$data['thumb'] = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height'));

где placeholder.png имя файла из папки /image/, которое следует использовать в качестве заглушки. Вы конечно можете использовать свое. Если вы представитель кодокопателей и зададитесь вопросом, а что если… админ удалит файл placeholder.png и это приведет скорее всего к Php warning. В таком случае, используйте PHP функцию file_exists(), например так:

$placeholder_file = '/image/placeholder.png';
if ($product_info['image']) {
$data['popup'] = $this->model_tool_image->resize($product_info['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height'));
} elseif (file_exists($placeholder_file)) {
$data['popup'] = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height'));
} else {
$data['popup'] = '';
}

Учтите, что такие правки нужно сделать во всех Контроллерах, где вы хотите, чтобы выводились заглушки вместо пустых полей! Т.к. все модули вроде Хиты продаж, Новинки, Рекомендуемые и пр. используют свой собственный Контроллер запаситесь терпением, а так же внимательно проверьте результаты труда.

Игорь Чишкала

Директор по технологиям в SoftForge.
Люблю ИТ, пишу технические статьи в этом блоге или для сайта фриланс-биржи Upwork. Кодю на PHP с использованием фреймворков Laravel или Symfony.

Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Богдан

    Добрый вечер, подскажите как править в featured.php не могу найти ничего схожего. Буду очень признателен, а то выгрузка через 1с делается, а фото нету, хотя в админке в товаре есть заглушка, а на сайте нету. Помогите))

    Ответить
  2. Focster

    Добрый день.
    На окстор 3.0.2.0 тоже не появляется плейсхолдер. Правил для категорий контроллеры и для товаров.. Не знаю с чем связано, но картинки заглушки по прежнему нет. Кеш чистил.

    Ответить