/** * Push EcommerceView to tracker on category view page * * @param \Magento\Framework\Event\Observer $observer * @return \Henhed\Piwik\Observer\CategoryViewObserver */ public function execute(\Magento\Framework\Event\Observer $observer) { if (!$this->_dataHelper->isTrackingEnabled()) { return $this; } $category = $observer->getEvent()->getCategory(); /* @var $category \Magento\Catalog\Model\Category */ $this->_piwikTracker->setEcommerceView(false, false, $category->getName()); return $this; }
/** * Push link tracking options to given tracker * * @param \Henhed\Piwik\Model\Tracker $tracker * @return \Henhed\Piwik\Observer\BeforeTrackPageViewObserver */ protected function _pushLinkTracking(\Henhed\Piwik\Model\Tracker $tracker) { if ($this->_dataHelper->isLinkTrackingEnabled()) { $tracker->enableLinkTracking(true); $delay = $this->_dataHelper->getLinkTrackingDelay(); if ($delay > 0) { $tracker->setLinkTrackingTimer($delay); } } return $this; }
/** * Push EcommerceView to tracker on product view page * * @param \Magento\Framework\Event\Observer $observer * @return \Henhed\Piwik\Observer\ProductViewObserver */ public function execute(\Magento\Framework\Event\Observer $observer) { if (!$this->_dataHelper->isTrackingEnabled()) { return $this; } $product = $observer->getEvent()->getProduct(); /* @var $product \Magento\Catalog\Model\Product */ $category = $product->getCategory(); $this->_piwikTracker->setEcommerceView($product->getSku(), $product->getName(), $category ? $category->getName() : false, $product->getFinalPrice()); return $this; }
/** * 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; }
/** * Push `trackSiteSearch' to tracker on search result page * * @param \Magento\Framework\Event\Observer $observer * @return \Henhed\Piwik\Observer\SearchResultObserver */ public function execute(\Magento\Framework\Event\Observer $observer) { if (!$this->_dataHelper->isTrackingEnabled()) { return $this; } $query = $this->_queryFactory->get(); $piwikBlock = $this->_view->getLayout()->getBlock('piwik.tracker'); /* @var $query \Magento\Search\Model\Query */ /* @var $piwikBlock \Henhed\Piwik\Block\Piwik */ $keyword = $query->getQueryText(); $resultsCount = $query->getNumResults(); if (is_null($resultsCount)) { // If this is a new search query the result count hasn't been saved // yet so we have to fetch it from the search result block instead. $resultBock = $this->_view->getLayout()->getBlock('search.result'); /* @var $resultBock \Magento\CatalogSearch\Block\Result */ if ($resultBock) { $resultsCount = $resultBock->getResultCount(); } } if (is_null($resultsCount)) { $this->_piwikTracker->trackSiteSearch($keyword); } else { $this->_piwikTracker->trackSiteSearch($keyword, false, (int) $resultsCount); } if ($piwikBlock) { // Don't push `trackPageView' when `trackSiteSearch' is set $piwikBlock->setSkipTrackPageView(true); } return $this; }
/** * Test for \Henhed\Piwik\Observer\CheckoutSuccessObserver::execute where * tracking is disabled. * * @return void */ public function testExecuteWithTrackingDisabled() { $this->_dataHelperMock->expects($this->once())->method('isTrackingEnabled')->willReturn(false); $this->_eventMock->expects($this->any())->method('getOrderIds')->willReturn([1]); $this->_orderCollectionMock->expects($this->never())->method('getIterator'); $this->assertSame($this->_testSubject, $this->_testSubject->execute($this->_eventObserverMock)); $this->assertEquals([], $this->_tracker->toArray()); }
/** * Test for \Henhed\Piwik\Helper\Tracker::addQuote * * Also covers `addQuoteItem' and `addQuoteTotal' * * @param array $items * @param float $total * @dataProvider addQuoteDataProvider */ public function testAddQuote($items, $total) { // Build expected tracker result from $items and $total $expectedResult = []; foreach ($items as $item) { list($sku, $name, $price, $qty) = $item; $expectedResult[] = ['addEcommerceItem', $sku, $name, false, (double) $price, (double) $qty]; } $expectedResult[] = ['trackEcommerceCartUpdate', (double) $total]; // Test `addQuote' with mock quote created from $items and $total $this->_helper->addQuote($this->_getQuoteMock($items, $total), $this->_tracker); $this->assertSame($expectedResult, $this->_tracker->toArray()); }
/** * Test magic tracker action push * * Covers Tracker::__call and Tracker::toArray * * @param string $name * @param array $args * @dataProvider trackerActionDataProvider */ public function testMagicPush($name, $args) { $this->_actionFactory->expects($this->once())->method('create')->with(['name' => $name, 'args' => $args])->will($this->returnValue(new Tracker\Action($name, $args))); call_user_func_array(array($this->_tracker, $name), $args); $this->assertEquals([array_merge([$name], $args)], $this->_tracker->toArray()); }
/** * Push `trackEcommerceCartUpdate' with quote data to given tracker * * @param \Magento\Quote\Model\Quote $quote * @param \Henhed\Piwik\Model\Tracker $tracker * @return \Henhed\Piwik\Helper\Tracker */ public function addQuoteTotal(Quote $quote, TrackerModel $tracker) { $tracker->trackEcommerceCartUpdate((double) $quote->getBaseGrandTotal()); return $this; }