0

だから、ここに私の問題があります:顧客が新しい注文を出し、彼/彼女がバックオーダーされたアイテムを含む既存の保留中の注文を持っている場合、2 つの注文をマージする必要があります。そこで、イベントでオブザーバーを作成しましたsales_model_service_quote_submit_before。このオブザーバーでは、顧客のメールをチェックし、保留中の注文があるかどうかを確認するという考えでした。そのような注文が存在する場合、古い注文の商品を新しい注文に入れ、古い注文を削除/キャンセルします。これが私の機能です:

public function salesQuoteSubmitBefore($observer){
$customerEmail = $observer->getQuote()->getData('customer_email');
    $customer = Mage::getModel("customer/customer");
    $customer->setWebsiteId(Mage::app()->getStore());
    $customer->loadByEmail($customerEmail);

    $oldOrder = Mage::getResourceModel('sales/order_collection')
    ->addFieldToSelect('increment_id')
    ->addFieldToFilter('customer_id', $customer->getId())
    ->addFieldToFilter('state', array('in' => array('new')))
    ->addFieldToFilter('status', array('in' => array('pending')))
    ->setOrder('created_at', 'desc')
    ->setPageSize(1);
    $oldID = $oldOrder->getData();

    if($oldID[0]['increment_id'] != '' && $oldID[0]['increment_id'] > 0){
        $mergeOrder = false;
        $order = Mage::getModel('sales/order')->loadByIncrementId($oldID[0]['increment_id']);
        foreach($order->getAllItems() as $item){
            $product = Mage::getModel('catalog/product')->load($item->getProduct()->getId());
            if($product->getStockItem()->getQty() < 0){
                $mergeOrder = true; 
            }   
        }

        if($mergeOrder){
            $newOrder = $observer->getOrder();
            $quote = $newOrder->getQuote();

            $tmp = array();
            foreach($order->getAllItems() as $item){
                $tmp[] = $item->getSku();
                $product = Mage::getModel('catalog/product')->load($item->getProduct()->getId());
                $qty = array('qty'=>$item->getQty());
                $quote->addProduct($product, new Varien_object($qty));
            }

            foreach($quote->getAllAddresses() as $a){
                $a->unsetData('cached_items_nonnominal');
                $a->unsetData('cached_items_nominal');
            }

            $quote->setTotalsCollectedFlag(false)->collectTotals();
            $quote->save();

            $newOrder->setQuote($quote)->save();
            $order->setState(Mage_Sales_Model_Order::STATE_CANCELED, true)->save();
            //Mage::throwException('obs: '.json_encode($newOrder->getQuote()->getData()));
        }
    }
}

Mage:throwExeption は新しい見積もりを出力し、すべてが正しく、数量、合計...そして、newOrder を出力するとすべてが正しくなります! ただし、注文時には古いデータが使用されるため、新しい注文には古いアイテムがありません。

新しいデータが注文の作成に使用されるように、変更された注文/見積もりを何またはどこに保存しますか? ご協力ありがとうございました!

4

1 に答える 1

0

見積書に製品を追加する代わりに、カートに追加してみてください。以下のように

$cart =Mage::getSingleton('checkout/cart');
$cart->addProduct($product, array('qty'=>$qty)); 
$cart->save();
于 2014-02-25T14:12:08.723 に答える