Вопрос

Может я просто глуп и не вижу очевидной вещи, но ..

В Magento доступно 3 различных метода расчета с таблицами, и одним из них является «# of Items против назначения». Таким образом, я могу надеяться, что идея этого метода состоит в том, чтобы указать различные ставки в зависимости от количества элементов в тележке.

Давайте приведем пример.

Давайте предположим, что мы хотим, чтобы ставка доставки была X Если количество предметов в корзине ниже 60 а также Y за 60 предметы и выше.

Для этой цели мы составляем следующий CSV:

Country,Region/State,"Zip/Postal Code","# of Items (and above)","Shipping Price"
*,      *,           *,                1.0000,                  X
*,      *,           *,                60.0000,                 Y

После быстрого отладка Mage_Shipping_Model_Resource_Carrier_Tablerate::getRate() Я узнал, что это приведет к следующему запросу:

  SELECT `shipping_tablerate`.* 
    FROM `shipping_tablerate` 
   WHERE (website_id = :website_id) 
     AND ((dest_country_id = :country_id 
           AND dest_region_id = :region_id 
           AND dest_zip = :postcode) 
         OR (dest_country_id = :country_id 
          AND dest_region_id = :region_id 
          AND dest_zip = '') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = :region_id 
          AND dest_zip = '*') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '*') 
         OR (dest_country_id = '0' 
          AND dest_region_id = :region_id 
          AND dest_zip = '*') 
         OR (dest_country_id = '0' 
          AND dest_region_id = 0 
          AND dest_zip = '*') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '') 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = :postcode) 
         OR (dest_country_id = :country_id 
          AND dest_region_id = 0 
          AND dest_zip = '*')) 
     AND (condition_name = :condition_name) 
     AND (condition_value <= :condition_value) 
ORDER BY `dest_country_id` DESC, `dest_region_id` DESC, `dest_zip` DESC    
   LIMIT 1

Не путайтесь со всеми этими условиями. Единственный, кто имеет значение, это этот:

     AND (condition_value <= :condition_value)

Это означает, что если у нас есть, скажем 63 Предметы в корзине он удовлетворит обеи линии нашего CSV, потому что 1 <= 63 так же как 60 <= 63. Анкет Это означает, что все сводится к ORDER BY Что, как вы можете видеть, не имеет никакого смысла. В результате мы всегда будем получать первую строку и X оценивать.

Так что я закончу с тем же рисунком, что и старатель. Я упускаю что -то очевидное или есть что -то ужасно неправильное?

Это было полезно?

Решение

Это почти наверняка ошибка, так как Magento никоим образом не сортирует значения состояния. Ставки также не отсортированы во время импорта (как вы можете видеть, записи вставляются в том же порядке, что и в CSV, используя CSV insertArray), поэтому Magento все еще может загружать правильную скорость, если порядок в импорте верен. Этот запрос, который вы отправили, может привести к неправильным результатам, не замечая.

Чтобы исправить это, этого будет достаточно, чтобы отредактировать Mage_Shipping_Model_Resource_Carrier_Tablerate, строка 128 (CE 1.7.0.2) с:

->order(array('dest_country_id DESC', 'dest_region_id DESC', 'dest_zip DESC', 'condition_value DESC'))

Я думаю, что запрос на тягу будет подходящим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top