Spaces:
No application file
No application file
| namespace Mautic\PageBundle\Helper; | |
| use Mautic\CacheBundle\Cache\CacheProvider; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\Serializer; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use Mautic\LeadBundle\Tracker\ContactTracker; | |
| use Psr\Cache\CacheItemInterface; | |
| use Psr\Cache\InvalidArgumentException; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| class TrackingHelper | |
| { | |
| public function __construct( | |
| protected ContactTracker $contactTracker, | |
| protected CacheProvider $cache, | |
| protected CoreParametersHelper $coreParametersHelper, | |
| protected RequestStack $requestStack, | |
| ) { | |
| } | |
| /** | |
| * @return array<string, 'facebook_pixel'|'google_analytics'> | |
| */ | |
| public function getEnabledServices(): array | |
| { | |
| $keys = [ | |
| 'google_analytics' => 'Google Analytics', | |
| 'facebook_pixel' => 'Facebook Pixel', | |
| ]; | |
| $result = []; | |
| foreach ($keys as $key => $service) { | |
| if ($id = $this->coreParametersHelper->get($key.'_id')) { | |
| $result[$service] = $key; | |
| } | |
| } | |
| return $result; | |
| } | |
| /** | |
| * @return string|null | |
| */ | |
| private function getCacheKey() | |
| { | |
| $lead = $this->contactTracker->getContact(); | |
| return $lead instanceof Lead ? 'mtc-tracking-pixel-events-'.$lead->getId() : null; | |
| } | |
| /** | |
| * @param mixed[] $values | |
| * | |
| * @throws InvalidArgumentException | |
| */ | |
| public function updateCacheItem(array $values): void | |
| { | |
| $cacheKey = $this->getCacheKey(); | |
| if (null !== $cacheKey) { | |
| /** @var CacheItemInterface $item */ | |
| $item = $this->cache->getItem($cacheKey); | |
| $item->set(serialize(array_merge($values, $this->getCacheItem()))); | |
| $item->expiresAfter(86400); // one day in seconds | |
| $this->cache->save($item); | |
| } | |
| } | |
| /** | |
| * @return mixed[] | |
| * | |
| * @throws InvalidArgumentException | |
| */ | |
| public function getCacheItem(bool $remove = false): array | |
| { | |
| $cacheKey = $this->getCacheKey(); | |
| $cacheValue = []; | |
| /* @var CacheItemInterface $item */ | |
| if (null !== $cacheKey) { | |
| $item = $this->cache->getItem($cacheKey); | |
| if ($item->isHit()) { | |
| $cacheValue = Serializer::decode($item->get(), ['allowed_classes' => false]); | |
| if ($remove) { | |
| $this->cache->deleteItem($cacheKey); | |
| } | |
| } | |
| } | |
| return (array) $cacheValue; | |
| } | |
| /** | |
| * @return bool|mixed | |
| */ | |
| public function displayInitCode($service) | |
| { | |
| $pixelId = $this->coreParametersHelper->get($service.'_id'); | |
| if ($pixelId && $this->coreParametersHelper->get($service.'_landingpage_enabled') && $this->isLandingPage()) { | |
| return $pixelId; | |
| } | |
| if ($pixelId && $this->coreParametersHelper->get($service.'_trackingpage_enabled') && !$this->isLandingPage()) { | |
| return $pixelId; | |
| } | |
| return false; | |
| } | |
| /** | |
| * @return Lead|null | |
| */ | |
| public function getLead() | |
| { | |
| return $this->contactTracker->getContact(); | |
| } | |
| public function getAnonymizeIp() | |
| { | |
| return $this->coreParametersHelper->get('google_analytics_anonymize_ip'); | |
| } | |
| protected function isLandingPage(): bool | |
| { | |
| $server = $this->requestStack->getCurrentRequest()->server; | |
| if (!str_contains((string) $server->get('HTTP_REFERER'), $this->coreParametersHelper->get('site_url'))) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| /** | |
| * @deprecated No session for anonymous users. Use getCacheKey. | |
| */ | |
| public function getSessionName(): ?string | |
| { | |
| return $this->getCacheKey(); | |
| } | |
| /** | |
| * @deprecated No session for anonymous users. Use updateCacheItem. | |
| * | |
| * @param mixed[] $values | |
| * | |
| * @return mixed[] | |
| */ | |
| public function updateSession(array $values): array | |
| { | |
| $this->updateCacheItem($values); | |
| return (array) $values; | |
| } | |
| /** | |
| * @deprecated No session for anonymous users. Use getCacheItem. | |
| */ | |
| public function getSession(bool $remove = false): array | |
| { | |
| return $this->getCacheItem($remove); | |
| } | |
| } | |