Ух закрутил название статьи :) Сегодня поговорим про такую странность в 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'] = ''; }
Учтите, что такие правки нужно сделать во всех Контроллерах, где вы хотите, чтобы выводились заглушки вместо пустых полей! Т.к. все модули вроде Хиты продаж, Новинки, Рекомендуемые и пр. используют свой собственный Контроллер запаситесь терпением, а так же внимательно проверьте результаты труда.
Добрый вечер, подскажите как править в featured.php не могу найти ничего схожего. Буду очень признателен, а то выгрузка через 1с делается, а фото нету, хотя в админке в товаре есть заглушка, а на сайте нету. Помогите))
Добрый день.
На окстор 3.0.2.0 тоже не появляется плейсхолдер. Правил для категорий контроллеры и для товаров.. Не знаю с чем связано, но картинки заглушки по прежнему нет. Кеш чистил.