Как узнать вес заказа в хуке backend_order
В документации в шопскрипт написано что хуку передаётся массив заказа. Посмотрел его содержимое - там нет ни одного параметра ассоциируемого со словом weight. Отсюда вопрос - есть ли в передаваемом массиве информация о весе заказа или если нет, то как её узнать? В плагине доставки вес можно получить хотя бы методом getTotalWeight - значит вес где-то спрятан, но где? Полазил по таблицам SQL с префиксом shop_order - не нашёл там упоминаний о весе тоже явно. Правда таблицы уж очень большие и глазами всё не охватить.
Поскольку документация мягко говоря скудна и на тему заказа тоже - помогите чем можете
Эта тема в архиве. Добавление комментариев к ней отключено.










8 ответов
Получите все товары и сложите вес всех товаров.
Если установлен плагин то можете обращаться к его методу расчета.
Как? Можно пояснить? Сложить вес - это значит делать ручной запрос по каждому товару в отдельности? Т.е. в самом заказе веса вообще нет?
А как обратиться к установленному плагину и убедить его использовать метод расчёта применительно к конкретному заказу?
сделать запрос по каждому товару. получить значения характеристики для указанных товаров :). узнать нет-ли у товара артикулов, у которых вес переопределен. Выбрать вес либо товара, либо артикула. Сконвертировать в нужные единицы измерения (у товаров вес может быть в разных единицах). Перемножить и сложить.Тут вот у меня скопированное из недр Магазина и, кажется, немного доработанное есть:
public static function addWeight(&$order, $weight_unit) { $Feature = new shopFeatureModel(); $weight_feature = $Feature->getByCode('weight'); $product_ids = $sku_ids = array(); foreach ($order['items'] as $item) { $product_ids[] = isset($item['product_id']) ? $item['product_id'] : $item['skus'][$item['sku_id']]['product_id']; $sku_ids[] = $item['sku_id']; } if (!$weight_feature) { $weight_values = array(); } else { $FeatureValue = $Feature->getValuesModel($weight_feature['type']); $weight_values = $FeatureValue->getProductValues($product_ids, $weight_feature['id']); } foreach ($order['items'] as &$item) { if ($item['type'] != 'product') { if (isset($item['item'])) { $item['item']['weight'] = 0; } else { $item['weight'] = 0; } continue; } $product_id = isset($item['product_id']) ? $item['product_id'] : $item['skus'][$item['sku_id']]['product_id']; $sku_id = $item['sku_id']; // Если есть вес артикула, используем его, если нет, то вес товара. Если нет никакого веса, то 0 if (isset($weight_values['skus'][$sku_id])) { if (isset($item['item'])) { $item['item']['weight'] = $weight_values['skus'][$sku_id]; } else { $item['weight'] = $weight_values['skus'][$sku_id]; } } elseif (isset($weight_values[$product_id])) { if (isset($item['item'])) { $item['item']['weight'] = $weight_values[$product_id]; } else { $item['weight'] = $weight_values[$product_id]; } } else { if (isset($item['item'])) { $item['item']['weight'] = 0; } else { $item['weight'] = 0; } } // Сконвертируем вес из базового в нужный нам if (isset($item['item'])) { if ($item['item']['weight']) { $item['item']['weight'] = shopDimension::getInstance() ->convert($item['item']['weight'], 'weight', $weight_unit); } } else { if ($item['weight']) { $item['weight'] = shopDimension::getInstance() ->convert($item['weight'], 'weight', $weight_unit); } } } unset($item); return $order; }Понял, спасибо, прелестно. Цифирка, которая была уже вычислена на момент формирования заказа и использовалась для расчёта стоимости доставки (методом calculate) далее была благополучно профукана :) И если вдруг в промежутке между формированием заказа и его отправкой из бакэнда менеджером какая-то позиция изменила вес, то итоговая цифра будет не та, что использовалась при оформлении.
Спасибо ещё раз за чёткое разъяснение. Стало ещё хуже :)
Оно каждой позиции заказа вес добавляет. Так что складывать вам самому придется :)
это понятно. Это не getTotalWeight а функция определения веса конкретной позиции заказа. Её ещё на квонтити домножать бы пришлось
waShipping::getTotalWeight() так и делает. Перебирает все позиции, умножает и складывает.
Ключевое На момент формирования заказа. А не момент, когда менеджер глянул в старый заказ и увидел там совершенно другой вес :)