Ga.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\GoogleAnalytics\Block;
  7. use Magento\Framework\App\ObjectManager;
  8. /**
  9. * GoogleAnalytics Page Block
  10. *
  11. * @api
  12. * @since 100.0.2
  13. */
  14. class Ga extends \Magento\Framework\View\Element\Template
  15. {
  16. /**
  17. * Google analytics data
  18. *
  19. * @var \Magento\GoogleAnalytics\Helper\Data
  20. */
  21. protected $_googleAnalyticsData = null;
  22. /**
  23. * @var \Magento\Sales\Model\ResourceModel\Order\CollectionFactory
  24. */
  25. protected $_salesOrderCollection;
  26. /**
  27. * @var \Magento\Cookie\Helper\Cookie
  28. */
  29. private $cookieHelper;
  30. /**
  31. * @param \Magento\Framework\View\Element\Template\Context $context
  32. * @param \Magento\Sales\Model\ResourceModel\Order\CollectionFactory $salesOrderCollection
  33. * @param \Magento\GoogleAnalytics\Helper\Data $googleAnalyticsData
  34. * @param array $data
  35. * @param \Magento\Cookie\Helper\Cookie|null $cookieHelper
  36. */
  37. public function __construct(
  38. \Magento\Framework\View\Element\Template\Context $context,
  39. \Magento\Sales\Model\ResourceModel\Order\CollectionFactory $salesOrderCollection,
  40. \Magento\GoogleAnalytics\Helper\Data $googleAnalyticsData,
  41. array $data = [],
  42. \Magento\Cookie\Helper\Cookie $cookieHelper = null
  43. ) {
  44. $this->_googleAnalyticsData = $googleAnalyticsData;
  45. $this->_salesOrderCollection = $salesOrderCollection;
  46. $this->cookieHelper = $cookieHelper ?: ObjectManager::getInstance()->get(\Magento\Cookie\Helper\Cookie::class);
  47. parent::__construct($context, $data);
  48. }
  49. /**
  50. * Get config
  51. *
  52. * @param string $path
  53. * @return mixed
  54. */
  55. public function getConfig($path)
  56. {
  57. return $this->_scopeConfig->getValue($path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
  58. }
  59. /**
  60. * Get a specific page name (may be customized via layout)
  61. *
  62. * @return string|null
  63. */
  64. public function getPageName()
  65. {
  66. return $this->_getData('page_name');
  67. }
  68. /**
  69. * Render regular page tracking javascript code
  70. * The custom "page name" may be set from layout or somewhere else. It must start from slash.
  71. *
  72. * @param string $accountId
  73. * @return string
  74. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference#set
  75. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference#gaObjectMethods
  76. * @deprecated 100.2.0 please use getPageTrackingData method
  77. */
  78. public function getPageTrackingCode($accountId)
  79. {
  80. $anonymizeIp = "";
  81. if ($this->_googleAnalyticsData->isAnonymizedIpActive()) {
  82. $anonymizeIp = "\nga('set', 'anonymizeIp', true);";
  83. }
  84. return "\nga('create', '" . $this->escapeHtmlAttr($accountId, false)
  85. . "', 'auto');{$anonymizeIp}\nga('send', 'pageview'{$this->getOptPageUrl()});\n";
  86. }
  87. /**
  88. * Render information about specified orders and their items
  89. *
  90. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#checkout-options
  91. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions
  92. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#transaction
  93. *
  94. * @return string|void
  95. * @deprecated 100.2.0 please use getOrdersTrackingData method
  96. */
  97. public function getOrdersTrackingCode()
  98. {
  99. $orderIds = $this->getOrderIds();
  100. if (empty($orderIds) || !is_array($orderIds)) {
  101. return;
  102. }
  103. $collection = $this->_salesOrderCollection->create();
  104. $collection->addFieldToFilter('entity_id', ['in' => $orderIds]);
  105. $result = [];
  106. $result[] = "ga('require', 'ec', 'ec.js');";
  107. foreach ($collection as $order) {
  108. $result[] = "ga('set', 'currencyCode', '" . $order->getOrderCurrencyCode() . "');";
  109. foreach ($order->getAllVisibleItems() as $item) {
  110. $result[] = sprintf(
  111. "ga('ec:addProduct', {
  112. 'id': '%s',
  113. 'name': '%s',
  114. 'price': '%s',
  115. 'quantity': %s
  116. });",
  117. $this->escapeJsQuote($item->getSku()),
  118. $this->escapeJsQuote($item->getName()),
  119. $item->getPrice(),
  120. $item->getQtyOrdered()
  121. );
  122. }
  123. $result[] = sprintf(
  124. "ga('ec:setAction', 'purchase', {
  125. 'id': '%s',
  126. 'affiliation': '%s',
  127. 'revenue': '%s',
  128. 'tax': '%s',
  129. 'shipping': '%s'
  130. });",
  131. $order->getIncrementId(),
  132. $this->escapeJsQuote($this->_storeManager->getStore()->getFrontendName()),
  133. $order->getGrandTotal(),
  134. $order->getTaxAmount(),
  135. $order->getShippingAmount()
  136. );
  137. $result[] = "ga('send', 'pageview');";
  138. }
  139. return implode("\n", $result);
  140. }
  141. /**
  142. * Render GA tracking scripts
  143. *
  144. * @return string
  145. */
  146. protected function _toHtml()
  147. {
  148. if (!$this->_googleAnalyticsData->isGoogleAnalyticsAvailable()) {
  149. return '';
  150. }
  151. return parent::_toHtml();
  152. }
  153. /**
  154. * Return cookie restriction mode value.
  155. *
  156. * @return bool
  157. * @since 100.2.0
  158. */
  159. public function isCookieRestrictionModeEnabled()
  160. {
  161. return $this->cookieHelper->isCookieRestrictionModeEnabled();
  162. }
  163. /**
  164. * Return current website id.
  165. *
  166. * @return int
  167. * @since 100.2.0
  168. */
  169. public function getCurrentWebsiteId()
  170. {
  171. return $this->_storeManager->getWebsite()->getId();
  172. }
  173. /**
  174. * Return information about page for GA tracking
  175. *
  176. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference#set
  177. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference#gaObjectMethods
  178. *
  179. * @param string $accountId
  180. * @return array
  181. * @since 100.2.0
  182. */
  183. public function getPageTrackingData($accountId)
  184. {
  185. return [
  186. 'optPageUrl' => $this->getOptPageUrl(),
  187. 'isAnonymizedIpActive' => $this->_googleAnalyticsData->isAnonymizedIpActive(),
  188. 'accountId' => $this->escapeHtmlAttr($accountId, false)
  189. ];
  190. }
  191. /**
  192. * Return information about order and items for GA tracking.
  193. *
  194. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#checkout-options
  195. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions
  196. * @link https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#transaction
  197. *
  198. * @return array
  199. * @since 100.2.0
  200. */
  201. public function getOrdersTrackingData()
  202. {
  203. $result = [];
  204. $orderIds = $this->getOrderIds();
  205. if (empty($orderIds) || !is_array($orderIds)) {
  206. return $result;
  207. }
  208. $collection = $this->_salesOrderCollection->create();
  209. $collection->addFieldToFilter('entity_id', ['in' => $orderIds]);
  210. foreach ($collection as $order) {
  211. foreach ($order->getAllVisibleItems() as $item) {
  212. $result['products'][] = [
  213. 'id' => $this->escapeJsQuote($item->getSku()),
  214. 'name' => $this->escapeJsQuote($item->getName()),
  215. 'price' => $item->getPrice(),
  216. 'quantity' => $item->getQtyOrdered(),
  217. ];
  218. }
  219. $result['orders'][] = [
  220. 'id' => $order->getIncrementId(),
  221. 'affiliation' => $this->escapeJsQuote($this->_storeManager->getStore()->getFrontendName()),
  222. 'revenue' => $order->getGrandTotal(),
  223. 'tax' => $order->getTaxAmount(),
  224. 'shipping' => $order->getShippingAmount(),
  225. ];
  226. $result['currency'] = $order->getOrderCurrencyCode();
  227. }
  228. return $result;
  229. }
  230. /**
  231. * Return page url for tracking.
  232. *
  233. * @return string
  234. */
  235. private function getOptPageUrl()
  236. {
  237. $optPageURL = '';
  238. $pageName = trim($this->getPageName());
  239. if ($pageName && substr($pageName, 0, 1) == '/' && strlen($pageName) > 1) {
  240. $optPageURL = ", '" . $this->escapeHtmlAttr($pageName, false) . "'";
  241. }
  242. return $optPageURL;
  243. }
  244. }