Форум русской поддержки Joomla!® CMS
04.12.2016, 12:17:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 594 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ChimikSantiaga
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« : 27.02.2016, 18:29:03 »

Добрый день.

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

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

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

Спасибо большое за помощь. 
Записан
gartes
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #1 : 27.02.2016, 22:05:59 »

Цену доставки можно забивать в кастомарное поле (обычное текстовое не являющимся атрибутом корзины. )
т.е. для каждого товара 2 поля . 1. Ship-max 2. Ship-normal

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

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

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

« Последнее редактирование: 27.02.2016, 22:11:11 от gartes » Записан
ChimikSantiaga
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #2 : 28.02.2016, 15:11:07 »

Спасибо большое за помощь, уважаемый gartes.

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

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

"$values['shipment_cost'] = "

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

Спасибо за ответ.
« Последнее редактирование: 28.02.2016, 15:19:05 от ChimikSantiaga » Записан
gartes
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #3 : 28.02.2016, 15:44:53 »

А куда именно указывали? Shocked

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

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

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #4 : 28.02.2016, 16:18:39 »

К сожалению, не вышло(

Код
$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
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #5 : 28.02.2016, 16:19:54 »

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

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #6 : 28.02.2016, 16:21:06 »

А изначально пробовал так:

Код
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
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #7 : 28.02.2016, 17:29:01 »

Цитировать
Он стоимость не переопределяет
Так а в таблицу БД Сохраняет или нет ?
Цитировать
#__virtuemart_shipment_plg_weight_countries столбец shipment_cost

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

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #8 : 28.02.2016, 18:22:40 »

Да, в таблицу заносит)

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

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

Код
$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']

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

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


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

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #9 : 28.02.2016, 18:24:49 »

 Grin не думаю что так просто все у Вас получится...
Пробуйте..
Записан
gartes
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #10 : 28.02.2016, 18:32:28 »

Метод который выводит инфо про доставку в адменке на странице заказа
Код
function getOrderShipmentHtml ($virtuemart_order_id) {...}
 
строка 160.
Записан
ChimikSantiaga
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #11 : 28.02.2016, 19:24:36 »

Что-то мне подсказывает, что я буду делать это до посинения((((
Записан
gartes
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #12 : 28.02.2016, 20:22:33 »

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

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

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

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

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #13 : 08.03.2016, 05:29:42 »

Прошу прощения за долгое отсутствие....

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

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

Код
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
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #14 : 08.03.2016, 13:31:14 »

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

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

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

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




Чуть позже напишу что нибудь )
Записан
ChimikSantiaga
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #15 : 08.03.2016, 18:50:00 »

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

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

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

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

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

Спасибо за ответ. Буду переделывать.
Записан
ChimikSantiaga
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #16 : 11.03.2016, 16:23:25 »

Протестил  код...Когда вывожу из массива $price_shipment значения, то получается, вне зависимости от количества товаров в корзине,
  • =>10.00 и всё в чем может быть проблема?
Код
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
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 11


« Ответ #17 : 14.03.2016, 15:56:57 »

Я дописал)))

Вышло так:

Код
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 в
Код
$this->_cart->cartPrices['billTotal'] = $this->_cart->cartPrices['salesPricePayment'] + $this->_cart->cartPrices['withTax'] + $this->_cart->cartPrices['salesPriceCoupon'];

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

Репутация: +12/-0
Offline Offline

Пол: Мужской
Сообщений: 462


зеленею...


« Ответ #18 : 08.04.2016, 08:33:14 »

Появилась несколько иная задача, но похожая. Уверен, будет полезна форумчанам.

Идея переписать 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, 10:35:29 от SolopoV » Записан
gartes
Живу я здесь
******

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #19 : 08.04.2016, 08:45:39 »

Цитировать
В админке можно выбрать только одного производителя на данный вид доставки, а хочется поставить несколько, как и категории
Ну наверно для такой цели все же придется свой тип полей создать..
тут написано как ))
Записан
SolopoV
Завсегдатай
*****

Репутация: +12/-0
Offline Offline

Пол: Мужской
Сообщений: 462


зеленею...


« Ответ #20 : 08.04.2016, 10:34:57 »

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

Репутация: +63/-3
Offline Offline

Сообщений: 826


Е = mс²


« Ответ #21 : 08.04.2016, 13:49:04 »

А просто не понял Вас.
Записан
SolopoV
Завсегдатай
*****

Репутация: +12/-0
Offline Offline

Пол: Мужской
Сообщений: 462


зеленею...


« Ответ #22 : 08.04.2016, 14:31:21 »

Может быть кто нибудь подскажет решение?
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet