diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml index fb856e63..9b9cc0d8 100644 --- a/src/bundle/Resources/config/services.yaml +++ b/src/bundle/Resources/config/services.yaml @@ -118,3 +118,7 @@ services: Ibexa\ContentForms\Content\Form\Provider\GroupedContentFormFieldsProvider: arguments: $fieldsGroupsList: '@Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList' + + Ibexa\ContentForms\Content\Form\Provider\IdentifiedGroupedContentFormFieldsProvider: + arguments: + $fieldsGroupsList: '@Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList' diff --git a/src/lib/Content/Form/Provider/AbstractGroupedContentFormFieldsProvider.php b/src/lib/Content/Form/Provider/AbstractGroupedContentFormFieldsProvider.php new file mode 100644 index 00000000..9169897a --- /dev/null +++ b/src/lib/Content/Form/Provider/AbstractGroupedContentFormFieldsProvider.php @@ -0,0 +1,50 @@ +fieldsGroupsList = $fieldsGroupsList; + } + + public function getGroupedFields(array $fieldsDataForm): array + { + $groupedFields = []; + + foreach ($fieldsDataForm as $fieldForm) { + /** @var \Ibexa\Contracts\ContentForms\Data\Content\FieldData $fieldData */ + $fieldData = $fieldForm->getViewData(); + $fieldGroupIdentifier = $this->fieldsGroupsList->getFieldGroup($fieldData->fieldDefinition); + $groupKey = $this->getGroupKey($fieldGroupIdentifier); + + $groupedFields[$groupKey][] = $fieldForm->getName(); + } + + return $groupedFields; + } + + abstract protected function getGroupKey(string $fieldGroupIdentifier): string; + + public static function getTranslationMessages(): array + { + return [ + Message::create('content', 'ibexa_fields_groups')->setDesc('Content'), + Message::create('metadata', 'ibexa_fields_groups')->setDesc('Metadata'), + ]; + } +} diff --git a/src/lib/Content/Form/Provider/GroupedContentFormFieldsProvider.php b/src/lib/Content/Form/Provider/GroupedContentFormFieldsProvider.php index 938034e1..5571d5fb 100644 --- a/src/lib/Content/Form/Provider/GroupedContentFormFieldsProvider.php +++ b/src/lib/Content/Form/Provider/GroupedContentFormFieldsProvider.php @@ -8,43 +8,17 @@ namespace Ibexa\ContentForms\Content\Form\Provider; -use Ibexa\Contracts\ContentForms\Content\Form\Provider\GroupedContentFormFieldsProviderInterface; -use Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList; -use JMS\TranslationBundle\Model\Message; -use JMS\TranslationBundle\Translation\TranslationContainerInterface; - -final class GroupedContentFormFieldsProvider implements GroupedContentFormFieldsProviderInterface, TranslationContainerInterface +/** + * @deprecated 4.6.17 The "GroupedContentFormFieldsProvider" class is deprecated. + */ +final class GroupedContentFormFieldsProvider extends AbstractGroupedContentFormFieldsProvider { - /** @var \Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList */ - private $fieldsGroupsList; - - public function __construct(FieldsGroupsList $fieldsGroupsList) - { - $this->fieldsGroupsList = $fieldsGroupsList; - } + protected array $groupContext; - public function getGroupedFields(array $fieldsDataForm): array + protected function getGroupKey(string $fieldGroupIdentifier): string { - $fieldsGroups = $this->fieldsGroupsList->getGroups(); - $groupedFields = []; + $this->groupContext ??= $this->fieldsGroupsList->getGroups(); - foreach ($fieldsDataForm as $fieldForm) { - /** @var \Ibexa\Contracts\ContentForms\Data\Content\FieldData $fieldData */ - $fieldData = $fieldForm->getViewData(); - $fieldGroupIdentifier = $this->fieldsGroupsList->getFieldGroup($fieldData->fieldDefinition); - $fieldGroupName = $fieldsGroups[$fieldGroupIdentifier] ?? $this->fieldsGroupsList->getDefaultGroup(); - - $groupedFields[$fieldGroupName][] = $fieldForm->getName(); - } - - return $groupedFields; - } - - public static function getTranslationMessages(): array - { - return [ - Message::create('content', 'ibexa_fields_groups')->setDesc('Content'), - Message::create('metadata', 'ibexa_fields_groups')->setDesc('Metadata'), - ]; + return $this->groupContext[$fieldGroupIdentifier] ?? $this->fieldsGroupsList->getDefaultGroup(); } } diff --git a/src/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProvider.php b/src/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProvider.php new file mode 100644 index 00000000..359e7706 --- /dev/null +++ b/src/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProvider.php @@ -0,0 +1,17 @@ +createMock(FieldsGroupsList::class); + $matcher = self::exactly(3); + $expectedGroups = [1 => 'group_1', 2 => 'group_2', 3 => 'group_2']; + + $mock + ->expects($matcher) + ->method('getFieldGroup') + ->willReturnCallback(static function () use ($matcher, $expectedGroups) { + return $expectedGroups[$matcher->getInvocationCount()]; + }); + + return $mock; + } + + final protected function getFormMockWithFieldData( + string $fieldDefIdentifier, + string $fieldTypeIdentifier + ): FormInterface { + $formMock = $this + ->getMockBuilder(FormInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $formMock + ->expects(self::once()) + ->method('getViewData') + ->willReturn(new FieldData([ + 'field' => new Field(['fieldDefIdentifier' => $fieldDefIdentifier]), + 'fieldDefinition' => new FieldDefinition(['fieldTypeIdentifier' => $fieldTypeIdentifier]), + 'value' => new Value('value'), + ])); + + $formMock + ->expects(self::once()) + ->method('getName') + ->willReturn($fieldDefIdentifier); + + return $formMock; + } + + final protected function getTestForms(): array + { + return [ + $this->getFormMockWithFieldData('first_field', 'first_field_type'), + $this->getFormMockWithFieldData('second_field', 'second_field_type'), + $this->getFormMockWithFieldData('third_field', 'third_field_type'), + ]; + } +} diff --git a/tests/lib/Content/Form/Provider/GroupedContentFormFieldsProviderTest.php b/tests/lib/Content/Form/Provider/GroupedContentFormFieldsProviderTest.php index e30bacd9..3ef8cc80 100644 --- a/tests/lib/Content/Form/Provider/GroupedContentFormFieldsProviderTest.php +++ b/tests/lib/Content/Form/Provider/GroupedContentFormFieldsProviderTest.php @@ -9,25 +9,12 @@ namespace Ibexa\Tests\ContentForms\Content\Form\Provider; use Ibexa\ContentForms\Content\Form\Provider\GroupedContentFormFieldsProvider; -use Ibexa\Contracts\ContentForms\Data\Content\FieldData; -use Ibexa\Contracts\Core\Repository\Values\Content\Field; -use Ibexa\Core\FieldType\TextLine\Value; -use Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList; -use Ibexa\Core\Repository\Values\ContentType\FieldDefinition; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Form\FormInterface; -final class GroupedContentFormFieldsProviderTest extends TestCase +final class GroupedContentFormFieldsProviderTest extends AbstractGroupedContentFormFieldsProviderTest { public function testGetGroupedFields(): void { - $fieldsGroupsListMock = $this->createMock(FieldsGroupsList::class); - $fieldsGroupsListMock - ->expects(self::exactly(3)) - ->method('getFieldGroup') - ->withConsecutive() - ->willReturnOnConsecutiveCalls('group_1', 'group_2', 'group_2'); - + $fieldsGroupsListMock = $this->getFieldsGroupsListMock(); $fieldsGroupsListMock ->expects(self::once()) ->method('getGroups') @@ -37,23 +24,7 @@ public function testGetGroupedFields(): void ]); $subject = new GroupedContentFormFieldsProvider($fieldsGroupsListMock); - - $form1 = $this->getFormMockWithFieldData( - 'first_field', - 'first_field_type', - ); - - $form2 = $this->getFormMockWithFieldData( - 'second_field', - 'second_field_type', - ); - - $form3 = $this->getFormMockWithFieldData( - 'third_field', - 'third_field_type', - ); - - $result = $subject->getGroupedFields([$form1, $form2, $form3]); + $result = $subject->getGroupedFields($this->getTestForms()); $expected = [ 'Group 1' => [ @@ -65,33 +36,6 @@ public function testGetGroupedFields(): void ], ]; - self::assertEquals($expected, $result); - } - - /** - * @return \Symfony\Component\Form\FormInterface - */ - private function getFormMockWithFieldData( - string $fieldDefIdentifier, - string $fieldTypeIdentifier - ) { - $formMock = $this - ->getMockBuilder(FormInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $formMock - ->expects(self::once()) - ->method('getViewData') - ->willReturn(new FieldData([ - 'field' => new Field(['fieldDefIdentifier' => $fieldDefIdentifier]), - 'fieldDefinition' => new FieldDefinition(['fieldTypeIdentifier' => $fieldTypeIdentifier]), - 'value' => new Value('value'), - ])); - $formMock - ->expects(self::once()) - ->method('getName') - ->willReturn($fieldDefIdentifier); - - return $formMock; + $this->assertEquals($expected, $result); } } diff --git a/tests/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProviderTest.php b/tests/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProviderTest.php new file mode 100644 index 00000000..0fe37629 --- /dev/null +++ b/tests/lib/Content/Form/Provider/IdentifiedGroupedContentFormFieldsProviderTest.php @@ -0,0 +1,34 @@ +getFieldsGroupsListMock(); + + $subject = new IdentifiedGroupedContentFormFieldsProvider($fieldsGroupsListMock); + $result = $subject->getGroupedFields($this->getTestForms()); + + $expected = [ + 'group_1' => [ + 0 => 'first_field', + ], + 'group_2' => [ + 0 => 'second_field', + 1 => 'third_field', + ], + ]; + + $this->assertEquals($expected, $result); + } +}