diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 76538d12b..76d2cf5ee 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -413,10 +413,10 @@ return array( 'Combodo\\iTop\\FormSDK\\Service\\FormFactoryBuilderTrait' => $baseDir . '/sources/FormSDK/Service/FormFactoryBuilderTrait.php', 'Combodo\\iTop\\FormSDK\\Service\\FormManager' => $baseDir . '/sources/FormSDK/Service/FormManager.php', 'Combodo\\iTop\\FormSDK\\Symfony\\SymfonyBridge' => $baseDir . '/sources/FormSDK/Symfony/SymfonyBridge.php', + 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\CollectionType' => $baseDir . '/sources/FormSDK/Symfony/Type/Compound/CollectionType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\FieldsetType' => $baseDir . '/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php', - 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\FormObjectType' => $baseDir . '/sources/FormSDK/Symfony/Type/Compound/FormObjectType.php', - 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\AbstractLayoutType' => $baseDir . '/sources/FormSDK/Symfony/Type/Layout/LayoutType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\ColumnType' => $baseDir . '/sources/FormSDK/Symfony/Type/Layout/ColumnType.php', + 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\LayoutType' => $baseDir . '/sources/FormSDK/Symfony/Type/Layout/LayoutType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\RowType' => $baseDir . '/sources/FormSDK/Symfony/Type/Layout/RowType.php', 'Combodo\\iTop\\Form\\Field\\AbstractSimpleField' => $baseDir . '/sources/Form/Field/AbstractSimpleField.php', 'Combodo\\iTop\\Form\\Field\\BlobField' => $baseDir . '/sources/Form/Field/BlobField.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 4024b5051..fb072e6f3 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -822,10 +822,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\FormSDK\\Service\\FormFactoryBuilderTrait' => __DIR__ . '/../..' . '/sources/FormSDK/Service/FormFactoryBuilderTrait.php', 'Combodo\\iTop\\FormSDK\\Service\\FormManager' => __DIR__ . '/../..' . '/sources/FormSDK/Service/FormManager.php', 'Combodo\\iTop\\FormSDK\\Symfony\\SymfonyBridge' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/SymfonyBridge.php', + 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\CollectionType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Compound/CollectionType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\FieldsetType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php', - 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Compound\\FormObjectType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Compound/FormObjectType.php', - 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\AbstractLayoutType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Layout/LayoutType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\ColumnType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Layout/ColumnType.php', + 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\LayoutType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Layout/LayoutType.php', 'Combodo\\iTop\\FormSDK\\Symfony\\Type\\Layout\\RowType' => __DIR__ . '/../..' . '/sources/FormSDK/Symfony/Type/Layout/RowType.php', 'Combodo\\iTop\\Form\\Field\\AbstractSimpleField' => __DIR__ . '/../..' . '/sources/Form/Field/AbstractSimpleField.php', 'Combodo\\iTop\\Form\\Field\\BlobField' => __DIR__ . '/../..' . '/sources/Form/Field/BlobField.php', diff --git a/lib/composer/installed.php b/lib/composer/installed.php index 7b5c6f143..24cb7616b 100644 --- a/lib/composer/installed.php +++ b/lib/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'combodo/itop', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '00f241e4cf314d4190bedeba80de9ec12461b958', + 'reference' => '153027434d1a860bbb424fdbf1bd6c7e47217e27', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -22,7 +22,7 @@ 'combodo/itop' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '00f241e4cf314d4190bedeba80de9ec12461b958', + 'reference' => '153027434d1a860bbb424fdbf1bd6c7e47217e27', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/sources/FormImplementation/Helper/FormHelper.php b/sources/FormImplementation/Helper/FormHelper.php index 56c8387b9..112635536 100644 --- a/sources/FormImplementation/Helper/FormHelper.php +++ b/sources/FormImplementation/Helper/FormHelper.php @@ -72,7 +72,24 @@ class FormHelper 'notify' => true, 'language' => 'FR FR', 'mode' => '1', - 'options' => ['0', '2','4'] + 'options' => ['0', '2', '4'], + 'collection' => [ + [ + 'text1' => 'Benjamin', + 'text2' => 'DALSASS', + 'date1' => new DateTime('1979/06/27') + ], + [ + 'text1' => 'Nelly', + 'text2' => 'DALSASS', + 'date1' => new DateTime('1977/04/6') + ], + [ + 'text1' => 'Léonard', + 'text2' => 'BASTID', + 'date1' => new DateTime('1975/03/16') + ] + ] ]; $oFormFactory->SetData($aData); @@ -225,6 +242,24 @@ class FormHelper ] ]); + // options - select with static data + $oText1 = new FormFieldDescription('text1', FormFieldTypeEnumeration::TEXT, []); + $oText2 = new FormFieldDescription('text2', FormFieldTypeEnumeration::TEXT, []); + $oDate = new FormFieldDescription('date1', FormFieldTypeEnumeration::DATE, [ + 'widget' => 'single_text' + ]); + $oFormFactory->AddCollectionField('collection', [ + 'label' => 'Une Collection', + 'element_type' => FormFieldTypeEnumeration::FIELDSET, + 'fields_labels' => ['Prénom', 'Nom', 'Naissance'], + 'element_options' => [ + 'fields' => [ + 'text1' => $oText1, + 'text2' => $oText2, + 'date1' => $oDate] + ] + ]); + } if(self::$MODES_DEFINITIONS[$iMode]['layout']){ diff --git a/sources/FormSDK/Field/FormFieldTypeEnumeration.php b/sources/FormSDK/Field/FormFieldTypeEnumeration.php index 2c0a2e3dd..a009bbe5d 100644 --- a/sources/FormSDK/Field/FormFieldTypeEnumeration.php +++ b/sources/FormSDK/Field/FormFieldTypeEnumeration.php @@ -25,16 +25,17 @@ namespace Combodo\iTop\FormSDK\Field; * @package FormSDK * @since 3.2.0 */ -enum FormFieldTypeEnumeration : string +enum FormFieldTypeEnumeration { - case TEXT = 'TEXT'; - case NUMBER = 'NUMBER'; - case AREA = 'AREA'; - case DATE = 'DATE'; - case SELECT = 'SELECT'; - case SWITCH = 'SWITCH'; - case DURATION = 'DURATION'; - case FIELDSET = 'FIELDSET'; + case TEXT; + case NUMBER; + case AREA; + case DATE; + case SELECT; + case SWITCH; + case DURATION; + case FIELDSET; + case COLLECTION; /** * Return available options. @@ -63,6 +64,9 @@ enum FormFieldTypeEnumeration : string FormFieldTypeEnumeration::FIELDSET => array_merge($aOptions, ['fields', 'layout'] ), + FormFieldTypeEnumeration::COLLECTION => array_merge($aOptions, + ['element_type', 'element_options', 'fields_labels'] + ), default => $aOptions, }; } diff --git a/sources/FormSDK/Service/FactoryAdapter/FormFactoryObjectAdapter.php b/sources/FormSDK/Service/FactoryAdapter/FormFactoryObjectAdapter.php index 8d272fdf6..75fc684b7 100644 --- a/sources/FormSDK/Service/FactoryAdapter/FormFactoryObjectAdapter.php +++ b/sources/FormSDK/Service/FactoryAdapter/FormFactoryObjectAdapter.php @@ -184,12 +184,8 @@ final class FormFactoryObjectAdapter implements FormFactoryAdapterInterface 'fields' => $aFieldsDescriptions, 'layout' => [ 'row__1' => [ - 'column__1' => [ - 'fieldset__1' => [ 'name'], - ], - 'column__2' => [ - 'fieldset__2' => ['mobile_phone'], - ], + 'column__1' => [ 'name'], + 'column__2' => ['mobile_phone'], ], ] ]); diff --git a/sources/FormSDK/Service/FormFactoryBuilderTrait.php b/sources/FormSDK/Service/FormFactoryBuilderTrait.php index 3aad60ef4..63f4f3626 100644 --- a/sources/FormSDK/Service/FormFactoryBuilderTrait.php +++ b/sources/FormSDK/Service/FormFactoryBuilderTrait.php @@ -246,4 +246,20 @@ trait FormFactoryBuilderTrait return $this; } + + /** + * Add collection field. + * + * @param string $sKey + * @param array $aOptions + * + * @return \Combodo\iTop\FormSDK\Service\FormFactory + * @throws \Exception + */ + public function AddCollectionField(string $sKey, array $aOptions) : FormFactory + { + $this->aFieldsDescriptions[$sKey] = new FormFieldDescription($sKey, FormFieldTypeEnumeration::COLLECTION, $aOptions); + + return $this; + } } \ No newline at end of file diff --git a/sources/FormSDK/Symfony/SymfonyBridge.php b/sources/FormSDK/Symfony/SymfonyBridge.php index b74269377..3d822c8bd 100644 --- a/sources/FormSDK/Symfony/SymfonyBridge.php +++ b/sources/FormSDK/Symfony/SymfonyBridge.php @@ -21,6 +21,7 @@ namespace Combodo\iTop\FormSDK\Symfony; use Combodo\iTop\FormSDK\Field\FormFieldDescription; use Combodo\iTop\FormSDK\Field\FormFieldTypeEnumeration; +use Combodo\iTop\FormSDK\Symfony\Type\Compound\CollectionType; use Combodo\iTop\FormSDK\Symfony\Type\Compound\FieldsetType; use Combodo\iTop\FormSDK\Symfony\Type\Layout\ColumnType; use Combodo\iTop\FormSDK\Symfony\Type\Layout\RowType; @@ -103,12 +104,7 @@ class SymfonyBridge case FormFieldTypeEnumeration::FIELDSET: $aOptions = $oFormDescription->GetOptions(); - $aFields = []; - foreach ($aOptions['fields'] as $oChildFormDescription){ - $aSymfony = $this->ToSymfonyFormType($oChildFormDescription); - $aFields[$oChildFormDescription->GetName()] = $aSymfony; - } - $aOptions['fields'] = $aFields; + $this->TransformFieldsetOptions($aOptions); return [ 'name' => $oFormDescription->GetName(), 'type' => FieldsetType::class, @@ -129,11 +125,41 @@ class SymfonyBridge 'options' => $oFormDescription->GetOptions() ]; + case FormFieldTypeEnumeration::COLLECTION: + $aOptions = $oFormDescription->GetOptions(); + $this->TransformCollectionOptions($aOptions); + return [ + 'name' => $oFormDescription->GetName(), + 'type' => CollectionType::class, + 'options' => $aOptions + ]; + default: return null; } } + private function TransformFieldsetOptions(array &$aOptions){ + + $aFields = []; + foreach ($aOptions['fields'] as $oChildFormDescription){ + $aSymfony = $this->ToSymfonyFormType($oChildFormDescription); + $aFields[$oChildFormDescription->GetName()] = $aSymfony; + } + $aOptions['fields'] = $aFields; + } + + private function TransformCollectionOptions(array &$aOptions){ + + $aOptions['entry_type'] = FieldsetType::class; + + $this->TransformFieldsetOptions($aOptions['element_options']); + $aOptions['entry_options'] = $aOptions['element_options']; + + unset($aOptions['element_options']); + unset($aOptions['element_type']); + } + /** * Create Symfony form. * diff --git a/sources/FormSDK/Symfony/Type/Compound/CollectionType.php b/sources/FormSDK/Symfony/Type/Compound/CollectionType.php new file mode 100644 index 000000000..3552de9bb --- /dev/null +++ b/sources/FormSDK/Symfony/Type/Compound/CollectionType.php @@ -0,0 +1,66 @@ +setDefaults([ + 'fields_labels' => [], + ]); + } + + /** @inheritdoc */ + public function getParent(): string + { + return \Symfony\Component\Form\Extension\Core\Type\CollectionType::class; + } + + /** @inheritdoc */ + public function buildView(FormView $view, FormInterface $form, array $options): void + { + // pass the form type option directly to the template + $view->vars['fields_labels'] = $options['fields_labels']; + } + + /** @inheritdoc */ + public function getBlockPrefix() + { + return 'itop_collection'; + } +} \ No newline at end of file diff --git a/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php b/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php index e53ad6433..dad8c57ac 100644 --- a/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php +++ b/sources/FormSDK/Symfony/Type/Compound/FieldsetType.php @@ -34,8 +34,6 @@ use Symfony\Component\OptionsResolver\OptionsResolver; class FieldsetType extends AbstractType { - - /** @inheritdoc */ public function buildForm(FormBuilderInterface $builder, array $options) : void { @@ -46,20 +44,11 @@ class FieldsetType extends AbstractType } } - private function handleRow(FormBuilderInterface $builder, array $aData){ - - } - - private function handleColumn(FormBuilderInterface $builder, array $aData){ - - } - /** @inheritdoc */ public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'fields' => [], - 'view' => [], 'layout' => [] ]); } diff --git a/sources/FormSDK/Symfony/Type/Layout/LayoutType.php b/sources/FormSDK/Symfony/Type/Layout/LayoutType.php index 8b14f9bc8..3f9761e98 100644 --- a/sources/FormSDK/Symfony/Type/Layout/LayoutType.php +++ b/sources/FormSDK/Symfony/Type/Layout/LayoutType.php @@ -37,7 +37,6 @@ class LayoutType extends AbstractType /** @inheritdoc */ public function buildForm(FormBuilderInterface $builder, array $options) : void { - foreach ($options['fields'] as $oField){ $builder->add($oField['name'], $oField['type'], $oField['options']); } diff --git a/templates/formSDK/themes/portal.html.twig b/templates/formSDK/themes/portal.html.twig index b84b43caa..c2dc706de 100644 --- a/templates/formSDK/themes/portal.html.twig +++ b/templates/formSDK/themes/portal.html.twig @@ -42,3 +42,24 @@ {%- block fieldset_row -%} {{ form_row(form, {'attr' : {'class' : attr.class|default('') ~ ' form-compound-fieldset'}}) }} {%- endblock fieldset_row -%} + +{%- block itop_collection_widget -%} + + + + {% for label in form.vars.fields_labels %} + + {% endfor %} + + + + {% for el in form %} + + {% for child in el.children %} + + {% endfor %} + + {% endfor %} + +
{{ label }}
{{ form(child) }}
+{%- endblock itop_collection_widget -%}