コード例 #1
0
 /**
  * Push trackEcommerceOrder to tracker on checkout success page
  *
  * @param \Magento\Framework\Event\Observer $observer
  * @return \Henhed\Piwik\Observer\CheckoutSuccessObserver
  */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
     $orderIds = $observer->getEvent()->getOrderIds();
     if (!$this->_dataHelper->isTrackingEnabled() || empty($orderIds) || !is_array($orderIds)) {
         return $this;
     }
     $collection = $this->_orderCollectionFactory->create();
     $collection->addFieldToFilter('entity_id', ['in' => $orderIds]);
     // Group order items by SKU since Piwik doesn't seem to handle multiple
     // `addEcommerceItem' with the same SKU.
     $piwikItems = [];
     // Aggregate all placed orders into one since Piwik seems to only
     // register one `trackEcommerceOrder' per request. (For multishipping)
     $piwikOrder = [];
     foreach ($collection as $order) {
         /* @var $order \Magento\Sales\Model\Order */
         foreach ($order->getAllVisibleItems() as $item) {
             /* @var $item \Magento\Sales\Model\Order\Item */
             $sku = $item->getSku();
             $name = $item->getName();
             $price = (double) $item->getBasePriceInclTax();
             $qty = (double) $item->getQtyOrdered();
             if (!isset($piwikItems[$sku])) {
                 $piwikItems[$sku] = [$sku, $name, $price * $qty, $qty];
             } else {
                 // Aggregate row total instead of unit price in case there
                 // are different prices for the same SKU.
                 $piwikItems[$sku][2] += $price * $qty;
                 $piwikItems[$sku][3] += $qty;
             }
         }
         $orderId = $order->getIncrementId();
         $grandTotal = (double) $order->getBaseGrandTotal();
         $subTotal = (double) $order->getBaseSubtotalInclTax();
         $tax = (double) $order->getBaseTaxAmount();
         $shipping = (double) $order->getBaseShippingInclTax();
         $discount = abs((double) $order->getBaseDiscountAmount());
         if (empty($piwikOrder)) {
             $piwikOrder = [$orderId, $grandTotal, $subTotal, $tax, $shipping, $discount];
         } else {
             $piwikOrder[0] .= ', ' . $orderId;
             $piwikOrder[1] += $grandTotal;
             $piwikOrder[2] += $subTotal;
             $piwikOrder[3] += $tax;
             $piwikOrder[4] += $shipping;
             $piwikOrder[5] += $discount;
         }
     }
     // Push `addEcommerceItem'
     foreach ($piwikItems as $piwikItem) {
         list($sku, $name, $rowTotal, $qty) = $piwikItem;
         $this->_piwikTracker->addEcommerceItem($sku, $name, false, $qty > 0 ? $rowTotal / $qty : 0, $qty);
     }
     // Push `trackEcommerceOrder'
     if (!empty($piwikOrder)) {
         list($orderId, $grandTotal, $subTotal, $tax, $shipping, $discount) = $piwikOrder;
         $this->_piwikTracker->trackEcommerceOrder($orderId, $grandTotal, $subTotal, $tax, $shipping, $discount > 0 ? $discount : false);
     }
     return $this;
 }