Оценок: 1

Отображение скидки в процентах

Небольшая модификация, позволяющая отобразить размер скидки в процентах. Пример для модулей "последние товары" и "специальные предложения", аналогично делается и для других страниц.

Для примера использую модуль вывода товаров с акциями. Необходимо отредактировать два файла:

"/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 %}
Оценок: 1

Комментарии (66)

  1. Могу ли я применить то же самое к разделу связанных продуктов на странице продукта?

    Related products

    arda 25 февраля 2022, 15:06 0
    • Да, там почти одинаково для модулей, страниц: категория, акции, производитель, поиск, товар (в том числе и похожие)…

      Владимир 25 февраля 2022, 15:37 0
    • В чем может быть проблема?
      скидка у всех товаров отображается одинаковая
      вывожу в модуле special
      контроллер

      Показать код
      
      if ((float)$result['special']) {
      					$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
      
      						$data['discount_amount'] = $this->currency->format($this->tax->calculate(($result['price'] - $result['special']), $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);	
      
      					$data['skidka'] = round(100-($result['special']/($result['price']/100)));
      
      
      
      				} else {
      					$special = false;
      					$data['skidka'] = (0); 
      					$data['discount_amount'] = ('0%');
      				}
      
      шаблон
      Показать код
      
      <p><?php echo 'Вы экономите - '.$discount_amount; ?></p>
      <p>- <?php echo $skidka; ?>% Скидка</p>
      

      Андрей 29 февраля 2020, 16:09 0
      • Так ведь в модуле нужно через data['products'][] выводить. посмотрите здесь в самом начале — «Изменения для модулей и категорий»
        т.е. не $data['skidka'] и $data['discount_amount'] (это вариант для текущего товара), а $skidka и $discount_amount, а в data['products'][]:
        'skidka' => $skidka,
        'discount_amount' => $discount_amount,

        в шаблоне будет что то вроде $product['skidka']

        Владимир 01 марта 2020, 00:11 0
      • спасибо огромное все получилось
        я сделал для общей категории только как теперь избавиться от % скидка если нету скидки на товаре. то надпись все равно есть

        Артем 24 февраля 2020, 01:54 0
        • все решил ))))

          Артем 24 февраля 2020, 02:00 0
        • Ocstore 2.3
          1. в tpl эта конструкция не работает

          Показать код
          <?php echo $product['skidka']; ?>
          а работает вот эта конструкция
          Показать код
          <?php echo $skidka; ?>
          2. делаю все по мануалу
          все работает
          НО
          если скидка не указана, лезут ошибки на tpl
          а именно на строку с
          Показать код
          <?php echo $skidka; ?>
          как победить?

          Андрей 11 января 2020, 20:54 0
          • Все. разобрался
            Спасибо

            Андрей 11 января 2020, 20:58 0
          • у меня выводится в таком виде — 3.804347826087%
            как сократить до целых чисел?

            Андрей 09 января 2020, 22:09 0
            • Добрый день!
              Округлить можно через round();
              Внес правки.

              Владимир 10 января 2020, 09:52 0
            • На Опенкарт 3 есть решение?

              222 14 августа 2019, 18:17 0
              • Добавил. Там разница в шаблонах только из за использования twig

                Владимир 15 августа 2019, 00:41 0
              • Статья огонь, но на OCStore 2.1.0.2.1 не работает (

                Владимир 20 апреля 2017, 02:02 0
                • подскажите, с чем может быть связано, делаю все по описанию, но результата не вижу, ес-но кэш чищу

                  Владимир 20 апреля 2017, 14:53 0
                  • Оказывается менять special.tpl надо не только в module, но и в product, тогда выводит

                    Владимир 07 мая 2017, 03:21 0
                    • (extension)/module/special — модуль
                      product/special — страница с товарами со скидкой
                      В общем то разные вещи

                      Владимир 07 мая 2017, 17:48 0
                      • Код отличается, однако по другому не работает, с чем связано понятия не имею

                        Владимир 07 мая 2017, 17:51 0
                • В категориях все вывелось без проблем, а в товаре скидку не считает, пишет 0%. Ошибок не выдает
                  Подскажите пожалуйста что не так? Вот код

                  Svetka0403 06 апреля 2017, 03:46 0
                  Надежный хостинг VPS серверов
                  • Свои ISO образы
                  • VDS с оплатой раз и навсегда
                  • Аренда VDS на любой срок, с оплатой по дням
                  • Большое разнообразие конфигураций
                  • Дата-центры в ЕС и России
                  + скидка 10%