custom/plugins/AcrisProductVideoCS/src/Storefront/Subscriber/ProductPageSubscriber.php line 36

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\ProductVideo\Storefront\Subscriber;
  3. use Acris\ProductVideo\Custom\ProductVideoEntity;
  4. use Shopware\Core\Content\Media\MediaCollection;
  5. use Shopware\Core\Content\Product\Aggregate\ProductMedia\ProductMediaCollection;
  6. use Shopware\Core\Content\Product\Aggregate\ProductMedia\ProductMediaEntity;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  8. use Shopware\Core\Framework\Struct\ArrayEntity;
  9. use Shopware\Core\System\SystemConfig\SystemConfigService;
  10. use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
  11. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class ProductPageSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var SystemConfigService
  17.      */
  18.     private $systemConfigService;
  19.     public function __construct(SystemConfigService $systemConfigService)
  20.     {
  21.         $this->systemConfigService $systemConfigService;
  22.     }
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             ProductPageCriteriaEvent::class => 'onProductCriteriaLoaded',
  27.             ProductPageLoadedEvent::class => 'onProductPageLoaded'
  28.         ];
  29.     }
  30.     public function onProductPageLoaded(ProductPageLoadedEvent $event): void
  31.     {
  32.         if($event->getPage()->getProduct()->hasExtension('acrisVideos') !== true) {
  33.             return;
  34.         }
  35.         $urlMetaData = [];
  36.         /** @var ProductVideoEntity $element */
  37.         foreach ($event->getPage()->getProduct()->getExtension('acrisVideos')->getElements() as $element)
  38.         {
  39.             if ($element && !empty($element->getTranslated()) && array_key_exists('link'$element->getTranslated()) && !empty($element->getTranslated()['link'])) {
  40.                 $link $element->getTranslated()['link'];
  41.                 $videoId explode('/'$link);
  42.                 $videoId end($videoId);
  43.                 $urlData $this->createYoutubeWatchUrl($videoId);
  44.                 $urlMetaData[$element->getId()] = $urlData;
  45.             }
  46.         }
  47.         if (!empty($urlMetaData)) {
  48.             $event->getPage()->addExtension('acrisProductVideo', new ArrayEntity([
  49.                 'metaData' => $urlMetaData
  50.             ]));
  51.         }
  52.         // add first product to product slider
  53.         /** @var ProductVideoEntity $element */
  54.         foreach ($event->getPage()->getProduct()->getExtension('acrisVideos')->getElements() as $key => $element)
  55.         {
  56.             $productMedia = new ProductMediaEntity();
  57.             $productMedia->setMedia($element);
  58.             $productMedia->setUniqueIdentifier($element->getId());
  59.             $mediaCollection $event->getPage()->getProduct()->getMedia();
  60.             if (empty($mediaCollection)) $mediaCollection = new ProductMediaCollection();
  61.             if($mediaCollection->count() > 1) {
  62.                 if ($this->systemConfigService->get('AcrisProductVideoCS.config.displayPosition'$event->getSalesChannelContext()->getSalesChannel()->getId()) === 'first') {
  63.                     $mediaCollection->insert(0$productMedia);
  64.                 } elseif ($this->systemConfigService->get('AcrisProductVideoCS.config.displayPosition'$event->getSalesChannelContext()->getSalesChannel()->getId()) === 'second') {
  65.                     $mediaCollection->insert(1$productMedia);
  66.                 } elseif ($this->systemConfigService->get('AcrisProductVideoCS.config.displayPosition'$event->getSalesChannelContext()->getSalesChannel()->getId()) === 'last') {
  67.                     $mediaCollection->add($productMedia);
  68.                 }
  69.             } else {
  70.                 if ($this->systemConfigService->get('AcrisProductVideoCS.config.displayPosition'$event->getSalesChannelContext()->getSalesChannel()->getId()) === 'first') {
  71.                     $mediaCollection->insert(0$productMedia);
  72.                 } elseif($this->systemConfigService->get('AcrisProductVideoCS.config.displayPosition'$event->getSalesChannelContext()->getSalesChannel()->getId()) !== 'noDisplay') {
  73.                     $mediaCollection->add($productMedia);
  74.                 }
  75.             }
  76.             if($this->systemConfigService->get('AcrisProductVideoCS.config.displayAllVideosInImageSlider'$event->getSalesChannelContext()->getSalesChannel()->getId()) !== true) {
  77.                 break;
  78.             }
  79.         }
  80.     }
  81.     public function onProductCriteriaLoaded(ProductPageCriteriaEvent $event): void
  82.     {
  83.         if(empty($event->getSalesChannelContext()->getSalesChannel())) {
  84.             return;
  85.         }
  86.         $sorting $this->getVideoSorting($event->getSalesChannelContext()->getSalesChannel()->getId());
  87.         $event->getCriteria()->addAssociation('acrisVideos');
  88.         $event->getCriteria()->getAssociation('acrisVideos')->addSorting(new FieldSorting('priority'$sortingtrue));
  89.     }
  90.     private function getVideoSorting(string $salesChannelId): string
  91.     {
  92.         if($this->systemConfigService->get('AcrisProductVideoCS.config.highestPriorityFirst'$salesChannelId) === true) {
  93.             return FieldSorting::DESCENDING;
  94.         } else {
  95.             return FieldSorting::ASCENDING;
  96.         }
  97.     }
  98.     public function createYoutubeWatchUrl($videoId)
  99.     {
  100.         $url 'https://www.youtube.com/watch?v='.$videoId;
  101.         $urlData $this->getYoutubeMetaData($url);
  102.         $metaDescription get_meta_tags($url);
  103.         if (!empty($urlData) && !empty($metaDescription) && array_key_exists('description'$metaDescription)) {
  104.             $urlData['description'] = $metaDescription['description'];
  105.         }
  106.         return $urlData;
  107.     }
  108.     public function getYoutubeMetaData($url){
  109.         $youtube "https://www.youtube.com/oembed?url="$url ."&format=json";
  110.         $curl curl_init($youtube);
  111.         curl_setopt($curlCURLOPT_RETURNTRANSFER1);
  112.         $return curl_exec($curl);
  113.         curl_close($curl);
  114.         return json_decode($returntrue);
  115.     }
  116. }