Показатели таблицы Magento - ошибка или функция?
-
16-10-2019 - |
Вопрос
Может я просто глуп и не вижу очевидной вещи, но ..
В 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'))
Я думаю, что запрос на тягу будет подходящим.