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');