2010-10-03 2 views
5

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

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

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

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

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

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

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

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

Спасибо, Джонатан

ответ

6

Во-первых, постарайтесь не слишком беспокоиться о производительности, пока вы не увидите фактическое узкое где-то. Имейте веру в множество систем кеширования. Положите больше цинично, 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'); 

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

+0

Спасибо Алан, отличный ответ.Моя забота о возврате в базу данных состояла в том, что эта модель, похоже, не проходит стандартный процесс автозагрузки, поэтому почему событие '$ model_load' не выбрасывается. Мне нравится идея использовать «Mage :: register» для хранения значения. Хранит ли 'Mage :: register' глобально или просто для этого' checkout/session'? ЕСЛИ это глобально, тогда мне нужно будет проверить, что сохраненная скорость включает в себя 'dest_zip', используемый для вычисления. Но это детализация реализации. –

+0

P.S. Загрузка базы данных для 'tablerate' выполняется в' Mage_Shipping_Model_Mysql4_Carrier_Tablerate_Collection :: __ construct() 'и является достаточно сложной, так как включает три таблицы в соединении. –

+2

А, я неправильно понял вопрос. Я думал, что вы хотите захватить его для использования по той же просьбе. Я уверен, что Mage :: register - это предмет запроса. Глобальные переменные, не нарушающие глобальный масштаб. Кроме того, FWIW, я просто искал локальную кодовую базу 1.4 и 1.4.1 и не нашел событие shipping_carrier_tablerate_load в любом месте. –