diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml index aa53155fbf..0a6797521d 100644 --- a/src/bundle/Resources/config/services.yaml +++ b/src/bundle/Resources/config/services.yaml @@ -30,6 +30,7 @@ imports: - { resource: services/events.yaml } - { resource: services/twig.yaml } - { resource: services/autosave.yaml } + - { resource: services/role_form_mappers.yaml } services: _defaults: diff --git a/src/bundle/Resources/config/services/role_form_mappers.yaml b/src/bundle/Resources/config/services/role_form_mappers.yaml index ca07d14fee..9ab6c0071e 100644 --- a/src/bundle/Resources/config/services/role_form_mappers.yaml +++ b/src/bundle/Resources/config/services/role_form_mappers.yaml @@ -223,3 +223,22 @@ services: tags: - { name: ez.limitation.formMapper, limitationType: Subtree } - { name: ez.limitation.valueMapper, limitationType: Subtree } + + Ibexa\AdminUi\Limitation\Mapper\MemberOfLimitationMapper: + parent: ezplatform.content_forms.limitation.form_mapper.multiple_selection + arguments: + $userService: '@ezpublish.api.service.user' + $repository: '@ezpublish.api.repository' + $contentService: '@ezpublish.api.service.content' + $translator: '@translator' + tags: + - { name: ez.limitation.formMapper, limitationType: MemberOf } + - { name: ez.limitation.valueMapper, limitationType: MemberOf } + + Ibexa\AdminUi\Limitation\Mapper\RoleLimitationMapper: + parent: ezplatform.content_forms.limitation.form_mapper.multiple_selection + arguments: + $roleService: '@ezpublish.api.service.role' + tags: + - { name: ez.limitation.formMapper, limitationType: Role } + - { name: ez.limitation.valueMapper, limitationType: Role } diff --git a/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff b/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff index 987a2c2979..9871404cef 100644 --- a/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff +++ b/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff @@ -26,6 +26,11 @@ Language key: policy.limitation.identifier.language + + MemberOf + MemberOf + key: policy.limitation.identifier.memberof + New Section New Section @@ -71,6 +76,11 @@ PersonalizationAccess key: policy.limitation.identifier.personalizationaccess + + Role + Role + key: policy.limitation.identifier.role + Section Section diff --git a/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff b/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff index c8f78e1d82..825e24f4a2 100644 --- a/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff +++ b/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff @@ -11,6 +11,11 @@ Self key: policy.limitation.group.self + + Self + Self + key: policy.limitation.member_of.self_user_group + Self Self diff --git a/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig b/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig index d85ddbe238..f1e2184b94 100644 --- a/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig +++ b/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig @@ -116,3 +116,15 @@ {{ values|join(', ') }} {% endapply %} {% endblock %} + +{% block ez_limitation_memberof_value %} + {% apply spaceless %} + {{ values|join(', ') }} + {% endapply %} +{% endblock %} + +{% block ez_limitation_role_value %} + {% apply spaceless %} + {{ values|join(', ') }} + {% endapply %} +{% endblock %} diff --git a/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php b/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php new file mode 100644 index 0000000000..c10084220a --- /dev/null +++ b/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php @@ -0,0 +1,105 @@ +userService = $userService; + $this->repository = $repository; + $this->contentService = $contentService; + $this->translator = $translator; + } + + protected function getSelectionChoices(): array + { + $userGroups = $this->loadUserGroups(); + $choices = []; + $choices[MemberOfLimitationType::SELF_USER_GROUP] = $this->getSelfUserGroupLabel(); + + foreach ($userGroups as $userGroup) { + $choices[$userGroup->id] = $userGroup->getName(); + } + + return $choices; + } + + public function mapLimitationValue(Limitation $limitation): array + { + $values = []; + foreach ($limitation->limitationValues as $groupId) { + if ((int)$groupId === MemberOfLimitationType::SELF_USER_GROUP) { + $values[] = $this->getSelfUserGroupLabel(); + continue; + } + $values[] = $this->userService->loadUserGroup((int)$groupId)->getName(); + } + + return $values; + } + + /** + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + private function loadUserGroups(): array + { + return $this->repository->sudo(function () { + $filter = new Filter(); + $filter->withCriterion(new ContentTypeIdentifier('user_group')); + $filter->withSortClause(new ContentName()); + $results = $this->contentService->find($filter); + + $groups = []; + foreach ($results as $result) { + $groups[] = $this->userService->loadUserGroup($result->id); + } + + return $groups; + }); + } + + private function getSelfUserGroupLabel(): string + { + return $this->translator->trans( + /** @Desc("Self") */ + 'policy.limitation.member_of.self_user_group', + [], + 'ezplatform_content_forms_role' + ); + } +} diff --git a/src/lib/Limitation/Mapper/RoleLimitationMapper.php b/src/lib/Limitation/Mapper/RoleLimitationMapper.php new file mode 100644 index 0000000000..5b4f82ed97 --- /dev/null +++ b/src/lib/Limitation/Mapper/RoleLimitationMapper.php @@ -0,0 +1,47 @@ +roleService = $roleService; + } + + protected function getSelectionChoices(): array + { + $choices = []; + foreach ($this->roleService->loadRoles() as $role) { + $choices[$role->id] = $role->identifier; + } + + return $choices; + } + + public function mapLimitationValue(Limitation $limitation): array + { + $values = []; + + foreach ($limitation->limitationValues as $roleId) { + $values[] = $this->roleService->loadRole((int)$roleId)->identifier; + } + + return $values; + } +}