vendor/ibexa/fieldtype-page/src/lib/Event/Subscriber/BlockContextSubscriber.php line 77

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\FieldTypePage\Event\Subscriber;
  8. use Ibexa\Bundle\FieldTypePage\Controller\BlockController;
  9. use Ibexa\Contracts\Core\Repository\ContentService;
  10. use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException;
  11. use Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException;
  12. use Ibexa\Contracts\Core\Repository\LocationService;
  13. use Ibexa\Contracts\Core\Repository\Values\Content\Content;
  14. use Ibexa\Contracts\Core\Repository\Values\Content\Field;
  15. use Ibexa\Core\Base\Exceptions\InvalidArgumentException;
  16. use Ibexa\FieldTypePage\Event\BlockContextEvent;
  17. use Ibexa\FieldTypePage\Event\BlockContextEvents;
  18. use Ibexa\FieldTypePage\FieldType\LandingPage\Type;
  19. use Ibexa\FieldTypePage\FieldType\Page\Block\Context\ContentViewBlockContext;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
  22. class BlockContextSubscriber implements EventSubscriberInterface
  23. {
  24.     /** @var \Ibexa\Contracts\Core\Repository\ContentService */
  25.     private $contentService;
  26.     /** @var \Ibexa\Contracts\Core\Repository\LocationService */
  27.     private $locationService;
  28.     /** @var \Symfony\Component\HttpKernel\Controller\ControllerResolverInterface */
  29.     private $controllerResolver;
  30.     /** @var \Ibexa\FieldTypePage\FieldType\LandingPage\Type */
  31.     private $type;
  32.     /**
  33.      * @param \Ibexa\Contracts\Core\Repository\ContentService $contentService
  34.      * @param \Ibexa\Contracts\Core\Repository\LocationService $locationService
  35.      * @param \Symfony\Component\HttpKernel\Controller\ControllerResolverInterface $controllerResolver
  36.      * @param \Ibexa\FieldTypePage\FieldType\LandingPage\Type $type
  37.      */
  38.     public function __construct(
  39.         ContentService $contentService,
  40.         LocationService $locationService,
  41.         ControllerResolverInterface $controllerResolver,
  42.         Type $type
  43.     ) {
  44.         $this->contentService $contentService;
  45.         $this->locationService $locationService;
  46.         $this->controllerResolver $controllerResolver;
  47.         $this->type $type;
  48.     }
  49.     /**
  50.      * {@inheritdoc}
  51.      */
  52.     public static function getSubscribedEvents()
  53.     {
  54.         return [
  55.             BlockContextEvents::CREATE => ['onBlockContextCreate'0],
  56.         ];
  57.     }
  58.     /**
  59.      * Creates ContentViewBlockContext from Request.
  60.      *
  61.      * @param \Ibexa\FieldTypePage\Event\BlockContextEvent $event
  62.      *
  63.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  64.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  65.      * @throws \Ibexa\Core\Base\Exceptions\InvalidArgumentException
  66.      */
  67.     public function onBlockContextCreate(BlockContextEvent $event): void
  68.     {
  69.         $request $event->getRequest();
  70.         $controller $this->controllerResolver->getController($request);
  71.         if (!\is_array($controller) || !$controller[0] instanceof BlockController || $controller[1] !== 'renderAction') {
  72.             return;
  73.         }
  74.         $location $request->get('location');
  75.         $locationId = (int)$request->get('locationId');
  76.         if (null === $location && !empty($locationId)) {
  77.             try {
  78.                 $location $this->locationService->loadLocation($locationId);
  79.             } catch (UnauthorizedException $e) {
  80.                 return;
  81.             } catch (NotFoundException $e) {
  82.                 //Content is not yet published (i.e. send for review), location do not exist.
  83.             }
  84.         }
  85.         $contentId = (int) (null !== $location $location->contentId $request->get('contentId'));
  86.         if (!$contentId) {
  87.             return;
  88.         }
  89.         $contentInfo null !== $location $location->getContentInfo() : $this->contentService->loadContent($contentId)->contentInfo;
  90.         $versionNo = (int) $request->get('versionNo'$contentInfo->currentVersionNo);
  91.         $languageCode = (string) $request->get('languageCode'$contentInfo->mainLanguageCode);
  92.         $content $this->contentService->loadContent($contentId, [$languageCode], $versionNo);
  93.         $pageField $this->getPageField($content);
  94.         $page $pageField->value->getPage();
  95.         $event->setBlockContext(new ContentViewBlockContext($location$content$versionNo$languageCode$page));
  96.     }
  97.     /**
  98.      * @param \Ibexa\Contracts\Core\Repository\Values\Content\Content $content
  99.      *
  100.      * @return \Ibexa\Contracts\Core\Repository\Values\Content\Field
  101.      *
  102.      * @throws \Ibexa\Core\Base\Exceptions\InvalidArgumentException
  103.      */
  104.     private function getPageField(Content $content): Field
  105.     {
  106.         foreach ($content->getFields() as $field) {
  107.             if ($field->fieldTypeIdentifier === $this->type->getFieldTypeIdentifier()) {
  108.                 return $field;
  109.             }
  110.         }
  111.         throw new InvalidArgumentException('$content''The Content item does not contain a Page Field.');
  112.     }
  113. }
  114. class_alias(BlockContextSubscriber::class, 'EzSystems\EzPlatformPageFieldType\Event\Subscriber\BlockContextSubscriber');