Làm thế nào để biết nếu một đơn đặt hàng là từ khách hàng hiện tại hoặc khách hàng mới?


7

Tôi có đoạn mã sau:

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

nhưng tôi cần gán một giá trị khác cho TYPE, nếu đơn đặt hàng là từ một khách hàng hiện tại hoặc từ một khách hàng mới.

có ý kiến ​​gì không?

Câu trả lời:


2

bạn có thể tìm khách hàng mới theo thời gian đặt hàng:

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

Vì vậy, mã này có được khách hàng, với khách hàng có được đơn đặt hàng đầu tiên? nếu cả đơn hàng đầu tiên và đơn hàng hiện tại cùng một lúc, thì đó là một khách hàng mới. nếu không phải là khách hàng hiện tại
Luis Valencia

vâng .. đúng ....
Amit Bera

Bỏ phiếu -1 vì đó là cách tiếp cận tồi. Không đề nghị treo vào ngày created_at.
zhartaunik

Tôi đã sử dụng phương pháp này, nhưng thay vào đó, như @zhartaunik đã nói, tôi đã sắp xếp bộ sưu tập theo cùng một cách - và sau đó getFirstItem () -> getId () và so sánh nó với orderId hiện tại. Hoạt động tốt, không có sự lộn xộn của việc xử lý ngày.
Barry Chapman

3

Trong cuộc gọi sau:

Mage_Sales_Model_Service_Quote :: submitOrder

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

Chúng tôi có hai thực thể có giá trị customer_id. Khi chúng tôi có khách hàng hiện tại - sau đó $order->getCustomerId()sẽ trả lại ID thật của nó . Nếu khách hàng chỉ được tạo - thì nó trả về đúng .

Vì vậy, nếu bạn muốn áp dụng một cái gì đó để đặt hàng dựa trên khách hàng (là mới / cũ) chạy trong trình quan sát:

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
}

Giải trình:

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

Chúng ta hãy xem ba phương thức được bảo vệ: _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)

Như bạn có thể thấy khách hàng có giá trị null


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

Đối với khách hàng mới, chúng tôi đang thiết lập đúng


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

Đối với khách hàng hiện tại, chúng tôi sẽ lấy đối tượng của nó từ phiên. Như bạn hiểu - đối tượng này sẽ có giá trị customer_id.


1

$ order-> getCustomerId () sẽ trả về số 0 cho khách nếu tôi nhớ đúng.


ya. Thật thú vị, bạn đã đúng, vì vậy tôi đang sử dụng customer_email
Amit Bera

/ ** * Chuẩn bị báo giá cho đơn đặt hàng thanh toán của khách gửi * * @return Mage_Checkout_Model_Type_Onepage * / chức năng được bảo vệ _prepareGuestQuote () {$ quote = $ this-> getQuote (); $ quote-> setCustomerId (null)
zhartaunik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.