
Небольшая модификация, позволяющая отобразить размер скидки в процентах. Пример для модулей "последние товары" и "специальные предложения", аналогично делается и для других страниц.
Для примера использую модуль вывода товаров с акциями. Необходимо отредактировать два файла:
"/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 %}
В чем может быть проблема?
шаблонскидка у всех товаров отображается одинаковая
вывожу в модуле special
контроллер
Так ведь в модуле нужно через data['products'][] выводить. посмотрите здесь в самом начале — «Изменения для модулей и категорий»
т.е. не $data['skidka'] и $data['discount_amount'] (это вариант для текущего товара), а $skidka и $discount_amount, а в data['products'][]:
'skidka' => $skidka,
'discount_amount' => $discount_amount,
в шаблоне будет что то вроде $product['skidka']
спасибо огромное все получилось
я сделал для общей категории только как теперь избавиться от % скидка если нету скидки на товаре. то надпись все равно есть
все решил ))))
Ocstore 2.3
а работает вот эта конструкция 2. делаю все по мануалу1. в tpl эта конструкция не работает
все работает
НО
если скидка не указана, лезут ошибки на tpl
а именно на строку с как победить?
Все. разобрался
Спасибо
у меня выводится в таком виде — 3.804347826087%
как сократить до целых чисел?
Добрый день!
Округлить можно через round();
Внес правки.
На Опенкарт 3 есть решение?
Добавил. Там разница в шаблонах только из за использования twig
Статья огонь, но на OCStore 2.1.0.2.1 не работает (
подскажите, с чем может быть связано, делаю все по описанию, но результата не вижу, ес-но кэш чищу
Оказывается менять special.tpl надо не только в module, но и в product, тогда выводит
(extension)/module/special — модуль
product/special — страница с товарами со скидкой
В общем то разные вещи
Код отличается, однако по другому не работает, с чем связано понятия не имею
В категориях все вывелось без проблем, а в товаре скидку не считает, пишет 0%. Ошибок не выдает
Подскажите пожалуйста что не так? Вот код
Не хватает знака; в 1 пункте после $skidka = round(100-($result['special']/($result['price']/100)))
в категории нормалньо выводит, на продукте ошибка
Notice: Undefined variable: skidka in Z:\home\rue21\www\catalog\controller\product\product.php on line 440Notice:
$data['products'][] = array(
…
'skidka' => $skidka,
…
Это похоже для похожих товаров в карточке… Немного выше видимо нет:
нет в контроллере только один массив
$this->data['products'][] = array(
и он ругается на 'skidka' => $skidka,
он говорит, что "$skidka" найти не может.
И замените на:Чуть выше найдите:
теперь выдает ошибки
Notice: Undefined index: special in Z:\home\rue21\www\catalog\controller\product\product.php on line 313
Notice: Undefined variable: special in Z:\home\rue21\www\catalog\view\theme\default\template\product\product.tpl on line 135
Сбросьте контроллер на vl@onenv.ru, поправлю
Помогите решить, у меня опенкарт 2 и немогу вывести на странице с акциями скидки((
А что именно не получается, какие ошибки? Там нет ничего особенного…
semechki.all-landing.com/specials/ — вот посмотрите там какая-то ошибка выскакивает
Notice: Undefined index: skidka in
Версия ocStore 2.1.0.2.1
Ошибка не полностью, но в контроллере видимо не находит… проверьте есть ли в $this->data['products'][] = array(
есть
1) а также хотел узнать я прописал <?php echo $product['skidka']; ?> % Скидка по пути /catalog/view/theme/МОЯТЕМА/template/product/special.tpl — и оно с ошибкой но вывелось на товаре,
2) Просто когда я прописал <?php echo $product['skidka']; ?> % Скидка в /catalog/view/theme/default/template/module/special.tpl — У меня ничего не отобразилось. Вот сейчас сделал так как Вы писали изначально и процентов вообще нету
подскажите как это сделать для featured products, там товары выводятся через админку в ручную, и данный способ не работает, т.к. видима нет цикла товаров
Цикл тем не менее есть, да и не причем здесь это… дело скорее всего дело в переменных, где то $product_info, где то $result. Переписал, теперь думаю понятнее и правильнее стало.
Скидки конечно есть, могу файлики прислать — посмотрите что не так. сайт biomaniya.net
Что-то у меня не получается — все делаю как написано но ничего не отображается.
В смысле не отображаются скидки, или пустая страница? А ошибки есть какие? В общем то все должно быть, если товару назначена скидка, проверено… на странице товара со скидкой, на странице категории — нигде нет? А скидка у товара есть?
Спасибо за статью, очень помогла. Правда немного не понял зачем все так усложнять и копаться в контроллере)
Использовал только этот кусок, просто подставил переменные и все отлично работает
$product['price2']; и $product['special2']; изначально ведь не существует… нужно что бы получить «чистую» цифру без конвертации
Логично что не существует, мне не понятно было зачем их определять) У меня задача немного другая, сумма скидки должна считаться исходя именно из 2 цифр цены, неважно в какой валюте, хотя и валюта то всего одна)
для этого я бы иначе сделал. На примере товара, в категории все по аналогии. В контроллере (там где special) добавить:
потом в tpl в нужном месте — echo $skidkaбудет выводить сумму со всеми знаками и с учетом валюты выбранной…
Это вроде как получиться в деньгах, а мне нужно в процентах)
Да неважно на самом деле, и так отлично работает, меня интересовал по сути только алгоритм расчета, так как тот что я придумал сразу (a/b*100) в некоторых случаях выдавал не то что нужно…
Неверно понял про сумму скидки) Хорошо что пригодилось решение, правда его можно упростить сделав в категориях/модулях по аналогии с товаром — меньше кода
В любом случае спасибо)
Вы бы версию движка указывали.
На последней двойке не работает.
Это для версии 1.5. Что касается двойки… там кое где есть изменения, но если делать по аналогии все должно получиться. Для модулей и страницы категории осталось все примерно как и было, должно работать…
Сделал для товаров, страницы вообще перестали открываться ((( завтра еще буду пробовать смотреть.
белый экран - ошибка php. проверю чуть позже на тестовом
Классный вариант, но на 1.5.4 не работает :sad: все сделал, по инструкции. При перезагрузке страницы отображается в фоне кружок со скидкой 10% и потом перекрывается шапкой, а на товаре нет ничего((
пропишите для блока с товаром position:relative; т.е. нужно задать точку отсчета, иначе все стикеры собьются в кучу.
Спасибо за оперативность! а есть значение в какое место css вставлять изменения?
В самом файле не важно, но лучше добавить к уже существующим свойствам для блока.. потом найти легче
так правильно?
/* box products - procent */
.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 products */
.box-product {
width: 100%;
overflow: hidden;
}
.box-product > div {
width: 155px;
display: inline-block;
vertical-align: top;
margin-right: 9px;
margin-bottom: 20px;
text-align: center;
hover .procent {box-shadow: 0px 0px 5px #FDDF00;}
position: relative;
}
Да, если не отображает как надо, покажите сайт - подскажу
Владимир, ekowebshop.com/airwick_lime_basilik_180g
только я там уже в stylesheet поменял немного. Но все равно не отображает. Считает все верно, но не показывает.
так.. процент только в левом блоке нужен?
тогда добавьте для .box-lsb > div (строка 760) position:relative;
Сам блок слишком узкий.. смотрите сами, я бы сделал так:
/*добавить в css*/
#column-left .box .box-content {padding:10px 5px;}
#column-left .box-lsb > div {width: 158px; margin: 0px 0px 10px 0px;
border: 1px solid #F7A4A4; height: 163px; position:relative; overflow:hidden;}
далее сама скидка.. в таком виде не пойдет, т.к. размер блока очень мал.. попробуйте такой вариант:
.procent {
position: absolute; z-index: 100; background-color: #ff0505;
color: #fff;
-webkit-transform: rotate(315deg);
-moz-transform: rotate(315deg);
-ms-transform: rotate(315deg);
-o-transform: rotate(315deg);
transform: rotate(315deg);
font-size: 18px; top: -8px; width: 85px; height: 23px; left: -31px; text-align: center;
padding-top: 20px;
}
далее в самом коде скидки замените:
echo round ($result); ?> % Скидка
на
echo '-'.round ($result); ?>%
Должно получиться так:
[img]https://webrazrab.ru/skidka.jpg[/img]
СПАСИБО! в карточке товара он тоже нужен! по идее там ширина блока позволяет, но скидка все равно не отображается
там нужно править контроллер и шаблон товара.. пока там не выводится
В контроллер и шаблон все изменения внес сразу
там есть отличия.. сейчас напишу для товара
Дописал. Не проверял, пробуйте.. если не сработает - пишите
А куда Вы дописали? :oops: в статье тот- же текст
разве? "Изменения для страницы товара
......."
:lol: не обновил страницу. Спасибо Вам большое!
Получилось ли?
Отличная статья!
у меня выводится в таком виде — 3.804347826087%
как сократить до целых чисел?