Почему Magento повторно сохраняет существующие адреса клиентов во время оформления заказа?

16

В процессе оформления заказа, даже если клиент выбирает существующий адрес из раскрывающегося списка, customer_addressсущность повторно сохраняется. Есть идеи для чего?

Обновить:

Он начинается Mage_Checkout_Model_Type_Onepage::saveOrderтам, где выполняется следующий код:

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

Это submitAllвызовы, Mage_Sales_Model_Service_Quote::submitOrderкоторые выполняют следующее:

$transaction->save();

Этот метод перебирает все объекты в кавычках (?) И сохраняет их.

Обновить:

Самое отвратительное в том, что они делают это по всем адресам клиентов. Таким образом, если ваш посетитель получит 10 адресов, сохраненных в адресной книге, все они будут повторно сохранены во время оформления заказа. Не удивляйтесь, почему это самая ресурсоемкая часть Magento.

user487772
источник
В customer_address_entityили в цитате?
Матиас Кляйн
Извините, не уверен, что вы имеете в виду. Объект customer_addressсохраняется во время размещения заказа. Нет связи, чтобы цитировать.
user487772
1
Можете ли вы предоставить код, который делает это? Это избавило бы меня от необходимости поиска
Мариус
Обновил вопрос.
user487772
@ Я думаю, что ответ, потому что они не продумали его, был бы приемлемым ответом;) Я думаю, что они не хотели проверять, существует ли адрес, поэтому было бы легче / ленивее сохранить все. Только предположение, хотя
Дэвид Мэннерс

Ответы:

6

Обычно, если данные в модели не изменились, вызов метода save () не приведет к повторному сохранению модели .
Это должно быть предположение при реализации логики таким образом.

Однако, поскольку метод модели адреса котировки _beforeSave()устанавливает идентификатор цитаты, идентификатор клиента плюс, возможно, идентификатор адреса клиента и same_as_billingсвойство с помощью _populateBeforeSaveData()метода, защита от ненужного сохранения обходится.

Простым исправлением в методе populateBeforeSaveData()было бы проверить, будут ли значения, которые должны быть установлены в модели адреса, уже присутствовать в текущей модели с тем же значением.

К счастью, адреса в кавычках хранятся в плоской таблице, что означает, что сохранение довольно эффективно. И за исключением некоторых магазинов B2B, у меня не было опытных клиентов, у которых было больше пары адресов.

Vinai
источник
2

Я рискнул бы предположить, что это не было продумано.

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

Примечание: это просто идея, но я подумал, что стоит поделиться, и я могу представить, что делаю те же предположения :(

Дэвид Мэннерс
источник
0

сохранение адреса во время оформления заказа осуществляется с помощью _afterSave () - метода в модели ресурсов клиента.

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

насколько я помню модель клиента сохраняется во время размещения заказа.

ура

sbothner_mzentrale
источник
Да, это было ясно. Вопрос «Зачем?».
user487772
@Tim: вообще я думаю. Нет очевидных причин для проверки банкомата.
sbothner_mzentrale
@Tim: Например, saveAction в admin нуждается в таком поведении.
sbothner_mzentrale
Зачем это нужно?
user487772