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

Ух закрутил название статьи :) Сегодня поговорим про такую странность в 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.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *