注文が既存の顧客からのものか、新しい顧客からのものかを知る方法は?


7

私は次のコードを持っています:

    $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';

しかし、注文が既存の顧客からのものか、新しい顧客からのものである場合は、TYPEに別の値を割り当てる必要があります。

どんな考え>?

回答:


2

作成された注文時間で新しい顧客を比較できます。

$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;  

このコードは顧客を取得し、顧客は最初の注文を取得しますか?最初の注文と現在の注文の両方が同時にある場合、その新しい顧客です。既存の顧客でない場合。
Luis Valencia

はい...右....
アミットベラ

悪いアプローチなので投票-1。created_at日付でハングすることはお勧めしません。
zhartaunik 2017

私はこのアプローチを使用しましたが、代わりに@zhartaunikが言ったように、コレクションを同じ方法でソートし、次にgetFirstItem()-> getId()を実行して、それを現在のorderIdと比較します。日付を扱う面倒なことなく、うまく機能します。
バリーチャップマン

3

次のイベント呼び出しでは:

Mage_Sales_Model_Service_Quote :: submitOrder

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

customer_id値を持つ2つのエンティティがあります。既存のお客様がいる場合は、実際のID$order->getCustomerId()を返します。顧客が作成されたばかりの場合-trueを返します

したがって、オブザーバーで実行される顧客(新/旧)に基づいて注文に何かを適用したい場合:

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
}

説明:

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;
    }

3つの保護されたメソッドを見てみましょう:_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)

ご覧のとおり、ゲストの顧客はnull値を持っています


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

新規顧客のために私たちは真実を設定しています


/**
 * 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);
}

既存の顧客の場合、セッションからオブジェクトを取得します。ご理解のとおり、このオブジェクトにはcustomer_id値があります。


1

$ order-> getCustomerId()は、私が正しく覚えている場合、ゲストに対してゼロを返すはずです。


ya.Amasty、あなたは正しいので、customer_emailを使用しています
Amit Bera

/ ** *ゲストチェックアウトオーダー送信用の見積もりを準備します* * @return Mage_Checkout_Model_Type_Onepage * / protected function _prepareGuestQuote(){$ quote = $ this-> getQuote(); $ quote-> setCustomerId(null)
zhartaunik 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.