Небольшая модификация, позволяющая отобразить размер скидки в процентах. Пример для модулей "последние товары" и "специальные предложения", аналогично делается и для других страниц.
Для примера использую модуль вывода товаров с акциями. Необходимо отредактировать два файла:
"/catalog/controller/module/special.php" и "/catalog/view/theme/default/template/module/special.tpl"
Для подсчета процентов будет использована основная стоимость товара (без скидки) и стоимость товара по акции. Стоимость товара в шаблон выводится с символами валюты, а для подсчета нужна стоимость в виде чисел, соответственно редактируем контроллер.
Изменения для модулей и категорий
1. Изменения в контроллере. (/catalog/controller/module/special.php)
Находим:
if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
} else {
$special = false;
}
И меняем на:
if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax'))); $skidka = round(100-($result['special']/($result['price']/100))) } else { $skidka = false; $special = false; }
Затем:
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'price' => $price,
'special' => $special,
'rating' => $rating,
'reviews' => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
);
Меняем на:
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'price' => $price,
'special' => $special,
'skidka' => $skidka,
'rating' => $rating,
'reviews' => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
);
Opencart 2
Для Opencart 2 код будет примерно такой же, поэтому переписывать не буду, найти не сложно. Еще один момент - в некоторых модулях вместо "$result" может использоваться "$product_info", соответственно тогда вычислять нужно так:
$skidka = round(100-($product_info['special']/($product_info['price']/100)));
2. Изменения в шаблоне (/catalog/view/theme/default/template/module/special.tpl):
После:
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
Добавляем:
<div class="procent"><?php echo $product['skidka']; ?> % <span>Скидка</span></div>
3. Немного изменений в css:
.procent { position: absolute; top: 5px; left: 5px; background: rgba(255, 0, 0, 0.57); border-radius: 50px; width: 100px; height: 75px; padding-top: 25px; text-align: center; font-size: 30px; color: #fff; text-shadow: 0px 0px 5px #520202; }
.procent span {display: block; font-size: 15px;}
.box-product > div:hover .procent {box-shadow: 0px 0px 5px #FDDF00;}
Учитывая, что для ".procent" было задано абсолютное позиционирование, добавим для блока с товаром "position:relative"
.box-product > div{ position: relative;}
Результат:
Изменения для карточки товара
Что касается страницы товара, здесь будут небольшие отличия. Так же немного изменю код
1. Контроллер - /catalog/controller/product/product.php
Находим:
if ((float)$product_info['special']) {
$this->data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')));
} else {
$this->data['special'] = false;
}
И меняем на:
if ((float)$product_info['special']) {
$this->data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')));
$this->data['skidka'] = round(100-($product_info['special']/($product_info['price']/100)));
} else {
$this->data['special'] = false;
$this->data['skidka'] = false;
}
Для Opencart 2:
$data['skidka'] = round(100-($product_info['special']/($product_info['price']/100)));
2. Теперь шаблон товара (/catalog/view/theme/default/template/product/product.tpl):
Находим:
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?>
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
<?php } ?>
И меняем на:
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?>
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
<div class="procent">
<?php echo $product['skidka']; ?>% <span>Скидка</span>
</div>
<?php } ?>
Не забываем добавить position:relative для блока с товаром. Для похожих товаров на этой странице изменения будут аналогичны категориям и модулям.
Opencart 3
Изменения коснутся только шаблонов, нужно переписать под новый шаблонизатор. Пример для контроллера и шаблона товара (product.php, product.twig), только на этот раз на примере основной цены.
Для начала добавим скидку в контроллер
if ((float)$product_info['special']) {
$data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
/*++++*/$data['skidka'] = round(100-($product_info['special']/($product_info['price']/100)));/*++++*/
} else {
$data['special'] = false;
/*++++*/$data['skidka'] = false;/*++++*/
}
Изменения отмечены /*++++*/
Теперь карточка товара, в нужном месте:
{% if skidka %}
<div class="procent">{{ skidka }}</div>
{% endif %}
Могу ли я применить то же самое к разделу связанных продуктов на странице продукта?
Related products
Да, там почти одинаково для модулей, страниц: категория, акции, производитель, поиск, товар (в том числе и похожие)…
В чем может быть проблема?
скидка у всех товаров отображается одинаковая
вывожу в модуле special
контроллер
Так ведь в модуле нужно через data['products'][] выводить. посмотрите здесь в самом начале — «Изменения для модулей и категорий»
т.е. не $data['skidka'] и $data['discount_amount'] (это вариант для текущего товара), а $skidka и $discount_amount, а в data['products'][]:
'skidka' => $skidka,
'discount_amount' => $discount_amount,
в шаблоне будет что то вроде $product['skidka']
спасибо огромное все получилось
я сделал для общей категории только как теперь избавиться от % скидка если нету скидки на товаре. то надпись все равно есть
все решил ))))
Ocstore 2.3
1. в tpl эта конструкция не работает
все работает
НО
если скидка не указана, лезут ошибки на tpl
а именно на строку с
Все. разобрался
Спасибо
у меня выводится в таком виде — 3.804347826087%
как сократить до целых чисел?
Добрый день!
Округлить можно через round();
Внес правки.
На Опенкарт 3 есть решение?
Добавил. Там разница в шаблонах только из за использования twig
Статья огонь, но на OCStore 2.1.0.2.1 не работает (
подскажите, с чем может быть связано, делаю все по описанию, но результата не вижу, ес-но кэш чищу
Оказывается менять special.tpl надо не только в module, но и в product, тогда выводит
(extension)/module/special — модуль
product/special — страница с товарами со скидкой
В общем то разные вещи
Код отличается, однако по другому не работает, с чем связано понятия не имею
В категориях все вывелось без проблем, а в товаре скидку не считает, пишет 0%. Ошибок не выдает
Подскажите пожалуйста что не так? Вот код