Наверное, больше, чем один способ сделать это, но мой метод выбора был создать плагин для \ Magento \ Доставка \ Model \ Доставка, в частности collectRates() функция. Наши требования были более конкретными, чем ваши (внизу).
Базовая логика поток ...
collectRates()(Unmodified функции \ Magento \ Доставка \ модель \ Доставка, Собирает ставки для всех способов доставки)
afterCollectRates()(плагин)
- На данный момент все способы доставки есть пчелу n и ставки, хранящиеся в нашем $ запросе объект.
- Вы можете определить продукты, которые находятся в корзине через $ request-> getAllItems()
- Примечание: Дети/Родительские продукты являются отдельными элементами, и в зависимости от вашего магазина конфигурации, один или другие не могут есть пользовательский атрибут, который вы хотите посмотреть.
- Вы можете увидеть все транспортные методы/цены через $ request-> GetResult() -> getAllRates()
- я не нашел функцию ядра, чтобы удалить скорость, мой обходной путь был .. .
- отключенное все данные скорости, чтобы удалить
- После того, как все цены изменены, использовать Еогеасп() цикл, чтобы хранить их в tempArray (с некоторой логикой, чтобы не добавлять, если стоимость == 0, и т.д. .)
- Теперь вровень и сбросить все существующие ставки через $ request-> GetResult() -> Сброс()
- Наконец, добавьте ставки от вашего tempArray назад в
В зависимости о том, как вы вычисляете ставки, вы также можете расширить различные способы доставки, чтобы вы могли полностью обходить их, когда определенные продукты находятся в корзине (вероятно, не для вашего варианта использования, но для тех, кто пытается отключить UPS/FedEx/etc.ставки)
Как уже упоминалось, наши требования были более обширны, и мы также имели функцию beforeCollectRates(), который фактически создал массив продукта и какой-либо другой логики (мы должны были ограничить различные методы доставки, добавить обработку для конкретных продуктов, и использовать размерную логику для создания списка загрузочных ящиков для отправки в UPS/FedEx и т. д. для фактической части CollectRates().)