pimcore/lib/Pimcore/Bundle/CoreBundle/EventListener/Frontend/CookiePolicyNoticeListener.php line 131

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener\Frontend;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Pimcore\Bundle\CoreBundle\EventListener\Traits\ResponseInjectionTrait;
  17. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  18. use Symfony\Bundle\FrameworkBundle\Translation\Translator;
  19. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  20. use Symfony\Component\HttpKernel\KernelInterface;
  21. class CookiePolicyNoticeListener
  22. {
  23.     use ResponseInjectionTrait;
  24.     use PimcoreContextAwareTrait;
  25.     /**
  26.      * @var bool
  27.      */
  28.     protected $enabled true;
  29.     /**
  30.      * @var string
  31.      */
  32.     protected $templateCode null;
  33.     /**
  34.      * @var KernelInterface
  35.      */
  36.     protected $kernel;
  37.     /**
  38.      * @var Translator
  39.      */
  40.     protected $translator;
  41.     /**
  42.      * @param KernelInterface $kernel
  43.      */
  44.     public function __construct(KernelInterface $kernel)
  45.     {
  46.         $this->kernel $kernel;
  47.     }
  48.     /**
  49.      * @return bool
  50.      */
  51.     public function disable()
  52.     {
  53.         $this->enabled false;
  54.         return true;
  55.     }
  56.     /**
  57.      * @return bool
  58.      */
  59.     public function enable()
  60.     {
  61.         $this->enabled true;
  62.         return true;
  63.     }
  64.     /**
  65.      * @return bool
  66.      */
  67.     public function isEnabled()
  68.     {
  69.         return $this->enabled;
  70.     }
  71.     /**
  72.      * @param $code
  73.      */
  74.     public function setTemplateCode($code)
  75.     {
  76.         $this->templateCode $code;
  77.     }
  78.     /**
  79.      * @return string
  80.      */
  81.     public function getTemplateCode()
  82.     {
  83.         return $this->templateCode;
  84.     }
  85.     /**
  86.      * @param string $path
  87.      */
  88.     public function loadTemplateFromResource($path)
  89.     {
  90.         $templateFile $this->kernel->locateResource($path);
  91.         if (file_exists($templateFile)) {
  92.             $this->setTemplateCode(file_get_contents($templateFile));
  93.         }
  94.     }
  95.     /**
  96.      * @return Translator
  97.      */
  98.     public function getTranslator()
  99.     {
  100.         return $this->translator;
  101.     }
  102.     /**
  103.      * @param Translator $translator
  104.      */
  105.     public function setTranslator($translator)
  106.     {
  107.         $this->translator $translator;
  108.     }
  109.     /**
  110.      * @param FilterResponseEvent $event
  111.      */
  112.     public function onKernelResponse(FilterResponseEvent $event)
  113.     {
  114.         $request $event->getRequest();
  115.         if (!$event->isMasterRequest()) {
  116.             return;
  117.         }
  118.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  119.             return;
  120.         }
  121.         $response $event->getResponse();
  122.         $config   = \Pimcore\Config::getSystemConfig();
  123.         $locale   $request->getLocale();
  124.         if ($this->enabled && $config->general->show_cookie_notice && \Pimcore\Tool::useFrontendOutputFilters()) {
  125.             if ($event->isMasterRequest() && $this->isHtmlResponse($response)) {
  126.                 $template $this->getTemplateCode();
  127.                 // cleanup code
  128.                 $template preg_replace('/[\r\n\t]+/'' '$template); //remove new lines, spaces, tabs
  129.                 $template preg_replace('/>[\s]+</''><'$template); //remove new lines, spaces, tabs
  130.                 $template preg_replace('/[\s]+/'' '$template); //remove new lines, spaces, tabs
  131.                 $translations $this->getTranslations($locale);
  132.                 foreach ($translations as $key => &$value) {
  133.                     $value    htmlentities($valueENT_COMPAT'UTF-8');
  134.                     $template str_replace('%' $key '%'$value$template);
  135.                 }
  136.                 $linkContent '';
  137.                 if (array_key_exists('linkTarget'$translations)) {
  138.                     $linkContent '<a href="' $translations['linkTarget'] . '" data-content="' $translations['linkText'] . '"></a>';
  139.                 }
  140.                 $template str_replace('%link%'$linkContent$template);
  141.                 $templateCode json_encode($template);
  142.                 $code '
  143.                         <script>
  144.                             (function () {
  145.                                 var ls = window["localStorage"];
  146.                                 if(ls && !ls.getItem("pc-cookie-accepted")) {
  147.             
  148.                                     var code = ' $templateCode ';
  149.                                     var ci = window.setInterval(function () {
  150.                                         if(document.body) {
  151.                                             clearInterval(ci);
  152.                                             document.body.insertAdjacentHTML("beforeend", code);
  153.             
  154.                                             document.getElementById("pc-button").onclick = function () {
  155.                                                 document.getElementById("pc-cookie-notice").style.display = "none";
  156.                                                 ls.setItem("pc-cookie-accepted", "true");
  157.                                             };
  158.                                         }
  159.                                     }, 100);
  160.                                 }
  161.                             })();
  162.                         </script>
  163.                     ';
  164.                 $content $response->getContent();
  165.                 // search for the end <head> tag, and insert the google analytics code before
  166.                 // this method is much faster than using simple_html_dom and uses less memory
  167.                 $headEndPosition stripos($content'</head>');
  168.                 if ($headEndPosition !== false) {
  169.                     $content substr_replace($content$code '</head>'$headEndPosition7);
  170.                 }
  171.                 $response->setContent($content);
  172.             }
  173.         }
  174.     }
  175.     /**
  176.      * @param string $locale
  177.      *
  178.      * @return array
  179.      */
  180.     protected function getTranslations($locale)
  181.     {
  182.         // most common translations
  183.         $defaultTranslations = [
  184.             'text'     => [
  185.                 'en' => 'Cookies help us deliver our services. By using our services, you agree to our use of cookies.',
  186.                 'de' => 'Cookies helfen uns bei der Bereitstellung unserer Dienste. Durch die Nutzung unserer Dienste erklären Sie sich mit dem Einsatz von Cookies einverstanden.',
  187.                 'it' => "I cookie ci aiutano a fornire i nostri servizi. Utilizzando tali servizi, accetti l'utilizzo dei cookie da parte.",
  188.                 'fr' => "Les cookies assurent le bon fonctionnement de nos services. En utilisant ces derniers, vous acceptez l'utilisation des cookies.",
  189.                 'nl' => 'Cookies helpen ons onze services te leveren. Door onze services te gebruiken, geef je aan akkoord te gaan met ons gebruik van cookies.',
  190.                 'es' => 'Las cookies nos ayudan a ofrecer nuestros servicios. Al utilizarlos, aceptas que usemos cookies.',
  191.                 'zh' => 'Cookie 可帮助我们提供服务。使用我们的服务即表示您同意我们使用 Cookie',
  192.                 'no' => 'Informasjonskapsler hjelper oss med å levere tjenestene vi tilbyr. Ved å benytte deg av tjenestene våre, godtar du bruken av informasjonskapsler.',
  193.                 'hu' => 'A cookie-k segítenek minket a szolgáltatásnyújtásban. Szolgáltatásaink használatával jóváhagyja, hogy cookie-kat használjunk.',
  194.                 'sv' => 'Vi tar hjälp av cookies för att tillhandahålla våra tjänster. Genom att använda våra tjänster godkänner du att vi använder cookies.',
  195.                 'fi' => 'Evästeet auttavat meitä palveluidemme tarjoamisessa. Käyttämällä palveluitamme hyväksyt evästeiden käytön.',
  196.                 'da' => 'Cookies hjælper os med at levere vores tjenester. Ved at bruge vores tjenester accepterer du vores brug af cookies.',
  197.                 'pl' => 'Nasze usługi wymagają plików cookie. Korzystając z nich, zgadzasz się na używanie przez nas tych plików.',
  198.                 'cs' => 'Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie',
  199.                 'sk' => 'Súbory cookie nám pomáhajú pri poskytovaní našich služieb. Používaním našich služieb vyjadrujete súhlas s používaním súborov cookie.',
  200.                 'pt' => 'Os cookies nos ajudam a oferecer nossos serviços. Ao usar nossos serviços, você concorda com nosso uso dos cookies.',
  201.                 'hr' => 'Kolačići nam pomažu pružati usluge. Upotrebom naših usluga prihvaćate našu upotrebu kolačića.',
  202.                 'sl' => 'Piškotki omogočajo, da vam ponudimo svoje storitve. Z uporabo teh storitev se strinjate z našo uporabo piškotkov.',
  203.                 'sr' => 'Колачићи нам помажу да пружамо услуге. Коришћењем услуга прихватате нашу употребу колачића.',
  204.                 'ru' => 'Используя наши сервисы, Вы соглашаетесь на наше использование файлов cookie. Это необходимо для нормального функционирования наших сервисов.',
  205.                 'bg' => '„Бисквитките“ ни помагат да предоставяме услугите си. С използването им приемате употребата на „бисквитките“ от наша страна.',
  206.                 'et' => 'Küpsised aitavad meil teenuseid pakkuda. Teenuste kasutamisel nõustute küpsiste kasutamisega.',
  207.                 'el' => 'Τα cookie μάς βοηθούν να προσφέρουμε τις υπηρεσίες μας. Χρησιμοποιώντας τις υπηρεσίες μας, αποδέχεστε την από μέρους μας χρήση των cookie.',
  208.                 'lv' => 'Mūsu pakalpojumos tiek izmantoti sīkfaili. Lietojot mūsu pakalpojumus, jūs piekrītat sīkfailu izmantošanai.',
  209.                 'lt' => 'Slapukai naudingi mums, kad galėtume teikti paslaugas. Naudodamiesi paslaugomis, sutinkate, kad mes galime naudoti slapukus.',
  210.                 'ro' => 'Cookie-urile ne ajută să vă oferim serviciile noastre. Prin utilizarea serviciilor, acceptați modul în care utilizăm cookie-urile.',
  211.             ],
  212.             'linkText' => [
  213.                 'en' => 'Learn more',
  214.                 'de' => 'Weitere Informationen',
  215.                 'it' => 'Ulteriori informazioni',
  216.                 'fr' => 'En savoir plus',
  217.                 'nl' => 'Meer informatie',
  218.                 'es' => 'Más información',
  219.                 'zh' => '了解详情',
  220.                 'no' => 'Finn ut mer',
  221.                 'hu' => 'További információ',
  222.                 'sv' => 'Läs mer',
  223.                 'fi' => 'Lisätietoja',
  224.                 'da' => 'Få flere oplysninger',
  225.                 'pl' => 'Więcej informacji',
  226.                 'cs' => 'Další informace',
  227.                 'sk' => 'Ďalšie informácie',
  228.                 'pt' => 'Saiba mais',
  229.                 'hr' => 'Saznajte više',
  230.                 'sl' => 'Več o tem',
  231.                 'sr' => 'Сазнајте више',
  232.                 'ru' => 'Подробнее...',
  233.                 'bg' => 'Научете повече',
  234.                 'et' => 'Lisateave',
  235.                 'el' => 'Μάθετε περισσότερα',
  236.                 'lv' => 'Uzziniet vairāk',
  237.                 'lt' => 'Sužinoti daugiau',
  238.                 'ro' => 'Aflați mai multe',
  239.             ],
  240.             'ok'       => [
  241.                 'en' => 'OK',
  242.                 'de' => 'Ok',
  243.                 'it' => 'Ho capito',
  244.                 'fr' => "J'ai compris",
  245.                 'nl' => 'Ik snap het',
  246.                 'es' => 'De acuerdo',
  247.                 'zh' => '知道了',
  248.                 'no' => 'Greit',
  249.                 'hu' => 'Rendben',
  250.                 'sv' => 'Uppfattat',
  251.                 'fi' => 'Selvä',
  252.                 'da' => 'Forstået',
  253.                 'pl' => 'OK',
  254.                 'cs' => 'OK',
  255.                 'sk' => 'Rozumiem',
  256.                 'pt' => 'Entendi',
  257.                 'hr' => 'Shvaćam',
  258.                 'sl' => 'V redu',
  259.                 'sr' => 'Важи',
  260.                 'ru' => 'OK',
  261.                 'bg' => 'Разбрах',
  262.                 'et' => 'Selge',
  263.                 'el' => 'Το κατάλαβα',
  264.                 'lv' => 'Sapratu',
  265.                 'lt' => 'Supratau',
  266.                 'ro' => 'Am înțeles',
  267.             ]
  268.         ];
  269.         $translations = [];
  270.         if ($this->getTranslator()) {
  271.             foreach (['text''linkText''ok''linkTarget'] as $key) {
  272.                 $translationKey 'cookie-policy-' $key;
  273.                 $translation    $this->getTranslator()->trans($translationKey);
  274.                 if ($translation != $translationKey) {
  275.                     $translations[$key] = $translation;
  276.                 }
  277.             }
  278.         }
  279.         $language 'en'// default language
  280.         if ($locale) {
  281.             $languagePart = \Locale::getPrimaryLanguage($locale);
  282.             if (array_key_exists($languagePart$defaultTranslations['text'])) {
  283.                 $language $languagePart;
  284.             }
  285.         }
  286.         // set defaults in en
  287.         foreach ($defaultTranslations as $key => $values) {
  288.             if (!array_key_exists($key$translations)) {
  289.                 $translations[$key] = $values[$language];
  290.             }
  291.         }
  292.         return $translations;
  293.     }
  294. }