Скидка и процент

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #1 sergeevizh » 16.10.2016, 20:57

Доброй ночи. Подскажите пожалуйста, как в карточке товара вывести правильно показатели "Скидка и процент".

Кое-как сделал:

Код: Выделить всё

{* Скида и процент *}
{if $product->variant->compare_price > 0}
<span class="discount">
Скидка: {math equation="100-(({$product->variant->price|convert}*100)/{$product->variant->compare_price|convert})" format="%d%%"}
Экономия: {math equation="{$product->variant->compare_price|convert}-{$product->variant->price|convert}" format="%01.2f"}
<span class="currency">{$currency->sign|escape}</span></span><br/>{/if}


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

m1hasik M
Аватара
m1hasik M
Возраст: 32
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 8 лет 5 месяцев
Откуда: Днепр
Skype

Сообщение #2 m1hasik » 17.10.2016, 07:28

sergeevizh писал(а):Доброй ночи. Подскажите пожалуйста, как в карточке товара вывести правильно показатели "Скидка и процент".

Кое-как сделал:

Код: Выделить всё

{* Скида и процент *}
{if $product->variant->compare_price > 0}
<span class="discount">
Скидка: {math equation="100-(({$product->variant->price|convert}*100)/{$product->variant->compare_price|convert})" format="%d%%"}
Экономия: {math equation="{$product->variant->compare_price|convert}-{$product->variant->price|convert}" format="%01.2f"}
<span class="currency">{$currency->sign|escape}</span></span><br/>{/if}


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

Скидку в процентах можно сделать вот так например

Код: Выделить всё

 {$econom2 = 100-({$product->variant->price}*100 / {$product->variant->compare_price})}
                        {$econom2} %

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 8 месяцев

Сообщение #3 Vitaly » 17.10.2016, 10:14

viewtopic.php?f=10&t=182
Посмотрите как сделано решение по выводу % на метках в этой теме. В этом решении метка не выводится, если товар подорожал.

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #4 sergeevizh » 17.10.2016, 22:00

m1hasik писал(а):
sergeevizh писал(а):Доброй ночи. Подскажите пожалуйста, как в карточке товара вывести правильно показатели "Скидка и процент".

Кое-как сделал:

Код: Выделить всё

{* Скида и процент *}
{if $product->variant->compare_price > 0}
<span class="discount">
Скидка: {math equation="100-(({$product->variant->price|convert}*100)/{$product->variant->compare_price|convert})" format="%d%%"}
Экономия: {math equation="{$product->variant->compare_price|convert}-{$product->variant->price|convert}" format="%01.2f"}
<span class="currency">{$currency->sign|escape}</span></span><br/>{/if}


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

Скидку в процентах можно сделать вот так например

Код: Выделить всё

 {$econom2 = 100-({$product->variant->price}*100 / {$product->variant->compare_price})}
                        {$econom2} %

Я настроил вывод скидки и процента. Код который я указал, рабочий. Вопрос был такой:
1. Почему скидка и процент не вычисляются у товара, когда есть вариации.
2. Если товар подорожал (а такое есть), то как скрыть данные о скидке и проценте. Какую делать обертку.

korshunov
korshunov
Репутация: 148
Сообщения: 1859
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #5 korshunov » 18.10.2016, 09:27

sergeevizh писал(а):Я настроил вывод скидки и процента. Код который я указал, рабочий. Вопрос был такой:
1. Почему скидка и процент не вычисляются у товара, когда есть вариации.
2. Если товар подорожал (а такое есть), то как скрыть данные о скидке и проценте. Какую делать обертку.

1. Потому что в "рабочем" коде используются цены только от ПЕРВОГО варианта. Если хотите, чтоб работало по всем вариантам, то дорабатывать надо соотвественно...
2. "товар подорожал" - в этой CMS (и в большинстве других) такого понятия НЕТ. Поэтому сделать такое просто в шаблоне с помощью простой обертки не получится. Если Вам это непременно надо, то потребуется немало дорабатывать систему...

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 2 месяца
Откуда: Днепр

Сообщение #6 zyxer » 18.10.2016, 09:58

насколько я понял, товар подорожал, это когда старая цена меньше новой. в таком случае нужно сделать так:

Код: Выделить всё

<span class="discount" {if $product->variant->price > $product->variant->compare_price}style="display: none;"{/if}>
Скидка: <span class="fn_discount">{math equation="100-(({$product->variant->price|convert}*100)/{$product->variant->compare_price|convert})" format="%d%%"}</span>
Экономия: <span class="fn_saving">{math equation="{$product->variant->compare_price|convert}-{$product->variant->price|convert}" format="%01.2f"}</span>
<span class="currency">{$currency->sign|escape}</span>
</span>


select-у вариантов добавить (опшинам)

Код: Выделить всё

   {if $v->price < $v->compare_price}
   data-discount="{math equation="100-(({$v->price|convert}*100)/{$v->compare_price|convert})" format="%d%%"} "
   data-saving="{math equation="{$v->compare_price|convert}-{$v->price|convert}" format="%01.2f"}"
   {/if}


и в js где переключение вариантов ~50-я строка okay.js добавить

Код: Выделить всё

if(selected.data('discount') && selected.data('saving')){
    $('.fn_discount').html(selected.data('discount'));
    $('.fn_saving').html(selected.data('saving'));
    $('.discount').show();
} else {
    $('.discount').hide();
}

как-то так...
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #7 sergeevizh » 19.10.2016, 10:23

zyxer писал(а):насколько я понял, товар подорожал, это когда старая цена меньше новой. в таком случае нужно сделать так:

Код: Выделить всё

<span class="discount" {if $product->variant->price > $product->variant->compare_price}style="display: none;"{/if}>
Скидка: <span class="fn_discount">{math equation="100-(({$product->variant->price|convert}*100)/{$product->variant->compare_price|convert})" format="%d%%"}</span>
Экономия: <span class="fn_saving">{math equation="{$product->variant->compare_price|convert}-{$product->variant->price|convert}" format="%01.2f"}</span>
<span class="currency">{$currency->sign|escape}</span>
</span>


select-у вариантов добавить (опшинам)

Код: Выделить всё

   {if $v->price < $v->compare_price}
   data-discount="{math equation="100-(({$v->price|convert}*100)/{$v->compare_price|convert})" format="%d%%"} "
   data-saving="{math equation="{$v->compare_price|convert}-{$v->price|convert}" format="%01.2f"}"
   {/if}


и в js где переключение вариантов ~50-я строка okay.js добавить

Код: Выделить всё

if(selected.data('discount') && selected.data('saving')){
    $('.fn_discount').html(selected.data('discount'));
    $('.fn_saving').html(selected.data('saving'));
    $('.discount').show();
} else {
    $('.discount').hide();
}

как-то так...

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

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 2 месяца
Откуда: Днепр

Сообщение #8 zyxer » 19.10.2016, 10:43

А код:

Код: Выделить всё

{foreach $product->variants as $v}
    <option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku}"{/if}>{if $v->name}{$v->name}{else}{$product->name|escape}{/if}</option>
{/foreach}


вы изменили на:

Код: Выделить всё

{foreach $product->variants as $v}
    <option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku}"{/if}
    {*добавить*}
    {if $v->price < $v->compare_price}
        data-discount="{math equation="100-(({$v->price|convert}*100)/{$v->compare_price|convert})" format="%d%%"} "
        data-saving="{math equation="{$v->compare_price|convert}-{$v->price|convert}" format="%01.2f"}"
    {/if}
    {*/добавить*}
    >{if $v->name}{$v->name}{else}{$product->name|escape}{/if}</option>
{/foreach}
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #9 sergeevizh » 19.10.2016, 10:57

zyxer писал(а):if(selected.data('discount') && selected.data('saving')){
    $('.fn_discount').html(selected.data('discount'));
    $('.fn_saving').html(selected.data('saving'));
    $('.discount').show();
} else {
    $('.discount').hide();
}

Добавил как вы и сказали, так же добавил

Код: Выделить всё

if(selected.data('discount') && selected.data('saving')){
    $('.fn_discount').html(selected.data('discount'));
    $('.fn_saving').html(selected.data('saving'));
    $('.discount').show();
} else {
    $('.discount').hide();
}

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

Код: Выделить всё

/* Смена варианта в превью товара и в карточке */
$(document).on('change', '.fn-variant.okaycms', function() {
   var selected = $( this ).children( ':selected' ),
      parent = selected.closest( '.fn-product' ),
      price = parent.find( '.fn-price' ),
      cprice = parent.find( '.fn-old_price' ),
      sku = parent.find( '.fn-sku' ),
      stock = parseInt( selected.data( 'stock' ) ),
      amount = parent.find( 'input[name="amount"]' ),
      camoun = parseInt( amount.val() );
   price.html( selected.data( 'price' ) );
   amount.data('max', stock);
   /* Количество товаров */
   if ( stock < camoun ) {
      amount.val( stock );
   } else if ( okay.amount > camoun ) {
      amount.val( okay.amount );
   }
    else if(isNaN(camoun)){
        amount.val( okay.amount );
    }

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 2 месяца
Откуда: Днепр

Сообщение #10 zyxer » 19.10.2016, 11:00

как вариант между строками
amount.data('max', stock);
/* Количество товаров */
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #11 sergeevizh » 19.10.2016, 11:02

zyxer писал(а):как вариант между строками
amount.data('max', stock);
/* Количество товаров */

Сейчас так и стоит, если при вариации выбрать товар, то у всех товаров выводиться скидка и экономия. Я отправил вам сайт в личные сообщения, посмотрите.

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 2 месяца
Откуда: Днепр

Сообщение #12 zyxer » 19.10.2016, 11:13

да, была ошибка в js :) Вот так работает

Код: Выделить всё

if(selected.data('discount') && selected.data('saving')){
    selected.closest('.fn-product').find('.fn_discount').html(selected.data('discount'));
    selected.closest('.fn-product').find('.fn_saving').html(selected.data('saving'));
    selected.closest('.fn-product').find('.discount').show();
} else {
    selected.closest('.fn-product').find('.discount').hide();
}
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

sergeevizh
sergeevizh
Репутация: 17
Сообщения: 151
Зарегистрирован: 16.10.2016
С нами: 7 лет 6 месяцев

Сообщение #13 sergeevizh » 19.10.2016, 11:19

zyxer писал(а):if(selected.data('discount') && selected.data('saving')){
    selected.closest('.fn-product').find('.fn_discount').html(selected.data('discount'));
    selected.closest('.fn-product').find('.fn_saving').html(selected.data('saving'));
    selected.closest('.fn-product').find('.discount').show();
} else {
    selected.closest('.fn-product').find('.discount').hide();
}

Все отлично работает, только есть конфликт в списке выбора, он выводиться теперь вверх. Моя ошибка. Все ок. Спасибо!


Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 54 гостя