From 5807e7474f3905b1a3d377be708bba05cf6bb1af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Mon, 19 Oct 2015 17:46:17 +0200 Subject: [PATCH 01/15] EZP-24713: Added limitation edition basics --- .../Compiler/LimitationFormMapperPass.php | 43 ++++++++++++ bundle/EzSystemsRepositoryFormsBundle.php | 2 + bundle/Resources/config/role.yml | 21 +++++- .../translations/ezrepoforms_role.en.xlf | 24 +++++++ lib/Data/Mapper/PolicyMapper.php | 31 ++++++++- lib/Data/Role/PolicyCreateData.php | 10 +++ lib/Data/Role/PolicyDataTrait.php | 6 ++ lib/Form/Type/Role/LimitationType.php | 55 +++++++++++++++ lib/Form/Type/Role/PolicyType.php | 29 +++++++- .../LimitationFormMapperInterface.php | 17 +++++ .../LimitationFormMapperRegistry.php | 68 +++++++++++++++++++ .../LimitationFormMapperRegistryInterface.php | 46 +++++++++++++ lib/Limitation/SiteAccessLimitationMapper.php | 36 ++++++++++ 13 files changed, 384 insertions(+), 4 deletions(-) create mode 100644 bundle/DependencyInjection/Compiler/LimitationFormMapperPass.php create mode 100644 lib/Form/Type/Role/LimitationType.php create mode 100644 lib/Limitation/LimitationFormMapperInterface.php create mode 100644 lib/Limitation/LimitationFormMapperRegistry.php create mode 100644 lib/Limitation/LimitationFormMapperRegistryInterface.php create mode 100644 lib/Limitation/SiteAccessLimitationMapper.php diff --git a/bundle/DependencyInjection/Compiler/LimitationFormMapperPass.php b/bundle/DependencyInjection/Compiler/LimitationFormMapperPass.php new file mode 100644 index 000000000..c22dbe224 --- /dev/null +++ b/bundle/DependencyInjection/Compiler/LimitationFormMapperPass.php @@ -0,0 +1,43 @@ +hasDefinition('ezrepoforms.limitation_form_mapper.registry')) { + return; + } + + $registry = $container->findDefinition('ezrepoforms.limitation_form_mapper.registry'); + + foreach ($container->findTaggedServiceIds('ez.limitation.formMapper') as $id => $attributes) { + foreach ($attributes as $attribute) { + if (!isset($attribute['limitationType'])) { + throw new LogicException( + 'ez.limitation.formMapper service tag needs a "limitationType" attribute to identify which LimitationType the mapper is for. None given.' + ); + } + + $registry->addMethodCall('addMapper', [new Reference($id), $attribute['limitationType']]); + } + } + } +} diff --git a/bundle/EzSystemsRepositoryFormsBundle.php b/bundle/EzSystemsRepositoryFormsBundle.php index 82e33ad1b..a8c615495 100644 --- a/bundle/EzSystemsRepositoryFormsBundle.php +++ b/bundle/EzSystemsRepositoryFormsBundle.php @@ -11,6 +11,7 @@ namespace EzSystems\RepositoryFormsBundle; use EzSystems\RepositoryFormsBundle\DependencyInjection\Compiler\FieldTypeFormMapperPass; +use EzSystems\RepositoryFormsBundle\DependencyInjection\Compiler\LimitationFormMapperPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -20,5 +21,6 @@ public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new FieldTypeFormMapperPass()); + $container->addCompilerPass(new LimitationFormMapperPass()); } } diff --git a/bundle/Resources/config/role.yml b/bundle/Resources/config/role.yml index c22e84266..004298b0f 100644 --- a/bundle/Resources/config/role.yml +++ b/bundle/Resources/config/role.yml @@ -1,6 +1,7 @@ parameters: # Form types ezrepoforms.policy.edit.form.class: EzSystems\RepositoryForms\Form\Type\Role\PolicyType + ezrepoforms.policy.limitation.form.class: EzSystems\RepositoryForms\Form\Type\Role\LimitationType # Validators ezrepoforms.validator.unique_role_identifier.class: EzSystems\RepositoryForms\Validator\Constraints\UniqueRoleIdentifierValidator @@ -13,14 +14,23 @@ parameters: ezrepoforms.form_processor.role.class: EzSystems\RepositoryForms\Form\Processor\RoleFormProcessor ezrepoforms.form_processor.policy.class: EzSystems\RepositoryForms\Form\Processor\PolicyFormProcessor + ezrepoforms.limitation_form_mapper.registry.class: EzSystems\RepositoryForms\Limitation\LimitationFormMapperRegistry + ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\SiteAccessLimitationMapper + services: # Form types ezrepoforms.policy.edit.form: class: %ezrepoforms.policy.edit.form.class% - arguments: [%ezpublish.api.role.policy_map%, @translator] + arguments: [%ezpublish.api.role.policy_map%, @translator, @ezpublish.api.service.role] tags: - { name: form.type, alias: ezrepoforms_policy_edit } + ezrepoforms.policy.limitation.form: + class: %ezrepoforms.policy.limitation.form.class% + arguments: [@ezrepoforms.limitation_form_mapper.registry] + tags: + - { name: form.type, alias: ezrepoforms_policy_limitation_edit } + # Validators ezrepoforms.validator.unique_role_identifier: class: %ezrepoforms.validator.unique_role_identifier.class% @@ -49,3 +59,12 @@ services: arguments: [@ezpublish.api.service.role] tags: - { name: kernel.event_subscriber } + + ezrepoforms.limitation_form_mapper.registry: + class: %ezrepoforms.limitation_form_mapper.registry.class% + + ezrepoforms.limitation.form_mapper.siteaccess: + class: %ezrepoforms.limitation.form_mapper.siteaccess.class% + arguments: [%ezpublish.siteaccess.list%] + tags: + - { name: ez.limitation.formMapper, limitationType: SiteAccess } diff --git a/bundle/Resources/translations/ezrepoforms_role.en.xlf b/bundle/Resources/translations/ezrepoforms_role.en.xlf index 6535c2fa0..5065388e7 100644 --- a/bundle/Resources/translations/ezrepoforms_role.en.xlf +++ b/bundle/Resources/translations/ezrepoforms_role.en.xlf @@ -50,6 +50,30 @@ role.policy.form.delete Delete policy + + role.policy.limitation.none + No limitations available + + + role.policy.save_and_add_limitation + Save and add limitations + + + role.policy.available_limitations + Limitations + + + role.policy.save + Save + + + Class + ContentType + + + Node + Location + role.assignment.form.delete Delete assignment diff --git a/lib/Data/Mapper/PolicyMapper.php b/lib/Data/Mapper/PolicyMapper.php index 2d0831fc0..9227f0385 100644 --- a/lib/Data/Mapper/PolicyMapper.php +++ b/lib/Data/Mapper/PolicyMapper.php @@ -36,6 +36,7 @@ public function mapToFormData(ValueObject $policyDraft, array $params = []) 'roleDraft' => $params['roleDraft'], 'initialRole' => $params['initialRole'], 'moduleFunction' => "{$policyDraft->module}|{$policyDraft->function}", + 'limitationsData' => $this->generateLimitationList($policyDraft->getLimitations(), $params['availableLimitationTypes']), ]); } else { $data = new PolicyCreateData([ @@ -51,7 +52,7 @@ public function mapToFormData(ValueObject $policyDraft, array $params = []) private function configureOptions(OptionsResolver $optionsResolver) { $optionsResolver - ->setRequired(['roleDraft', 'initialRole']) + ->setRequired(['roleDraft', 'initialRole', 'availableLimitationTypes']) ->setAllowedTypes('roleDraft', '\eZ\Publish\API\Repository\Values\User\RoleDraft') ->setAllowedTypes('initialRole', '\eZ\Publish\API\Repository\Values\User\Role'); } @@ -60,4 +61,32 @@ private function isPolicyNew(PolicyDraft $policy) { return $policy->id === null; } + + /** + * Generates the limitation list from existing limitations (already configured for current policy) and + * available limitation types available for current policy (i.e. current module/function combination) + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation[] $existingLimitations + * @param \eZ\Publish\SPI\Limitation\Type[] $availableLimitationTypes + * + * @return array|\eZ\Publish\API\Repository\Values\User\Limitation[] + */ + private function generateLimitationList(array $existingLimitations, array $availableLimitationTypes) + { + $limitations = []; + foreach ($existingLimitations as $limitation) { + $limitations[$limitation->getIdentifier()] = $limitation; + } + + foreach ($availableLimitationTypes as $identifier => $limitationType) { + if (isset($limitations[$identifier])) { + continue; + } + + $limitations[$identifier] = $limitationType->buildValue([]); + } + + ksort($limitations); + return $limitations; + } } diff --git a/lib/Data/Role/PolicyCreateData.php b/lib/Data/Role/PolicyCreateData.php index 559a43abf..163526613 100644 --- a/lib/Data/Role/PolicyCreateData.php +++ b/lib/Data/Role/PolicyCreateData.php @@ -24,4 +24,14 @@ public function isNew() { return true; } + + public function getModule() + { + return $this->module; + } + + public function getFunction() + { + return $this->function; + } } diff --git a/lib/Data/Role/PolicyDataTrait.php b/lib/Data/Role/PolicyDataTrait.php index 8ab0dcc76..2c523e64b 100644 --- a/lib/Data/Role/PolicyDataTrait.php +++ b/lib/Data/Role/PolicyDataTrait.php @@ -29,6 +29,8 @@ trait PolicyDataTrait */ protected $initialRole; + protected $limitationsData; + /** * Combination of module + function as a single string. * Example: "content|read". @@ -46,4 +48,8 @@ public function getId() { return $this->policyDraft ? $this->policyDraft->id : null; } + + abstract public function getModule(); + + abstract public function getFunction(); } diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php new file mode 100644 index 000000000..c5586ce80 --- /dev/null +++ b/lib/Form/Type/Role/LimitationType.php @@ -0,0 +1,55 @@ +limitationFormMapperRegistry = $limitationFormMapperRegistry; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->add('identifier', 'hidden'); + + $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { + /** @var \eZ\Publish\API\Repository\Values\User\Limitation $data */ + $data = $event->getData(); + $form = $event->getForm(); + $this->limitationFormMapperRegistry->getMapper($data->getIdentifier())->mapLimitationForm($form, $data); + }); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => '\eZ\Publish\API\Repository\Values\User\Limitation', + 'translation_domain' => 'ezrepoforms_role', + ]); + } + + public function getName() + { + return 'ezrepoforms_policy_limitation_edit'; + } +} diff --git a/lib/Form/Type/Role/PolicyType.php b/lib/Form/Type/Role/PolicyType.php index 4d2bbfb55..16ab66b26 100644 --- a/lib/Form/Type/Role/PolicyType.php +++ b/lib/Form/Type/Role/PolicyType.php @@ -8,8 +8,11 @@ */ namespace EzSystems\RepositoryForms\Form\Type\Role; +use eZ\Publish\API\Repository\RoleService; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Translation\TranslatorInterface; @@ -25,10 +28,16 @@ class PolicyType extends AbstractType */ private $translator; - public function __construct(array $policyMap, TranslatorInterface $translator) + /** + * @var RoleService + */ + private $roleService; + + public function __construct(array $policyMap, TranslatorInterface $translator, RoleService $roleService) { $this->translator = $translator; $this->policyChoices = $this->buildPolicyChoicesFromMap($policyMap); + $this->roleService = $roleService; } /** @@ -83,7 +92,23 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'placeholder' => 'role.policy.type.choose', ]) ->add('removeDraft', 'submit', ['label' => 'role.cancel', 'validation_groups' => false]) - ->add('savePolicy', 'submit', ['label' => 'role.save']); + ->add('savePolicy', 'submit', ['label' => 'role.policy.save']); + + $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { + /** @var \EzSystems\RepositoryForms\Data\Role\PolicyCreateData|\EzSystems\RepositoryForms\Data\Role\PolicyUpdateData $data */ + $data = $event->getData(); + $form = $event->getForm(); + + if ($module = $data->getModule()) { + $form + ->add('limitationsData', 'collection', [ + 'type' => 'ezrepoforms_policy_limitation_edit', + 'label' => 'role.policy.available_limitations', + ]); + } else { + $form->add('saveAndAddLimitation', 'submit', ['label' => 'role.policy.save_and_add_limitation']); + } + }); } public function getName() diff --git a/lib/Limitation/LimitationFormMapperInterface.php b/lib/Limitation/LimitationFormMapperInterface.php new file mode 100644 index 000000000..5f5e9fa83 --- /dev/null +++ b/lib/Limitation/LimitationFormMapperInterface.php @@ -0,0 +1,17 @@ +limitationFormMappers; + } + + public function addMapper(LimitationFormMapperInterface $mapper, $fieldTypeIdentifier) + { + $this->limitationFormMappers[$fieldTypeIdentifier] = $mapper; + } + + /** + * Returns mapper corresponding to given Limitation identifier. + * + * @param string $limitationIdentifier + * + * @throws \InvalidArgumentException If no mapper exists for $fieldTypeIdentifier. + * + * @return LimitationFormMapperInterface + */ + public function getMapper($limitationIdentifier) + { + if (!$this->hasMapper($limitationIdentifier)) { + throw new InvalidArgumentException("No LimitationFormMapper found for '$limitationIdentifier'"); + } + + return $this->limitationFormMappers[$limitationIdentifier]; + } + + /** + * Checks if a mapper exists for given Limitation identifier. + * + * @param string $limitationIdentifier + * + * @return bool + */ + public function hasMapper($limitationIdentifier) + { + return isset($this->limitationFormMappers[$limitationIdentifier]); + } +} diff --git a/lib/Limitation/LimitationFormMapperRegistryInterface.php b/lib/Limitation/LimitationFormMapperRegistryInterface.php new file mode 100644 index 000000000..c64937983 --- /dev/null +++ b/lib/Limitation/LimitationFormMapperRegistryInterface.php @@ -0,0 +1,46 @@ +siteAccessList = $siteAccessList; + } + + public function mapLimitationForm(FormInterface $form, Limitation $data) + { + $siteAccesses = []; + foreach ($this->siteAccessList as $sa) { + $siteAccesses[sprintf('%u', crc32($sa))] = $sa; + } + + $form + ->add('limitationValues', 'choice', ['choices' => $siteAccesses, 'multiple' => true]); + } +} From 3c52a38c837cc15ad13a43fb58d1f0f0ec5528cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 14:38:18 +0200 Subject: [PATCH 02/15] EZP-24713: Added base class for Limitation mappers based on multiple selection SiteAccessLimitationMapper is now based on this abstract class. --- bundle/Resources/config/role.yml | 11 +++- .../translations/ezrepoforms_role.en.xlf | 4 ++ .../base_limitation_values.html.twig | 3 + .../LimitationFormMapperInterface.php | 23 +++++++ .../Mapper/MultipleSelectionBasedMapper.php | 63 +++++++++++++++++++ .../SiteAccessLimitationMapper.php | 17 ++--- 6 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 bundle/Resources/views/Limitation/base_limitation_values.html.twig create mode 100644 lib/Limitation/Mapper/MultipleSelectionBasedMapper.php rename lib/Limitation/{ => Mapper}/SiteAccessLimitationMapper.php (60%) diff --git a/bundle/Resources/config/role.yml b/bundle/Resources/config/role.yml index 004298b0f..53b9f1551 100644 --- a/bundle/Resources/config/role.yml +++ b/bundle/Resources/config/role.yml @@ -14,8 +14,10 @@ parameters: ezrepoforms.form_processor.role.class: EzSystems\RepositoryForms\Form\Processor\RoleFormProcessor ezrepoforms.form_processor.policy.class: EzSystems\RepositoryForms\Form\Processor\PolicyFormProcessor + # Limitation mappers ezrepoforms.limitation_form_mapper.registry.class: EzSystems\RepositoryForms\Limitation\LimitationFormMapperRegistry - ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\SiteAccessLimitationMapper + ezrepoforms.limitation.multiple_selection.template: "EzSystemsRepositoryFormsBundle:Limitation:base_limitation_values.html.twig" + ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\Mapper\SiteAccessLimitationMapper services: # Form types @@ -63,7 +65,14 @@ services: ezrepoforms.limitation_form_mapper.registry: class: %ezrepoforms.limitation_form_mapper.registry.class% + ezrepoforms.limitation.form_mapper.multiple_selection: + class: EzSystems\RepositoryForms\Limitation\Mapper\MultipleSelectionBasedMapper + abstract: true + calls: + - [setFormTemplate, [%ezrepoforms.limitation.multiple_selection.template%]] + ezrepoforms.limitation.form_mapper.siteaccess: + parent: ezrepoforms.limitation.form_mapper.multiple_selection class: %ezrepoforms.limitation.form_mapper.siteaccess.class% arguments: [%ezpublish.siteaccess.list%] tags: diff --git a/bundle/Resources/translations/ezrepoforms_role.en.xlf b/bundle/Resources/translations/ezrepoforms_role.en.xlf index 5065388e7..442064e26 100644 --- a/bundle/Resources/translations/ezrepoforms_role.en.xlf +++ b/bundle/Resources/translations/ezrepoforms_role.en.xlf @@ -78,6 +78,10 @@ role.assignment.form.delete Delete assignment + + role.policy.limitation.any + Any + diff --git a/bundle/Resources/views/Limitation/base_limitation_values.html.twig b/bundle/Resources/views/Limitation/base_limitation_values.html.twig new file mode 100644 index 000000000..ce24156fa --- /dev/null +++ b/bundle/Resources/views/Limitation/base_limitation_values.html.twig @@ -0,0 +1,3 @@ +{{ form_label(form.limitationValues) }} +{{ form_errors(form.limitationValues) }} +{{ form_widget(form.limitationValues) }} diff --git a/lib/Limitation/LimitationFormMapperInterface.php b/lib/Limitation/LimitationFormMapperInterface.php index 5f5e9fa83..fa2c7a6e6 100644 --- a/lib/Limitation/LimitationFormMapperInterface.php +++ b/lib/Limitation/LimitationFormMapperInterface.php @@ -11,7 +11,30 @@ use eZ\Publish\API\Repository\Values\User\Limitation; use Symfony\Component\Form\FormInterface; +/** + * Interface for LimitationType form mappers. + * + * It maps a LimitationType's supported values to editing form. + */ interface LimitationFormMapperInterface { + /** + * "Maps" Limitation form to current LimitationType, in order to display one or several fields + * representing limitation values supported by the LimitationType. + * + * Implementors MUST either: + * - Add a "limitationValues" form field + * - OR add field(s) that map to "limitationValues" property from $data. + * + * @param FormInterface $form Form for current Limitation. + * @param Limitation $data Underlying data for current Limitation form. + */ public function mapLimitationForm(FormInterface $form, Limitation $data); + + /** + * Returns the Twig template to use to render the limitation form. + * + * @return string + */ + public function getFormTemplate(); } diff --git a/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php b/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php new file mode 100644 index 000000000..a70dbb019 --- /dev/null +++ b/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php @@ -0,0 +1,63 @@ +getChoiceFieldOptions() + [ + 'multiple' => true, + 'label' => $data->getIdentifier(), + ]; + $options['choices'] = $this->getSelectionChoices(); + $form->add('limitationValues', 'choice', $options); + } + + /** + * Returns value choices to display, as expected by the "choices" option from Choice field. + * + * @return array + */ + abstract protected function getSelectionChoices(); + + /** + * Returns custom options. + * + * @return array + */ + protected function getChoiceFieldOptions() + { + return []; + } + + public function setFormTemplate($template) + { + $this->template = $template; + } + + public function getFormTemplate() + { + return $this->template; + } +} diff --git a/lib/Limitation/SiteAccessLimitationMapper.php b/lib/Limitation/Mapper/SiteAccessLimitationMapper.php similarity index 60% rename from lib/Limitation/SiteAccessLimitationMapper.php rename to lib/Limitation/Mapper/SiteAccessLimitationMapper.php index 807620538..202f16266 100644 --- a/lib/Limitation/SiteAccessLimitationMapper.php +++ b/lib/Limitation/Mapper/SiteAccessLimitationMapper.php @@ -6,12 +6,9 @@ * @license For full copyright and license information view LICENSE file distributed with this source code. * @version //autogentag// */ -namespace EzSystems\RepositoryForms\Limitation; +namespace EzSystems\RepositoryForms\Limitation\Mapper; -use eZ\Publish\API\Repository\Values\User\Limitation; -use Symfony\Component\Form\FormInterface; - -class SiteAccessLimitationMapper implements LimitationFormMapperInterface +class SiteAccessLimitationMapper extends MultipleSelectionBasedMapper { /** * @var array @@ -23,14 +20,18 @@ public function __construct(array $siteAccessList) $this->siteAccessList = $siteAccessList; } - public function mapLimitationForm(FormInterface $form, Limitation $data) + protected function getSelectionChoices() { $siteAccesses = []; foreach ($this->siteAccessList as $sa) { $siteAccesses[sprintf('%u', crc32($sa))] = $sa; } - $form - ->add('limitationValues', 'choice', ['choices' => $siteAccesses, 'multiple' => true]); + return $siteAccesses; + } + + protected function getChoiceFieldOptions() + { + return ['required' => false]; } } From 27960776c3f118ef60944b1efdefe76202c87704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 14:39:41 +0200 Subject: [PATCH 03/15] EZP-24713: Exposed limitation mapper in limitation form view --- lib/Form/Type/Role/LimitationType.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php index c5586ce80..31c18e419 100644 --- a/lib/Form/Type/Role/LimitationType.php +++ b/lib/Form/Type/Role/LimitationType.php @@ -13,6 +13,8 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; class LimitationType extends AbstractType @@ -22,6 +24,11 @@ class LimitationType extends AbstractType */ private $limitationFormMapperRegistry; + /** + * @var \EzSystems\RepositoryForms\Limitation\LimitationFormMapperInterface + */ + private $mapper; + public function __construct(LimitationFormMapperRegistryInterface $limitationFormMapperRegistry) { $this->limitationFormMapperRegistry = $limitationFormMapperRegistry; @@ -36,10 +43,17 @@ public function buildForm(FormBuilderInterface $builder, array $options) /** @var \eZ\Publish\API\Repository\Values\User\Limitation $data */ $data = $event->getData(); $form = $event->getForm(); - $this->limitationFormMapperRegistry->getMapper($data->getIdentifier())->mapLimitationForm($form, $data); + $this->mapper = $this->limitationFormMapperRegistry->getMapper($data->getIdentifier()); + $this->mapper->mapLimitationForm($form, $data); }); } + public function buildView(FormView $view, FormInterface $form, array $options) + { + $view->vars['mapper'] = $this->mapper; + $view->vars['template'] = $this->mapper->getFormTemplate(); + } + public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ From 518c0577121af25180a5513bdc58b089f6a8770e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 14:40:02 +0200 Subject: [PATCH 04/15] EZP-24713: Removed useless field in LimitationType --- lib/Form/Type/Role/LimitationType.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php index 31c18e419..6137ed284 100644 --- a/lib/Form/Type/Role/LimitationType.php +++ b/lib/Form/Type/Role/LimitationType.php @@ -36,9 +36,6 @@ public function __construct(LimitationFormMapperRegistryInterface $limitationFor public function buildForm(FormBuilderInterface $builder, array $options) { - $builder - ->add('identifier', 'hidden'); - $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { /** @var \eZ\Publish\API\Repository\Values\User\Limitation $data */ $data = $event->getData(); From 3780aad076842e8ae64ffc4c2aa344f6d0684b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 17:10:12 +0200 Subject: [PATCH 05/15] EZP-24713: Improved PHPDoc --- lib/Data/Role/PolicyCreateData.php | 1 + lib/Data/Role/PolicyDataTrait.php | 5 +++++ lib/Data/Role/PolicyUpdateData.php | 1 + 3 files changed, 7 insertions(+) diff --git a/lib/Data/Role/PolicyCreateData.php b/lib/Data/Role/PolicyCreateData.php index 163526613..963d80e4c 100644 --- a/lib/Data/Role/PolicyCreateData.php +++ b/lib/Data/Role/PolicyCreateData.php @@ -15,6 +15,7 @@ * @property-read \eZ\Publish\API\Repository\Values\User\PolicyDraft $policyDraft * @property-read \eZ\Publish\API\Repository\Values\User\RoleDraft $roleDraft * @property-read \eZ\Publish\API\Repository\Values\User\Role $initialRole + * @property-read \eZ\Publish\API\Repository\Values\User\Limitation[] $limitationsData */ class PolicyCreateData extends PolicyCreateStruct implements NewsnessCheckable { diff --git a/lib/Data/Role/PolicyDataTrait.php b/lib/Data/Role/PolicyDataTrait.php index 2c523e64b..d01a8d612 100644 --- a/lib/Data/Role/PolicyDataTrait.php +++ b/lib/Data/Role/PolicyDataTrait.php @@ -29,6 +29,11 @@ trait PolicyDataTrait */ protected $initialRole; + /** + * List of limitations that were posted. + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ protected $limitationsData; /** diff --git a/lib/Data/Role/PolicyUpdateData.php b/lib/Data/Role/PolicyUpdateData.php index 12f163399..986b1cb1b 100644 --- a/lib/Data/Role/PolicyUpdateData.php +++ b/lib/Data/Role/PolicyUpdateData.php @@ -15,6 +15,7 @@ * @property-read \eZ\Publish\API\Repository\Values\User\PolicyDraft $policyDraft * @property-read \eZ\Publish\API\Repository\Values\User\RoleDraft $roleDraft * @property-read \eZ\Publish\API\Repository\Values\User\Role $initialRole + * @property-read \eZ\Publish\API\Repository\Values\User\Limitation[] $limitationsData */ class PolicyUpdateData extends PolicyUpdateStruct { From d1cae80075e7f8ee7334cde0046c0d2857cc3cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 17:11:12 +0200 Subject: [PATCH 06/15] EZP-24713: Implemented policy limitations update --- lib/Form/Processor/PolicyFormProcessor.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Form/Processor/PolicyFormProcessor.php b/lib/Form/Processor/PolicyFormProcessor.php index 0a95de536..48d72c1a9 100644 --- a/lib/Form/Processor/PolicyFormProcessor.php +++ b/lib/Form/Processor/PolicyFormProcessor.php @@ -49,7 +49,14 @@ public function processUpdatePolicy(FormActionEvent $event) $data->function = $function; $this->roleService->addPolicyByRoleDraft($data->roleDraft, $data); } else { - // TODO: Save limitations. It's not possible by design to update policy module/function. + // Only save limitations on update. + // It is not possible by design to update policy module/function. + foreach ($data->limitationsData as $limitation) { + // Add posted limitations as valid ones, recognized by RoleService. + $data->addLimitation($limitation); + } + + $this->roleService->updatePolicyByRoleDraft($data->roleDraft, $data->policyDraft, $data); } } From 161eac6e91161000f9f2f1644c5c0d0347553ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Tue, 20 Oct 2015 17:29:00 +0200 Subject: [PATCH 07/15] CS --- lib/Data/Mapper/PolicyMapper.php | 3 ++- lib/Limitation/LimitationFormMapperRegistry.php | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Data/Mapper/PolicyMapper.php b/lib/Data/Mapper/PolicyMapper.php index 9227f0385..d85ef3181 100644 --- a/lib/Data/Mapper/PolicyMapper.php +++ b/lib/Data/Mapper/PolicyMapper.php @@ -64,7 +64,7 @@ private function isPolicyNew(PolicyDraft $policy) /** * Generates the limitation list from existing limitations (already configured for current policy) and - * available limitation types available for current policy (i.e. current module/function combination) + * available limitation types available for current policy (i.e. current module/function combination). * * @param \eZ\Publish\API\Repository\Values\User\Limitation[] $existingLimitations * @param \eZ\Publish\SPI\Limitation\Type[] $availableLimitationTypes @@ -87,6 +87,7 @@ private function generateLimitationList(array $existingLimitations, array $avail } ksort($limitations); + return $limitations; } } diff --git a/lib/Limitation/LimitationFormMapperRegistry.php b/lib/Limitation/LimitationFormMapperRegistry.php index 7153f646a..0b828080f 100644 --- a/lib/Limitation/LimitationFormMapperRegistry.php +++ b/lib/Limitation/LimitationFormMapperRegistry.php @@ -11,7 +11,6 @@ namespace EzSystems\RepositoryForms\Limitation; use eZ\Publish\API\Repository\Values\User\Limitation; -use Symfony\Component\Form\FormInterface; use InvalidArgumentException; /** From 5f422e913e014ce820f2ddbbe4486bc2b744057c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 11:34:50 +0200 Subject: [PATCH 08/15] EZP-24713: Fixed tests --- .../Data/Mapper/PolicyMapperTest.php | 16 +++++++++---- .../Processor/PolicyFormProcessorTest.php | 24 +++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/tests/RepositoryForms/Data/Mapper/PolicyMapperTest.php b/tests/RepositoryForms/Data/Mapper/PolicyMapperTest.php index 75d421ec1..5923958c8 100644 --- a/tests/RepositoryForms/Data/Mapper/PolicyMapperTest.php +++ b/tests/RepositoryForms/Data/Mapper/PolicyMapperTest.php @@ -32,7 +32,7 @@ public function testMapToCreateNoRoleDraft() public function testMapToCreateNoInitialRole() { $policy = new PolicyDraft(); - (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => new RoleDraft()]); + (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => new RoleDraft(), 'availableLimitationTypes' => []]); } public function testMapToCreate() @@ -40,7 +40,11 @@ public function testMapToCreate() $policy = new PolicyDraft(['innerPolicy' => new Policy()]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); self::assertInstanceOf('\EzSystems\RepositoryForms\Data\Role\PolicyCreateData', $data); self::assertSame($policy, $data->policyDraft); self::assertSame($roleDraft, $data->roleDraft); @@ -64,7 +68,7 @@ public function testMapToUpdateNoInitialRole() { $policy = new PolicyDraft(['innerPolicy' => new Policy(['id' => 123])]); $roleDraft = new RoleDraft(); - (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft]); + (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'availableLimitationTypes' => []]); } public function testMapToUpdate() @@ -79,7 +83,11 @@ public function testMapToUpdate() ]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); self::assertInstanceOf('\EzSystems\RepositoryForms\Data\Role\PolicyUpdateData', $data); self::assertSame($policy, $data->policyDraft); self::assertSame($roleDraft, $data->roleDraft); diff --git a/tests/RepositoryForms/Form/Processor/PolicyFormProcessorTest.php b/tests/RepositoryForms/Form/Processor/PolicyFormProcessorTest.php index a5fcb3a92..a989d6e27 100644 --- a/tests/RepositoryForms/Form/Processor/PolicyFormProcessorTest.php +++ b/tests/RepositoryForms/Form/Processor/PolicyFormProcessorTest.php @@ -54,7 +54,11 @@ public function testProcessCreate() $policy = new PolicyDraft(['innerPolicy' => new Policy()]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); $module = 'foo'; $function = 'bar'; $data->moduleFunction = "$module|$function"; @@ -73,7 +77,11 @@ public function testSavePolicy() $policy = new PolicyDraft(['innerPolicy' => new Policy()]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); $module = 'foo'; $function = 'bar'; $data->moduleFunction = "$module|$function"; @@ -92,7 +100,11 @@ public function testRemoveDraftOnCreateData() $policy = new PolicyDraft(['innerPolicy' => new Policy()]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); $module = 'foo'; $function = 'bar'; $data->moduleFunction = "$module|$function"; @@ -115,7 +127,11 @@ public function testRemoveDraftOnUpdateData() $policy = new PolicyDraft(['innerPolicy' => new Policy(['id' => 123])]); $roleDraft = new RoleDraft(); $initialRole = new Role(); - $data = (new PolicyMapper())->mapToFormData($policy, ['roleDraft' => $roleDraft, 'initialRole' => $initialRole]); + $data = (new PolicyMapper())->mapToFormData($policy, [ + 'roleDraft' => $roleDraft, + 'initialRole' => $initialRole, + 'availableLimitationTypes' => [], + ]); $module = 'foo'; $function = 'bar'; $data->moduleFunction = "$module|$function"; From 21882ffcb4364eb2d1235bc548817fa41875a2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 11:58:22 +0200 Subject: [PATCH 09/15] EZP-24713: Added NullLimitationMapper --- bundle/Resources/config/role.yml | 10 +++++- .../translations/ezrepoforms_role.en.xlf | 4 +++ .../null_limitation_values.html.twig | 3 ++ lib/Form/Type/Role/LimitationType.php | 16 +++++++-- .../Mapper/NullLimitationMapper.php | 35 +++++++++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 bundle/Resources/views/Limitation/null_limitation_values.html.twig create mode 100644 lib/Limitation/Mapper/NullLimitationMapper.php diff --git a/bundle/Resources/config/role.yml b/bundle/Resources/config/role.yml index 53b9f1551..9d12bd5eb 100644 --- a/bundle/Resources/config/role.yml +++ b/bundle/Resources/config/role.yml @@ -16,6 +16,8 @@ parameters: # Limitation mappers ezrepoforms.limitation_form_mapper.registry.class: EzSystems\RepositoryForms\Limitation\LimitationFormMapperRegistry + ezrepoforms.limitation.null.template: "EzSystemsRepositoryFormsBundle:Limitation:null_limitation_values.html.twig" + ezrepoforms.limitation.form_mapper.null.class: EzSystems\RepositoryForms\Limitation\Mapper\NullLimitationMapper ezrepoforms.limitation.multiple_selection.template: "EzSystemsRepositoryFormsBundle:Limitation:base_limitation_values.html.twig" ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\Mapper\SiteAccessLimitationMapper @@ -29,7 +31,7 @@ services: ezrepoforms.policy.limitation.form: class: %ezrepoforms.policy.limitation.form.class% - arguments: [@ezrepoforms.limitation_form_mapper.registry] + arguments: [@ezrepoforms.limitation_form_mapper.registry, @ezrepoforms.limitation.form_mapper.null] tags: - { name: form.type, alias: ezrepoforms_policy_limitation_edit } @@ -77,3 +79,9 @@ services: arguments: [%ezpublish.siteaccess.list%] tags: - { name: ez.limitation.formMapper, limitationType: SiteAccess } + + ezrepoforms.limitation.form_mapper.null: + class: %ezrepoforms.limitation.form_mapper.null.class% + arguments: [%ezrepoforms.limitation.null.template%] + tags: + - { name: ez.limitation.formMapper, limitationType: "Null" } diff --git a/bundle/Resources/translations/ezrepoforms_role.en.xlf b/bundle/Resources/translations/ezrepoforms_role.en.xlf index 442064e26..2ba060f68 100644 --- a/bundle/Resources/translations/ezrepoforms_role.en.xlf +++ b/bundle/Resources/translations/ezrepoforms_role.en.xlf @@ -82,6 +82,10 @@ role.policy.limitation.any Any + + role.policy.limitation.not_implemented + Limitation edition for '%limitationTypeIdentifier%' is not implemented yet. + diff --git a/bundle/Resources/views/Limitation/null_limitation_values.html.twig b/bundle/Resources/views/Limitation/null_limitation_values.html.twig new file mode 100644 index 000000000..42e822dc6 --- /dev/null +++ b/bundle/Resources/views/Limitation/null_limitation_values.html.twig @@ -0,0 +1,3 @@ +{% do form.setRendered() %} +{{ form_label(form) }} +{{ "Limitation edition for '%limitationTypeIdentifier%' is not implemented yet."|trans({"%limitationTypeIdentifier%": form.vars.data.identifier}, 'ezrepoforms_role') }} diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php index 6137ed284..67e908b2b 100644 --- a/lib/Form/Type/Role/LimitationType.php +++ b/lib/Form/Type/Role/LimitationType.php @@ -8,6 +8,7 @@ */ namespace EzSystems\RepositoryForms\Form\Type\Role; +use EzSystems\RepositoryForms\Limitation\LimitationFormMapperInterface; use EzSystems\RepositoryForms\Limitation\LimitationFormMapperRegistryInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; @@ -29,9 +30,15 @@ class LimitationType extends AbstractType */ private $mapper; - public function __construct(LimitationFormMapperRegistryInterface $limitationFormMapperRegistry) + /** + * @var LimitationFormMapperInterface + */ + private $nullMapper; + + public function __construct(LimitationFormMapperRegistryInterface $limitationFormMapperRegistry, LimitationFormMapperInterface $nullMapper) { $this->limitationFormMapperRegistry = $limitationFormMapperRegistry; + $this->nullMapper = $nullMapper; } public function buildForm(FormBuilderInterface $builder, array $options) @@ -40,7 +47,12 @@ public function buildForm(FormBuilderInterface $builder, array $options) /** @var \eZ\Publish\API\Repository\Values\User\Limitation $data */ $data = $event->getData(); $form = $event->getForm(); - $this->mapper = $this->limitationFormMapperRegistry->getMapper($data->getIdentifier()); + + if ($this->limitationFormMapperRegistry->hasMapper($data->getIdentifier())) { + $this->mapper = $this->limitationFormMapperRegistry->getMapper($data->getIdentifier()); + } else { + $this->mapper = $this->nullMapper; + } $this->mapper->mapLimitationForm($form, $data); }); } diff --git a/lib/Limitation/Mapper/NullLimitationMapper.php b/lib/Limitation/Mapper/NullLimitationMapper.php new file mode 100644 index 000000000..0b69a3e4f --- /dev/null +++ b/lib/Limitation/Mapper/NullLimitationMapper.php @@ -0,0 +1,35 @@ +template = $template; + } + + public function mapLimitationForm(FormInterface $form, Limitation $data) + { + } + + public function getFormTemplate() + { + return $this->template; + } +} From 8730d70ed0b9e7a39050b050811eaaf021838847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 16:07:42 +0200 Subject: [PATCH 10/15] EZP-24713: Ensure that limitation form mappers are individually exposed in the form view --- lib/Form/Type/Role/LimitationType.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php index 67e908b2b..b73630c49 100644 --- a/lib/Form/Type/Role/LimitationType.php +++ b/lib/Form/Type/Role/LimitationType.php @@ -8,6 +8,7 @@ */ namespace EzSystems\RepositoryForms\Form\Type\Role; +use eZ\Publish\API\Repository\Values\User\Limitation; use EzSystems\RepositoryForms\Limitation\LimitationFormMapperInterface; use EzSystems\RepositoryForms\Limitation\LimitationFormMapperRegistryInterface; use Symfony\Component\Form\AbstractType; @@ -25,11 +26,6 @@ class LimitationType extends AbstractType */ private $limitationFormMapperRegistry; - /** - * @var \EzSystems\RepositoryForms\Limitation\LimitationFormMapperInterface - */ - private $mapper; - /** * @var LimitationFormMapperInterface */ @@ -49,18 +45,25 @@ public function buildForm(FormBuilderInterface $builder, array $options) $form = $event->getForm(); if ($this->limitationFormMapperRegistry->hasMapper($data->getIdentifier())) { - $this->mapper = $this->limitationFormMapperRegistry->getMapper($data->getIdentifier()); - } else { - $this->mapper = $this->nullMapper; + $this->limitationFormMapperRegistry->getMapper($data->getIdentifier())->mapLimitationForm($form, $data); } - $this->mapper->mapLimitationForm($form, $data); }); } public function buildView(FormView $view, FormInterface $form, array $options) { - $view->vars['mapper'] = $this->mapper; - $view->vars['template'] = $this->mapper->getFormTemplate(); + $data = $view->vars['value']; + if (!$data instanceof Limitation) { + return; + } + + if ($this->limitationFormMapperRegistry->hasMapper($data->getIdentifier())) { + $mapper = $this->limitationFormMapperRegistry->getMapper($data->getIdentifier()); + } else { + $mapper = $this->nullMapper; + } + $view->vars['mapper'] = $mapper; + $view->vars['template'] = $mapper->getFormTemplate(); } public function configureOptions(OptionsResolver $resolver) From b42cf8756a094b917631b73e810e9c375ade006a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 16:09:31 +0200 Subject: [PATCH 11/15] EZP-24713: Added LimitationFormMapperInterface::filterLimitationValues() It gives the opportunity to filter/manipulate posted limitation values. --- lib/Form/Type/Role/LimitationType.php | 8 ++++++++ lib/Limitation/LimitationFormMapperInterface.php | 8 ++++++++ lib/Limitation/Mapper/MultipleSelectionBasedMapper.php | 7 ++++++- lib/Limitation/Mapper/NullLimitationMapper.php | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/Form/Type/Role/LimitationType.php b/lib/Form/Type/Role/LimitationType.php index b73630c49..1fa1748ce 100644 --- a/lib/Form/Type/Role/LimitationType.php +++ b/lib/Form/Type/Role/LimitationType.php @@ -48,6 +48,14 @@ public function buildForm(FormBuilderInterface $builder, array $options) $this->limitationFormMapperRegistry->getMapper($data->getIdentifier())->mapLimitationForm($form, $data); } }); + + $builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) { + /** @var \eZ\Publish\API\Repository\Values\User\Limitation $data */ + $data = $event->getData(); + if ($this->limitationFormMapperRegistry->hasMapper($data->getIdentifier())) { + $this->limitationFormMapperRegistry->getMapper($data->getIdentifier())->filterLimitationValues($data); + } + }); } public function buildView(FormView $view, FormInterface $form, array $options) diff --git a/lib/Limitation/LimitationFormMapperInterface.php b/lib/Limitation/LimitationFormMapperInterface.php index fa2c7a6e6..7ae91da54 100644 --- a/lib/Limitation/LimitationFormMapperInterface.php +++ b/lib/Limitation/LimitationFormMapperInterface.php @@ -37,4 +37,12 @@ public function mapLimitationForm(FormInterface $form, Limitation $data); * @return string */ public function getFormTemplate(); + + /** + * This method will be called when FormEvents::SUBMIT is called. + * It gives the opportunity to filter/manipulate limitation values. + * + * @param Limitation $limitation + */ + public function filterLimitationValues(Limitation $limitation); } diff --git a/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php b/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php index a70dbb019..11d8e6bb4 100644 --- a/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php +++ b/lib/Limitation/Mapper/MultipleSelectionBasedMapper.php @@ -30,7 +30,8 @@ public function mapLimitationForm(FormInterface $form, Limitation $data) 'multiple' => true, 'label' => $data->getIdentifier(), ]; - $options['choices'] = $this->getSelectionChoices(); + $choices = $this->getSelectionChoices(); + asort($choices, SORT_NATURAL | SORT_FLAG_CASE); $form->add('limitationValues', 'choice', $options); } @@ -60,4 +61,8 @@ public function getFormTemplate() { return $this->template; } + + public function filterLimitationValues(Limitation $limitation) + { + } } diff --git a/lib/Limitation/Mapper/NullLimitationMapper.php b/lib/Limitation/Mapper/NullLimitationMapper.php index 0b69a3e4f..f16634859 100644 --- a/lib/Limitation/Mapper/NullLimitationMapper.php +++ b/lib/Limitation/Mapper/NullLimitationMapper.php @@ -32,4 +32,8 @@ public function getFormTemplate() { return $this->template; } + + public function filterLimitationValues(Limitation $limitation) + { + } } From dc041d81936b13d4824d5a355a559716689027f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 16:10:20 +0200 Subject: [PATCH 12/15] EZP-24713: Added ContentTypeLimitationMapper --- bundle/Resources/config/role.yml | 8 +++++ .../Mapper/ContentTypeLimitationMapper.php | 36 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 lib/Limitation/Mapper/ContentTypeLimitationMapper.php diff --git a/bundle/Resources/config/role.yml b/bundle/Resources/config/role.yml index 9d12bd5eb..6861fd5fb 100644 --- a/bundle/Resources/config/role.yml +++ b/bundle/Resources/config/role.yml @@ -20,6 +20,7 @@ parameters: ezrepoforms.limitation.form_mapper.null.class: EzSystems\RepositoryForms\Limitation\Mapper\NullLimitationMapper ezrepoforms.limitation.multiple_selection.template: "EzSystemsRepositoryFormsBundle:Limitation:base_limitation_values.html.twig" ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\Mapper\SiteAccessLimitationMapper + ezrepoforms.limitation.form_mapper.contenttype.class: EzSystems\RepositoryForms\Limitation\Mapper\ContentTypeLimitationMapper services: # Form types @@ -85,3 +86,10 @@ services: arguments: [%ezrepoforms.limitation.null.template%] tags: - { name: ez.limitation.formMapper, limitationType: "Null" } + + ezrepoforms.limitation.form_mapper.contenttype: + parent: ezrepoforms.limitation.form_mapper.multiple_selection + class: %ezrepoforms.limitation.form_mapper.contenttype.class% + arguments: [@ezpublish.api.service.content_type] + tags: + - { name: ez.limitation.formMapper, limitationType: Class } diff --git a/lib/Limitation/Mapper/ContentTypeLimitationMapper.php b/lib/Limitation/Mapper/ContentTypeLimitationMapper.php new file mode 100644 index 000000000..604dbb00b --- /dev/null +++ b/lib/Limitation/Mapper/ContentTypeLimitationMapper.php @@ -0,0 +1,36 @@ +contentTypeService = $contentTypeService; + } + + protected function getSelectionChoices() + { + $contentTypeChoices = []; + foreach ($this->contentTypeService->loadContentTypeGroups() as $group) { + foreach ($this->contentTypeService->loadContentTypes($group) as $contentType) { + $contentTypeChoices[$contentType->id] = $contentType->getName($contentType->mainLanguageCode); + } + } + + return $contentTypeChoices; + } +} From 19fc76405789743d88f23556eeec5176ff1ffd73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 16:10:31 +0200 Subject: [PATCH 13/15] EZP-24713: Added SectionLimitationMapper --- bundle/Resources/config/role.yml | 8 +++++ .../Mapper/SectionLimitationMapper.php | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 lib/Limitation/Mapper/SectionLimitationMapper.php diff --git a/bundle/Resources/config/role.yml b/bundle/Resources/config/role.yml index 6861fd5fb..e6de7544d 100644 --- a/bundle/Resources/config/role.yml +++ b/bundle/Resources/config/role.yml @@ -21,6 +21,7 @@ parameters: ezrepoforms.limitation.multiple_selection.template: "EzSystemsRepositoryFormsBundle:Limitation:base_limitation_values.html.twig" ezrepoforms.limitation.form_mapper.siteaccess.class: EzSystems\RepositoryForms\Limitation\Mapper\SiteAccessLimitationMapper ezrepoforms.limitation.form_mapper.contenttype.class: EzSystems\RepositoryForms\Limitation\Mapper\ContentTypeLimitationMapper + ezrepoforms.limitation.form_mapper.section.class: EzSystems\RepositoryForms\Limitation\Mapper\SectionLimitationMapper services: # Form types @@ -93,3 +94,10 @@ services: arguments: [@ezpublish.api.service.content_type] tags: - { name: ez.limitation.formMapper, limitationType: Class } + + ezrepoforms.limitation.form_mapper.section: + parent: ezrepoforms.limitation.form_mapper.multiple_selection + class: %ezrepoforms.limitation.form_mapper.section.class% + arguments: [@ezpublish.api.service.section] + tags: + - { name: ez.limitation.formMapper, limitationType: Section } diff --git a/lib/Limitation/Mapper/SectionLimitationMapper.php b/lib/Limitation/Mapper/SectionLimitationMapper.php new file mode 100644 index 000000000..17cdfeb7c --- /dev/null +++ b/lib/Limitation/Mapper/SectionLimitationMapper.php @@ -0,0 +1,34 @@ +sectionService = $sectionService; + } + + protected function getSelectionChoices() + { + $choices = []; + foreach ($this->sectionService->loadSections() as $section) { + $choices[$section->id] = $section->name; + } + + return $choices; + } +} From ba5cac4ff68fcfe974fbf3f0dfcaabef607eb3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Wed, 21 Oct 2015 16:11:27 +0200 Subject: [PATCH 14/15] EZP-24713: Ensure that limitations added to the policy have values --- lib/Form/Processor/PolicyFormProcessor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Form/Processor/PolicyFormProcessor.php b/lib/Form/Processor/PolicyFormProcessor.php index 48d72c1a9..02b84e070 100644 --- a/lib/Form/Processor/PolicyFormProcessor.php +++ b/lib/Form/Processor/PolicyFormProcessor.php @@ -53,7 +53,9 @@ public function processUpdatePolicy(FormActionEvent $event) // It is not possible by design to update policy module/function. foreach ($data->limitationsData as $limitation) { // Add posted limitations as valid ones, recognized by RoleService. - $data->addLimitation($limitation); + if (!empty($limitation->limitationValues)) { + $data->addLimitation($limitation); + } } $this->roleService->updatePolicyByRoleDraft($data->roleDraft, $data->policyDraft, $data); From 7c6d06a0195f636b9928bf0f9ae6f55bb83d5d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vieilledent?= Date: Thu, 22 Oct 2015 09:42:36 +0200 Subject: [PATCH 15/15] EZP-24713: Fix translation identifier --- .../Resources/views/Limitation/null_limitation_values.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/Resources/views/Limitation/null_limitation_values.html.twig b/bundle/Resources/views/Limitation/null_limitation_values.html.twig index 42e822dc6..aa323c9d2 100644 --- a/bundle/Resources/views/Limitation/null_limitation_values.html.twig +++ b/bundle/Resources/views/Limitation/null_limitation_values.html.twig @@ -1,3 +1,3 @@ {% do form.setRendered() %} {{ form_label(form) }} -{{ "Limitation edition for '%limitationTypeIdentifier%' is not implemented yet."|trans({"%limitationTypeIdentifier%": form.vars.data.identifier}, 'ezrepoforms_role') }} +{{ "role.policy.limitation.not_implemented"|trans({"%limitationTypeIdentifier%": form.vars.data.identifier}, 'ezrepoforms_role') }}