Dlaczego Magento ponownie zapisuje istniejące adresy klientów podczas realizacji transakcji?

16

Podczas realizacji transakcji, nawet jeśli klient wybierze istniejący adres z menu rozwijanego, customer_addressjednostka jest ponownie zapisywana. Masz pomysł po co?

Aktualizacja:

Zaczyna się w Mage_Checkout_Model_Type_Onepage::saveOrdermiejscu wykonania następującego kodu:

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

Te submitAllrozmowy Mage_Sales_Model_Service_Quote::submitOrder, który wykonuje następujące czynności:

$transaction->save();

Ta metoda zapętla wszystkie obiekty cytatu (?) I zapisuje je.

Aktualizacja:

Najbardziej obrzydliwe jest to, że robią to dla wszystkich adresów, które posiada klient. Jeśli więc odwiedzający otrzyma 10 adresów zapisanych w książce adresowej, wszystkie zostaną zapisane ponownie podczas realizacji transakcji. Nie zastanawiaj się, dlaczego jest to najbardziej pochłaniająca zasoby część Magento.

użytkownik487772
źródło
W customer_address_entityczy w cytacie?
Matthias Kleine
Przepraszam, nie jestem pewien, co masz na myśli. Obiekt customer_addressjest zapisywany podczas składania zamówienia. Brak połączenia do wyceny.
user487772
1
Czy możesz podać kod, który to robi? Oszczędziłoby mi to kłopotów z wyszukiwaniem
Marius
Zaktualizowałem pytanie.
user487772
@Tim Myślę, że odpowiedź, ponieważ nie uważali, że to będzie odpowiednia odpowiedź;) Domyślam się, że nie chcieli sprawdzić, czy adres istnieje, więc łatwiej / leniwiej byłoby zapisać wszystko. Tylko przypuszczenie
David Manners

Odpowiedzi:

6

Zwykle, chyba że dane uległy zmianie w modelu, wywołanie na nim save () nie spowoduje ponownego zapisania modelu .
Musiało to być założenie podczas implementacji logiki w ten sposób.

Ponieważ jednak metoda modelu adresu wyceny _beforeSave()ustawia identyfikator wyceny, identyfikator klienta oraz ewentualnie identyfikator adresu klienta i same_as_billingwłaściwość za pośrednictwem tej _populateBeforeSaveData()metody, ochrona przed niepotrzebnym zapisywaniem jest obchodzona.

Łatwym rozwiązaniem w tej metodzie populateBeforeSaveData()byłoby sprawdzenie, czy wartości, które mają być ustawione w modelu adresu, który jest już obecny w bieżącym modelu o tej samej wartości.

Na szczęście adresy cytatów są przechowywane w płaskiej tabeli, co oznacza, że ​​zapis jest dość wydajny. Poza niektórymi sklepami B2B nie spotkałem klientów posiadających więcej niż kilka adresów.

Vinai
źródło
2

Zaryzykowałbym przypuszczenie, że nie zostało to przemyślane.

Może uważano, że zamiast aktualizować nowy adres plus zmianę domyślnego adresu rozliczeniowego i wysyłkowego, łatwiej byłoby po prostu zapisać wszystko, ponieważ ludzie nie będą mieli tak wielu adresów, a kasa jest już wolna, ludzie nie zauważą ... dużo .

Uwaga: to tylko pomysł, ale pomyślałem, że warto się nim podzielić, mogę też sobie wyobrazić, że mam takie same założenia :(

David Manners
źródło
0

zapisywanie adresu podczas finalizacji odbywa się przez _afterSave () - Metoda w modelu zasobów klienta.

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

jak pamiętam model klienta zostaje zapisany podczas składania zamówienia.

Twoje zdrowie

sbothner_mzentrale
źródło
Tak, to było jasne. Pytanie brzmi „Po co?”.
user487772
@Tim: generalnie myślę. Brak widocznego powodu bankomatu do kasy.
sbothner_mzentrale
@Tim: Na przykład saveAction w admin potrzebuje tego zachowania.
sbothner_mzentrale
Po co to jest potrzebne?
user487772