为什么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或报价中?
Matthias Kleine

抱歉,不确定您的意思。下customer_address订单时将保存实体。没有报价引用。
user487772 2014年

1
您可以提供执行此操作的代码吗?这将为我省去搜索的麻烦
Marius

更新了问题。
user487772 2014年

@Tim我猜答案是因为他们不认为这是可以接受的答案;)我的猜测是,他们不想检查地址是否存在,因此保存所有内容将更加容易/懒惰。虽然只有一个猜测
David Manners 2014年

Answers:


6

通常,除非模型上的数据已更改,否则在其上调用save() 不会导致模型被重新保存
这一定是在以这种方式实现逻辑期间的假设。

但是,由于引用地址模型的方法 _beforeSave()设置报价ID,客户ID以及可能的客户地址ID和same_as_billing属性(通过_populateBeforeSaveData(),因此可以避免不必要的保存。

一种简单的方法 populateBeforeSaveData()是检查要在地址模型上设置的值是否已经存在于当前模型中,并且具有相同的值。

幸运的是,报价地址存储在平面表中,这意味着保存非常有效。除了一些B2B商店外,我还没有遇到过拥有几个地址的客户。


2

我会冒险猜测,这是没有经过深思熟虑的。

也许有人认为,与其更新任何新地址以及对默认账单和收货地址进行任何更改,不如仅保存所有内容就会更容易,因为人们不会拥有那么多地址,而结帐已经很慢了,人们不会注意到。 。

注意:这只是一个想法,但我认为值得分享,也可以想象自己做同样的假设:(


0

结帐期间的地址保存由_afterSave()-客户资源模型中的方法完成。

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

我记得在下订单时会保存客户模型。

干杯


是的,很明显。问题是“做什么用的?”。
user487772 2014年

@蒂姆:一般我认为。没有明显的原因可以结帐atm。
sbothner_mzentrale,2014年

@Tim:例如,管理员中的saveAction需要此行为。
sbothner_mzentrale 2014年

它需要什么?
user487772
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.