次のイベント呼び出しでは:
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値があります。