Здесь уже обсуждался вопрос о том, что система скидок в OpenCart не слишком гибкая. Например, на вкладке "Специальное" можно задать акционную цену на товар, но, к сожалению, только в абсолютном, т.е. денежном выражении. Сами понимаете, что это крайне не удобно: меняется цена на товар - вам нужно пересчитывать цену по акции, акции бывают разные и с разными скидками, и каждый раз нужно все считать, считать, считать... А как было бы здорово, если можно было бы указывать величину скидки в таких привычных и понятных для всех процентах! Ну что ж, попробуем реализовать нашу идею, минимальными затратами, без сложных переделок.
Например, можно сделать такое условие: если цена по акции больше 1, то значит она указана традиционным способом, т.е. в денежном выражении, если же цена по акции меньше 1, то она указана в процентном выражении. Например, значение цены 0.95 соответствует 5% скидке, а 0.85 скидке в 15%. Теперь осталось модифицировать код системы для правильного расчета цены по акции.
Начнем с основной страницы отображения товара, файла catalog\controller\product\product.php, необходимо модифицировать код следующим образом:
$this->data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
$special = $this->model_catalog_product->getProductSpecial($this->request->get['product_id']);
if ($special < 1) $special = (int)($product_info['price'] * $special); // наша строка для расчета скидки в процентах
if ($special) {
это для основного продукта страницы. И еще в одном месте:
$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
$special = $this->model_catalog_product->getProductSpecial($result['product_id']);
if ($special < 1) $special = (int)($result['price'] * $special); // наша строка для расчета скидки в процентах
if ($special) {
это для рекомендуемых продуктов.
Аналогично второму фрагменту нужно внести изменения в следующие файлы:
catalog\controller\product\category.php
catalog\controller\product\manufacturer.php
catalog\controller\product\search.php
catalog\controller\module\bestseller.php
catalog\controller\module\featured.php
catalog\controller\module\latest.php
catalog\controller\module\special.php
После внесения этих изменений у вас на сайте везде должен заработать новый способ расчета цены спец-предложения, проверьте.
А вот корзина все равно считается не правильно! Пришлось повозиться. Изменения нужно внести в файл: system\library\cart.php
$product_special_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");
if ($product_special_query->num_rows) {
if ($product_special_query->row['price'] < 1) $price = (int)($product_query->row['price'] * $product_special_query->row['price']); // это две новых строки
else $price = $product_special_query->row['price']; // это две новых строки
} else {
$price = $product_query->row['price'];
}
После этого изменения ваша корзина будет считаться так, как нам нужно.
Вот и все, прошу экспериментировать и комментировать.
ПС: изменения производились на ocStore 0.1.1, но не думаю, что на других версиях что-то по-другому.
ППС: маленький бонус от переделки: теперь, наконец-то, можно легко и просто устанавливать постоянные скидки для постоянных клиентов в зависимости от статуса (группы) клиента. И не надо каждый раз пересчитывать кучу цен...