Выборочная бесплатная доставка на 2.1.5

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

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 8
Сообщения: 100
Зарегистрирован: 07.10.2016
С нами: 2 года 7 месяцев
Сайт

Сообщение #1 trainracing » 08.04.2018, 18:55

Данное решение позволяет передавать на яндекс маркет стоимость доставки. Платная или бесплатная.
Так же показываем пользователю, сколько обойдется доставка.

Добавим запрос

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

ALTER TABLE `ok_products` ADD `free_delivery` TINYINT( 0 ) NOT NULL AFTER `featured`;
UPDATE `ok_products` SET `free_delivery` = 0;


Дальше идем в /backend/core/ProductAdmin.php ищем строку 21

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

 $product->visible = $this->request->post('visible', 'boolean');


и ниже вставим

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

$product->free_delivery = $this->request->post('free_delivery', 'boolean');


Теперь добавим галочку в шаблоне backend/design/html/product.tpl после строк (129) ищем

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

<div class="activity_of_switch_item"> {* row block *}
<div class="okay_switch clearfix">
<label class="switch_label">{$btr->general_bestseller|escape}</label>
<label class="switch switch-default">
<input class="switch-input" name="featured" value="1" type="checkbox" id="featured_checkbox" {if $product->featured}checked=""{/if}/>
<span class="switch-label"></span>
<span class="switch-handle"></span>
</label>
</div>
</div>


и ниже вставим:

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

<div class="activity_of_switch_item"> {* row block *}
<div class="okay_switch clearfix">
<label class="switch_label">Беспл. доставка</label>
<label class="switch switch-default">
<input class="switch-input" name="free_delivery" value="1" type="checkbox" id="free_delivery_checkbox" {if $product->free_delivery}checked=""{/if}/>
<span class="switch-label"></span>
<span class="switch-handle"></span>
</label>
</div>
</div>


в файле backend/design/html/products.tpl ищем (212строка)

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

{*featured*}
<button data-hint="{$btr->general_bestseller|escape}" type="button" class="setting_icon setting_icon_featured fn_ajax_action {if $product->featured}fn_active_class{/if} hint-bottom-middle-t-info-s-small-mobile  hint-anim" data-module="product" data-action="featured" data-id="{$product->id}" >
дост.
</button>


Ниже добавим

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

{*free_delivery*}
<button data-hint="Бесплатная доставка" type="button" class="setting_icon setting_icon_free_delivery fn_ajax_action {if $product->free_delivery}fn_active_class{/if} hint-bottom-middle-t-info-s-small-mobile  hint-anim" data-module="product" data-action="free_delivery" data-id="{$product->id}" >
Я
</button>




Далее идем backend/design/css/okay.css ищем там строку 2523

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

.okay_list_setting .setting_icon_featured.fn_active_class,
.okay_list_setting .setting_icon_featured:hover{
    background: #F8D053;
    border-color: #F8D053;
    color: #fff
}


вставим ниже:

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

.okay_list_setting .setting_icon_free_delivery.fn_active_class, .okay_list_setting .setting_icon_free_delivery:hover {
    background: #a953f8;
    border-color: #a953f8;
    color: #fff;
}


далее в api/products.php ищем в двух местах (183,388строки)

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

p.visible,


и ниже вставим в 2-х местах

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

p.free_delivery,


далее идем в feed.php
ищем

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

v.compare_price,

ниже вставим

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

p.free_delivery AS product_free_delivery,


далее ниже ищем

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

$old_price = ($old_price > 0 ? "<oldprice>$old_price</oldprice>" : '');


и после этой строки вставим

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

$delivery = $okay->delivery->get_delivery(1);
if ($p->product_free_delivery == 1 || $p->price >= $delivery->free_from) {
$local_delivery_cost = '0';
}
else {
$local_delivery_cost = '600';}


далее ищем

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

print "</offer>";


и выше вставим

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

print "<local_delivery_cost>".$local_delivery_cost."</local_delivery_cost>";



где 600 - это стоимость доставки в рублях для товаров без чекбокса.


Выводим в шаблоне например так:

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

{* Доставка *}
            <div>
   Доставка этого товара по Москве
        {if ($product->free_delivery == 1) || ({$product->variant->price}>=50000)}Бесплатна
            {else}
            600р{/if}.         
            </div>
Последний раз редактировалось trainracing 09.04.2018, 16:35, всего редактировалось 1 раз.

korshunov
korshunov
Репутация: 99
Сообщения: 968
Зарегистрирован: 03.12.2015
С нами: 3 года 5 месяцев
Skype

Сообщение #2 korshunov » 09.04.2018, 06:34

1. К разработке надо бы комментарий хоть небольшой добавить - что это такое вообще и зачем. Потому что сама идея не очень понятна. Например, если для двух товаров в карточках товара будет написано - Доставка 600 руб, то у простого покупателя сразу вопрос - а при покупке двух товаров в одном заказе что будет - доставка два раза по 600 или как...

2. В текущем виде, как представлено, у некоторых товаров в карточке товара будет надпись о бесплатной доставке. А поскольку в корзине и заказе ничего не меняется, то там расчет будет идти по стандартным правилам. В итоге может выйти так - сначала пообещали покупателю доставку бесплатную, а потом в заказе выставили счет за доставку. Это прямой путь, чтобы отвадить покупателей от магазина...

3. Техническое исполнение. В части, касающейся feed.php, видна нерациональность, и даже две нерациональности:
3.1 Для каждого товара в отдельности делается запрос delivery->get_delivery(1);
3.2 Это запрос проводится даже для товара, у которого не установлено product_free_delivery, то есть совсем впустую идет работа.
В итоге для реального магазина - тысячи лишних запросов, без которых можно было бы легко обойтись.

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 8
Сообщения: 100
Зарегистрирован: 07.10.2016
С нами: 2 года 7 месяцев
Сайт

Сообщение #3 trainracing » 09.04.2018, 16:30

Владимир, я буду очень рад если покажите, как лучше сделать в feed

p.s. Я не программист а маркетолог. Переписал решение под последнюю версию. По факту работает, знаю что можно было бы улучшить, но не умею.
Любое улучшение буду рад видеть. И буду благодарен.

korshunov
korshunov
Репутация: 99
Сообщения: 968
Зарегистрирован: 03.12.2015
С нами: 3 года 5 месяцев
Skype

Сообщение #4 korshunov » 09.04.2018, 17:14

3. Надо строку
$delivery = $okay->delivery->get_delivery(1);
вывести из цикла ближе к началу.
Запрос на способ доставки выполнится один раз всего, а не для каждого товара...

Что касается замечаний из пп. 1,2, то они обычно понятны простым покупателям, не говоря уж о маркетологах - специалистах по торговле...


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

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

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