From 9200883bc31b11e308b502fb83065b8d7e39f191 Mon Sep 17 00:00:00 2001 From: Benjamin Dalsass Date: Tue, 7 Oct 2025 09:25:51 +0200 Subject: [PATCH] form dependency --- lib/composer/autoload_classmap.php | 6 +++ lib/composer/autoload_static.php | 6 +++ lib/composer/platform_check.php | 5 +- sources/Controller/Form/FormController.php | 11 +++++ .../Type/Dependency/AttributeChoiceType.php | 49 +++++++++++++++++++ .../Dependency/AttributeChoiceTypeData.php | 8 +++ .../Dependency/ClassProviderInterface.php | 8 +++ .../Form/Type/Dependency/OQLData.php | 23 +++++++++ .../Type/Dependency/OQLDataTransformer.php | 27 ++++++++++ .../Form/Type/Dependency/OQLType.php | 29 +++++++++++ .../Form/Type/Dependency/OfficeType.php | 3 ++ 11 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 sources/Controller/Form/Type/Dependency/AttributeChoiceType.php create mode 100644 sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php create mode 100644 sources/Controller/Form/Type/Dependency/ClassProviderInterface.php create mode 100644 sources/Controller/Form/Type/Dependency/OQLData.php create mode 100644 sources/Controller/Form/Type/Dependency/OQLDataTransformer.php create mode 100644 sources/Controller/Form/Type/Dependency/OQLType.php diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index fe51e59b5..9190fb22d 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -412,10 +412,16 @@ return array( 'Combodo\\iTop\\Controller\\Form\\Dependency\\MutableStatusEnumeration' => $baseDir . '/sources/Controller/Form/Dependency/MutableStatusEnumeration.php', 'Combodo\\iTop\\Controller\\Form\\FakeDataProvider' => $baseDir . '/sources/Controller/Form/FakeDataProvider.php', 'Combodo\\iTop\\Controller\\Form\\FormController' => $baseDir . '/sources/Controller/Form/FormController.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\AttributeChoiceType' => $baseDir . '/sources/Controller/Form/Type/Dependency/AttributeChoiceType.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\AttributeChoiceTypeData' => $baseDir . '/sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ClassProviderInterface' => $baseDir . '/sources/Controller/Form/Type/Dependency/ClassProviderInterface.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ContactType' => $baseDir . '/sources/Controller/Form/Type/Dependency/ContactType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ContactTypeData' => $baseDir . '/sources/Controller/Form/Type/Dependency/ContactTypeData.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\FakeChoiceType' => $baseDir . '/sources/Controller/Form/Type/Dependency/FakeChoiceType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\FakeChoiceTypeData' => $baseDir . '/sources/Controller/Form/Type/Dependency/FakeChoiceTypeData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLData' => $baseDir . '/sources/Controller/Form/Type/Dependency/OQLData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLDataTransformer' => $baseDir . '/sources/Controller/Form/Type/Dependency/OQLDataTransformer.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLType' => $baseDir . '/sources/Controller/Form/Type/Dependency/OQLType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OfficeType' => $baseDir . '/sources/Controller/Form/Type/Dependency/OfficeType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OfficeTypeData' => $baseDir . '/sources/Controller/Form/Type/Dependency/OfficeTypeData.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Form\\MailType' => $baseDir . '/sources/Controller/Form/Type/Form/MailType.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index b84fdf266..04a3d1dfa 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -828,10 +828,16 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\Controller\\Form\\Dependency\\MutableStatusEnumeration' => __DIR__ . '/../..' . '/sources/Controller/Form/Dependency/MutableStatusEnumeration.php', 'Combodo\\iTop\\Controller\\Form\\FakeDataProvider' => __DIR__ . '/../..' . '/sources/Controller/Form/FakeDataProvider.php', 'Combodo\\iTop\\Controller\\Form\\FormController' => __DIR__ . '/../..' . '/sources/Controller/Form/FormController.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\AttributeChoiceType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/AttributeChoiceType.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\AttributeChoiceTypeData' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ClassProviderInterface' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/ClassProviderInterface.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ContactType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/ContactType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\ContactTypeData' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/ContactTypeData.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\FakeChoiceType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/FakeChoiceType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\FakeChoiceTypeData' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/FakeChoiceTypeData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLData' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/OQLData.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLDataTransformer' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/OQLDataTransformer.php', + 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OQLType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/OQLType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OfficeType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/OfficeType.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Dependency\\OfficeTypeData' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Dependency/OfficeTypeData.php', 'Combodo\\iTop\\Controller\\Form\\Type\\Form\\MailType' => __DIR__ . '/../..' . '/sources/Controller/Form/Type/Form/MailType.php', diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php index dee74e173..72145773d 100644 --- a/lib/composer/platform_check.php +++ b/lib/composer/platform_check.php @@ -36,8 +36,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/sources/Controller/Form/FormController.php b/sources/Controller/Form/FormController.php index 2be41adcc..0225daf27 100644 --- a/sources/Controller/Form/FormController.php +++ b/sources/Controller/Form/FormController.php @@ -2,6 +2,8 @@ namespace Combodo\iTop\Controller\Form; +use Combodo\iTop\Controller\Form\Type\Dependency\AttributeChoiceType; +use Combodo\iTop\Controller\Form\Type\Dependency\AttributeChoiceTypeData; use Combodo\iTop\Controller\Form\Type\Dependency\ContactTypeData; use Combodo\iTop\Controller\Form\Type\Dependency\FakeChoiceTypeData; use Combodo\iTop\Controller\Form\Dependency\FormDependencyManager; @@ -9,6 +11,7 @@ use Combodo\iTop\Controller\Form\Type\Dependency\OfficeTypeData; use Combodo\iTop\Controller\Form\Type\Dependency\ContactType; use Combodo\iTop\Controller\Form\Type\Dependency\FakeChoiceType; use Combodo\iTop\Controller\Form\Type\Dependency\OfficeType; +use Combodo\iTop\Controller\Form\Type\Dependency\OQLType; use Combodo\iTop\Controller\Form\Type\Form\Form2; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -71,6 +74,14 @@ class FormController extends AbstractController ], ]) ->add('contact', ContactType::class) + ->add('oql', OQLType::class, [ + 'bindings' => [ + 'object_class' => AttributeChoiceTypeData::OBJECT_CLASS + ], + ]) + ->add('object_class', AttributeChoiceType::class, [ + 'required' => false, + ]) ->getForm(); $form->handleRequest($request); diff --git a/sources/Controller/Form/Type/Dependency/AttributeChoiceType.php b/sources/Controller/Form/Type/Dependency/AttributeChoiceType.php new file mode 100644 index 000000000..7dfedb5d3 --- /dev/null +++ b/sources/Controller/Form/Type/Dependency/AttributeChoiceType.php @@ -0,0 +1,49 @@ +getConfig()->getOptions(); + + $value = $data[AttributeChoiceTypeData::OBJECT_CLASS->name]['value']; + + $options['choices'] = []; + + if($value !== null){ + // attributes of the selected class + $objectClass = $value->GetObjectClass(); + foreach (\MetaModel::GetAttributesList($objectClass) as $attCode){ + $options['choices'][$attCode] = $attCode; + } + // mute type + return [ + 'status' => MutableStatusEnumeration::MUTATION, + 'type' => ChoiceType::class, + 'options' => $options + ]; + } + else{ + // delete type + return [ + 'status' => MutableStatusEnumeration::SUPPRESSION, + ]; + } + + } + +} \ No newline at end of file diff --git a/sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php b/sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php new file mode 100644 index 000000000..5f22c75ed --- /dev/null +++ b/sources/Controller/Form/Type/Dependency/AttributeChoiceTypeData.php @@ -0,0 +1,8 @@ +sOQL; + } + + public function GetObjectClass(): string + { + return 'Contact'; + } +} \ No newline at end of file diff --git a/sources/Controller/Form/Type/Dependency/OQLDataTransformer.php b/sources/Controller/Form/Type/Dependency/OQLDataTransformer.php new file mode 100644 index 000000000..7db334766 --- /dev/null +++ b/sources/Controller/Form/Type/Dependency/OQLDataTransformer.php @@ -0,0 +1,27 @@ +getOQL(); + } + + public function reverseTransform(mixed $value): ?OQLData + { + if (!$value) { + return null; + } + + return new OQLData($value); + } +} \ No newline at end of file diff --git a/sources/Controller/Form/Type/Dependency/OQLType.php b/sources/Controller/Form/Type/Dependency/OQLType.php new file mode 100644 index 000000000..1344de53b --- /dev/null +++ b/sources/Controller/Form/Type/Dependency/OQLType.php @@ -0,0 +1,29 @@ +addViewTransformer(new OQLDataTransformer()); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => OQLData::class, + ]); + } + +} \ No newline at end of file diff --git a/sources/Controller/Form/Type/Dependency/OfficeType.php b/sources/Controller/Form/Type/Dependency/OfficeType.php index a405abf8c..4f9717922 100644 --- a/sources/Controller/Form/Type/Dependency/OfficeType.php +++ b/sources/Controller/Form/Type/Dependency/OfficeType.php @@ -33,10 +33,13 @@ class OfficeType extends AbstractMutableDependentType $builder->add('office', FakeChoiceType::class,[ 'fake_collection' => 'office', 'help' => '⚡ Will mutate place', + // on office post submit 'post_submit_callback' => function (FormEvent $event) { + // add place field to parent form $event->getForm()->getParent()->add('place', IntegerType::class,[ 'required' => false, 'disabled' => empty($event->getData()), + // preset place default value 'pre_set_data_callback' => function (FormEvent $event) { if($event->getData() === null){ $event->setData(1); // prefer set this by model layer (not a form responsibility)