SDK Form demonstrator dynamic field without dependency

This commit is contained in:
Eric Espie
2025-04-18 16:49:59 +02:00
parent 6c54ee0666
commit c20221a683
5 changed files with 17 additions and 15 deletions

View File

@@ -45,9 +45,9 @@ abstract class AbstractType extends SymfonyAbstractType
* *
* @return array|null null if field is not present * @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;
} }
/** /**

View File

@@ -114,6 +114,7 @@ class FormBuilder implements FormBuilderInterface, \IteratorAggregate
$aPrerequisites = $oType->GetPrerequisites($options); $aPrerequisites = $oType->GetPrerequisites($options);
if (is_null($aPrerequisites)) { if (is_null($aPrerequisites)) {
$this->oDependencies->Add($child, $type); $this->oDependencies->Add($child, $type);
$options = $oType->BuildOptions($options);
$this->builder->add($child, $type, $options); $this->builder->add($child, $type, $options);
} else { } else {
$this->oDependencies->Add($child, $type, $aPrerequisites, $options); $this->oDependencies->Add($child, $type, $aPrerequisites, $options);

View File

@@ -19,7 +19,7 @@ class AttCodeGroupByType extends AbstractType
return SymfonyChoiceType::class; return SymfonyChoiceType::class;
} }
public function BuildOptions(array $aUserOptions, array $aModelData): ?array public function BuildOptions(array $aUserOptions, array $aModelData = []): ?array
{ {
$oModelReflection = new \ModelReflectionRuntime(); $oModelReflection = new \ModelReflectionRuntime();
$sClassOrOql = $aModelData[$aUserOptions['source_class']]; $sClassOrOql = $aModelData[$aUserOptions['source_class']];

View File

@@ -4,37 +4,38 @@
* @license http://opensource.org/licenses/AGPL-3.0 * @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\Base\AbstractType;
use Combodo\iTop\Forms\FormType\FormTypeException; use Combodo\iTop\Forms\FormType\FormTypeException;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use ValueSetObjects; use ValueSetObjects;
class ExternalKeyType extends AbstractType class ExternalKeyType extends AbstractType
{ {
public function getParent()
{
return SymfonyChoiceType::class;
}
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
parent::configureOptions($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(); $oModelReflection = new \ModelReflectionRuntime();
$sClass = $options['class']; $sClass = $aUserOptions['class'];
if (!$oModelReflection->IsValidClass($sClass)) { if (!$oModelReflection->IsValidClass($sClass)) {
throw new FormTypeException("Unknown class $sClass"); throw new FormTypeException("Unknown class $sClass");
} }
$oValueSet = new ValueSetObjects("SELECT `$sClass`"); $oValueSet = new ValueSetObjects("SELECT `$sClass`");
$aUserOptions['choices'] = array_flip($oValueSet->GetValues([])); $aOptions['choices'] = array_flip($oValueSet->GetValues([]));
$aUserOptions['multiple'] = false; $aOptions['multiple'] = false;
$aUserOptions['inherit_data'] = true;
$builder->add('selected', SymfonyChoiceType::class, $aUserOptions); return $aOptions;
parent::buildForm($builder, $options);
} }
} }

View File

@@ -18,7 +18,7 @@ class ValuesFromAttcodeType extends AbstractType
return SymfonyChoiceType::class; 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; $sAttCode = $aModelData[$aUserOptions['source_attcode']] ?? null;
if (utils::IsNullOrEmptyString($sAttCode)) { if (utils::IsNullOrEmptyString($sAttCode)) {