Add support for acceptable types to UploadFormField of form builder
authorTim Düsterhus <duesterhus@woltlab.com>
Tue, 30 Jun 2020 09:27:58 +0000 (11:27 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Tue, 30 Jun 2020 09:42:15 +0000 (11:42 +0200)
Resolves #3414

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

index d095b3246874268f00d8e30b6bafa0e46220dc0b..ec8239f4b9121af32c93eb7ba4d3882b526a8bc8 100644 (file)
@@ -42,6 +42,13 @@ class UploadFormField extends AbstractFormField {
         */
        protected $allowSvgImage = false;
        
+       /**
+        * Acceptable file types.
+        * @var null|string[]
+        * @since 5.3
+        */
+       protected $acceptableFiles = null;
+       
        /**
         * maximum filesize for each uploaded file
         * @var null|number
@@ -110,6 +117,7 @@ class UploadFormField extends AbstractFormField {
                if ($this->isImageOnly()) {
                        $uploadField->setAllowSvgImage($this->svgImageAllowed());
                }
+               $uploadField->setAcceptableFiles($this->getAcceptableFiles());
                
                return $uploadField;
        }
@@ -597,7 +605,10 @@ class UploadFormField extends AbstractFormField {
        /**
         * Sets the flag for `imageOnly`. This flag indicates whether only images 
         * can uploaded via this field. Other file types will be rejected during upload.
-        *
+        * 
+        * If set to `true` will also set the acceptable types to `image/*`. If set to
+        * false it will clear the acceptable types if they are `image/*`.
+        * 
         * @param       boolean         $imageOnly
         * @return      static                          this field
         * 
@@ -623,6 +634,16 @@ class UploadFormField extends AbstractFormField {
                }
                
                $this->imageOnly = $imageOnly;
+               if ($imageOnly) {
+                       $this->setAcceptableFiles(['image/*']);
+               }
+               else {
+                       // Using == here is safe, because we match a single element array containing
+                       // a scalar value.
+                       if ($this->getAcceptableFiles() == ['image/*']) {
+                               $this->setAcceptableFiles(null);
+                       }
+               }
                
                return $this;
        }
@@ -668,4 +689,38 @@ class UploadFormField extends AbstractFormField {
        public function svgImageAllowed() {
                return $this->allowSvgImage;
        }
+       
+       /**
+        * Specifies acceptable file types. Use null to not specify any restrictions.
+        * 
+        * <strong>Heads up:</strong> This feature is used to improve user experience, by removing
+        * unacceptable files from the file picker. It does not validate the type of the uploaded
+        * file. You are responsible to perform (proper) validation on the server side.
+        * 
+        * Valid values are specified as "Unique file type specifiers":
+        * - A case insensitive file extension starting with a dot.
+        * - A mime type.
+        * - `audio/*`
+        * - `image/*`
+        * - `video/*`
+        * 
+        * @see         https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers
+        * @param       string[]|null     $acceptableFiles
+        * @since       5.3
+        */
+       public function setAcceptableFiles($acceptableFiles = null) {
+               $this->acceptableFiles = $acceptableFiles;
+               
+               return $this;
+       }
+       
+       /**
+        * Returns the acceptable file types.
+        * 
+        * @return      string[]|null
+        * @since       5.3
+        */
+       public function getAcceptableFiles() {
+               return $this->acceptableFiles;
+       }
 }