Доступ к стоимости доставки в корзине Magento и / или оформлении заказа - PullRequest
5 голосов
/ 03 октября 2010

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

Таблица базы данных 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 отсутствует в этой модели.

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

Спасибо, Jonathan

1 Ответ

7 голосов
/ 03 октября 2010

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

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

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

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');

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

...