Как узнать вес заказа в хуке backend_order

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


Поскольку документация мягко говоря скудна и на тему заказа тоже - помогите чем можете

1 ответ

  • 1
    Алексей Webasyst 27 мая 2016 13:19 #

    Получите все товары и сложите вес всех товаров.
    Если установлен плагин то можете обращаться к его методу расчета.

    • +1
      Аркадий Глазов Аркадий Глазов 27 мая 2016 13:23 #

      Как? Можно пояснить? Сложить вес - это значит делать ручной запрос по каждому товару в отдельности? Т.е. в самом заказе веса вообще нет?

      А как обратиться к установленному плагину и убедить его использовать метод расчёта применительно к конкретному заказу?

      • +1
        Syrnik.com Syrnik.com 27 мая 2016 13:36 #

        сделать запрос по каждому товару. получить значения характеристики для указанных товаров :). узнать нет-ли у товара артикулов, у которых вес переопределен. Выбрать вес либо товара, либо артикула. Сконвертировать в нужные единицы измерения (у товаров вес может быть в разных единицах). Перемножить и сложить.

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


            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;
            }
        
        • +1
          Аркадий Глазов Аркадий Глазов 27 мая 2016 13:41 #

          Понял, спасибо, прелестно. Цифирка, которая была уже вычислена на момент формирования заказа и использовалась для расчёта стоимости доставки (методом calculate) далее была благополучно профукана :) И если вдруг в промежутке между формированием заказа и его отправкой из бакэнда менеджером какая-то позиция изменила вес, то итоговая цифра будет не та, что использовалась при оформлении.


          Спасибо ещё раз за чёткое разъяснение. Стало ещё хуже :)

          • +1
            Syrnik.com Syrnik.com 27 мая 2016 13:44 #

            Оно каждой позиции заказа вес добавляет. Так что складывать вам самому придется :)

            • +1
              Аркадий Глазов Аркадий Глазов 27 мая 2016 13:47 #

              это понятно. Это не getTotalWeight а функция определения веса конкретной позиции заказа. Её ещё на квонтити домножать бы пришлось

              • +1
                Syrnik.com Syrnik.com 27 мая 2016 13:55 #

                waShipping::getTotalWeight() так и делает. Перебирает все позиции, умножает и складывает.

                • +1
                  Аркадий Глазов Аркадий Глазов 27 мая 2016 14:06 #

                  Ключевое На момент формирования заказа. А не момент, когда менеджер глянул в старый заказ и увидел там совершенно другой вес :)

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите