vendor/ezsystems/ezplatform-admin-ui/src/lib/UniversalDiscovery/Event/Subscriber/ContentCreate.php line 67

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) eZ Systems 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 EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\Subscriber;
  8. use eZ\Publish\API\Repository\ContentTypeService;
  9. use eZ\Publish\API\Repository\Exceptions\NotFoundException;
  10. use eZ\Publish\API\Repository\PermissionResolver;
  11. use eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation;
  12. use eZ\Publish\API\Repository\Values\User\Limitation\LanguageLimitation;
  13. use EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\ConfigResolveEvent;
  14. use EzSystems\EzPlatformAdminUi\Permission\PermissionCheckerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class ContentCreate implements EventSubscriberInterface
  17. {
  18.     /** @var array */
  19.     private $restrictedContentTypesIdentifiers;
  20.     /** @var array */
  21.     private $restrictedLanguagesCodes;
  22.     /** @var \EzSystems\EzPlatformAdminUi\Permission\PermissionCheckerInterface */
  23.     private $permissionChecker;
  24.     /** @var \eZ\Publish\API\Repository\ContentTypeService */
  25.     private $contentTypeService;
  26.     /**
  27.      * @param \eZ\Publish\API\Repository\PermissionResolver $permissionResolver
  28.      * @param \EzSystems\EzPlatformAdminUi\Permission\PermissionCheckerInterface $permissionChecker
  29.      * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService
  30.      *
  31.      * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
  32.      */
  33.     public function __construct(
  34.         PermissionResolver $permissionResolver,
  35.         PermissionCheckerInterface $permissionChecker,
  36.         ContentTypeService $contentTypeService
  37.     ) {
  38.         $this->contentTypeService $contentTypeService;
  39.         $this->permissionChecker $permissionChecker;
  40.         $hasAccess $permissionResolver->hasAccess('content''create');
  41.         $this->restrictedContentTypesIdentifiers $this->getRestrictedContentTypesIdentifiers($hasAccess);
  42.         $this->restrictedLanguagesCodes $this->getRestrictedLanguagesCodes($hasAccess);
  43.     }
  44.     /**
  45.      * {@inheritdoc}
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             ConfigResolveEvent::NAME => ['onUdwConfigResolve'],
  51.         ];
  52.     }
  53.     /**
  54.      * @param \EzSystems\EzPlatformAdminUi\UniversalDiscovery\Event\ConfigResolveEvent $event
  55.      */
  56.     public function onUdwConfigResolve(ConfigResolveEvent $event): void
  57.     {
  58.         $config $event->getConfig();
  59.         if (!$this->hasCreateTab($config)) {
  60.             return;
  61.         }
  62.         if ($this->hasContentTypeRestrictions()) {
  63.             $config['content_on_the_fly']['allowed_content_types'] = $this->restrictedContentTypesIdentifiers;
  64.             $event->setConfig($config);
  65.         }
  66.         if ($this->hasLanguagesRestrictions()) {
  67.             $config['content_on_the_fly']['allowed_languages'] = $this->restrictedLanguagesCodes;
  68.             $event->setConfig($config);
  69.         }
  70.     }
  71.     /**
  72.      * @param array $config
  73.      *
  74.      * @return bool
  75.      */
  76.     private function hasCreateTab(array $config): bool
  77.     {
  78.         return empty($config['visible_tabs']) || \in_array('create'$config['visible_tabs'], true);
  79.     }
  80.     /**
  81.      * @param array|bool $hasAccess
  82.      *
  83.      * @return array
  84.      */
  85.     private function getRestrictedContentTypesIdentifiers($hasAccess): array
  86.     {
  87.         if (!\is_array($hasAccess)) {
  88.             return [];
  89.         }
  90.         $restrictedContentTypesIds $this->permissionChecker->getRestrictions($hasAccessContentTypeLimitation::class);
  91.         if (empty($restrictedContentTypesIds)) {
  92.             return [];
  93.         }
  94.         $restrictedContentTypesIdentifiers = [];
  95.         foreach ($restrictedContentTypesIds as $restrictedContentTypeId) {
  96.             // TODO: Change to `contentTypeService->loadContentTypeList($restrictedContentTypesIds)` after #2444 will be merged
  97.             try {
  98.                 $identifier $this->contentTypeService->loadContentType($restrictedContentTypeId)->identifier;
  99.                 $restrictedContentTypesIdentifiers[] = $identifier;
  100.             } catch (NotFoundException $e) {
  101.             }
  102.         }
  103.         return $restrictedContentTypesIdentifiers;
  104.     }
  105.     /**
  106.      * @return bool
  107.      */
  108.     private function hasContentTypeRestrictions(): bool
  109.     {
  110.         return !empty($this->restrictedContentTypesIdentifiers);
  111.     }
  112.     /**
  113.      * @param $hasAccess
  114.      *
  115.      * @return string[]
  116.      */
  117.     private function getRestrictedLanguagesCodes($hasAccess): array
  118.     {
  119.         if (!\is_array($hasAccess)) {
  120.             return [];
  121.         }
  122.         $restrictedLanguagesCodes $this->permissionChecker->getRestrictions($hasAccessLanguageLimitation::class);
  123.         if (empty($restrictedLanguagesCodes)) {
  124.             return [];
  125.         }
  126.         return $restrictedLanguagesCodes;
  127.     }
  128.     /**
  129.      * @return bool
  130.      */
  131.     private function hasLanguagesRestrictions(): bool
  132.     {
  133.         return !empty($this->restrictedLanguagesCodes);
  134.     }
  135. }