将magento管理报价转换为多地址订单

将magento管理报价转换为多地址订单,magento,Magento,假设我有一个来自管理员创建订单的报价,所有产品都已输入,我如何编写一些代码来添加多个发货地址并将商品分配到该地址 我有一些代码在工作,它是基于前端多芯片模型的。我遇到的问题是添加多个地址并将项目分配给报价。如果我有一个标准报价,我如何添加多个地址 我已经试过了: $address = Mage::getModel('customer/address')->load($addressID); $quote->addShippingAddress($address); 似乎只有一个

假设我有一个来自管理员创建订单的报价,所有产品都已输入,我如何编写一些代码来添加多个发货地址并将商品分配到该地址

我有一些代码在工作,它是基于前端多芯片模型的。我遇到的问题是添加多个地址并将项目分配给报价。如果我有一个标准报价,我如何添加多个地址

我已经试过了:

 $address = Mage::getModel('customer/address')->load($addressID);
 $quote->addShippingAddress($address);
似乎只有一个地址

整个功能:

 public function createMultiOrders() {
    // print_r($_POST);
    $items = $_POST['item'];
    $itemsByAddress = array();
    $billingInfo = array();
    $session = Mage::getSingleton('adminhtml/session_quote');
        $quote = $session->getQuote();

        //first we are reorganizing the data provided by javascript into an array based on address ID's
        foreach ($items as $key => $item) {
            $addID = $item['addressID'];
            $itemID = $key;
            $qty = $item['qty'];
            $itemsByAddress[$addID][] = array('itemID' => $itemID, 'qty' => $qty);
        }
        // print_r($itemsByAddress);
        //now that we have an array of items, seperated by which addressid they goto, we can create the order for each address

        foreach ($itemsByAddress as $addressID => $items) {
            $address = Mage::getModel('customer/address')->load($addressID); 
            $quote->addShippingAddress($address);
            echo"<br/>address id is $addressID, items are: <br/>"; 
            foreach ($items as $item) {
                // $address->addItem($_item);
                ///add items to order
                //  echo"id before is $item<br/>";
                $itemID = explode('-_', $item['itemID']);
                $itemID = $itemID[0];
                $qty = $item['qty'];
                echo "itemid is $itemID, qty is " . $qty . " <br/><br/><br/><br/>";
            }
        }
        //print_r(get_class_methods($quote));
        $shippingAddresses = $quote->getAllShippingAddresses();
        try {
            foreach ($shippingAddresses as $address) { 
                $order = $this->_prepareOrder($address);

                $orders[] = $order;
                Mage::dispatchEvent(
                        'checkout_type_multishipping_create_orders_single', array('order' => $order, 'address' => $address)
                );
            }

            foreach ($orders as $order) {
                $order->place();
                $order->save();
                if ($order->getCanSendNewEmailFlag()) {
                    $order->sendNewOrderEmail();
                }
                $orderIds[$order->getId()] = $order->getIncrementId();
            }

            Mage::getSingleton('core/session')->setOrderIds($orderIds);
            Mage::getSingleton('checkout/session')->setLastQuoteId($quote->getId());

            $quote->setIsActive(false)->save();

            Mage::dispatchEvent('checkout_submit_all_after', array('orders' => $orders, 'quote' => $quote));

            return $this;
        } catch (Exception $e) {
            Mage::dispatchEvent('checkout_multishipping_refund_all', array('orders' => $orders));
            throw $e;
        }
公共函数createMultiOrders(){
//打印(邮政美元);
$items=$_POST['item'];
$itemsByAddress=array();
$billingInfo=array();
$session=Mage::getSingleton('adminhtml/session_quote');
$quote=$session->getQuote();
//首先,我们根据地址ID将javascript提供的数据重新组织成一个数组
foreach($key=>$item的项目){
$addID=$item['addressID'];
$itemID=$key;
$qty=$item['qty'];
$itemsByAddress[$addID][]=数组('itemID'=>$itemID,'qty'=>$qty);
}
//打印地址($itemsByAddress);
//现在我们有了一个项目数组,按它们转到的地址ID分开,我们可以为每个地址创建订单
foreach($itemsByAddress作为$addressID=>$items){
$address=Mage::getModel('customer/address')->load($addressID);
$quote->addShippingAddress($address);
echo“
地址id为$addressID,项目为:
”; foreach($items作为$item){ //$address->addItem($\项); ///向订单添加项目 //echo“前面的id是$item
”; $itemID=explode('-\',$item['itemID']); $itemID=$itemID[0]; $qty=$item['qty']; echo“itemid是$itemid,qty是“$qty”。




; } } //打印(获取类方法($quote)); $shippingAddresses=$quote->getAllShippingAddresses(); 试一试{ foreach($shippingAddresses作为$address){ $order=$this->\u prepareOrder($address); $orders[]=$order; Mage::dispatchEvent( “签出类型多发货创建订单单”,数组('order'=>$order,'address'=>$address) ); } foreach($orders作为$order){ $order->place(); $order->save(); 如果($order->getCanSendNewEmailFlag()){ $order->sendNewOrderEmail(); } $orderIds[$order->getId()]=$order->getIncrementId(); } Mage::getSingleton('core/session')->setOrderIds($orderIds); Mage::getSingleton('checkout/session')->setLastQuoteId($quote->getId()); $quote->setIsActive(false)->save(); Mage::dispatchEvent('checkout\u submit\u all\u after',数组('orders'=>$orders,'quote'=>$quote)); 退还$this; }捕获(例外$e){ Mage::dispatchEvent('checkout\u multishipping\u return\u all',数组('orders'=>$orders)); 扔$e; }
好的,我解决了这个问题,并成功地编写了一个脚本,将普通的管理订单转换为多地址订单。一直困扰我的一个错误是我加载管理报价的方式:

我是这样加载会话的

$session = Mage::getSingleton('adminhtml/session_quote');
应该是这样

$session = Mage::getModel('adminhtml/session_quote');
现在,将每个报价项分配到一个地址,最终代码如下所示:

$address = Mage::getModel('customer/address')->load($addressID);
echo"<br/>address id is $addressID<br/>";

echo"quote address not set, adding shipping address <br/>";
$quoteAddress = Mage::getModel('sales/quote_address')->importCustomerAddress($address);
$quote->addShippingAddress($quoteAddress);
$quoteAddressItem = $quoteAddress->getItemByQuoteItemId($quoteItem->getId());
if ($quoteAddressItem) {
  echo"increasing item quantitiy for quote address<br/>";
  // $quoteAddressItem->setQty((int) ($quoteAddressItem->getQty() + $qty));
} else {
echo"setting customer id for quote item<br/>";
$quoteItem->setCustomerAddressId($quoteAddress->getCustomerAddressId());
echo"adding item to quote address<br/>";
$quoteAddress->addItem($quoteItem)->setQuote($quote);
echo"adding item to quote collection<br/>";


if (!$quoteAddress->getItemsCollection()->getItemById($quoteItem->getId())) {
    $quoteAddress->getItemsCollection()->addItem($quoteItem)->save();
}
$quoteAddress->setCollectShippingRates(TRUE);
$quoteAddress->collectShippingRates();
$quoteAddress->save();
$quoteItem->save();
$quote->save();
$address=Mage::getModel('customer/address')->load($addressID);
echo“
地址id为$addressID
”; echo“未设置报价地址,添加发货地址
”; $quoteAddress=Mage::getModel('sales/quote_address')->导入客户地址($address); $quote->addShippingAddress($quoteAddress); $QuotedAddressItem=$QuotedAddress->getItemByQuoteItemId($quoteItem->getId()); 如果($quoteAddressItem){ 回显“增加报价地址的项目数量
”; //$QuotedDressItem->setQty((int)($QuotedDressItem->getQty()+$qty)); }否则{ echo“为报价项设置客户id
”; $quoteItem->setCustomerAddressId($quoteAddress->getCustomerAddressId()); echo“将项目添加到报价地址
”; $quoteAddress->addItem($quoteItem)->setQuote($quote); echo“将项目添加到报价集合
”; 如果(!$quoteAddress->getItemsCollection()->getItemById($quoteItem->getId()){ $quoteAddress->getItemsCollection()->addItem($quoteItem)->save(); } $quoteAddress->setCollectShippingRates(真); $quoteAddress->collectShippingRates(); $quoteadress->save(); $quoteItem->save(); $quote->save();

}

我只是想澄清一下,您实际上是在试图为管理员复制前端多地址订单功能吗?是的,没错。我实际上可以通过其他方式完成这项工作。我们将其作为一个扩展发布。该扩展为magento admin添加了多地址订单功能,但目前该功能不存在。@MSD您是否能够创建e此扩展?它是否也考虑购物车规则?我们是否可以有相同的地址,并且仍然按照我的情况将订单分为两部分?某些产品可以使用特定的装运方式装运,因此我需要有两个订单,每个订单具有单独的装运方式,但装运地址相同。