Обратите внимание, что этот вопрос касается стоимости доставки, а не цены. Существует важная разница, т.е. то, что $$ взимает метод доставки за владельца магазина, в отличие от того, какой платеж $$ оплачивается клиентом.
Таблица базы данных 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
в этой модели отсутствует.
На этом этапе у меня заканчиваются идеи. Любые предложения с благодарностью получили!
Благодарю, Джонатан
Во-первых, постарайтесь не слишком беспокоиться о производительности, пока не увидите какое-то конкретное узкое место. Имейте веру в множество систем кеширования. Положите больше цинично, 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');
Вы в основном называете тот же код, что и раньше, но убираете результаты где-то для последующего доступа. О такой безопасности, как переопределение может получить.