2015-09-24 14 views
13

Nakliye işlemini Magento'daki mevcut bir siparişte değiştirmeye çalışıyorum. Bu, gönderim adresi nesnesinde yeni gönderim yöntemini ayarladıktan ve teklif toplamlarını yeniden hesapladıktan sonra sipariş alanlarının/özniteliklerin birçoğunu el ile güncellemem gerektiğinden, bu işlem oldukça verimli olsa bile, yönetici arka planından iyi çalışır.Magento: Mevcut sipariş üzerinde gönderim yöntemini değiştir

Sorunum, aynı kodu ön uçta çalıştırırken, hiç çalışmıyor, quoteToTotals, shippingAddress'de yaptığım tüm değişiklikleri geri döndürecek ve nasıl çözüleceğine veya neden çözüleceğine dair hiçbir fikrim yok. arka uçtan çalışır.

$shippingAddress = $quote->getShippingAddress(); 

    $shippingAddress->setShippingMethod('dynamicshipping_'.$shippingCode); 
    $shippingAddress->setCollectShippingRates(true); 
    $shippingAddress->collectShippingRates(); 

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

    $order->setShippingHiddenTaxAmount($shippingAddress->getShippingHiddenTaxAmount()); 
    $order->setBaseShippingHiddenTaxAmount($shippingAddress->getBaseShippingHiddenTaxAmount()); 
    $order->setBaseShippingHiddenTaxAmnt($shippingAddress->getBaseShippingHiddenTaxAmnt()); 
    $order->setShippingInclTax($shippingAddress->getShippingInclTax()); 
    $order->setBaseShippingInclTax($shippingAddress->getBaseShippingInclTax()); 
    $order->setShippingTaxAmount($shippingAddress->getShippingTaxAmount()); 
    $order->setBaseShippingTaxAmount($shippingAddress->getBaseShippingTaxAmount()); 
    $order->setShippingAmount($shippingAddress->getShippingAmount()); 
    $order->setBaseShippingAmount($shippingAddress->getBaseShippingAmount()); 
    $order->setShippingDiscountAmount($shippingAddress->getShippingDiscountAmount()); 
    $order->setBaseShippingDiscountAmount($shippingAddress->getBaseShippingDiscountAmount()); 
    $order->setGrandTotal($shippingAddress->getGrandTotal()); 
    $order->setBaseGrandTotal($shippingAddress->getBaseGrandTotal()); 
    $order->setShippingMethod('dynamicshipping_'.$shippingCode); 
    $order->setShippingDescription($shippingDescription); 

    $order->setServicePoint($servicePoint); 
    $order->save(); 

Ve dediğim gibi bu arka uç ince her zaman çalıştı, ama Önyüzden aramadı zaman:

Bu görünüyordu nasıl.

Eski nakliye yönteminin herhangi bir izini denemek ve yok etmek için şanssız bir şekilde, bu gibi varyasyonları denedim. Ben collectTotals çağırıyorum zaman alıntı olursa olsun benim yaptığım, sevkıyat adresi eski/diffrent kopyasını kullanıyor sanki

$quote->getShippingAddress()->removeAllShippingRates() 
     ->setShippingMethod('dynamicshipping_'.$shippingCode) 
     ->setShippingDescription($shippingDescription) 
     //->setBaseShippingAmount(0) 
     //->setBaseShippingTaxAmount(0) 
     //->setShippingTaxAmount(0) 
     //->setShippingInclTax(0) 
     ->setCollectShippingRates(true) 
     //->unsetData('cached_items_all') 
     //->unsetData('cached_items_nominal') 
     //->unsetData('cached_items_nonnominal') 
     ->collectShippingRates() 
     //->collectTotals() 
     ->save(); 

Bana bakıyor.

Önceden değil, arka uçta çalışmanın nasıl mümkün olabileceğine dair herhangi bir öneri, ya da belki bir kavrayış?

DÜZENLEME daha ayıklama sonra, gönderim önyüzü ve arka uçta hem değiştirmek olmadığını görebiliriz. Sorun şu ki, ücret sadece bu kodu arka uçtan geçirirken değişecektir. Çok ilginç. Sadece nakliye ücretini güncellemeyi reddediyor.

+0

Daha eksiksiz bir kod (snippet'inizi nereye koydunuz) ve kullanım durumunuz hakkında daha fazla bilgi verebilir misiniz? Sorunuza cevap vermek için biraz bağlama ihtiyacım var. –

+0

Bu tam bir koddur ve gönderim sırasına göre değiştirildiği zaman yönetici ve ön uçtan çalıştırıyorum –

+0

Hangi sınıfı snippet'inize yazdınız ve bu kodu ön uçtan nasıl almayı teklif ediyorsunuz? –

cevap

2

CollectTotals üzerinde bir gözlemci ile bazı sorunlar yaşadım, bu da olayın başlatılmadığı arka planda çalışmasının nedeni.

Tüm alanları yeniden siparişe kopyalamak için daha güvenli bir yöntem kullanmak için son değiştirdiğim tam bir başvuru kodu.

/* @var $order Mage_Sales_Model_Order */ 
    /* @var $quote Mage_Sales_Model_Quote */ 

    $shippingAddress = $quote->getShippingAddress(); 
    $shippingAddress->setShippingMethod('dynamicshipping_'.$shippingCode); 
    $shippingAddress->setShippingDescription($shippingDescription); 

    $shippingAddress->setCollectShippingRates(true)->collectShippingRates(); 
    $quote->collectTotals(); 

    if ($this->updateMagentoOrder($order, $quote)) { 

     // here's where I check if we successfully updated the authorized 
     // amount at the payment gateway, before saving anything 
     // wrapping the payment update and save in a try-catch 

     $quote->save(); 
     $order->save(); 
    } 

Ve tüm sipariş alanlarını güncellemek için bu yöntemi kullanarak: Referans olarak

/** 
* Updates a Magento order based on quote changes 
* will not save anything, up to the caller. 
* deleting items not supported. 
* 
* @param $order Mage_Sales_Model_Order 
* @param $quote Mage_Sales_Model_Quote 
* @return bool 
*/ 
public function updateMagentoOrder($order, $quote) { 
    if (!$order instanceof Mage_Sales_Model_Order || !$quote instanceof Mage_Sales_Model_Quote) { 
     return false; 
    } 

    try { 
     $converter = Mage::getSingleton('sales/convert_quote'); 
     $converter->toOrder($quote, $order); 

     foreach ($quote->getAllItems() as $quoteItem) { 

      $orderItem  = $converter->itemToOrderItem($quoteItem); 
      $quoteItemId = $quoteItem->getId(); 
      $origOrderItem = empty($quoteItemId) ? null : $order->getItemByQuoteItemId($quoteItemId); 

      if ($origOrderItem) { 
       $origOrderItem->addData($orderItem->getData()); 
      } else { 
       if ($quoteItem->getParentItem()) { 
        $orderItem->setParentItem(
         $order->getItemByQuoteItemId($quoteItem->getParentItem()->getId()) 
        ); 
        $orderItem->setParentItemId($quoteItem->getParentItemId()); 
       } 
       $order->addItem($orderItem); 
      } 
     } 

     if ($shippingAddress = $quote->getShippingAddress()) { 
      $converter->addressToOrder($shippingAddress, $order); 
     } 
    } catch (Exception $e) { 
     Mage::logException($e); 
     return false; 
    } 

    return true; 
} 

, yukarıdaki yöntemi döngü $order->getAllItems() olabilir ve ilk üzerlerinde $orderItem->cancel()->delete(); yapmak - ama öğeleri silme hakkı desteklemeyeceğini şimdi. Silme işleminden önce, cancel()cancel() bölümünün parçası, stoğun geri yüklenmesini sağlayacak şekilde böyledir. sales_order_item_cancel olayını dinliyor.

İlgili konular