Woher wissen Sie, ob eine Bestellung von einem bestehenden oder einem neuen Kunden stammt?

7

Ich habe folgenden Code:

    $lastOrderId = Mage::getSingleton('checkout/session')
        ->getLastRealOrderId();

    $orderId = Mage::getModel('sales/order')
        ->loadByIncrementId($lastOrderId)
        ->getEntityId();

    $order = Mage::getModel('sales/order')->load($orderId);
    echo $order;
    $udo = array();
    $udo['CID'] = '123';
    $udo['TYPE'] = '123';

Ich muss TYPE jedoch einen anderen Wert zuweisen, wenn die Bestellung von einem bestehenden Kunden oder von einem neuen Kunden stammt.

Irgendeine Idee>?

Luis Valencia
quelle

Antworten:

2

Sie können neue Kunden nach dem erstellten Bestellzeitpunkt unterscheiden:

$LastOrder=Mage::getModel('sales/order')->load($orderId);
$LastOrdertime= $LastOrder->getCreatedAt();

$OrderCollection=Mage::getModel('sales/order')->getCollection()->addFieldToFilter('customer_email',$LastOrder->getData('customer_email'))
            ->setOrder('created_at','asc');
$fstoredetime= $OrderCollection->getFirstItem()->getCreatedAt();    

if($fstoredetime==$LastOrdertime):
// new customer
else:
//old customer
endif;  
Amit Bera
quelle
Also bekommt dieser Code den Kunden, mit dem Kunden bekommt die erste Bestellung? Wenn sowohl die erste als auch die aktuelle Bestellung gleichzeitig sind, handelt es sich um einen neuen Kunden. wenn nicht ein bestehender Kunde.
Luis Valencia
ja .. richtig ....
Amit Bera
Abstimmung -1, weil es ein schlechter Ansatz ist. Es wird nicht empfohlen, am Erstellungsdatum zu bleiben.
Zhartaunik
Ich habe diesen Ansatz verwendet, aber stattdessen habe ich, wie @zhartaunik sagte, die Sammlung auf die gleiche Weise sortiert - und dann getFirstItem () -> getId () und diese mit der aktuellen orderId verglichen. Funktioniert gut, ohne die Unordnung, mit Daten umzugehen.
Barry Chapman
3

Im folgenden Ereignis anrufen:

Mage_Sales_Model_Service_Quote :: submitOrder

Mage::dispatchEvent('checkout_type_onepage_save_order', array('order'=>$order, 'quote'=>$quote));

Wir haben zwei Entitäten mit dem Wert customer_id. Wenn wir einen bestehenden Kunden haben, $order->getCustomerId()wird der echte Ausweis zurückgegeben . Wenn der Kunde gerade erstellt wurde, gibt er true zurück .

Wenn Sie also etwas auf Bestellung basierend auf dem Kunden (neu / alt) anwenden möchten, führen Sie den Beobachter aus:

if ($observer->getOrder()->getCustomerId() === true) {
    //here goes code for customer, which was just created
} elseif ($observer->getOrder()->getCustomerId() > 0) {
    //here goes code for old customer
} elseif ($observer->getOrder()->getCustomerId() === null) {
    //here goes code for guest
}

Erläuterung:

Mage_Checkout_Model_Type_Onepage :: saveOrder

/**
 * Create order based on checkout type. Create customer if necessary.
 *
 * @return Mage_Checkout_Model_Type_Onepage
 */
public function saveOrder()
{
    $this->validate();
    $isNewCustomer = false;
    switch ($this->getCheckoutMethod()) {
        case self::METHOD_GUEST:
            $this->_prepareGuestQuote();
            break;
        case self::METHOD_REGISTER:
            $this->_prepareNewCustomerQuote();
            $isNewCustomer = true;
            break;
        default:
            $this->_prepareCustomerQuote();
            break;
    }

Schauen wir uns drei geschützte Methoden an: _prepareGuestQuote (), _prepareNewCustomerQuote (), _prepareCustomerQuote ()

/**
 * Prepare quote for guest checkout order submit
 *
 * @return Mage_Checkout_Model_Type_Onepage
 */
protected function _prepareGuestQuote()
{
    $quote = $this->getQuote();
    $quote->setCustomerId(null)

Wie Sie sehen können, hat der Gastkunde den Wert Null


/**
 * Prepare quote for customer registration and customer order submit
 *
 * @return Mage_Checkout_Model_Type_Onepage
 */
protected function _prepareNewCustomerQuote()
{
    ...
    $quote->setCustomer($customer)
        ->setCustomerId(true);
}

Für Neukunden setzen wir wahr


/**
 * Prepare quote for customer order submit
 *
 * @return Mage_Checkout_Model_Type_Onepage
 */
protected function _prepareCustomerQuote()
{
    $quote      = $this->getQuote();
    $billing    = $quote->getBillingAddress();
    $shipping   = $quote->isVirtual() ? null : $quote->getShippingAddress();

    $customer = $this->getCustomerSession()->getCustomer();
    ...
    $quote->setCustomer($customer);
}

Für bestehende Kunden nehmen wir das Objekt aus der Sitzung. Wie Sie verstehen, hat dieses Objekt den Wert customer_id.

zhartaunik
quelle
1

$ order-> getCustomerId () sollte für Gast Null zurückgeben, wenn ich mich recht erinnere.

Amasty
quelle
ya.Amasty, Sie haben Recht, also benutze ich customer_email
Amit Bera
/ ** * Angebot für Gastkasse vorbereiten Bestellung senden * * @return Mage_Checkout_Model_Type_Onepage * / geschützte Funktion _prepareGuestQuote () {$ quote = $ this-> getQuote (); $ quote-> setCustomerId (null)
zhartaunik