diff --git a/src/bundle/Controller/UserController.php b/src/bundle/Controller/UserController.php index d68ef09d..a099666e 100644 --- a/src/bundle/Controller/UserController.php +++ b/src/bundle/Controller/UserController.php @@ -55,7 +55,7 @@ class UserController extends Controller private $groupedContentFormFieldsProvider; /** @var \Ibexa\Contracts\Core\Repository\ContentService */ - private $contentService; + private ContentService $contentService; public function __construct( ContentTypeService $contentTypeService, diff --git a/src/lib/Event/StructFieldOptionsEvent.php b/src/lib/Event/StructFieldOptionsEvent.php index c1339d84..5a1b4c27 100644 --- a/src/lib/Event/StructFieldOptionsEvent.php +++ b/src/lib/Event/StructFieldOptionsEvent.php @@ -15,13 +15,13 @@ abstract class StructFieldOptionsEvent extends Event { /** @var \Symfony\Component\Form\FormInterface */ - protected $parentForm; + protected FormInterface $parentForm; /** @var \Ibexa\Contracts\ContentForms\Data\Content\FieldData */ - protected $fieldData; + protected FieldData $fieldData; /** @var array */ - protected $options; + protected array $options; public function __construct( FormInterface $parentForm, diff --git a/src/lib/Event/UserCreateFieldOptionsEvent.php b/src/lib/Event/UserCreateFieldOptionsEvent.php index 321d8634..42d44456 100644 --- a/src/lib/Event/UserCreateFieldOptionsEvent.php +++ b/src/lib/Event/UserCreateFieldOptionsEvent.php @@ -15,7 +15,7 @@ final class UserCreateFieldOptionsEvent extends StructFieldOptionsEvent { /** @var \Ibexa\Contracts\Core\Repository\Values\User\UserCreateStruct */ - private $userCreateStruct; + private UserCreateStruct $userCreateStruct; public function __construct( UserCreateStruct $userCreateStruct, diff --git a/src/lib/Event/UserUpdateFieldOptionsEvent.php b/src/lib/Event/UserUpdateFieldOptionsEvent.php index ae9fb1e5..aa1fc884 100644 --- a/src/lib/Event/UserUpdateFieldOptionsEvent.php +++ b/src/lib/Event/UserUpdateFieldOptionsEvent.php @@ -16,10 +16,10 @@ final class UserUpdateFieldOptionsEvent extends StructFieldOptionsEvent { /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Content */ - private $content; + private Content $content; /** @var \Ibexa\Contracts\Core\Repository\Values\User\UserUpdateStruct */ - private $userUpdateStruct; + private UserUpdateStruct $userUpdateStruct; public function __construct( Content $content, diff --git a/src/lib/Form/Type/Content/BaseContentType.php b/src/lib/Form/Type/Content/BaseContentType.php index 51ec4161..ebfac390 100644 --- a/src/lib/Form/Type/Content/BaseContentType.php +++ b/src/lib/Form/Type/Content/BaseContentType.php @@ -8,12 +8,17 @@ namespace Ibexa\ContentForms\Form\Type\Content; +use Ibexa\Contracts\Core\Repository\Values\Content\ContentCreateStruct; +use Ibexa\Contracts\Core\Repository\Values\User\UserCreateStruct; +use Ibexa\Contracts\Core\Repository\Values\User\UserUpdateStruct; +use Ibexa\Core\Repository\Values\Content\ContentUpdateStruct; use JMS\TranslationBundle\Annotation\Desc; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; /** @@ -42,10 +47,11 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'mainLanguageCode' => $options['mainLanguageCode'], 'location' => $options['location'] ?? null, 'content' => $options['content'] ?? null, - 'contentCreateStruct' => $options['contentCreateStruct'] ?? null, - 'contentUpdateStruct' => $options['contentUpdateStruct'] ?? null, - 'userCreateStruct' => $options['userCreateStruct'] ?? null, - 'userUpdateStruct' => $options['userUpdateStruct'] ?? null, + 'contentCreateStruct' => $options['contentCreateStruct'] ?? null, // deprecated + 'contentUpdateStruct' => $options['contentUpdateStruct'] ?? null, // deprecated + 'userCreateStruct' => $options['userCreateStruct'] ?? null, // deprecated + 'userUpdateStruct' => $options['userUpdateStruct'] ?? null, // deprecated + 'struct' => $options['struct'], ], ]) ->add('redirectUrlAfterPublish', HiddenType::class, [ @@ -63,8 +69,27 @@ public function buildView(FormView $view, FormInterface $form, array $options) public function configureOptions(OptionsResolver $resolver) { $resolver - ->setDefaults(['translation_domain' => 'ibexa_content_forms_content']) - ->setRequired(['languageCode', 'mainLanguageCode']); + ->setDefaults([ + 'translation_domain' => 'ibexa_content_forms_content', + 'struct' => null, + ]) + ->setAllowedTypes( + 'struct', + [ + 'null', + ContentCreateStruct::class, + ContentUpdateStruct::class, + UserCreateStruct::class, + UserUpdateStruct::class, + ], + ) + ->setRequired(['languageCode', 'mainLanguageCode', 'struct']) + ->setNormalizer('struct', static function (Options $options, $value) { + return $options['userUpdateStruct'] + ?? $options['userCreateStruct'] + ?? $options['contentUpdateStruct'] + ?? $options['contentCreateStruct']; + }); } } diff --git a/src/lib/Form/Type/Content/ContentFieldType.php b/src/lib/Form/Type/Content/ContentFieldType.php index 78ce734a..f9d9e9a7 100644 --- a/src/lib/Form/Type/Content/ContentFieldType.php +++ b/src/lib/Form/Type/Content/ContentFieldType.php @@ -46,14 +46,15 @@ public function configureOptions(OptionsResolver $resolver) ->setDefaults([ 'content' => null, 'location' => null, - 'contentCreateStruct' => null, - 'contentUpdateStruct' => null, - 'userCreateStruct' => null, - 'userUpdateStruct' => null, + 'contentCreateStruct' => null, // deprecated + 'contentUpdateStruct' => null, // deprecated + 'userCreateStruct' => null, // deprecated + 'userUpdateStruct' => null, // deprecated 'data_class' => FieldData::class, 'translation_domain' => 'ibexa_content_forms_content', + 'struct' => null, ]) - ->setRequired(['languageCode', 'mainLanguageCode']); + ->setRequired(['languageCode', 'mainLanguageCode', 'struct']); } public function buildView(FormView $view, FormInterface $form, array $options) diff --git a/src/lib/Form/Type/Content/FieldCollectionType.php b/src/lib/Form/Type/Content/FieldCollectionType.php index 39e9c32c..1a9b30eb 100644 --- a/src/lib/Form/Type/Content/FieldCollectionType.php +++ b/src/lib/Form/Type/Content/FieldCollectionType.php @@ -14,6 +14,10 @@ use Ibexa\ContentForms\Event\UserCreateFieldOptionsEvent; use Ibexa\ContentForms\Event\UserUpdateFieldOptionsEvent; use Ibexa\Contracts\ContentForms\Data\Content\FieldData; +use Ibexa\Contracts\Core\Repository\Values\User\UserUpdateStruct; +use Ibexa\Core\Repository\Values\Content\ContentCreateStruct; +use Ibexa\Core\Repository\Values\Content\ContentUpdateStruct; +use Ibexa\Core\Repository\Values\User\UserCreateStruct; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; @@ -61,12 +65,12 @@ public function buildForm( private function isContentCreate(array $entryOptions): bool { - return !empty($entryOptions['contentCreateStruct']); + return !empty($entryOptions['struct']) && $entryOptions['struct'] instanceof ContentCreateStruct; } private function isContentUpdate(array $entryOptions): bool { - return !empty($entryOptions['content']) && !empty($entryOptions['contentUpdateStruct']); + return !empty($entryOptions['struct']) && $entryOptions['struct'] instanceof ContentUpdateStruct; } /** @@ -74,7 +78,7 @@ private function isContentUpdate(array $entryOptions): bool */ private function isUserCreate(array $entryOptions): bool { - return !empty($entryOptions['userCreateStruct']); + return !empty($entryOptions['struct']) && $entryOptions['struct'] instanceof UserCreateStruct; } /** @@ -82,25 +86,26 @@ private function isUserCreate(array $entryOptions): bool */ private function isUserUpdate(array $entryOptions): bool { - return !empty($entryOptions['userUpdateStruct']); + return !empty($entryOptions['struct']) && $entryOptions['struct'] instanceof UserUpdateStruct; } /** * @param array $entryOptions * - * @return array $entryOptions + * @return array */ private function dispatchFieldOptionsEvent( FieldData $entryData, array $entryOptions, FormInterface $form ): array { + dump($entryOptions); if ($this->isContentUpdate($entryOptions)) { /** @var \Ibexa\ContentForms\Event\ContentUpdateFieldOptionsEvent $contentUpdateFieldOptionsEvent */ $contentUpdateFieldOptionsEvent = $this->eventDispatcher->dispatch( new ContentUpdateFieldOptionsEvent( $entryOptions['content'], - $entryOptions['contentUpdateStruct'], + $entryOptions['struct'], $form, $entryData, $entryOptions @@ -113,7 +118,7 @@ private function dispatchFieldOptionsEvent( /** @var \Ibexa\ContentForms\Event\ContentCreateFieldOptionsEvent $contentUpdateFieldOptionsEvent */ $contentCreateFieldOptionsEvent = $this->eventDispatcher->dispatch( new ContentCreateFieldOptionsEvent( - $entryOptions['contentCreateStruct'], + $entryOptions['struct'], $form, $entryData, $entryOptions @@ -126,7 +131,7 @@ private function dispatchFieldOptionsEvent( /** @var \Ibexa\ContentForms\Event\UserCreateFieldOptionsEvent $userCreateFieldOptionsEvent */ $userCreateFieldOptionsEvent = $this->eventDispatcher->dispatch( new UserCreateFieldOptionsEvent( - $entryOptions['userCreateStruct'], + $entryOptions['struct'], $form, $entryData, $entryOptions @@ -140,7 +145,7 @@ private function dispatchFieldOptionsEvent( $userUpdateFieldOptionsEvent = $this->eventDispatcher->dispatch( new UserUpdateFieldOptionsEvent( $entryOptions['content'], - $entryOptions['userUpdateStruct'], + $entryOptions['struct'], $form, $entryData, $entryOptions