Появилась задача от клиента сделать так, чтобы дополнительные изображения показывались первыми, а главное изображение в конце карточки товара. Шаблон Unishop 2 Opencart 3.
Решение. Редактируем контроллер /catalog/controller/product/product.php и меняем всё что между:
$this->load->model('tool/image');
...
if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
На этот код:
$results = $this->model_catalog_product->getProductImages($this->request->get['product_id']);
$data['images'] = array();
if (count($results) == 0) {
// Если нет дополнительных изображений, используем только основное
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')
);
$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')
);
$data['small'] = $this->model_tool_image->resize($product_info['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
);
} else {
$data['popup'] = '';
$data['thumb'] = '';
$data['small'] = '';
}
} else {
// Если есть дополнительные изображения, загружаем их первыми
$im = 0;
foreach ($results as $result) {
$im++;
if ($im > 1) {
$data['images'][] = array(
'popup' => $this->model_tool_image->resize($result['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')
),
'thumb' => $this->model_tool_image->resize($result['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
),
'small' => $this->model_tool_image->resize($result['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['popup'] = $this->model_tool_image->resize($result['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')
);
$data['thumb'] = $this->model_tool_image->resize($result['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')
);
$data['small'] = $this->model_tool_image->resize($result['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
);
}
}
// Если основное изображение не совпадает с первым доп. изображением, добавляем его в конец
if ($product_info['image'] && $product_info['image'] != $results[0]['image']) {
$data['images'][] = array(
'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')
),
'thumb' => $this->model_tool_image->resize($product_info['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
),
'small' => $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')
)
);
}
}
Результат:
Видим, что доп. изображение стало первым
В админке:
Для чего это нужно? В категории товара клиенту необходимо было показать своё главное изображение, а в карточке товара сразу реальное фото. После изменений контроллера не забываем очистить модификаторы иначе изменений. Сразу скажу, что решение не подойдет для стандартного и других шаблонов.
Для стандартного шаблона Opencart 3 решение примерно таким же, только без переменной small:
$results = $this->model_catalog_product->getProductImages($this->request->get['product_id']);
$data['images'] = array();
if (count($results) == 0) {
// Если нет дополнительных изображений, используем только основное
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')
);
$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['popup'] = '';
$data['thumb'] = '';
}
} else {
// Если есть дополнительные изображения, загружаем их первыми
$im = 0;
foreach ($results as $result) {
$im++;
if ($im > 1) {
$data['images'][] = array(
'popup' => $this->model_tool_image->resize($result['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')
),
'thumb' => $this->model_tool_image->resize($result['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
)
);
} else {
// Первое доп. изображение становится основным
$data['popup'] = $this->model_tool_image->resize($result['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')
);
$data['thumb'] = $this->model_tool_image->resize($result['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')
);
}
}
// Если основное изображение не совпадает с первым доп. изображением, добавляем его в конец
if ($product_info['image'] && $product_info['image'] != $results[0]['image']) {
$data['images'][] = array(
'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')
),
'thumb' => $this->model_tool_image->resize($product_info['image'],
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_width'),
$this->config->get('theme_' . $this->config->get('config_theme') . '_image_additional_height')
)
);
}
}
Я не тестировал код на стандартном шаблоне. Если у вас не работает, то сообщите мне в комментариях и я постараюсь помочь. По другим шаблонам помочь не смогу, так как это требует детального разбора шаблона.