custom/plugins/WebcellentInternalLinks/src/Subscriber/ProductDetailPageSubscriber.php line 26

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Webcellent\InternalLinks\Subscriber;
  3. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  6. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Webcellent\InternalLinks\Entity\InternalLinksEntity;
  9. class ProductDetailPageSubscriber implements EventSubscriberInterface
  10. {
  11.     private EntityRepository $linkRepository;
  12.     public function __construct(EntityRepository $linkRepository) {
  13.         $this->linkRepository $linkRepository;
  14.     }
  15.     public static function getSubscribedEvents(): array {
  16.         return [
  17.             ProductPageLoadedEvent::class => "onProductPageLoaded"
  18.         ];
  19.     }
  20.     public function onProductPageLoaded(ProductPageLoadedEvent $event) {
  21.         $salesChannel $event->getSalesChannelContext()->getSalesChannelId();
  22.         $criteria = new Criteria();
  23.         $criteria->addFilter(new EqualsFilter('salesChannelId'$salesChannel));
  24.         $internalLinks $this->linkRepository->search($criteria$event->getContext());
  25.         /**
  26.          * Convert $internalLinks to array,
  27.          * sort it by keyword length so longer keywords are processed first
  28.          */
  29.         $internalLinks iterator_to_array($internalLinks);
  30.         usort($internalLinks, function($link1$link2) {
  31.             return strlen($link2->getKeyword()) >= strlen($link1->getKeyword());
  32.         });
  33.         $content $event->getPage()->getProduct()->getTranslation('description');
  34.         foreach ($internalLinks as $internalLink) {
  35.             $keyword strtolower($internalLink->getKeyword());
  36.             $linkInHeadings $internalLink->getLinkInHeadings();
  37.             $currentURLs = [
  38.                 ((array_key_exists('HTTPS'$_SERVER) && $_SERVER['HTTPS'] == 'on') ? 'https://' 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
  39.                 str_replace('www.''', ((array_key_exists('HTTPS'$_SERVER) && $_SERVER['HTTPS'] == 'on') ? 'https://' 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']),
  40.                 $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
  41.                 str_replace('www.'''$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'])
  42.             ];
  43.             // skip internal link if currently on to be linked page
  44.             if (in_array($internalLink->getLink(), $currentURLs)) {
  45.                 continue;
  46.             }
  47.             $limit $internalLink->getMaxLinks();
  48.             if (!is_int($limit) || $limit < -1) {
  49.                 $limit 1;
  50.             }
  51.             if ($limit <= 0) {
  52.                 $limit 10000;
  53.             }
  54.             $content preg_replace('/\b(' $keyword ')(?![^<]*<\/a>)' . ($linkInHeadings '' '(?![^<]*<\/h1>)(?![^<]*<\/h2>)(?![^<]*<\/h3>)(?![^<]*<\/h4>)') . '\b/i'$this->generateReplacement($internalLink"$1"), $content$limit$count);
  55.         }
  56.         $content str_replace(['&wctlt;''&wctgt;'], ['<''>'], $content);
  57.         $event->getPage()->getProduct()->setDescription($content);
  58.     }
  59.     private function generateReplacement(InternalLinksEntity $internalLinkstring $originalContent) {
  60.         $tag '&wctlt;a href="' $internalLink->getLink() . '" id=' $internalLink->getId() . ' webcellent-internal-link=true class="internal-link ' $internalLink->getClasses() . '"';
  61.         if ($internalLink->isOpenInNewTab()) {
  62.             $tag .= 'target="_blank" rel="noreferrer"';
  63.         }
  64.         if ($internalLink->getTitle()) {
  65.             $tag .= ' title="' $internalLink->getTitle(). '"&wctgt;' $originalContent '&wctlt;/a&wctgt;';
  66.         } else {
  67.             $tag .= '&wctgt;' $originalContent '&wctlt;/a&wctgt;';
  68.         }
  69.         return $tag;
  70.     }
  71. }