From 501866405eeeccc3c54346fa5d2ef09dcb0322f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Mon, 30 Jun 2025 10:43:18 +0200 Subject: [PATCH 1/7] IBX-8753: Added ContentTypeIsCompany specification and improved ModifyFieldDefinitions logic --- src/bundle/Resources/config/services.yaml | 22 ++++++++++ .../ModifyFieldDefinitionFieldsSubscriber.php | 44 ++++++++++++++----- ...ieldDefinitionsCollectionTypeExtension.php | 25 +++++++++-- .../ContentType/ContentTypeIsCompany.php | 35 +++++++++++++++ 4 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 src/lib/Specification/ContentType/ContentTypeIsCompany.php diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml index b72c49f6ab..e7bf5d878d 100644 --- a/src/bundle/Resources/config/services.yaml +++ b/src/bundle/Resources/config/services.yaml @@ -165,3 +165,25 @@ services: - {name: kernel.event_subscriber} Ibexa\AdminUi\Permission\Mapper\UsersWithPermissionInfoMapper: ~ + + Ibexa\AdminUi\Specification\ContentType\ContentTypeIsCompany: + arguments: + $companyContentTypeIdentifier: 'company' + + Ibexa\AdminUi\Form\Type\Extension\ModifyFieldDefinitionsCollectionTypeExtension.corporate_fields: + class: Ibexa\AdminUi\Form\Type\Extension\ModifyFieldDefinitionsCollectionTypeExtension + arguments: + $fieldTypeIdentifier: '' + $fieldIdentifiers: + - 'customer_group' + - 'sales_rep' + - 'contact' + - 'default_address' + - 'billing_address' + - 'address_book' + - 'members' + $modifiedOptions: + disable_remove: true + $contentTypeSpecification: '@Ibexa\AdminUi\Specification\ContentType\ContentTypeIsCompany' + tags: + - { name: form.type_extension } \ No newline at end of file diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index 935cc70fd6..1594edbfbc 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -9,6 +9,7 @@ namespace Ibexa\AdminUi\Form\Type\Extension\EventSubscriber; use Ibexa\AdminUi\Form\Type\FieldDefinition\FieldDefinitionType; +use Ibexa\Contracts\Core\Specification\SpecificationInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; @@ -20,16 +21,28 @@ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInte { private string $fieldTypeIdentifier; + /** @var string[] */ + private array $fieldIdentifiers; + /** @var array */ private array $modifiedOptions; + private ?SpecificationInterface $contentTypeSpecification; + /** + * @param string[]|string $fieldIdentifiers * @param array $modifiedOptions */ - public function __construct(string $fieldTypeIdentifier, array $modifiedOptions) - { + public function __construct( + string $fieldTypeIdentifier, + array $modifiedOptions, + $fieldIdentifiers = [], + ?SpecificationInterface $contentTypeSpecification = null + ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->modifiedOptions = $modifiedOptions; + $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; + $this->contentTypeSpecification = $contentTypeSpecification; } public static function getSubscribedEvents(): array @@ -45,29 +58,40 @@ public function onPreSetData(FormEvent $event): void $data = $event->getData(); $form = $event->getForm(); - if (null === $data) { + if (empty($data)) { return; } - foreach ($data as $fieldTypeIdentifier => $fieldTypeData) { - if ($this->fieldTypeIdentifier !== $fieldTypeData->fieldDefinition->fieldTypeIdentifier) { + $firstField = reset($data); + $contentTypeDraft = $firstField->contentTypeData->contentTypeDraft ?? null; + + if ( + $this->contentTypeSpecification !== null && + !$this->contentTypeSpecification->isSatisfiedBy($contentTypeDraft) + ) { + return; + } + foreach ($data as $fieldIdentifier => $fieldTypeData) { + $matchesType = $this->fieldTypeIdentifier === $fieldTypeData->fieldDefinition->fieldTypeIdentifier; + $matchesId = in_array($fieldIdentifier, $this->fieldIdentifiers, true); + + if (!($matchesType || $matchesId)) { continue; } - if (!$form->has($fieldTypeIdentifier)) { - return; + if (!$form->has($fieldIdentifier)) { + continue; } - $baseFieldForm = $form->get($fieldTypeIdentifier); + $baseFieldForm = $form->get($fieldIdentifier); $baseFieldFormName = $baseFieldForm->getName(); - $form->remove($baseFieldFormName); - $options = array_merge( $baseFieldForm->getConfig()->getOptions(), $this->modifiedOptions ); + $form->remove($baseFieldFormName); $form->add($baseFieldFormName, FieldDefinitionType::class, $options); } } diff --git a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php index 78b7bb606c..7f1bad111f 100644 --- a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php +++ b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php @@ -10,6 +10,7 @@ use Ibexa\AdminUi\Form\Type\ContentType\FieldDefinitionsCollectionType; use Ibexa\AdminUi\Form\Type\Extension\EventSubscriber\ModifyFieldDefinitionFieldsSubscriber; +use Ibexa\Contracts\Core\Specification\SpecificationInterface; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; @@ -22,22 +23,38 @@ final class ModifyFieldDefinitionsCollectionTypeExtension extends AbstractTypeEx { private string $fieldTypeIdentifier; + /** @var string[] */ + private array $fieldIdentifiers; + /** @var array */ private array $modifiedOptions; + private ?SpecificationInterface $contentTypeSpecification; + /** - * @param string $fieldTypeIdentifier + * @param string|string[] $fieldIdentifiers * @param array $modifiedOptions */ - public function __construct(string $fieldTypeIdentifier, array $modifiedOptions) - { + public function __construct( + string $fieldTypeIdentifier, + array $modifiedOptions, + $fieldIdentifiers = [], + ?SpecificationInterface $contentTypeSpecification = null + ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; + $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; $this->modifiedOptions = $modifiedOptions; + $this->contentTypeSpecification = $contentTypeSpecification; } public function buildForm(FormBuilderInterface $builder, array $options): void { - $subscriber = new ModifyFieldDefinitionFieldsSubscriber($this->fieldTypeIdentifier, $this->modifiedOptions); + $subscriber = new ModifyFieldDefinitionFieldsSubscriber( + $this->fieldTypeIdentifier, + $this->modifiedOptions, + $this->fieldIdentifiers, + $this->contentTypeSpecification + ); foreach ($builder->all() as $fieldTypeGroup) { $fieldTypeGroup->addEventSubscriber($subscriber); diff --git a/src/lib/Specification/ContentType/ContentTypeIsCompany.php b/src/lib/Specification/ContentType/ContentTypeIsCompany.php new file mode 100644 index 0000000000..94d70ee3bb --- /dev/null +++ b/src/lib/Specification/ContentType/ContentTypeIsCompany.php @@ -0,0 +1,35 @@ +companyContentTypeIdentifier = $companyContentTypeIdentifier; + } + + public function isSatisfiedBy($contentType): bool + { + if (!$contentType instanceof ContentType) { + throw new InvalidArgumentException( + '$contentType', + sprintf('Must be an instance of %s', ContentType::class) + ); + } + + return $contentType->identifier === $this->companyContentTypeIdentifier; + } +} From 5bb19382a9f99866fc730475f176e5c519c7b981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Tue, 1 Jul 2025 11:01:25 +0200 Subject: [PATCH 2/7] IBX-9876: Removed ContentTypeIsCompany specification and related service definitions --- src/bundle/Resources/config/services.yaml | 22 ------------ .../ContentType/ContentTypeIsCompany.php | 35 ------------------- 2 files changed, 57 deletions(-) delete mode 100644 src/lib/Specification/ContentType/ContentTypeIsCompany.php diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml index e7bf5d878d..b72c49f6ab 100644 --- a/src/bundle/Resources/config/services.yaml +++ b/src/bundle/Resources/config/services.yaml @@ -165,25 +165,3 @@ services: - {name: kernel.event_subscriber} Ibexa\AdminUi\Permission\Mapper\UsersWithPermissionInfoMapper: ~ - - Ibexa\AdminUi\Specification\ContentType\ContentTypeIsCompany: - arguments: - $companyContentTypeIdentifier: 'company' - - Ibexa\AdminUi\Form\Type\Extension\ModifyFieldDefinitionsCollectionTypeExtension.corporate_fields: - class: Ibexa\AdminUi\Form\Type\Extension\ModifyFieldDefinitionsCollectionTypeExtension - arguments: - $fieldTypeIdentifier: '' - $fieldIdentifiers: - - 'customer_group' - - 'sales_rep' - - 'contact' - - 'default_address' - - 'billing_address' - - 'address_book' - - 'members' - $modifiedOptions: - disable_remove: true - $contentTypeSpecification: '@Ibexa\AdminUi\Specification\ContentType\ContentTypeIsCompany' - tags: - - { name: form.type_extension } \ No newline at end of file diff --git a/src/lib/Specification/ContentType/ContentTypeIsCompany.php b/src/lib/Specification/ContentType/ContentTypeIsCompany.php deleted file mode 100644 index 94d70ee3bb..0000000000 --- a/src/lib/Specification/ContentType/ContentTypeIsCompany.php +++ /dev/null @@ -1,35 +0,0 @@ -companyContentTypeIdentifier = $companyContentTypeIdentifier; - } - - public function isSatisfiedBy($contentType): bool - { - if (!$contentType instanceof ContentType) { - throw new InvalidArgumentException( - '$contentType', - sprintf('Must be an instance of %s', ContentType::class) - ); - } - - return $contentType->identifier === $this->companyContentTypeIdentifier; - } -} From 34830b85f44d600066400e64d3a5cc4a1be9b0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Wed, 2 Jul 2025 10:55:47 +0200 Subject: [PATCH 3/7] IBX-8753: Refactored ModifyFieldDefinitionFieldsSubscriber to improve readability and encapsulate logic with helper methods --- .../ModifyFieldDefinitionFieldsSubscriber.php | 79 ++++++++++++++----- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index 1594edbfbc..e52650a891 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -8,14 +8,17 @@ namespace Ibexa\AdminUi\Form\Type\Extension\EventSubscriber; +use Ibexa\AdminUi\Form\Data\FieldDefinitionData; use Ibexa\AdminUi\Form\Type\FieldDefinition\FieldDefinitionType; +use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentTypeDraft; use Ibexa\Contracts\Core\Specification\SpecificationInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\FormInterface; /** - * Modifies CT editing form by rebuilding field definition list with custom options on given field type. + * Rebuilds specific field definitions in the Content Type editing form with custom options for a given field type and set of field identifiers. */ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInterface { @@ -62,37 +65,71 @@ public function onPreSetData(FormEvent $event): void return; } - $firstField = reset($data); - $contentTypeDraft = $firstField->contentTypeData->contentTypeDraft ?? null; - - if ( - $this->contentTypeSpecification !== null && - !$this->contentTypeSpecification->isSatisfiedBy($contentTypeDraft) - ) { + if (!$this->isApplicableToContentTypeDraft($this->getContentTypeDraft($data))) { return; } - foreach ($data as $fieldIdentifier => $fieldTypeData) { - $matchesType = $this->fieldTypeIdentifier === $fieldTypeData->fieldDefinition->fieldTypeIdentifier; - $matchesId = in_array($fieldIdentifier, $this->fieldIdentifiers, true); - if (!($matchesType || $matchesId)) { + foreach ($data as $fieldIdentifier => $fieldTypeData) { + if (!$form->has($fieldIdentifier)) { continue; } - if (!$form->has($fieldIdentifier)) { + if (!$this->acceptsFieldDefinition($fieldTypeData, $fieldIdentifier)) { continue; } - $baseFieldForm = $form->get($fieldIdentifier); - $baseFieldFormName = $baseFieldForm->getName(); + $this->rebuildFieldForm($form, $fieldIdentifier); + } + } - $options = array_merge( - $baseFieldForm->getConfig()->getOptions(), - $this->modifiedOptions - ); + private function isApplicableToContentTypeDraft(?ContentTypeDraft $contentTypeDraft): bool + { + if ($this->contentTypeSpecification === null) { + return true; + } + + if ($contentTypeDraft === null) { + return false; + } - $form->remove($baseFieldFormName); - $form->add($baseFieldFormName, FieldDefinitionType::class, $options); + return $this->contentTypeSpecification->isSatisfiedBy($contentTypeDraft); + } + + /** + * @param array $data + */ + private function getContentTypeDraft(array $data): ?ContentTypeDraft + { + $firstField = reset($data); + if ($firstField instanceof FieldDefinitionData && isset($firstField->contentTypeData)) { + return $firstField->contentTypeData->contentTypeDraft ?? null; } + + return null; + } + + private function acceptsFieldDefinition(FieldDefinitionData $field, string $identifier): bool + { + $matchesType = $this->fieldTypeIdentifier === $field->fieldDefinition->fieldTypeIdentifier; + $matchesIdentifier = in_array($identifier, $this->fieldIdentifiers, true); + + return $matchesType || $matchesIdentifier; + } + + /** + * @param \Symfony\Component\Form\FormInterface<\Ibexa\AdminUi\Form\Data\FieldDefinitionData[]> $form + */ + private function rebuildFieldForm(FormInterface $form, string $name): void + { + $baseFieldForm = $form->get($name); + $baseFieldFormName = $baseFieldForm->getName(); + + $options = array_merge( + $baseFieldForm->getConfig()->getOptions(), + $this->modifiedOptions + ); + + $form->remove($baseFieldFormName); + $form->add($baseFieldFormName, FieldDefinitionType::class, $options); } } From e7e121d5ede88246c50e8fab1c07f4e4da392ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Tue, 15 Jul 2025 11:39:19 +0200 Subject: [PATCH 4/7] IBX-8753: Replaced SpecificationInterface with CorporateAccount dependency and updated related logic --- composer.json | 7 +++++++ .../ModifyFieldDefinitionFieldsSubscriber.php | 12 ++++++------ ...ModifyFieldDefinitionsCollectionTypeExtension.php | 10 +++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 5b7cf12e7c..585b1b4efe 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,12 @@ "Ibexa\\Tests\\AdminUi\\": "tests/lib/" } }, + "repositories": [ + { + "type": "composer", + "url": "https://updates.ibexa.co" + } + ], "require": { "php": "^7.4 || ^8.0", "ext-json": "*", @@ -48,6 +54,7 @@ "symfony/webpack-encore-bundle": "^v1.17", "jms/translation-bundle": "^1.5", "ibexa/core": "~4.6.0@dev", + "ibexa/corporate-account": "~4.6.0@dev", "ibexa/content-forms": "~4.6.0@dev", "ibexa/design-engine": "~4.6.0@dev", "ibexa/user": "~4.6.0@dev", diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index e52650a891..fd0444771b 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -11,7 +11,7 @@ use Ibexa\AdminUi\Form\Data\FieldDefinitionData; use Ibexa\AdminUi\Form\Type\FieldDefinition\FieldDefinitionType; use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentTypeDraft; -use Ibexa\Contracts\Core\Specification\SpecificationInterface; +use Ibexa\CorporateAccount\Configuration\CorporateAccount; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; @@ -30,7 +30,7 @@ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInte /** @var array */ private array $modifiedOptions; - private ?SpecificationInterface $contentTypeSpecification; + private ?CorporateAccount $corporateAccount; /** * @param string[]|string $fieldIdentifiers @@ -40,12 +40,12 @@ public function __construct( string $fieldTypeIdentifier, array $modifiedOptions, $fieldIdentifiers = [], - ?SpecificationInterface $contentTypeSpecification = null + ?CorporateAccount $corporateAccount = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->modifiedOptions = $modifiedOptions; $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; - $this->contentTypeSpecification = $contentTypeSpecification; + $this->corporateAccount = $corporateAccount; } public static function getSubscribedEvents(): array @@ -84,7 +84,7 @@ public function onPreSetData(FormEvent $event): void private function isApplicableToContentTypeDraft(?ContentTypeDraft $contentTypeDraft): bool { - if ($this->contentTypeSpecification === null) { + if ($this->corporateAccount === null) { return true; } @@ -92,7 +92,7 @@ private function isApplicableToContentTypeDraft(?ContentTypeDraft $contentTypeDr return false; } - return $this->contentTypeSpecification->isSatisfiedBy($contentTypeDraft); + return $contentTypeDraft->getIdentifier() === $this->corporateAccount->getCompanyContentTypeIdentifier(); } /** diff --git a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php index 7f1bad111f..6307f24d2f 100644 --- a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php +++ b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php @@ -10,7 +10,7 @@ use Ibexa\AdminUi\Form\Type\ContentType\FieldDefinitionsCollectionType; use Ibexa\AdminUi\Form\Type\Extension\EventSubscriber\ModifyFieldDefinitionFieldsSubscriber; -use Ibexa\Contracts\Core\Specification\SpecificationInterface; +use Ibexa\CorporateAccount\Configuration\CorporateAccount; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; @@ -29,7 +29,7 @@ final class ModifyFieldDefinitionsCollectionTypeExtension extends AbstractTypeEx /** @var array */ private array $modifiedOptions; - private ?SpecificationInterface $contentTypeSpecification; + private ?CorporateAccount $corporateAccount; /** * @param string|string[] $fieldIdentifiers @@ -39,12 +39,12 @@ public function __construct( string $fieldTypeIdentifier, array $modifiedOptions, $fieldIdentifiers = [], - ?SpecificationInterface $contentTypeSpecification = null + ?CorporateAccount $corporateAccount = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; $this->modifiedOptions = $modifiedOptions; - $this->contentTypeSpecification = $contentTypeSpecification; + $this->corporateAccount = $corporateAccount; } public function buildForm(FormBuilderInterface $builder, array $options): void @@ -53,7 +53,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $this->fieldTypeIdentifier, $this->modifiedOptions, $this->fieldIdentifiers, - $this->contentTypeSpecification + $this->corporateAccount ); foreach ($builder->all() as $fieldTypeGroup) { From 01e79dc09cd9b466cb8bd2962e9e7ea4a8a06532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Tue, 15 Jul 2025 12:59:47 +0200 Subject: [PATCH 5/7] IBX-8753: Replaced CorporateAccount dependency with SpecificationInterface and updated related logic --- composer.json | 7 ------- .../ModifyFieldDefinitionFieldsSubscriber.php | 12 ++++++------ ...ModifyFieldDefinitionsCollectionTypeExtension.php | 10 +++++----- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/composer.json b/composer.json index 585b1b4efe..5b7cf12e7c 100644 --- a/composer.json +++ b/composer.json @@ -25,12 +25,6 @@ "Ibexa\\Tests\\AdminUi\\": "tests/lib/" } }, - "repositories": [ - { - "type": "composer", - "url": "https://updates.ibexa.co" - } - ], "require": { "php": "^7.4 || ^8.0", "ext-json": "*", @@ -54,7 +48,6 @@ "symfony/webpack-encore-bundle": "^v1.17", "jms/translation-bundle": "^1.5", "ibexa/core": "~4.6.0@dev", - "ibexa/corporate-account": "~4.6.0@dev", "ibexa/content-forms": "~4.6.0@dev", "ibexa/design-engine": "~4.6.0@dev", "ibexa/user": "~4.6.0@dev", diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index fd0444771b..e52650a891 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -11,7 +11,7 @@ use Ibexa\AdminUi\Form\Data\FieldDefinitionData; use Ibexa\AdminUi\Form\Type\FieldDefinition\FieldDefinitionType; use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentTypeDraft; -use Ibexa\CorporateAccount\Configuration\CorporateAccount; +use Ibexa\Contracts\Core\Specification\SpecificationInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; @@ -30,7 +30,7 @@ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInte /** @var array */ private array $modifiedOptions; - private ?CorporateAccount $corporateAccount; + private ?SpecificationInterface $contentTypeSpecification; /** * @param string[]|string $fieldIdentifiers @@ -40,12 +40,12 @@ public function __construct( string $fieldTypeIdentifier, array $modifiedOptions, $fieldIdentifiers = [], - ?CorporateAccount $corporateAccount = null + ?SpecificationInterface $contentTypeSpecification = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->modifiedOptions = $modifiedOptions; $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; - $this->corporateAccount = $corporateAccount; + $this->contentTypeSpecification = $contentTypeSpecification; } public static function getSubscribedEvents(): array @@ -84,7 +84,7 @@ public function onPreSetData(FormEvent $event): void private function isApplicableToContentTypeDraft(?ContentTypeDraft $contentTypeDraft): bool { - if ($this->corporateAccount === null) { + if ($this->contentTypeSpecification === null) { return true; } @@ -92,7 +92,7 @@ private function isApplicableToContentTypeDraft(?ContentTypeDraft $contentTypeDr return false; } - return $contentTypeDraft->getIdentifier() === $this->corporateAccount->getCompanyContentTypeIdentifier(); + return $this->contentTypeSpecification->isSatisfiedBy($contentTypeDraft); } /** diff --git a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php index 6307f24d2f..7f1bad111f 100644 --- a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php +++ b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php @@ -10,7 +10,7 @@ use Ibexa\AdminUi\Form\Type\ContentType\FieldDefinitionsCollectionType; use Ibexa\AdminUi\Form\Type\Extension\EventSubscriber\ModifyFieldDefinitionFieldsSubscriber; -use Ibexa\CorporateAccount\Configuration\CorporateAccount; +use Ibexa\Contracts\Core\Specification\SpecificationInterface; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; @@ -29,7 +29,7 @@ final class ModifyFieldDefinitionsCollectionTypeExtension extends AbstractTypeEx /** @var array */ private array $modifiedOptions; - private ?CorporateAccount $corporateAccount; + private ?SpecificationInterface $contentTypeSpecification; /** * @param string|string[] $fieldIdentifiers @@ -39,12 +39,12 @@ public function __construct( string $fieldTypeIdentifier, array $modifiedOptions, $fieldIdentifiers = [], - ?CorporateAccount $corporateAccount = null + ?SpecificationInterface $contentTypeSpecification = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; $this->modifiedOptions = $modifiedOptions; - $this->corporateAccount = $corporateAccount; + $this->contentTypeSpecification = $contentTypeSpecification; } public function buildForm(FormBuilderInterface $builder, array $options): void @@ -53,7 +53,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $this->fieldTypeIdentifier, $this->modifiedOptions, $this->fieldIdentifiers, - $this->corporateAccount + $this->contentTypeSpecification ); foreach ($builder->all() as $fieldTypeGroup) { From 5a91157d071e7ffe4af74f993740346e83a5c735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Fri, 22 Aug 2025 11:32:00 +0200 Subject: [PATCH 6/7] IBX-8753: Refactor fieldIdentifiers parameter to enforce array type in ModifyFieldDefinitionFieldsSubscriber and ModifyFieldDefinitionsCollectionTypeExtension constructors --- .../ModifyFieldDefinitionFieldsSubscriber.php | 10 +++++----- .../ModifyFieldDefinitionsCollectionTypeExtension.php | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index e52650a891..88f5d8c7d9 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -22,7 +22,7 @@ */ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInterface { - private string $fieldTypeIdentifier; + private ?string $fieldTypeIdentifier; /** @var string[] */ private array $fieldIdentifiers; @@ -33,18 +33,18 @@ final class ModifyFieldDefinitionFieldsSubscriber implements EventSubscriberInte private ?SpecificationInterface $contentTypeSpecification; /** - * @param string[]|string $fieldIdentifiers * @param array $modifiedOptions + * @param array $fieldIdentifiers */ public function __construct( - string $fieldTypeIdentifier, + ?string $fieldTypeIdentifier, array $modifiedOptions, - $fieldIdentifiers = [], + array $fieldIdentifiers = [], ?SpecificationInterface $contentTypeSpecification = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; $this->modifiedOptions = $modifiedOptions; - $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; + $this->fieldIdentifiers = $fieldIdentifiers; $this->contentTypeSpecification = $contentTypeSpecification; } diff --git a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php index 7f1bad111f..524ac14709 100644 --- a/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php +++ b/src/lib/Form/Type/Extension/ModifyFieldDefinitionsCollectionTypeExtension.php @@ -21,7 +21,7 @@ */ final class ModifyFieldDefinitionsCollectionTypeExtension extends AbstractTypeExtension { - private string $fieldTypeIdentifier; + private ?string $fieldTypeIdentifier; /** @var string[] */ private array $fieldIdentifiers; @@ -32,17 +32,17 @@ final class ModifyFieldDefinitionsCollectionTypeExtension extends AbstractTypeEx private ?SpecificationInterface $contentTypeSpecification; /** - * @param string|string[] $fieldIdentifiers * @param array $modifiedOptions + * @param array $fieldIdentifiers */ public function __construct( - string $fieldTypeIdentifier, + ?string $fieldTypeIdentifier, array $modifiedOptions, - $fieldIdentifiers = [], + array $fieldIdentifiers = [], ?SpecificationInterface $contentTypeSpecification = null ) { $this->fieldTypeIdentifier = $fieldTypeIdentifier; - $this->fieldIdentifiers = is_array($fieldIdentifiers) ? $fieldIdentifiers : [$fieldIdentifiers]; + $this->fieldIdentifiers = $fieldIdentifiers; $this->modifiedOptions = $modifiedOptions; $this->contentTypeSpecification = $contentTypeSpecification; } From 2e42cd148c40c2865ce73addba3c0656c3a45d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Bia=C5=82czak?= Date: Mon, 25 Aug 2025 08:58:40 +0200 Subject: [PATCH 7/7] Fixed method call to getFieldTypeIdentifier in acceptsFieldDefinition for improved clarity --- .../EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php index 88f5d8c7d9..9e8ef96dff 100644 --- a/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php +++ b/src/lib/Form/Type/Extension/EventSubscriber/ModifyFieldDefinitionFieldsSubscriber.php @@ -110,7 +110,7 @@ private function getContentTypeDraft(array $data): ?ContentTypeDraft private function acceptsFieldDefinition(FieldDefinitionData $field, string $identifier): bool { - $matchesType = $this->fieldTypeIdentifier === $field->fieldDefinition->fieldTypeIdentifier; + $matchesType = $this->fieldTypeIdentifier === $field->getFieldTypeIdentifier(); $matchesIdentifier = in_array($identifier, $this->fieldIdentifiers, true); return $matchesType || $matchesIdentifier;