Не правильно работает страница «Новинки» в Opencart

Сегодня столкнулся с такой проблемой, которая появилась из ни откуда и застала врасплох. Вообщем, друзья, перестала работать страница с новинками и это меня возмутило. Провел 2 часа в раздумьях, перелопатил контроллеры и модели, но безрезультатно.

Решил обратится к популярному форуму opencart и наткнулся на подобную тему, созданную автором «xiolog», где решалась подобная проблема. Ниже его рецепт лечения:

Все изменения проводятся в файле /catalog/model/catalog/product.php

1. В методе getLatest добавить в выборку поле p.date_added (2-й SELECT)

$sql = "SELECT * FROM (SELECT p.product_id, p.sort_order, p.model, pd.name, p.quantity, p.price, p.date_added, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '" . $this->NOW . "') AND (pd2.date_end = '0000-00-00' OR pd2.date_end > '" . $this->NOW . "')) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < '" . $this->NOW . "') AND (ps.date_end = '0000-00-00' OR ps.date_end > '" . $this->NOW . "')) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.status = '1' AND p.date_available <= '" . $this->NOW . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY p.date_added DESC";

2. Затем добавить поле p.date_added в массив для сортировки:
$sort_data = array(
'pd.name',
'quantity',
'ps.price',
'rating',
'p.sort_order',
'p.model',
'p.date_added'
);

3. Добавить поле date_added DESC в последнюю конкатенацию переменной $sql (в блоке else):
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
if ($data['sort'] == 'pd.name') {
$sql .= " LCASE('name')";
} elseif ($data['sort'] == 'ps.price') {
$sql .= " (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
} else {
$sql .= " " . $data['sort'];
}
} else {
$sql .= " date_added DESC, sort_order";
}

И ву а ля!!! Все работает, проверено лично на версии OCSHOP 1.5.6.4.1.

share

Оставить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: