diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 86a6d66..b87e7b4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,7 +28,7 @@ jobs: php: '7.3' DEPS: 'lowest' WITH_DOCTRINE_CACHE_BUNDLE: 'yes' - SYMFONY_DEPRECATIONS_HELPER: 'max[self]=2&max[indirect]=1230' + SYMFONY_DEPRECATIONS_HELPER: 'max[self]=2&max[indirect]=1394' - php: '8.2' DEPS: 'unmodified' diff --git a/Controller/SettingsController.php b/Controller/SettingsController.php index 4f18c6b..3f0b159 100644 --- a/Controller/SettingsController.php +++ b/Controller/SettingsController.php @@ -37,10 +37,10 @@ public function modifyAction(CacheAdapterInterface $cache, FormFactoryInterface $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // update the cache foreach ($formData['settings'] as $formSetting) { $storedSetting = $this->getSettingByName($allStoredSettings, $formSetting->getName()); if ($storedSetting !== null) { - $storedSetting->setValue($formSetting->getValue()); $cache->set($storedSetting->getName(), $storedSetting->getValue()); } } diff --git a/Form/ModifySettingsForm.php b/Form/ModifySettingsForm.php index 0cd42e1..63d2539 100644 --- a/Form/ModifySettingsForm.php +++ b/Form/ModifySettingsForm.php @@ -2,9 +2,10 @@ namespace Craue\ConfigBundle\Form; +use Craue\ConfigBundle\Entity\SettingInterface; use Craue\ConfigBundle\Form\Type\SettingType; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\CollectionType; +use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\FormBuilderInterface; /** @@ -18,9 +19,16 @@ class ModifySettingsForm extends AbstractType { * {@inheritDoc} */ public function buildForm(FormBuilderInterface $builder, array $options) : void { - $builder->add('settings', CollectionType::class, [ - 'entry_type' => SettingType::class, - ]); + $settingsForm = $builder->create('settings', FormType::class); + + foreach ($options['data']['settings'] as $setting) { + /* @var $setting SettingInterface */ + $settingsForm->add($setting->getName(), SettingType::class, [ + 'data' => $setting, + ]); + } + + $builder->add($settingsForm); } /** diff --git a/Form/Type/SettingType.php b/Form/Type/SettingType.php index 9593b33..1bc3518 100644 --- a/Form/Type/SettingType.php +++ b/Form/Type/SettingType.php @@ -5,6 +5,8 @@ use Craue\ConfigBundle\Entity\SettingInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -33,6 +35,21 @@ public function buildForm(FormBuilderInterface $builder, array $options) : void 'required' => false, 'translation_domain' => 'CraueConfigBundle', ]); + + $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) : void { + $form = $event->getForm(); + $submittedData = $event->getData(); + + // replace non-submitted values by defaults - this avoids nulling values of settings missing from the request + // idea from https://stackoverflow.com/questions/11687760/form-avoid-setting-null-to-non-submitted-field/16522446#16522446 + foreach ($form->all() as $name => $child) { + if (!isset($submittedData[$name])) { + $submittedData[$name] = $child->getData(); + } + } + + $event->setData($submittedData); + }); } /** diff --git a/Tests/Controller/SettingsControllerIntegrationTest.php b/Tests/Controller/SettingsControllerIntegrationTest.php index 4e29908..60f234a 100644 --- a/Tests/Controller/SettingsControllerIntegrationTest.php +++ b/Tests/Controller/SettingsControllerIntegrationTest.php @@ -3,6 +3,8 @@ namespace Craue\ConfigBundle\Tests\Controller; use Craue\ConfigBundle\Entity\Setting; +use Craue\ConfigBundle\Entity\SettingInterface; +use Craue\ConfigBundle\Tests\IntegrationTestBundle\Entity\CanBeDisabledSetting; use Craue\ConfigBundle\Tests\IntegrationTestBundle\Entity\CustomSetting; use Craue\ConfigBundle\Tests\IntegrationTestCase; @@ -39,8 +41,8 @@ public function testModifyAction_noChanges($platform, $config, $requiredExtensio $content = static::$client->getResponse()->getContent(); $this->assertSame(200, static::$client->getResponse()->getStatusCode(), $content); $this->assertMatchesRegularExpression('/