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

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 Commercial License (PCL)
  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 PCL
  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. /**
  29.  * @deprecated
  30.  */
  31. class Tracker extends AbstractTracker
  32. {
  33.     const BLOCK_BEFORE_SCRIPT_TAG 'beforeScriptTag';
  34.     const BLOCK_BEFORE_SCRIPT 'beforeScript';
  35.     const BLOCK_BEFORE_TRACK 'beforeTrack';
  36.     const BLOCK_TRACK 'track';
  37.     const BLOCK_AFTER_TRACK 'afterTrack';
  38.     const BLOCK_BEFORE_ASYNC 'beforeAsync';
  39.     const BLOCK_AFTER_ASYNC 'afterAsync';
  40.     const BLOCK_AFTER_SCRIPT 'afterScript';
  41.     const BLOCK_AFTER_SCRIPT_TAG 'afterScriptTag';
  42.     /**
  43.      * @var ConfigProvider
  44.      */
  45.     private $configProvider;
  46.     /**
  47.      * @var EventDispatcherInterface
  48.      */
  49.     private $eventDispatcher;
  50.     /**
  51.      * @var EngineInterface
  52.      */
  53.     private $templatingEngine;
  54.     /**
  55.      * @var array
  56.      */
  57.     private $blocks = [
  58.         self::BLOCK_BEFORE_SCRIPT_TAG,
  59.         self::BLOCK_BEFORE_SCRIPT,
  60.         self::BLOCK_BEFORE_TRACK,
  61.         self::BLOCK_TRACK,
  62.         self::BLOCK_AFTER_TRACK,
  63.         self::BLOCK_BEFORE_ASYNC,
  64.         self::BLOCK_AFTER_ASYNC,
  65.         self::BLOCK_AFTER_SCRIPT,
  66.         self::BLOCK_AFTER_SCRIPT_TAG,
  67.     ];
  68.     public function __construct(
  69.         SiteIdProvider $siteIdProvider,
  70.         ConfigProvider $configProvider,
  71.         EventDispatcherInterface $eventDispatcher,
  72.         EngineInterface $templatingEngine
  73.     ) {
  74.         @trigger_error(
  75.             'Piwik\Tracker has been deprecated and will be removed in Pimcore 10.',
  76.             E_USER_DEPRECATED
  77.         );
  78.         parent::__construct($siteIdProvider);
  79.         $this->configProvider $configProvider;
  80.         $this->eventDispatcher $eventDispatcher;
  81.         $this->templatingEngine $templatingEngine;
  82.     }
  83.     protected function buildCodeCollector(): CodeCollector
  84.     {
  85.         return new CodeCollector($this->blocksself::BLOCK_TRACK);
  86.     }
  87.     protected function buildCode(SiteId $siteId)
  88.     {
  89.         $config $this->configProvider->getConfig();
  90.         if (!$config->isConfigured()) {
  91.             return null;
  92.         }
  93.         $configKey $siteId->getConfigKey();
  94.         if (!$config->isSiteConfigured($configKey)) {
  95.             return null;
  96.         }
  97.         $data = [
  98.             'siteId' => $siteId,
  99.             'config' => $config,
  100.             'piwikSiteId' => $config->getPiwikSiteId($siteId->getConfigKey()),
  101.             'piwikUrl' => $config->getPiwikUrl(),
  102.         ];
  103.         $blocks $this->buildCodeBlocks($config$siteId);
  104.         $template '@PimcoreCore/Analytics/Tracking/Piwik/trackingCode.html.twig';
  105.         $event = new TrackingDataEvent($config$siteId$data$blocks$template);
  106.         $this->eventDispatcher->dispatch(PiwikEvents::CODE_TRACKING_DATA$event);
  107.         return $this->renderTemplate($event);
  108.     }
  109.     private function renderTemplate(TrackingDataEvent $event): string
  110.     {
  111.         $data $event->getData();
  112.         $data['blocks'] = $event->getBlocks();
  113.         $code $this->templatingEngine->render(
  114.             $event->getTemplate(),
  115.             $data
  116.         );
  117.         $code trim($code);
  118.         return $code;
  119.     }
  120.     private function buildCodeBlocks(Config $configSiteId $siteId): array
  121.     {
  122.         $configKey $siteId->getConfigKey();
  123.         $trackerConfig $config->getConfigForSite($configKey);
  124.         $blockData $this->buildBlockData($trackerConfig$config$siteId);
  125.         $blocks = [];
  126.         foreach ($this->blocks as $block) {
  127.             $codeBlock = new CodeBlock();
  128.             if (isset($blockData[$block])) {
  129.                 $codeBlock->append($blockData[$block]);
  130.             }
  131.             $this->getCodeCollector()->enrichCodeBlock($siteId$codeBlock$block);
  132.             $blocks[$block] = $codeBlock;
  133.         }
  134.         return $blocks;
  135.     }
  136.     private function buildBlockData(ConfigObject $trackerConfigConfig $configSiteId $siteId): array
  137.     {
  138.         $blockData = [];
  139.         if (!empty($trackerConfig->code_before_init)) {
  140.             $blockData[self::BLOCK_BEFORE_SCRIPT] = $trackerConfig->code_before_init;
  141.         }
  142.         if (!empty($trackerConfig->code_before_track)) {
  143.             $blockData[self::BLOCK_BEFORE_TRACK] = $trackerConfig->code_before_track;
  144.         }
  145.         $blockData[self::BLOCK_TRACK] = [
  146.             "_paq.push(['trackPageView']);",
  147.             "_paq.push(['enableLinkTracking']);",
  148.         ];
  149.         if (!empty($trackerConfig->code_after_track)) {
  150.             $blockData[self::BLOCK_AFTER_TRACK] = $trackerConfig->code_after_track;
  151.         }
  152.         $blockData[self::BLOCK_BEFORE_ASYNC] = [
  153.             "_paq.push(['setTrackerUrl', u+'piwik.php']);",
  154.             sprintf("_paq.push(['setSiteId', '%d']);"$config->getPiwikSiteId($siteId->getConfigKey())),
  155.         ];
  156.         return $blockData;
  157.     }
  158. }