5

この質問は、価格ではなく、送料に関するものです。重要な違いがあります。つまり、顧客が支払う $$ 料金とは対照的に、配送方法によってストア オーナーに発生する $$ 料金です。

shipping_tablerateデータベース テーブルには、メソッド中にオブジェクトにcost入力されるフィールドが含まれています。ただし、そのフィールドには、スタック内の他の場所 (引用符のアドレスなど) からはアクセスできません。 Mage_Shipping_Model_Carrier_TableratecollectRates

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

計算された が表示されますが、そのモデルには存在しませんpricecost

この段階では、アイデアが不足しています。どんな提案もありがたく受け取った!

ありがとう、ジョナサン

4

1 に答える 1

7

まず、実際のボトルネックがどこかに現れるまでは、パフォーマンスについてあまり心配しないようにしてください。多数のキャッシュシステムを信頼してください。もっと冷笑的に言えば、Magento はすでに SQL の獣のようなものなので、ストアを適切に調整していれば、いくつかの追加のクエリを実行しても問題はありません。

第 2 に、データベース ヒットは問題にならない場合もあります。モデルはshipping/rate_requestデータベースに支えられていないようです。コアコードで使用されている2回を見ると

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

基本的には以前と同じコードを呼び出していますが、後でアクセスできるように結果をどこかに保管しています。オーバーライドが得られるのと同じくらい安全です。

于 2010-10-03T19:13:17.393 に答える