From c20221a683413f2b77900e77a08b4c7e68e9eb44 Mon Sep 17 00:00:00 2001 From: Eric Espie Date: Fri, 18 Apr 2025 16:49:59 +0200 Subject: [PATCH] SDK Form demonstrator dynamic field without dependency --- sources/Forms/FormType/Base/AbstractType.php | 4 ++-- sources/Forms/FormType/Base/FormBuilder.php | 1 + .../Forms/FormType/Orm/AttCodeGroupByType.php | 2 +- .../{ => Orm}/Attribute/ExternalKeyType.php | 23 ++++++++++--------- .../FormType/Orm/ValuesFromAttcodeType.php | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) rename sources/Forms/FormType/{ => Orm}/Attribute/ExternalKeyType.php (58%) diff --git a/sources/Forms/FormType/Base/AbstractType.php b/sources/Forms/FormType/Base/AbstractType.php index 2f0ecf485b..4d296396c5 100644 --- a/sources/Forms/FormType/Base/AbstractType.php +++ b/sources/Forms/FormType/Base/AbstractType.php @@ -45,9 +45,9 @@ abstract class AbstractType extends SymfonyAbstractType * * @return array|null null if field is not present */ - public function BuildOptions(array $aUserOptions, array $aModelData): ?array + public function BuildOptions(array $aUserOptions, array $aModelData = []): ?array { - return null; + return $aUserOptions; } /** diff --git a/sources/Forms/FormType/Base/FormBuilder.php b/sources/Forms/FormType/Base/FormBuilder.php index 5484ff46dc..bfba5ceef4 100644 --- a/sources/Forms/FormType/Base/FormBuilder.php +++ b/sources/Forms/FormType/Base/FormBuilder.php @@ -114,6 +114,7 @@ class FormBuilder implements FormBuilderInterface, \IteratorAggregate $aPrerequisites = $oType->GetPrerequisites($options); if (is_null($aPrerequisites)) { $this->oDependencies->Add($child, $type); + $options = $oType->BuildOptions($options); $this->builder->add($child, $type, $options); } else { $this->oDependencies->Add($child, $type, $aPrerequisites, $options); diff --git a/sources/Forms/FormType/Orm/AttCodeGroupByType.php b/sources/Forms/FormType/Orm/AttCodeGroupByType.php index 4d60ada041..7827ff2449 100644 --- a/sources/Forms/FormType/Orm/AttCodeGroupByType.php +++ b/sources/Forms/FormType/Orm/AttCodeGroupByType.php @@ -19,7 +19,7 @@ class AttCodeGroupByType extends AbstractType return SymfonyChoiceType::class; } - public function BuildOptions(array $aUserOptions, array $aModelData): ?array + public function BuildOptions(array $aUserOptions, array $aModelData = []): ?array { $oModelReflection = new \ModelReflectionRuntime(); $sClassOrOql = $aModelData[$aUserOptions['source_class']]; diff --git a/sources/Forms/FormType/Attribute/ExternalKeyType.php b/sources/Forms/FormType/Orm/Attribute/ExternalKeyType.php similarity index 58% rename from sources/Forms/FormType/Attribute/ExternalKeyType.php rename to sources/Forms/FormType/Orm/Attribute/ExternalKeyType.php index 7ce955df8d..072e32aee4 100644 --- a/sources/Forms/FormType/Attribute/ExternalKeyType.php +++ b/sources/Forms/FormType/Orm/Attribute/ExternalKeyType.php @@ -4,37 +4,38 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ -namespace Combodo\iTop\Forms\FormType\Attribute; +namespace Combodo\iTop\Forms\FormType\Orm\Attribute; use Combodo\iTop\Forms\FormType\Base\AbstractType; use Combodo\iTop\Forms\FormType\FormTypeException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType; -use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use ValueSetObjects; class ExternalKeyType extends AbstractType { + public function getParent() + { + return SymfonyChoiceType::class; + } + public function configureOptions(OptionsResolver $resolver) { parent::configureOptions($resolver); - $resolver->setRequired('class'); - $resolver->setAllowedTypes('class', 'string'); } - public function buildForm(FormBuilderInterface $builder, array $options) + public function BuildOptions(array $aUserOptions, array $aModelData = []): ?array { $oModelReflection = new \ModelReflectionRuntime(); - $sClass = $options['class']; + $sClass = $aUserOptions['class']; if (!$oModelReflection->IsValidClass($sClass)) { throw new FormTypeException("Unknown class $sClass"); } $oValueSet = new ValueSetObjects("SELECT `$sClass`"); - $aUserOptions['choices'] = array_flip($oValueSet->GetValues([])); - $aUserOptions['multiple'] = false; - $aUserOptions['inherit_data'] = true; - $builder->add('selected', SymfonyChoiceType::class, $aUserOptions); - parent::buildForm($builder, $options); + $aOptions['choices'] = array_flip($oValueSet->GetValues([])); + $aOptions['multiple'] = false; + + return $aOptions; } } \ No newline at end of file diff --git a/sources/Forms/FormType/Orm/ValuesFromAttcodeType.php b/sources/Forms/FormType/Orm/ValuesFromAttcodeType.php index 821cf9135b..0d16e489c8 100644 --- a/sources/Forms/FormType/Orm/ValuesFromAttcodeType.php +++ b/sources/Forms/FormType/Orm/ValuesFromAttcodeType.php @@ -18,7 +18,7 @@ class ValuesFromAttcodeType extends AbstractType return SymfonyChoiceType::class; } - public function BuildOptions(array $aUserOptions, array $aModelData): ?array + public function BuildOptions(array $aUserOptions, array $aModelData = []): ?array { $sAttCode = $aModelData[$aUserOptions['source_attcode']] ?? null; if (utils::IsNullOrEmptyString($sAttCode)) {