vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/Frontend/TagManagerListener.php line 78

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\PreviewRequestTrait;
  17. use Pimcore\Bundle\CoreBundle\EventListener\Traits\ResponseInjectionTrait;
  18. use Pimcore\Http\Request\Resolver\EditmodeResolver;
  19. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  20. use Pimcore\Model\Site;
  21. use Pimcore\Model\Tool\Tag;
  22. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  23. class TagManagerListener
  24. {
  25.     use PimcoreContextAwareTrait;
  26.     use ResponseInjectionTrait;
  27.     use PreviewRequestTrait;
  28.     /**
  29.      * @var EditmodeResolver
  30.      */
  31.     private $editmodeResolver;
  32.     /**
  33.      * @var bool
  34.      */
  35.     protected $enabled true;
  36.     public function __construct(EditmodeResolver $editmodeResolver)
  37.     {
  38.         $this->editmodeResolver $editmodeResolver;
  39.     }
  40.     /**
  41.      * @return bool
  42.      */
  43.     public function disable()
  44.     {
  45.         $this->enabled false;
  46.         return true;
  47.     }
  48.     /**
  49.      * @return bool
  50.      */
  51.     public function enable()
  52.     {
  53.         $this->enabled true;
  54.         return true;
  55.     }
  56.     /**
  57.      * @return bool
  58.      */
  59.     public function isEnabled()
  60.     {
  61.         return $this->enabled;
  62.     }
  63.     /**
  64.      * @param FilterResponseEvent $event
  65.      */
  66.     public function onKernelResponse(FilterResponseEvent $event)
  67.     {
  68.         $request $event->getRequest();
  69.         if (!$event->isMasterRequest()) {
  70.             return;
  71.         }
  72.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  73.             return;
  74.         }
  75.         if ($this->isPreviewRequest($request)) {
  76.             return;
  77.         }
  78.         $response $event->getResponse();
  79.         if (!$this->isHtmlResponse($response) || !$this->isEnabled()) {
  80.             return;
  81.         }
  82.         $list = new Tag\Config\Listing();
  83.         $tags $list->load();
  84.         if (empty($tags)) {
  85.             return;
  86.         }
  87.         $html null;
  88.         $content $response->getContent();
  89.         $requestParams array_merge($_GET$_POST);
  90.         $editmode $this->editmodeResolver->isEditmode($request);
  91.         /** @var Tag\Config $tag */
  92.         foreach ($tags as $tag) {
  93.             if ($tag->isDisabled()) {
  94.                 continue;
  95.             }
  96.             $method strtolower($tag->getHttpMethod());
  97.             $pattern $tag->getUrlPattern();
  98.             $textPattern $tag->getTextPattern();
  99.             // site check
  100.             if (Site::isSiteRequest() && $tag->getSiteId()) {
  101.                 if (Site::getCurrentSite()->getId() != $tag->getSiteId()) {
  102.                     continue;
  103.                 }
  104.             } elseif (!Site::isSiteRequest() && $tag->getSiteId() && $tag->getSiteId() != 'default') {
  105.                 continue;
  106.             }
  107.             $requestPath rtrim($request->getPathInfo(), '/');
  108.             if (($method == strtolower($request->getMethod()) || empty($method)) &&
  109.                 (empty($pattern) || @preg_match($pattern$requestPath)) &&
  110.                 (empty($textPattern) || strpos($content$textPattern) !== false)
  111.             ) {
  112.                 $paramsValid true;
  113.                 foreach ($tag->getParams() as $param) {
  114.                     if (!empty($param['name'])) {
  115.                         if (!empty($param['value'])) {
  116.                             if (!array_key_exists($param['name'], $requestParams) || $requestParams[$param['name']] != $param['value']) {
  117.                                 $paramsValid false;
  118.                             }
  119.                         } else {
  120.                             if (!array_key_exists($param['name'], $requestParams)) {
  121.                                 $paramsValid false;
  122.                             }
  123.                         }
  124.                     }
  125.                 }
  126.                 if (is_array($tag->getItems()) && $paramsValid) {
  127.                     foreach ($tag->getItems() as $itemKey => $item) {
  128.                         if ($item['disabled']) {
  129.                             continue;
  130.                         }
  131.                         $currentTime = new \Carbon\Carbon();
  132.                         if (!empty($item['date']) && $currentTime->getTimestamp() > $item['date']) {
  133.                             //disable tag item if expired
  134.                             $tag->items[$itemKey]['disabled'] = true;
  135.                             $tag->save();
  136.                             continue;
  137.                         }
  138.                         if ($editmode && !$item['enabledInEditmode']) {
  139.                             continue;
  140.                         }
  141.                         if (!empty($item['element']) && !empty($item['code']) && !empty($item['position'])) {
  142.                             if (in_array($item['element'], ['body''head'])) {
  143.                                 // check if the code should be inserted using one of the presets
  144.                                 // because this can be done much faster than using a html parser
  145.                                 if ($html) {
  146.                                     // reset simple_html_dom if set
  147.                                     $html->clear();
  148.                                     unset($html);
  149.                                     $html null;
  150.                                 }
  151.                                 if ($item['position'] == 'end') {
  152.                                     $regEx '@</' $item['element'] . '>@i';
  153.                                     $content preg_replace($regEx"\n\n" $item['code'] . "\n\n</" $item['element'] . '>'$content1);
  154.                                 } else {
  155.                                     $regEx '/<' $item['element'] . '([^a-zA-Z])?( [^>]+)?>/';
  156.                                     $content preg_replace($regEx'<' $item['element'] . "$1$2>\n\n" $item['code'] . "\n\n"$content1);
  157.                                 }
  158.                             } else {
  159.                                 // use simple_html_dom
  160.                                 if (!$html) {
  161.                                     include_once(PIMCORE_PATH '/lib/simple_html_dom.php');
  162.                                     $html str_get_html($content);
  163.                                 }
  164.                                 if ($html) {
  165.                                     $element $html->find($item['element'], 0);
  166.                                     if ($element) {
  167.                                         if ($item['position'] == 'end') {
  168.                                             $element->innertext $element->innertext "\n\n" $item['code'] . "\n\n";
  169.                                         } else {
  170.                                             // beginning
  171.                                             $element->innertext "\n\n" $item['code'] . "\n\n" $element->innertext;
  172.                                         }
  173.                                         // we havve to reinitialize the html object, otherwise it causes problems with nested child selectors
  174.                                         $content $html->save();
  175.                                         $html->clear();
  176.                                         unset($html);
  177.                                         $html null;
  178.                                     }
  179.                                 }
  180.                             }
  181.                         }
  182.                     }
  183.                 }
  184.             }
  185.         }
  186.         if ($html && method_exists($html'clear')) {
  187.             $html->clear();
  188.             unset($html);
  189.         }
  190.         $response->setContent($content);
  191.     }
  192. }