1 Отредактировано Николай (18.07.2015 17:43:14)

Тема: Вывод зачеркнутой цены

Задача: На сайт добавляется товар с несколькими комплектациями. У одной из комплектации должна быть скидка, то есть старая зачеркнутая цена и новая. Если выставить зачеркнутую цену первой комплектации, к примеру 1000 руб - старая зачеркнутая цена,  500 руб новая цена, а у второй комлектации одна цена 2000 руб, то для первой комплектации выведется 1000 руб( зачеркнуто) - 500 не зачернуто, а для второй комплектации выведется две цены 2000 руб зачеркнуто и 2000 руб не зачеркнуто.

http://cs629508.vk.me/v629508708/7304/rcR9MX-vIJ0.jpg

Если же зачеркнутую цену выставить второй комплектации, то зачеркнутая цена не выведется вообще.

Вопрос: Как сделать, чтобы вывод работал нормально, то если есть зачеркнутая цена во второй комплектации, то он ее выводил и если зачеркнутая цена в первой комплектации, то он не зачеркивал цены во второй.

И еще, как сделать чтобы в блоке Акция выводилась всегда цена со скидкой, а не цена первой комплектации.

Комплектации и цены выводятся этим кодом. И я так понимаю цикл составлен так, что он одинаков для всех комплектаций.

                             {foreach from=$product.offers.items key=key item=offer name=offers}
                                <option value="{$key}" 
                                    {if $smarty.foreach.offers.first}
                                        checked
                                    {/if} 
                                    {if $check_quantity}
                                        data-num="{$offer.num}"
                                    {/if} 
                                    {if $catalog_config.use_offer_unit}
                                        data-unit="{$offer->getUnit()->stitle}"
                                    {/if} 
                                    data-change-cost='{ 
                                        ".offerBarcode": "{$offer.barcode|default:$product.barcode}",
                                        ".myCost": "{$product->getCost(null, $key)}",
                                        ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
                                    }' 
                                    data-images='{$offer->getPhotosJson()}' 
                                    data-sticks='{$offer->getStickJson()}'
                                >
                                        {$offer.title}
                                </option>
                            {/foreach}

По идее можно было бы задать условие что если зачеркнутая цена = розничной, то не выводить зачеркнутую цену, но к сожалению знания движка и php мне не позволяют самому сообразить как это реализовать.

Повысить оценку Понизить оценку

2 Отредактировано Александр (20.07.2015 12:45:18)

Re: Вывод зачеркнутой цены

Дело вот в чём. Предполагается, что если вы предоставляете скидку на товар, то она распространяется на все его комплектации. Поэтому мы возвращаем зачёркнутую цену соответственно правилу в комплектации.
У Вас стоит в комплектации для зачёркнутой цена равна "+" 0(пустое поле - тоже ноль) рублей от зачёркнутой цены базовой комплектации.
Соответственно, если мы хотим, чтобы в зачёркнутой цене не было значения (0), то надо поменять знак с "+" на "=", тогда в зачёркнутую цену пойдёт 0, т.к. поле со значением в комплектации пустое, а уже в шаблоне можно проверить на равность нулю.
Строки:

data-change-cost='{ 
                                        ".offerBarcode": "{$offer.barcode|default:$product.barcode}",
                                        ".myCost": "{$product->getCost(null, $key)}",
                                        ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
                                    }' 

Эти строки подхватывает javascript обработчик, который перебором из данного объекта выставляет значение элементам по классу (вы можете детально посмотреть это в файле jquery.changeoffer.js в свой теме оформления). Мы знаем, что в Зачёркнутую цену пойдёт 0, поэтому на него и проверим.

{$lastprice=$product->getCost('Зачеркнутая цена', $key)}
data-change-cost='{ 
                                        ".offerBarcode": "{$offer.barcode|default:$product.barcode}",
                                        ".myCost": "{$product->getCost(null, $key)}",
                                        {if $lastprice}
                                            ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
                                        {/if}
                                    }' 

И еще, как сделать чтобы в блоке Акция выводилась всегда цена со скидкой, а не цена первой комплектации.

Насколько я понял Вам надо чтобы вы у одной из комплектации товара Вы выставили цену и после этого в акциях у Вас должна отображаться, только та цена у которой есть зачёркнутая.
Если так, Вам надо тогда в шаблончике перебрать комплектации. Сделать это можно как и в случае с карточкой товара, где идёт перебор.

{if $product->isOffersUse()} {*Проверяем есть ли комплектации и одновременно загружаем их*}
    {foreach from=$product.offers.items key=key item=offer name=offers} {* Перебираем их *}
          {$lastprice=$product->getCost('Зачеркнутая цена', $key)} {*Получаем зачёркнутую цену для нужной комплектации*}
          {if $lastprice} {*Если зачёркнутая цена существует и она больше нуля*}
              {$product->getCost(null, $key)} {*Выводим базовую цену нужной комплектации*}
          {/if}   
    {/foreach}  
{/if}

3 Отредактировано Александр (20.07.2015 14:09:27)

Re: Вывод зачеркнутой цены

Прошу прощения, немного не правильно подсказал.
Вообщем, зачёркнутую цену в шаблоне нужно оставить без условия.

data-change-cost='{ 
                                        ".offerBarcode": "{$offer.barcode|default:$product.barcode}",
                                        ".myCost": "{$product->getCost(null, $key)}",
                                        ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
                                    }' 

Как и было раньше. Тогда у нас в зачёркнутую цену будет идти 0 (ноль).
А вот в самой js (jquery.changeoffer.js) сделать проверку на "0" (ноль).
Там где :

//Сменим артикул и цену
$.each(list, function(selector, cost) { 
    $(selector, context).text(cost);
});

Сменим на:
//Сменим артикул и цену

$.each(list, function(selector, cost) { 
    if (cost){ //Если цена больше нуля
       $(selector, context).text(cost);
   }else{
       $(selector, context).text('');
   }
});

Re: Вывод зачеркнутой цены

Отпишитесь о результате в конце пожалуйста

Re: Вывод зачеркнутой цены

Спасибо за помощь. С карточкой товара вроде разобрался.

Как Вы посоветовали поменял в jquery.changeoffer.js

$.each(list, function(selector, cost) { 
    $(selector, context).text(cost);
});

на

$.each(list, function(selector, cost) { 
    if (cost){ //Если цена больше нуля
       $(selector, context).text(cost);
   }else{
       $(selector, context).text('');
   }
});

Но этого оказалось не достаточно. Начал копаться и заметил, что в в js в cost подхватывает не числовое значение, а строку. Следовательно условие всегда будет выполняться.

Добавил в цикл генерации формы дополнительную проверку и условие, чтобы насильно присобачить none

                            data-change-cost='{ 
                                    ".offerBarcode": "{$offer.barcode|default:$product.barcode}", 
                                    ".myCost": "{$product->getCost(null, $key)}",
                                    {if $product->getCost('Зачеркнутая цена', $key)>0}
                                        ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
                                    {else}
                                        ".lastPrice": 0
                                    {/if}
                                }' 

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

Засунул условие внутрь абзаца, начало работать как надо

                    <p class="lastPrice">
                         {if $last_price>0}
                              {$last_price}
                         {/if}
                    </p>

Возможно можно было сделать как-то элегантнее, но вроде работает)

До вывода товаров в блоке еще не добрался. Когда доберусь отпишу о успехах.

Повысить оценку Понизить оценку

Re: Вывод зачеркнутой цены

После всех этих изменений стали выводится зачеркнутые цены у других товаров, так как там стояла галка "Для всех видов цен".

Пришлось сделать так

data-change-cost='{ 
    ".offerBarcode": "{$offer.barcode|default:$product.barcode}", 
    ".myCost": "{$product->getCost(null, $key)}",
    {if $product->getCost('Зачеркнутая цена', $key)>0 
    && $product->getCost('Зачеркнутая цена', $key)!=$product->getCost(null, $key)}
        ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"
    {else}
        ".lastPrice": 0
    {/if}
}' 

Повысить оценку Понизить оценку

7 Отредактировано Александр (22.07.2015 12:58:01)

Re: Вывод зачеркнутой цены

Отлично.
Для проверки цены, нужно в условиях проверок в методе getCost указывать третий аргумент в false, т.к. он отвечает за форматирование цены в строку с пробелом с тысячных(10 000) в виде строки. Если третий аргумент в false, то будет 10000 именно как число. А то будет конфуз.
Например.

{$product->getCost('Зачеркнутая цена', $key, false)}

Подробнее описание можно почитать в классе комплектации "Offer" в файле /modules/catalog/model/orm/offer.inc.php и там найти функцию getCost.

Что касается js, то можно так проверить.

$.each(list, function(selector, cost) { //Перебор объекта в data-change-cost 
   if (selector=='.lastPrice'){
          if (cost=="0"){ //Если цена равна 0
               $(selector, context).text('');
          }else{
               $(selector, context).text(cost);
          }
   }else{
          $(selector, context).text(cost);
   } 
   
});

8 Отредактировано Андрей (30.11.2015 17:02:36)

Re: Вывод зачеркнутой цены

Здравствуйте, скажите можно ли вывести разницу между ценой и зачёркнутой ценой, например вы экономите nn руб. или n%?

Повысить оценку Понизить оценку

Re: Вывод зачеркнутой цены

Можно. Надо лишь посчитать в шаблоне её.
Вот например так:

{$cost=$product->getCost(null, null, false)} {* Получим цену без фоматирования *}
{$oldcost=$product->getCost('Зачеркнутая цена', null, false)} {* Получим цену без фоматирования *}
{$delta=$oldcost-$cost} {* Посчитаем разницу *}
{$delta} {* Выведем разницу *}
<br/>
{$delta|format_price} {* Выведем разницу форматированную используя наш плагин format_price *}

10

Re: Вывод зачеркнутой цены

Разницу между ценами в рублях таким способом вывести получилось:

http://luchski.ru/product/parafin-quot- … 0gr-58388/

а если нужно указать разницу в процентах как это сделать?

11

Re: Вывод зачеркнутой цены

{$skidka=round((1-$cost/$oldcost)*100)}

{$skidka}% - выведет процент выгоды

Повысить оценку Понизить оценку

12

Re: Вывод зачеркнутой цены

А как округлить цену и результат? Вот, например товар http://luchski.ru/product/bryuki-razmin … -ws-10298/

{$delta=($oldcost-$cost)} - вот такой формулой я могу посчитать разницу
{$delta=round($oldcost-$cost)} - вот так я могу ее округлить, но если я делаю так, то округляется разница, а результат нет.

Если рассматривать товар, предложенный выше как сделать, чтобы итоговая сумма была не 2379,30 а 2380 ?

Re: Вывод зачеркнутой цены

Sergey T. пишет:

А как округлить цену и результат? Вот, например товар http://luchski.ru/product/bryuki-razmin … -ws-10298/

{$delta=($oldcost-$cost)} - вот такой формулой я могу посчитать разницу
{$delta=round($oldcost-$cost)} - вот так я могу ее округлить, но если я делаю так, то округляется разница, а результат нет.

Если рассматривать товар, предложенный выше как сделать, чтобы итоговая сумма была не 2379,30 а 2380 ?

Дайте полный код, который делаете с выводом цены.

14

Re: Вывод зачеркнутой цены

Вот так выводится цена сейчас

 {* Блок с ценой *}
        <div class="fcost">
            {assign var=last_price value=$product->getCost('Старая цена')}
            {if $last_price>0}

                <div class="lastPrice">РРЦ: {$last_price}руб.</div>
                
                <!--этот блок выводит разницу между старой ценой и скидочной-->
                {$cost=$product->getCost(null, null, false)} {* Получим цену без фоматирования *}
                {$oldcost=$product->getCost('Старая цена', null, false)} {* Получим цену без фоматирования *}
                {$delta=($oldcost-$cost)} {* Посчитаем разницу *}
                <div class="skidka">скидка {$delta|format_price} руб.</div> {* Выведем разницу форматированную используя наш плагин format_price *}            

            {/if}

            <span class="myCost price">{$product->getCost()}</span> {$product->getCurrency()}

            
        </div>

Re: Вывод зачеркнутой цены

Так у Вас же здесь нет round. Вы что округляете то?

16

Re: Вывод зачеркнутой цены

Вот товар http://luchski.ru/product/bryuki-razmin … -ws-10298/

РРЦ: 3399
Скидка: 1019,70
Цена: 2379,30

Если я делаю так {$delta=round($oldcost-$cost)}, то получается следующее

РРЦ: 3399
Скидка: 1020
Цена: 2379,30

т.е. цена 2379,30 остается. Как заставить ее округлиться тоже?

Re: Вывод зачеркнутой цены

Так и делается. Всё абсолютно верно. Может у Вас кеш?

18

Re: Вывод зачеркнутой цены

Бррррр. smile
Мы по ходу немного не понимаем друг друга.

Если я делаю так {$delta=round($oldcost-$cost)} = 1020, то получается следующее
РРЦ: 3399
Скидка: 1020
Цена: 2379,30

но 3399 - 1020 = 2379 без тридцати копеек, а они все равно выводятся. Как округлить 2379,30 до 2379 ?

Re: Вывод зачеркнутой цены

Да действительно не понимаем.
Ну вот вы округлили разницу между ценами, она у Вас в delta.
Что теперь вам мешает применить round к нужной сумме?
$cost=round($cost)

?

Вы же функцию к переменной можете вызывать сколько угодно раз.