Доступ к стоимости доставки в тележке Magento и / или оформлении заказа

Обратите внимание, что этот вопрос касается стоимости доставки, а не цены. Существует важная разница, т.е. то, что $$ взимает метод доставки за владельца магазина, в отличие от того, какой платеж $$ оплачивается клиентом.

Таблица базы данных shipping_tablerate включает поле cost , которое заполняется в объекте Mage_Shipping_Model_Carrier_Tablerate во время метода collectRates . Однако это поле недоступно нигде в стеке, например, из адреса котировки.

Мне нужно получить доступ к этому значению на странице корзины, и я не могу найти его для достижения этого, кроме как создать экземпляр объекта Mage_Shipping_Model_Rate_Request для передачи в collectRates() . Это кажется излишне неэффективным, учитывая, что данные уже загружены из таблицы и должны быть доступны.

Я попытался Наблюдать за событием <shipping_carrier_tablerate_load/> , но кажется, что событие _load не _load для этой модели.

Я также попытался получить доступ к курсу из цитаты:

 $quote = Mage::getSingleton('checkout/cart')->getQuote(); $address = $quote->getShippingAddress(); $rate = $address->getShippingRateByCode($code ='tablerate_bestway'); 

Я могу видеть расчетную price , однако cost в этой модели отсутствует.

На этом этапе у меня заканчиваются идеи. Любые предложения с благодарностью получили!

Благодарю, Джонатан

Related of "Доступ к стоимости доставки в тележке Magento и / или оформлении заказа"

Во-первых, постарайтесь не слишком беспокоиться о производительности, пока не увидите какое-то конкретное узкое место. Имейте веру в множество систем кеширования. Положите больше цинично, Magento уже немного зверя SQL, поэтому, если у вас есть магазин, настроенный на несколько дополнительных запросов, это не повредит.

Во-вторых, попадание в базу данных может даже не быть проблемой. Модель shipping/rate_request не поддерживается базой данных. Если вы посмотрите на два раза, то они используются в основном коде

 Mage_Shipping_Model_Shipping::collectRatesByAddress Mage_Sales_Model_Quote_Address::requestShippingRates 

вы можете увидеть, что модель shipping/rate_request создается, а затем заполняется из уже загруженных полей. Кроме того, все модели, используемые в Mage_Shipping_Model_Carrier_Tablerate::collectRates , не загружают ничего из базы данных, они просто выполняют вычисления.

Поразительно, что вы хотите создать что-то максимально возможное в первом раунде, но в современной OO-системе слишком много сложных взаимодействий, чтобы волшебным образом узнать наиболее эффективный способ сделать что-то. Сделайте то, что вам нужно, чтобы получить нужную информацию, и отрегулируйте настройку производительности (если необходимо) во время выпуска технического обслуживания (или если вам не повезло иметь выпуск обслуживания, когда кто-то с властью в вашей организации ворчит о скорости где-то )

В-третьих, когда система не предоставляет доступ к чему-то, что вам нужно, для этого нужна система переопределения класса. Что-то вроде

 class Package_Module_Model_Carriertablerate extends Mage_Shipping_Model_Carrier_Tablerate { public function getRate(Mage_Shipping_Model_Rate_Request $request) { $rate = parent::getRate($request); Mage::register('package_module_carriertablerates', $rate); return $rate; } } ... //later, retrieve the rate $rates = Mage::registry('package_module_carriertablerates'); 

Вы в основном называете тот же код, что и раньше, но убираете результаты где-то для последующего доступа. О такой безопасности, как переопределение может получить.