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
+ key: policy.limitation.identifier.memberof
+
New Section
@@ -71,6 +76,11 @@
PersonalizationAccess
key: policy.limitation.identifier.personalizationaccess
+
+
+ Role
+ key: policy.limitation.identifier.role
+
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
+ key: policy.limitation.member_of.self_user_group
+
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;
+ }
+}