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
*/
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);
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);

View File

@@ -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']];

View File

@@ -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;
}
}

View File

@@ -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)) {