diff --git a/src/bundle/Resources/config/services/siteaccess.yml b/src/bundle/Resources/config/services/siteaccess.yml index 43aa47b6fa..2e6f96c324 100644 --- a/src/bundle/Resources/config/services/siteaccess.yml +++ b/src/bundle/Resources/config/services/siteaccess.yml @@ -5,5 +5,9 @@ services: public: false EzSystems\EzPlatformAdminUi\Siteaccess\SiteaccessResolverInterface: '@EzSystems\EzPlatformAdminUi\Siteaccess\SiteaccessResolver' - EzSystems\EzPlatformAdminUi\Siteaccess\SiteaccessResolver: ~ + EzSystems\EzPlatformAdminUi\Siteaccess\SiteaccessResolver: + arguments: + $siteaccessPreviewVoters: !tagged ezplatform.admin_ui.siteaccess_preview_voter EzSystems\EzPlatformAdminUi\Siteaccess\NonAdminSiteaccessResolver: ~ + EzSystems\EzPlatformAdminUi\Siteaccess\AdminSiteaccessPreviewVoter: + tags: ['ezplatform.admin_ui.siteaccess_preview_voter'] diff --git a/src/lib/Siteaccess/AbstractSiteaccessPreviewVoter.php b/src/lib/Siteaccess/AbstractSiteaccessPreviewVoter.php new file mode 100644 index 0000000000..5fda135591 --- /dev/null +++ b/src/lib/Siteaccess/AbstractSiteaccessPreviewVoter.php @@ -0,0 +1,67 @@ +configResolver = $configResolver; + } + + /** + * {@inheritdoc} + */ + public function vote(SiteaccessPreviewVoterContext $context): bool + { + $siteaccess = $context->getSiteaccess(); + $location = $context->getLocation(); + $languageCode = $context->getLanguageCode(); + $contentLanguages = $context->getVersionInfo()->languageCodes; + + if (empty(array_intersect($this->getRootLocationIds($siteaccess), $location->path))) { + return false; + } + + $siteaccessLanguages = $this->configResolver->getParameter( + 'languages', + null, + $siteaccess + ); + if (!in_array($languageCode, $siteaccessLanguages)) { + return false; + } + + $primarySiteaccessLanguage = reset($siteaccessLanguages); + if ( + $languageCode !== $primarySiteaccessLanguage + && in_array($primarySiteaccessLanguage, $contentLanguages) + ) { + return false; + } + + return true; + } + + /** + * @param string $siteaccess + * + * @return int[] + */ + abstract protected function getRootLocationIds(string $siteaccess): array; +} diff --git a/src/lib/Siteaccess/AdminSiteaccessPreviewVoter.php b/src/lib/Siteaccess/AdminSiteaccessPreviewVoter.php new file mode 100644 index 0000000000..66f1ab78ec --- /dev/null +++ b/src/lib/Siteaccess/AdminSiteaccessPreviewVoter.php @@ -0,0 +1,37 @@ +configResolver->getParameter( + 'location_ids.content_structure', + null, + $siteaccess + ); + $locationIds[] = $this->configResolver->getParameter( + 'location_ids.media', + null, + $siteaccess + ); + $locationIds[] = $this->configResolver->getParameter( + 'location_ids.users', + null, + $siteaccess + ); + + return $locationIds; + } +} diff --git a/src/lib/Siteaccess/SiteaccessPreviewVoterContext.php b/src/lib/Siteaccess/SiteaccessPreviewVoterContext.php new file mode 100644 index 0000000000..4995635178 --- /dev/null +++ b/src/lib/Siteaccess/SiteaccessPreviewVoterContext.php @@ -0,0 +1,71 @@ +location = $location; + $this->versionInfo = $versionInfo; + $this->siteaccess = $siteaccess; + $this->languageCode = $languageCode; + } + + /** + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function getLocation(): Location + { + return $this->location; + } + + /** + * @return string + */ + public function getSiteaccess(): string + { + return $this->siteaccess; + } + + /** + * @return string + */ + public function getLanguageCode(): string + { + return $this->languageCode; + } + + /** + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo(): VersionInfo + { + return $this->versionInfo; + } +} diff --git a/src/lib/Siteaccess/SiteaccessPreviewVoterInterface.php b/src/lib/Siteaccess/SiteaccessPreviewVoterInterface.php new file mode 100644 index 0000000000..5d31f805ed --- /dev/null +++ b/src/lib/Siteaccess/SiteaccessPreviewVoterInterface.php @@ -0,0 +1,21 @@ +configResolver = $configResolver; $this->contentService = $contentService; + $this->siteaccessPreviewVoters = $siteaccessPreviewVoters; } + /** + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param int|null $versionNo + * @param string|null $languageCode + * + * @return array + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ public function getSiteaccessesForLocation( Location $location, int $versionNo = null, string $languageCode = null ): array { $contentInfo = $location->getContentInfo(); - $languageCode = $languageCode ?? $contentInfo->mainLanguageCode; $versionInfo = $this->contentService->loadVersionInfo($contentInfo, $versionNo); - $contentLanguages = $versionInfo->languageCodes; + $languageCode = $languageCode ?? $contentInfo->mainLanguageCode; $eligibleSiteaccesses = []; foreach ($this->getSiteaccesses() as $siteaccess) { - $rootLocationId = $this->configResolver->getParameter( - 'content.tree_root.location_id', - null, - $siteaccess - ); - if (!in_array($rootLocationId, $location->path)) { - continue; + $context = new SiteaccessPreviewVoterContext($location, $versionInfo, $siteaccess, $languageCode); + foreach ($this->siteaccessPreviewVoters as $siteaccessPreviewVoter) { + if (true === $siteaccessPreviewVoter->vote($context)) { + $eligibleSiteaccesses[] = $siteaccess; + break; + } } - - $siteaccessLanguages = $this->configResolver->getParameter( - 'languages', - null, - $siteaccess - ); - if (!in_array($languageCode, $siteaccessLanguages)) { - continue; - } - - $primarySiteaccessLanguage = reset($siteaccessLanguages); - if ( - $languageCode !== $primarySiteaccessLanguage - && in_array($primarySiteaccessLanguage, $contentLanguages) - ) { - continue; - } - - $eligibleSiteaccesses[] = $siteaccess; } return $eligibleSiteaccesses;