チェックアウト中にMagentoが既存の顧客の住所を再保存するのはなぜですか?


16

顧客がドロップダウンから既存の住所を選択した場合でも、精算プロセス中にcustomer_addressエンティティが再保存されます。どんなアイデアがありますか?

更新:

Mage_Checkout_Model_Type_Onepage::saveOrder次のコードが実行される場所から開始します。

$service = Mage::getModel('sales/service_quote', $this->getQuote());
$service->submitAll();

これsubmitAllMage_Sales_Model_Service_Quote::submitOrder以下を実行する呼び出しを行います:

$transaction->save();

このメソッドは、quote(?)のすべてのオブジェクトをループして保存します。

更新:

最も嫌なことは、彼らが顧客が持っているすべてのアドレスに対してそれをやっているということです。したがって、訪問者がアドレス帳に10個の住所を保存すると、それらのすべてがチェックアウト中に再保存されます。なぜMagentoの中で最もリソースを消費するのか不思議に思わないでください。


customer_address_entityまたは引用符で?
マティアスクライン

申し訳ありませんが、意味がわかりません。customer_addressエンティティは、注文時に保存されています。引用との関係はありません。
user487772

1
これを行うコードを提供できますか?検索の手間が省けます
マリウス

質問を更新しました。
user487772

@Tim私は彼らがそれを受け入れなかったと思わなかった原因を推測します;)私の推測は、アドレスが存在するかどうかをチェックしたくないので、すべてを保存するのがより簡単/怠/です。ただ推測
デビッドマナー

回答:


6

通常、モデルのデータが変更されていない限り、そのデータに対してsave()を呼び出してもモデルは再保存されません
これは、この方法でロジックを実装する際の前提であったに違いありません。

ただし、見積住所モデルのメソッド_beforeSave()は見積ID、顧客ID、および場合によっては顧客住所IDとsame_as_billingプロパティを_populateBeforeSaveData()メソッドを介して設定するため、不必要な保存に対する保護は回避されます。

メソッドの簡単な修正方法populateBeforeSaveData()は、アドレスモデルに設定しようとしている値が、現在のモデルに同じ値で既に存在するかどうかを確認することです。

幸いなことに、見積もりアドレスはフラットテーブルに格納されます。つまり、保存はかなり効率的です。また、一部のB2Bストアを除き、顧客が2つ以上の住所を持つ経験はありません。


2

これは考え抜かれなかったという推測を危険にさらすでしょう。

おそらく、新しい住所に加えてデフォルトの請求先住所と配送先住所の変更を更新するよりも、すべての住所を保存する方が簡単だと考えられていました。 。

注:これは単なるアイデアですが、共有する価値があると思いました。また、同じ仮定を自分自身が行うことを想像できます:(


0

チェックアウト中のアドレスの保存は、顧客リソースモデルの_afterSave()-Methodによって行われます。

protected function _afterSave(Varien_Object $customer)
{
    $this->_saveAddresses($customer);
    return parent::_afterSave($customer);
}

注文時に顧客モデルが保存されることを覚えています。

乾杯


はい、それは明らかでした。質問は「何のため?」です。
user487772

@ティム:一般的な私は思う。チェックアウトATMの明らかな理由はありません。
sbothner_mzentrale

@Tim:たとえば、adminのsaveActionにはこの動作が必要です。
sbothner_mzentrale

それは何のために必要ですか?
user487772
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.