Стоимость доставки

Уроки и советы по работе с TSVshop
ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Стоимость доставки

Сообщение ekcreate » 21 мар 2016, 09:44

Добрый день
а возможно ли без аддона, добавить стоимость доставки?
то есть в магазине есть самовывоз для него стоимость всегда по 0
а есть доставка курьером, так вот до суммы например 3000 руб стоимость прибавить 300 рублей, от 3000 тоже по нулям?
можете подсказать реально ли это реализовать малыми силами?

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Стоимость доставки

Сообщение admin » 21 мар 2016, 13:19

В принципе, это несложно сделать. Можно, например вот таким способом: http://forum.tsvshop.xyz/viewtopic.php?f=6&t=29&sid=e92d5a88b1fb61a448999d10b6377d6a, но тогда не получится стоимость доставки считать и добавить, а также вписать в таблицу корзины эти данные.

А можно с помощью плагина. У модуля есть событие TSVshopOnUserFormFieldsRender (http://tsvshop.xyz/dokumentacziya/dlya-razrabotchikov/sistemnyie-sobyitiya.html). Можно воспользоваться этим событием так (делаем наподобие http://forum.tsvshop.xyz/viewtopic.php?f=6&t=29&sid=e92d5a88b1fb61a448999d10b6377d6a за исключением некоторых изменений):

1) Добавить на странице оформления заказа в вызов [!TSVshop? &act=`checkout`!] параметр &customfields=`shiptype,shipping`, т.е. получится так (это только важная часть кода, у вас могут быть и другие параметры):

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

[!TSVshop? &act=`checkout` &customfields=`shiptype,shipping`!]


2) Далее в самой форме (чанк Shop_UserForm) в нужном месте вставляем

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

<select name="shiptype"><option value="Самовывоз">Самовывоз</option><option value="Доставка курьером">Доставка курьером</option></select>

и т.д.

3) Пишем плагин и вешаем его на TSVshopOnUserFormFieldsRender (плагин пишу сходу, не проверял его работу). Также замечу, что этот плагин является просто примером. Его можно оптимизировать, сделать более удобным, вынести настройки из кода в конфигурацию плагина и т.д. Т

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

global $modx, $tsvshop, $session;
$e = &$modx->Event;
//Определяем массив в виде Название доставки => цена/формула
$shipping = array('Доставка курьером' => '0-3000==300||0', // тут как раз ваш вариант цены
           'Самовывоз' => '0',
           'Еще что-то' => '100'
);

if($e->name == 'TSVshopOnUserFormFieldsRender'){
   /*тут у нас доступен массив $fields, в котором хранятся все переменные, отправленные формой оформления заказа и о самом заказе, которые потом записываются в БД. Их можно переопределить. Так и поступаем.
   Сначала смотрим, какой методы доставки выбрал заказчик. Это хранится в переменной $fields['shiptype'] (поле формы shiptype)
   И уже делаем то, что нужно. А нам нужно посмотреть, какая сумма заказа $fields['subtotal'], в зависимости от этой суммы и выбранного метода доставки записываем, столько стоит доставка в $fields['shipping']. Потом подсчитываем итоговую сумму заказа $fields['total'] и $fields['topay'];
   Нужно переопределить переменные:
   $fields['shiptype'] - 'Название доставки', остается без изменений, т.к. пришла из формы
   $fields['shipping'] - стоимость доставки
   $fields['total'] и $fields['topay'] - итоговая цена доставки: доставка+подитог
   */
   //считаем стоимость доставки встроенной функцией TSVshop, но можно по-своему сделать.
   $fields['shipping']=floatval(tsv_CalcPrice($shipping[$fields['shiptype']],round($fields['subtotal']),''));
   //считаем итоговую сумму заказа в любом случае
   $fields['total'] = $fields['topay'] = $fields['subtotal'] + $fields['shipping'];    
}


Цену доставки меняете в плагине, массив $shipping, соответственно, не забывая добавлять и в форму эти методы доставки.

Если будут ошибки, пишите, исправлю.

По вопросу об екстендере Ditto чуть позже напишу и выложу обновленный вариант

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Стоимость доставки

Сообщение ekcreate » 22 мар 2016, 08:15

вывожу стоимость доставки в корзине вот так
<!--shipping-->
<div class="cart_subtotal">
<h3>Доставка: <span class="money"><b>[+shop.basket.shipping+] [+shop.basket.monetary+]</b></span></h3>
</div>
<!--/shipping-->
но почему то этот кусок кода не выводиться вообще, тоесть будто нет его

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Стоимость доставки

Сообщение ekcreate » 22 мар 2016, 08:33

и не реагирует вообще никак на изменение типа доставки

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Стоимость доставки

Сообщение admin » 22 мар 2016, 11:10

Приведенный мной плагин не обрабатывает шаблон корзины, а только заносит данные о доставке в БД. И в корзине приведенный вами участок кода не будет отображаться, поскольку аддон Методы доставки не установлен в системе. Т.е. вывести в корзине стоимость доставки не получится с помощью плагина. Это можно сделать только с помощью аддона. Если же нужно добавить такую возможность в плагин, то это будет куда более обширный код, по сути - это уже почти аддон Методы доставки. Проще тогда приобрести аддон. Но если все это не входит в ваши планы, можно пойти немного другим путем, который частично решит вашу проблему:

1) В чане корзины убираете <!--shipping--> и <!--/shipping-->, оставляя только од между ними.
2) В форме у поля shiptype нужно добавить событие onChange, и добавив к этому событию какую-то функцию, которая считает выбранный метод доставки, а потом с помощью jquery (или на чистом js) просто подменит данные в чанке корзины. Т.е. получится как-то так:

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

<select name="shiptype" onChange="recalc([+shop.basket.subtotal+])"><option value="Самовывоз">Самовывоз</option><option value="Доставка курьером">Доставка курьером</option></select>

Т.е. даем функции recalc текущее значение стоимости заказа с помощью плейсхолдера [+shop.basket.subtotal+], к которой она должна прибавить стоимость доставки и вывести результат в шаблон с помощью jquery.

Суть функции recalc:

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

function recalc(subtotal) {
   1) Считываем текущее значение поля shiptype
   2) Определяем цену доставки для выбранного метода
   3) Определяем конечную стоимость: total = subtotal + стоимость доставки
   4) Выводим в шаблоне везде куда надо информацию о доставке. Только нужно добавить в чанке корзины в нужные места id или class, по которым jquery будет выводить данные с помощью html()      
}


3) Замените код плагина на этот новый, а также добавьте событие TSVshopOnBeforeUserFormRenderComplete:

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

global $modx, $tsvshop, $session;
$e = &$modx->Event;
//Определяем массив в виде Название доставки => цена/формула
$shipping = array('Доставка курьером' => '0-3000==300||0', // тут как раз ваш вариант цены
           'Самовывоз' => '0',
           'Еще что-то' => '100'
);

if($e->name == 'TSVshopOnUserFormFieldsRender'){
   /*тут у нас доступен массив $fields, в котором хранятся все переменные, отправленные формой оформления заказа и о самом заказе, которые потом записываются в БД. Их можно переопределить. Так и поступаем.
   Сначала смотрим, какой методы доставки выбрал заказчик. Это хранится в переменной $fields['shiptype'] (поле формы shiptype)
   И уже делаем то, что нужно. А нам нужно посмотреть, какая сумма заказа $fields['subtotal'], в зависимости от этой суммы и выбранного метода доставки записываем, столько стоит доставка в $fields['shipping']. Потом подсчитываем итоговую сумму заказа $fields['total'] и $fields['topay'];
   Нужно переопределить переменные:
   $fields['shiptype'] - 'Название доставки', остается без изменений, т.к. пришла из формы
   $fields['shipping'] - стоимость доставки
   $fields['total'] и $fields['topay'] - итоговая цена доставки: доставка+подитог
   */
   //считаем стоимость доставки встроенной функцией TSVshop, но можно по-своему сделать.
   $fields['shipping']=floatval(tsv_CalcPrice($shipping[$fields['shiptype']],round($fields['subtotal']),''));
   //считаем итоговую сумму заказа в любом случае
   $fields['total'] = $fields['topay'] = $fields['subtotal'] + $fields['shipping'];   
}

if($e->name == 'TSVshopOnBeforeUserFormRenderComplete'){
   $tpl = str_replace('[+shop.basket.subtotal+]',$_SESSION[$session]['result']['subtotal'],$tpl);
   $e->output($tpl);
}

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Стоимость доставки

Сообщение admin » 22 мар 2016, 11:13

И еще не забудьте потом очистит кеш МОДх, чтобы чанки корзины обновились.

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Стоимость доставки

Сообщение admin » 22 мар 2016, 12:05

Обновил екстендер Ditto, проверьте и отпишите, пожалуйста, о результате. Если все ок, внесем его в офф.версию модуля.
shopgroupprice.extender.inc.zip
(2.85 КБ) 119 скачиваний

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Стоимость доставки

Сообщение ekcreate » 22 мар 2016, 20:59

екстендер ditto заработал, спасибо.. наверно надо его добавить в ту тему, что б люди видели правильный код

а вот по доставке не получается.. у меня нет события TSVshopOnUserFormFieldsRender почему то.. версия TSVshop 5.2.1
и что то подсказывает что так не может быть.. так в доках напсано что с версии 5.0 это событие уже есть

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Стоимость доставки

Сообщение ekcreate » 23 мар 2016, 13:26

подскажите с событием как быть?

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Стоимость доставки

Сообщение admin » 23 мар 2016, 17:47

Можете добавить его напрямую через запрос:

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

REPLACE INTO `{PREFIX}system_eventnames` VALUES ('1036','TSVshopOnUserFormFieldsRender', 6, 'TSVshop');


только вместо {PREFIX} поставьте свой префикс БД.

Насчет карточки товара, чуть позже выложу исправление.


Вернуться в «Как сделать ... ?»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость