UMIhelp

Разработка сайта на UMI.CMS => Макросы UMI.CMS => Тема начата: crazygeorgio от 13 Января 2016, 17:26:55

Название: Обновление цен в корзине при изменении цен товаров
Отправлено: crazygeorgio от 13 Января 2016, 17:26:55
Цены товаров зависят от региона, выбранного на сайте! Однако, при добавлении товара в корзину и при дальнейшем изменении региона цены в корзине не пересчитываются. Написан метод, вызываю его при смене региона, вроде работает. Суть в том, что беру корзину, перебираю в ней товары, удаляю их и добавляю заново... может можно как-то и иначе?

public function basketRefresh() {
$order = $this->getBasketOrder();
$orderItems = $order->getItems();
if (count($orderItems) == 0) return false;

foreach($orderItems as $orderItem) {

$options = $orderItem->getOptions();
$amount = $orderItem->getAmount();

$element = $orderItem->getItemElement();
$orderItem->remove();
$orderItemNew = orderItem::create($element->id);

                if ($orderItemNew instanceof optionedOrderItem) {
foreach($options as $optionName => $optionId) {
if ($optionId) {
$orderItemNew->appendOption($optionName, $optionId);
}
}
}

$orderItemNew->setAmount($amount ? $amount : 1);
$orderItemNew->refresh();
$order->appendItem($orderItemNew);
}

$order->refresh();
}
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: crazygeorgio от 02 Февраля 2016, 15:07:27
никто и ничего не может сказать?
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: Rodogor от 25 Февраля 2016, 13:08:17
Чисто теория:
Когда вызывается refresh() для экземпляра класса ORDER, т.е. для корзины, то и вызывается refresh() для OrderItem (товар в корзине).
Внутри OrderItem::Refresh() вызывается метод OrderItem::getItemPrice(), возвращающий стоимость товара. Вероятнее всего, туда Вы и встраивали проверку стоимости от региона.

То есть в идеале после смены региона достаточно вызвать refresh() для корзины и цены пересчитаются.
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: crazygeorgio от 25 Февраля 2016, 13:16:00
я тоже так думал! но это все не работает, ни refresh для корзины, ни refresh для каждой позиции в корзине... могу только предположить что видимо метод OrderItem::getItemPrice() никак не связан с точкой вызова umiObjectProperty_loadPriceValue, по которой и подменяется цена
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: Rodogor от 25 Февраля 2016, 14:32:35
Логичное предположение. Советую расставить какие-нибудь метки (var_dump(); отлично подходит) и убедиться в этом.
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: crazygeorgio от 25 Февраля 2016, 14:56:26
да не, чего толку-то, так работает и ладно)

просто непонятно, это косяк или из каких-то других соображений было так сделано
Название: Re: Обновление цен в корзине при изменении цен товаров
Отправлено: Rodogor от 25 Февраля 2016, 15:47:54
Да не, вроде не косяк.
Сколько раз я что-то подобное делал или копался в чужом коде - всё, что касается интернет-магазина, делалось внутри класса emarket (в терминах umi.cms - внутри модуля emarket).
Реализую подобного функционала внутри класса umiObjectProperty не встречал, но не отрицаю, что это возможно.