vendor/pimcore/pimcore/lib/Analytics/Piwik/Tracker.php line 93

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Enterprise License (PEL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  14.  */
  15. namespace Pimcore\Analytics\Piwik;
  16. use Pimcore\Analytics\AbstractTracker;
  17. use Pimcore\Analytics\Code\CodeBlock;
  18. use Pimcore\Analytics\Code\CodeCollector;
  19. use Pimcore\Analytics\Piwik\Config\Config;
  20. use Pimcore\Analytics\Piwik\Config\ConfigProvider;
  21. use Pimcore\Analytics\Piwik\Event\TrackingDataEvent;
  22. use Pimcore\Analytics\SiteId\SiteId;
  23. use Pimcore\Analytics\SiteId\SiteIdProvider;
  24. use Pimcore\Config\Config as ConfigObject;
  25. use Pimcore\Event\Analytics\PiwikEvents;
  26. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  27. use Symfony\Component\Templating\EngineInterface;
  28. class Tracker extends AbstractTracker
  29. {
  30.     const BLOCK_BEFORE_SCRIPT_TAG 'beforeScriptTag';
  31.     const BLOCK_BEFORE_SCRIPT 'beforeScript';
  32.     const BLOCK_BEFORE_TRACK 'beforeTrack';
  33.     const BLOCK_TRACK 'track';
  34.     const BLOCK_AFTER_TRACK 'afterTrack';
  35.     const BLOCK_BEFORE_ASYNC 'beforeAsync';
  36.     const BLOCK_AFTER_ASYNC 'afterAsync';
  37.     const BLOCK_AFTER_SCRIPT 'afterScript';
  38.     const BLOCK_AFTER_SCRIPT_TAG 'afterScriptTag';
  39.     /**
  40.      * @var ConfigProvider
  41.      */
  42.     private $configProvider;
  43.     /**
  44.      * @var EventDispatcherInterface
  45.      */
  46.     private $eventDispatcher;
  47.     /**
  48.      * @var EngineInterface
  49.      */
  50.     private $templatingEngine;
  51.     /**
  52.      * @var array
  53.      */
  54.     private $blocks = [
  55.         self::BLOCK_BEFORE_SCRIPT_TAG,
  56.         self::BLOCK_BEFORE_SCRIPT,
  57.         self::BLOCK_BEFORE_TRACK,
  58.         self::BLOCK_TRACK,
  59.         self::BLOCK_AFTER_TRACK,
  60.         self::BLOCK_BEFORE_ASYNC,
  61.         self::BLOCK_AFTER_ASYNC,
  62.         self::BLOCK_AFTER_SCRIPT,
  63.         self::BLOCK_AFTER_SCRIPT_TAG,
  64.     ];
  65.     public function __construct(
  66.         SiteIdProvider $siteIdProvider,
  67.         ConfigProvider $configProvider,
  68.         EventDispatcherInterface $eventDispatcher,
  69.         EngineInterface $templatingEngine
  70.     ) {
  71.         parent::__construct($siteIdProvider);
  72.         $this->configProvider $configProvider;
  73.         $this->eventDispatcher $eventDispatcher;
  74.         $this->templatingEngine $templatingEngine;
  75.     }
  76.     protected function buildCodeCollector(): CodeCollector
  77.     {
  78.         return new CodeCollector($this->blocksself::BLOCK_TRACK);
  79.     }
  80.     protected function buildCode(SiteId $siteId)
  81.     {
  82.         $config $this->configProvider->getConfig();
  83.         if (!$config->isConfigured()) {
  84.             return null;
  85.         }
  86.         $configKey $siteId->getConfigKey();
  87.         if (!$config->isSiteConfigured($configKey)) {
  88.             return null;
  89.         }
  90.         $data = [
  91.             'siteId' => $siteId,
  92.             'config' => $config,
  93.             'piwikSiteId' => $config->getPiwikSiteId($siteId->getConfigKey()),
  94.             'piwikUrl' => $config->getPiwikUrl(),
  95.         ];
  96.         $blocks $this->buildCodeBlocks($config$siteId);
  97.         $template '@PimcoreCore/Analytics/Tracking/Piwik/trackingCode.html.twig';
  98.         $event = new TrackingDataEvent($config$siteId$data$blocks$template);
  99.         $this->eventDispatcher->dispatch(PiwikEvents::CODE_TRACKING_DATA$event);
  100.         return $this->renderTemplate($event);
  101.     }
  102.     private function renderTemplate(TrackingDataEvent $event): string
  103.     {
  104.         $data $event->getData();
  105.         $data['blocks'] = $event->getBlocks();
  106.         $code $this->templatingEngine->render(
  107.             $event->getTemplate(),
  108.             $data
  109.         );
  110.         $code trim($code);
  111.         return $code;
  112.     }
  113.     private function buildCodeBlocks(Config $configSiteId $siteId): array
  114.     {
  115.         $configKey $siteId->getConfigKey();
  116.         $trackerConfig $config->getConfigForSite($configKey);
  117.         $blockData $this->buildBlockData($trackerConfig$config$siteId);
  118.         $blocks = [];
  119.         foreach ($this->blocks as $block) {
  120.             $codeBlock = new CodeBlock();
  121.             if (isset($blockData[$block])) {
  122.                 $codeBlock->append($blockData[$block]);
  123.             }
  124.             $this->getCodeCollector()->enrichCodeBlock($siteId$codeBlock$block);
  125.             $blocks[$block] = $codeBlock;
  126.         }
  127.         return $blocks;
  128.     }
  129.     private function buildBlockData(ConfigObject $trackerConfigConfig $configSiteId $siteId): array
  130.     {
  131.         $blockData = [];
  132.         if (!empty($trackerConfig->code_before_init)) {
  133.             $blockData[self::BLOCK_BEFORE_SCRIPT] = $trackerConfig->code_before_init;
  134.         }
  135.         if (!empty($trackerConfig->code_before_track)) {
  136.             $blockData[self::BLOCK_BEFORE_TRACK] = $trackerConfig->code_before_track;
  137.         }
  138.         $blockData[self::BLOCK_TRACK] = [
  139.             "_paq.push(['trackPageView']);",
  140.             "_paq.push(['enableLinkTracking']);",
  141.         ];
  142.         if (!empty($trackerConfig->code_after_track)) {
  143.             $blockData[self::BLOCK_AFTER_TRACK] = $trackerConfig->code_after_track;
  144.         }
  145.         $blockData[self::BLOCK_BEFORE_ASYNC] = [
  146.             "_paq.push(['setTrackerUrl', u+'piwik.php']);",
  147.             sprintf("_paq.push(['setSiteId', '%d']);"$config->getPiwikSiteId($siteId->getConfigKey())),
  148.         ];
  149.         return $blockData;
  150.     }
  151. }