¿Por qué Magento vuelve a guardar las direcciones de los clientes existentes durante el pago?

16

Durante el proceso de pago, incluso si el cliente selecciona el formulario de dirección existente, el menú desplegable de la customer_addressentidad se está volviendo a guardar. ¿Alguna idea de para qué?

Actualizar:

Comienza en Mage_Checkout_Model_Type_Onepage::saveOrderdonde se ejecuta el siguiente código:

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

Esto submitAllllama Mage_Sales_Model_Service_Quote::submitOrderque ejecuta lo siguiente:

$transaction->save();

Este método recorre todos los objetos de la cita (?) Y los guarda.

Actualizar:

Lo más desagradable es que lo están haciendo para todas las direcciones que tiene el cliente. Entonces, si su visitante obtiene 10 direcciones guardadas en la libreta de direcciones, todas se volverán a guardar durante el pago. No se pregunte por qué es la parte más consumidora de recursos de Magento.

usuario487772
fuente
En el customer_address_entityo en la cita?
Matthias Kleine
Lo siento, no estoy seguro de lo que quieres decir. La customer_addressentidad se guarda al realizar el pedido. No hay conexión para cotizar.
user487772
1
¿Puedes proporcionar el código que hace esto? Me ahorraría la molestia de buscar
Marius
Se actualizó la pregunta.
user487772
@Tim Supongo que la respuesta porque no pensaron bien sería una respuesta aceptable;) Supongo que no querían verificar si la dirección existe, por lo que sería más fácil / más lento guardar todo. Sin embargo, solo una suposición
David Manners

Respuestas:

6

Usualmente, a menos que los datos hayan cambiado en un modelo, llamar a save () en él no hará que el modelo se vuelva a guardar .
Esta debe haber sido la suposición durante la implementación de la lógica de esta manera.

Sin embargo, dado que el método del modelo de dirección de presupuesto _beforeSave() establece la ID de cotización, la ID de cliente, más posiblemente la ID de dirección de cliente y la same_as_billingpropiedad a través del _populateBeforeSaveData()método, se evita la protección contra el ahorro innecesario.

Una solución fácil en el método populateBeforeSaveData()sería verificar si los valores a punto de establecerse en el modelo de dirección ya están presentes en el modelo actual con el mismo valor.

Afortunadamente, las direcciones de cotizaciones se almacenan en una tabla plana, lo que significa que guardar es bastante eficiente. Y a excepción de algunas tiendas B2B, no he experimentado clientes que tengan más de un par de direcciones.

Vinaí
fuente
2

Me arriesgaría a adivinar que esto no fue pensado.

Tal vez se pensó que, en lugar de actualizar cualquier dirección nueva más cualquier cambio en la dirección de facturación y envío predeterminada, sería más fácil guardar todo, ya que las personas no tendrán tantas direcciones y el pago ya es lento, la gente no se dará cuenta ... mucho .

Nota: esta es solo una idea, pero pensé que valía la pena compartirla, también me imagino haciendo las mismas suposiciones :(

David modales
fuente
0

el guardado de direcciones durante el pago se realiza mediante _afterSave () - Método en el modelo de recursos del cliente.

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

Como recuerdo, el modelo del cliente se guarda durante el pedido.

salud

sbothner_mzentrale
fuente
Sí, eso estaba claro. La pregunta es "¿Para qué?".
user487772
@Tim: general, creo. No hay razón observable para el cajero automático.
sbothner_mzentrale
@Tim: por ejemplo saveAction en admin necesita este comportamiento.
sbothner_mzentrale
¿Para qué lo necesita?
user487772