Расчет стоимости доставки в зависимости от товаров в корзине.

  • 22 Ответов
  • 924 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Добрый день.

Столкнулся с такой задачей, заказчик просит сделать расчет стоимости доставки в зависимости от того какой товар лежит в корзине.
У товара будет 2 цены доставки. Для него 1го в корзине и если там есть ещё, то будет 2ая цена. В корзине лежит 3 товара, выбирается наивысшая цена для 1го товара и прибавляется 2ая цена двух других товаров.

Мои размышления были такие....Сначала $cartProducts = VirtueMartCart::getCart(false)->products; получаю массив товаров, в нем нахожу наивысшую цену доставки для 1го товара и т.д. Но не знаю куда определить и как вставить результаты расчета цены.

Сайт делается на Joomla 3.x, VirtueMart 3.x

Спасибо большое за помощь. 

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Цену доставки можно забивать в кастомарное поле (обычное текстовое не являющимся атрибутом корзины. )
т.е. для каждого товара 2 поля . 1. Ship-max 2. Ship-normal

результаты расчета цены -- это можно поправить  стандартный плагин доставки.
где то в этой function plgVmConfirmedOrder строка 105 наверное. ))

и сохранить вот так $values['shipment_cost'] = {ВАША ЦЕНА.}

Теория есть .. Осталось только написать ))
 :(
PS ... Я же правильно понимаю что у каждого товара 1. Ship-max 2. Ship-normal будет отличаться...?

« Последнее редактирование: 27.02.2016, 23:11:11 от gartes »

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Спасибо большое за помощь, уважаемый gartes.

"PS ... Я же правильно понимаю что у каждого товара 1. Ship-max 2. Ship-normal будет отличаться...?"

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

"$values['shipment_cost'] = "

значение 50, к примеру, но значение доставки не поменялось. В чем может быть причина, не могли бы Вы подсказать?

Спасибо за ответ.
« Последнее редактирование: 28.02.2016, 16:19:05 от ChimikSantiaga »

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
А куда именно указывали? :o

Попробуйте в 128 строку подставить
Код: php
$values['shipment_cost'] = 50; 

И потом в таблице плагина #__virtuemart_shipment_plg_weight_countries столбец shipment_cost найти ваше значение.
« Последнее редактирование: 28.02.2016, 16:57:57 от gartes »

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
К сожалению, не вышло(

Код: php
$costs = $this->getCosts($cart,$method,$cart->cartPrices);
if(empty($costs)){
$values['shipment_cost'] = 0;
$values['shipment_package_fee'] = 0;
} else {
$values['shipment_cost'] = $method->shipment_cost;
$values['shipment_package_fee'] = $method->package_fee;
}

$values['shipment_cost'] = 55;

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Он стоимость не переопределяет.....Если в админке задано значение 0, то стоимость доставки - 0, а если значение отличное от 0, то задается это значение.....

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
А изначально пробовал так:

Код: php
if(empty($costs)){
$values['shipment_cost'] = 0;
$values['shipment_package_fee'] = 0;
} else {
$values['shipment_cost'] = 55;
$values['shipment_package_fee'] = $method->package_fee;
}

Спасибо за ответ.

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Цитировать
Он стоимость не переопределяет
Так а в таблицу БД Сохраняет или нет ?
Цитировать
#__virtuemart_shipment_plg_weight_countries столбец shipment_cost

Просто скорее всего что и при выводе он тоже будет проверять правила для стоимости доставки а это уже совсем другой метод (функция)

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Да, в таблицу заносит)

Спасибо большое!Заносит после того, как я нажал подтвердить заказ.

Теперь, я так понимаю, я используя код

Код: php
$cartProducts = VirtueMartCart::getCart(false)->products;
foreach($cartProducts as $cartProduct){
$db = JFactory::getDbo();
$sql = 'SELECT `product_price_shipment_1` FROM `tjb76_virtuemart_product_prices`';
$db->setQuery($sql);
$price_shipment = $db->loadRow();
$max_prices = max($price_shipment);

Нахожу максимальное значение, цены доставки_1 и могу подставить в $values['shipment_cost']

таким образом

Код: php
$values['shipment_cost'] = $this->max_prices;


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

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Метод который выводит инфо про доставку в адменке на странице заказа
Код: php
function getOrderShipmentHtml ($virtuemart_order_id) {...}
строка 160.

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Что-то мне подсказывает, что я буду делать это до посинения((((

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Цитировать
Что-то мне подсказывает, что я буду делать это до посинения((((
Может быть и такое..
Зато разберетесь ... ;D
Там на самом деле не чего сложного нет..
1. Вы уже понимаете где прилепить цену. Пусть пока это будет фиксирована цена
Цитировать
$values['shipment_cost'] = 55;

2. Теперь нужно ее получить при выводе..
Это можно получить либо через плагин доставки либо прямо из шаблона заказа написать MySQL запрос к таблице плагина доставки получить данные по ID заказа.

3. Останется только написать алгоритм выбора цен доставок и их правильного сложения но это скорее всего уже другой вопрос.

ps// Что Вы паникуете? Вам же помогают.. так что в перед.
 

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Прошу прощения за долгое отсутствие....

В общем вернулся к данному вопросу.

Написал такой код:

Код: php
if(!class_exists('VirtueMartCart')) {
require(JPATH_VM_SITE.DS.'helpers'.DS.'cart.php');
}
$cartProducts = VirtueMartCart::getCart(false)->products;
foreach($cartProducts as $cartProduct){
$db = JFactory::getDbo();
$sql = 'SELECT `product_price_shipment_1` FROM `tjb76_virtuemart_product_prices`';
$db->setQuery($sql);
$price_shipment = $db->loadRow();
$max_prices = max($price_shipment);
}
return $max_prices;

Добавляю его в файл calculation.php, запускаю и не работает.

Пишет - Notice: Undefined variable: max_prices. Как определить?

P.S. плюсик обязательно будет.Ещё не могу ставить...Я так понял надо написать 10 сообщений...
Спасибо.

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Цитировать
Добавляю его в файл calculation.php, запускаю и не работает.
А при чем тут этот файл..
Мы же говорили о плагине доставки.

Цитировать
$sql = 'SELECT `product_price_shipment_1` FROM `tjb76_virtuemart_product_prices`';
А разве такое поле product_price_shipment_1 есть в этой таблице ?

Ни и даже если есть то в запросе не хватает условия WHERE

Не однозначно => Решение неправильное ..




Чуть позже напишу что нибудь )

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Цитировать
Добавляю его в файл calculation.php, запускаю и не работает.
А при чем тут этот файл..
Мы же говорили о плагине доставки.

Это да, но вывод окончательной цены идет в calculation.php.

Цитировать
А разве такое поле product_price_shipment_1 есть в этой таблице ?

Ни и даже если есть то в запросе не хватает условия WHERE

Такое поле просто добавил в таблицу, решение конечно не очень, но пока что сделал так.

Спасибо за ответ. Буду переделывать.

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Протестил  код...Когда вывожу из массива $price_shipment значения, то получается, вне зависимости от количества товаров в корзине,
  • =>10.00 и всё в чем может быть проблема?
Код: php
foreach($cartProducts as $cartProduct){
$db = JFactory::getDbo();
$sql = 'SELECT `product_price_shipment_1` FROM `tjb76_virtuemart_product_prices`';
$db->setQuery($sql);
$price_shipment = $db->loadRow();
}
print_r ($price_shipment);
}

Спасибо за ответ.

*

ChimikSantiaga

  • Захожу иногда
  • **
  • 11
  • 1
Я дописал)))

Вышло так:

Код: php
if(!class_exists('VirtueMartCart')) {
require(JPATH_VM_SITE.DS.'helpers'.DS.'cart.php');
}
$cartProducts = VirtueMartCart::getCart(false)->products;
$a = json_decode(json_encode($cartProducts), True);
$r = count($a);
$ps = array();
$psn = array();
for ($x=0; $x<=$r-1; $x++){
foreach($a as $n){
$ps[$x] = ($a[$x][allPrices][0][product_price_shipment_1]);
$psn[$x] = ($a[$x][allPrices][0][product_price_shipment_n]);
}
}
$maxp = max($ps);
$minpr = array_sum($psn);
$final_price = $maxp + $minpr;

Осталось только занести $final_price в
Код: php
$this->_cart->cartPrices['billTotal'] = $this->_cart->cartPrices['salesPricePayment'] + $this->_cart->cartPrices['withTax'] + $this->_cart->cartPrices['salesPriceCoupon'];

Вроде работает.
Буду ещё тестить.Если получится улучшить - напишу.
Спасибо всем за помощь.

*

SolopoV

  • Завсегдатай
  • *****
  • 474
  • 12
  • зеленею...
Появилась несколько иная задача, но похожая. Уверен, будет полезна форумчанам.

Идея переписать weight_countries на предмет включения\выключения способа доставки на производителя товара. Тем магазинам, кто торгует, например не со своего склада, а со склада производителей - реальный выход.

В плагине weight_countries уще существует привязка по категориям:

Код
$cat_cond = true;
if($method->categories or $method->blocking_categories){
if($method->categories)$cat_cond = false;
if(!is_array($method->categories)) $method->categories = array($method->categories);
if(!is_array($method->blocking_categories)) $method->blocking_categories = array($method->blocking_categories);
foreach($cart->products as $product){
if(array_intersect($product->categories,$method->categories)){
$cat_cond = true;
}
if(array_intersect($product->categories,$method->blocking_categories)){
$cat_cond = false;
break;
}
}
}

Попытался сделать  по образу и подобию:
Код
//start manufacturer
$man_cond = true;
if($method->manufacturer or $method->blocking_manufacturer){
if($method->manufacturer)$man_cond = false;
if(!is_array($method->manufacturer)) $method->manufacturer = array($method->manufacturer);
if(!is_array($method->blocking_manufacturer)) $method->blocking_manufacturer = array($method->blocking_manufacturer);
foreach($cart->products as $product){
if(array_intersect($product->virtuemart_manufacturer_id,$method->manufacturer)){
$man_cond = true;
}
if(array_intersect($product->virtuemart_manufacturer_id,$method->blocking_manufacturer)){
$man_cond = false;
break;
}
}
}
//stop manufacturer

$allconditions = (int) $weight_cond + (int)$zip_cond + (int)$nbproducts_cond + (int)$orderamount_cond + (int)$country_cond + (int)$cat_cond + (int)$man_cond;
if($allconditions === 7){
//end hack
Ну и соответственно  в XML плагина:
Код
				 <field name="manufacturer" value_field="mf_name" type="manufacturer" multiple="true" size="10" default="" label="bla-bla"
                       description=""/>
                <field name="blocking_manufacturer" value_field="mf_name" type="manufacturer" multiple="true" size="10" default="bla-bla" label="bla-bla"
                       description=""/>
Теперь, в таблицу БД #__virtuemart_shipmentmethods
 записывает нужного нам производителя:
Код
shipment_logos=""|show_on_pdetails="1"|categories=[
]|blocking_categories=""|manufacturer=[
    "7"
]|blocking_manufacturer=[
    ""
]|countries=""

Осталось две беды:
1. В админке можно выбрать только одного производителя на данный вид доставки, а хочется поставить несколько, как и категории.
(решено чуть позже, не знаю правильно или нет: добавим multiple="multiple" в  /fields/manufacturer.php)
и
2.:

Если в корзине 2 товара разных производителей, то получаем два вида доставки.

Можно ли сделать так, что на весь такой заказ выводился способ доставки с наибольшей стоимостью (shipment_cost=max)?

Заранее благодарен за совет.
« Последнее редактирование: 08.04.2016, 11:35:29 от SolopoV »

*

gartes

  • Живу я здесь
  • ******
  • 951
  • 71
  • Е = mс²
Цитировать
В админке можно выбрать только одного производителя на данный вид доставки, а хочется поставить несколько, как и категории
Ну наверно для такой цели все же придется свой тип полей создать..
тут написано как ))

*

SolopoV

  • Завсегдатай
  • *****
  • 474
  • 12
  • зеленею...
Ну наверно для такой цели все же придется свой тип полей создать..
тут написано как ))
А какой смысл в полях? Когда осталось выбрать из массива, насколько я понимаю, вариант доставки с наибольшей стоимостью и показать только его?


*

SolopoV

  • Завсегдатай
  • *****
  • 474
  • 12
  • зеленею...
Может быть кто нибудь подскажет решение?