2

下面的代码对我来说可以很好地在magento下订单,但库存数量没有更新,它保持原样,但是当我从前端下订单时,下订单并更新库存,但是当我使用下面的代码下订单时一个订单,库存数量保持不变。下订单后,默认邮件也会成功发送给客户。

      $id=$custid; // get Customer Id
      $customer = Mage::getModel('customer/customer')->load($id);
      $transaction = Mage::getModel('core/resource_transaction');
      $storeId = $customer->getStoreId();
      $reservedOrderId = Mage::getSingleton('eav/config')->getEntityType('order')->fetchNewIncrementId($storeId);

      $order = Mage::getModel('sales/order')
        ->setIncrementId($reservedOrderId)
        ->setStoreId($storeId)
        ->setQuoteId(0)
        ->setGlobal_currency_code('USD')
        ->setBase_currency_code('USD')
        ->setStore_currency_code('USD')
        ->setOrder_currency_code('USD');

        // set Customer data
       $order->setCustomer_email($customer->getEmail())
        ->setCustomerFirstname($customer->getFirstname())
        ->setCustomerLastname($customer->getLastname())
        ->setCustomerGroupId($customer->getGroupId())
        ->setCustomer_is_guest(0)
        ->setCustomer($customer);

       // set Billing Address
       $billing = $customer->getDefaultBillingAddress();
       $billingAddress = Mage::getModel('sales/order_address')
         ->setStoreId($storeId)
         ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
         ->setCustomerId($customer->getId())
         ->setCustomerAddressId($customer->getDefaultBilling())
         ->setCustomer_address_id($billing->getEntityId())
         ->setPrefix($billing->getPrefix())
         ->setFirstname($billing->getFirstname())
         ->setMiddlename($billing->getMiddlename())
         ->setLastname($billing->getLastname())
         ->setSuffix($billing->getSuffix())
         ->setCompany($billing->getCompany())
         ->setStreet($billing->getStreet())
         ->setCity($billing->getCity())
         ->setCountry_id($billing->getCountryId())
         ->setRegion($billing->getRegion())
         ->setRegion_id($billing->getRegionId())
         ->setPostcode($billing->getPostcode())
         ->setTelephone($billing->getTelephone())
         ->setFax($billing->getFax());

        $order->setBillingAddress($billingAddress);
        $shipping = $customer->getDefaultShippingAddress();
        $shippingAddress = Mage::getModel('sales/order_address')
         ->setStoreId($storeId)
         ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
         ->setCustomerId($customer->getId())
         ->setCustomerAddressId($customer->getDefaultShipping())
         ->setCustomer_address_id($shipping->getEntityId())
         ->setPrefix($shipping->getPrefix())
         ->setFirstname($shipping->getFirstname())
         ->setMiddlename($shipping->getMiddlename())
         ->setLastname($shipping->getLastname())
         ->setSuffix($shipping->getSuffix())
         ->setCompany($shipping->getCompany())
         ->setStreet($shipping->getStreet())
         ->setCity($shipping->getCity())
         ->setCountry_id($shipping->getCountryId())
         ->setRegion($shipping->getRegion())
         ->setRegion_id($shipping->getRegionId())
         ->setPostcode($shipping->getPostcode())
         ->setTelephone($shipping->getTelephone())
         ->setFax($shipping->getFax());

       $order->setShippingAddress($shippingAddress)
         ->setShipping_method('flatrate_flatrate')
         ->setShippingDescription('flatrate');

       $orderPayment = Mage::getModel('sales/order_payment')
         ->setStoreId($storeId)
         ->setCustomerPaymentId(0)
         ->setMethod('purchaseorder')
         ->setPo_number(' - ');
       $order->setPayment($orderPayment);

          // let say, we have 2 products
          $subTotal = 0;
       $products = array('9' => array('qty' => 2),'18' =>array('qty' => 2));
       foreach ($products as $productId=>$product) {
           $_product = Mage::getModel('catalog/product')->load($productId);
           $rowTotal = $_product->getPrice() * $product['qty'];
           $orderItem = Mage::getModel('sales/order_item')
              ->setStoreId($storeId)
              ->setQuoteItemId(0)
              ->setQuoteParentItemId(NULL)
              ->setProductId($productId)
              ->setProductType($_product->getTypeId())
              ->setQtyBackordered(NULL)
              ->setTotalQtyOrdered($product['rqty'])
              ->setQtyOrdered($product['qty'])
              ->setName($_product->getName())
              ->setSku($_product->getSku())
              ->setPrice($_product->getPrice())
              ->setBasePrice($_product->getPrice())
              ->setOriginalPrice($_product->getPrice())
              ->setRowTotal($rowTotal)
              ->setBaseRowTotal($rowTotal);

            $subTotal += $rowTotal;
            $order->addItem($orderItem);
         }

        $order->setSubtotal($subTotal)
          ->setBaseSubtotal($subTotal)
          ->setGrandTotal($subTotal)
          ->setBaseGrandTotal($subTotal);

        $transaction->addObject($order);
        $transaction->addCommitCallback(array($order, 'place'));
        $transaction->addCommitCallback(array($order, 'save'));
        $transaction->save();
        $order->sendNewOrderEmail();
4

1 回答 1

2

添加下面的代码将更新数量,一切正常。

//get total quantity
$totalqty = (int)Mage::getModel('cataloginventory/stock_item')
           ->loadByProduct($productId)
           ->getQty();
//calculate new quantity
$newqty = $totalqty-$product['qty'];

//update new quantity
Mage::getModel('cataloginventory/stock_item')
       ->loadByProduct($productId)
       ->setQty($newqty)
       ->save();
于 2013-09-26T10:20:30.233 回答