InboxRu
@InboxRu
Фриланс

Как сделать сортировку по размеру скидки в opencart?

На странице /specials выводятся все товары скидкой. Нужно, чтобы первыми выводились товары с наибольшей скидкой. Или чтобы выводились товары со скидкой больше определенной.
  • Вопрос задан
  • 1481 просмотр
Пригласить эксперта
Ответы на вопрос 2
Ищите контроллер модуля, отвечающего за это, в нем должны быть настройки либо как минимум написано в коде будет, откуда он берет настройки(). В стандартном Opencart1564 такого пути по-умолчанию нет, есть только модуль для отображения на других страницах, располагается в catalog/controller/module/special.php, если вашу страницу specials писал не совсем криворукий спец, то он этот же контроллер должен был использовать. Сортировка там задается полями:

'sort'  => 'pd.name',
'order' => 'ASC',


Фильтрацию выше определенной цены либо самостоятельно напишете (там несложно по идее), либо на фриланс, если php не владеете.
Ответ написан
@harlamov_di
Самый простой способ по акциям по крайней мере который показался мне при решении данной задачи адекватным и помог мне:

1. В таблице oc_product создать столбец и назвать его например - product_special, тип INT(10)
2. В файле admin/model/catalog/product находим две функции addProduct и editProduct
3. В каждой из них в теле функции находим проверку на существование акции в товаре и пишем такой запрос к таблице oc_product:

$this->db->query("UPDATE " . DB_PREFIX . "product SET product_special = '" . (float)$product_special['price'] . "' WHERE product_id = '" . (int)$product_id . "'");

Вот как выглядит само условие и уже запрос который надо туда вставить:

if (isset($data['product_special'])) {
			foreach ($data['product_special'] as $product_special) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_special SET product_id = '" . (int)$product_id . "', customer_group_id = '" . (int)$product_special['customer_group_id'] . "', priority = '" . (int)$product_special['priority'] . "', price = '" . (float)$product_special['price'] . "', date_start = '" . $this->db->escape($product_special['date_start']) . "', date_end = '" . $this->db->escape($product_special['date_end']) . "'");
			}
            
            $this->db->query("UPDATE " . DB_PREFIX . "product SET product_special = '" . (float)$product_special['price'] . "' WHERE product_id = '" . (int)$product_id . "'");
		}


Теперь при добавлении товара или редактировании в таблицу oc_product в столбец - product_special будет заноситься цена акционного товара.

4. В файле /catalog/controller/category/category.php добавляет новую сортировку в $this->language->get('пишем что угодно это текст самой сортировки'), ASC ставим если нам надо по возрастанию, DESC если по убыванию:

$data['sorts'][] = array(
				'text'  => $this->language->get('text_special_asc'),
				'value' => 'p.product_special-asc',
				'href'  => $this->url->link($route, $path . '&sort=p.product_special&order=asc' . $url)
			);


5. В файле /catalog/model/product.php

В функции getProducts находим строку:

$sort_data = array(
			'pd.name',
			'p.model',
			'p.quantity',
			'p.price',
и тд...
		);


и туда добавляем новую строку p.product_special-asc и получится:
$sort_data = array(
			'pd.name',
			'p.model',
			'p.quantity',
			'p.price',
			'rating',
			'p.sort_order',
			'p.date_added',
                       'p.product_special-asc'
		);


вот и все в принципе
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы