Internally work with `null` in SelectFormField
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 4 May 2023 08:19:53 +0000 (10:19 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 4 May 2023 08:25:47 +0000 (10:25 +0200)
Convert the empty string to `null` immediately when reading the data to allow
custom validators to check for the `null` value instead of the empty string.

wcfsetup/install/files/lib/system/form/builder/field/SelectFormField.class.php

index f35a2d7369599e4d3cf60d5da218ec7907a6cbf2..6d997a37c431971b8c1635440f14e9d2cf392c48 100644 (file)
@@ -30,18 +30,6 @@ final class SelectFormField extends AbstractFormField implements
      */
     protected $templateName = '__selectFormField';
 
-    /**
-     * @inheritDoc
-     */
-    public function getSaveValue()
-    {
-        if ($this->getValue() === '') {
-            return;
-        }
-
-        return parent::getSaveValue();
-    }
-
     /**
      * @inheritDoc
      */
@@ -51,7 +39,7 @@ final class SelectFormField extends AbstractFormField implements
             $value = $this->getDocument()->getRequestData($this->getPrefixedId());
 
             if (\is_string($value)) {
-                $this->value = $value;
+                $this->value = $value !== '' ? $value : null;
             }
         }
 
@@ -63,7 +51,7 @@ final class SelectFormField extends AbstractFormField implements
      */
     public function validate()
     {
-        if ($this->getValue() === '') {
+        if ($this->getValue() === null) {
             if ($this->isRequired()) {
                 $this->addValidationError(new FormFieldValidationError('empty'));
             }
@@ -82,14 +70,10 @@ final class SelectFormField extends AbstractFormField implements
      */
     public function value($value)
     {
-        // ignore `null` as value which can be passed either for nullable
-        // fields or as value if no options are available
-        if ($value === null) {
-            return $this;
-        }
-
-        if (!isset($this->getOptions()[$value])) {
-            throw new \InvalidArgumentException("Unknown value '{$value}' for field '{$this->getId()}'.");
+        if ($value !== null) {
+            if (!isset($this->getOptions()[$value])) {
+                throw new \InvalidArgumentException("Unknown value '{$value}' for field '{$this->getId()}'.");
+            }
         }
 
         return parent::value($value);