From 50e4840216be0006cc1c24c852c7dfa698ad1737 Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Sat, 20 Jun 2015 10:12:14 +1000 Subject: [PATCH] Create 'extensions' custom validator FileUpload can now specify mime types --- CHANGELOG.md | 3 +++ modules/backend/formwidgets/FileUpload.php | 12 ++++++++++- .../fileupload/assets/js/fileupload.js | 7 ++++++- modules/system/ServiceProvider.php | 21 +++++++++++++++++++ modules/system/lang/en/validation.php | 1 + 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ed20d7b9..a3756271e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* **Build 271** (2015-06-20) + - File Upload form widget can now specify `mimeTypes` to define MIME types that are accepted by the uploader, either as file extension or fully qualified name. + * **Build 270** (2015-06-18) - Introduced the October Storm client-side library. - Introduced new *MediaFinder* form widget. diff --git a/modules/backend/formwidgets/FileUpload.php b/modules/backend/formwidgets/FileUpload.php index 7514d0d38..9df67b4bf 100644 --- a/modules/backend/formwidgets/FileUpload.php +++ b/modules/backend/formwidgets/FileUpload.php @@ -56,6 +56,11 @@ class FileUpload extends FormWidgetBase */ public $fileTypes = false; + /** + * @var mixed Collection of acceptable mime types. + */ + public $mimeTypes = false; + /** * @var array Options used for generating thumbnails. */ @@ -89,6 +94,7 @@ class FileUpload extends FormWidgetBase 'imageHeight', 'previewNoFilesMessage', 'fileTypes', + 'mimeTypes', 'thumbOptions', 'useCaption' ]); @@ -347,7 +353,11 @@ class FileUpload extends FormWidgetBase $validationRules = ['max:'.File::getMaxFilesize()]; if ($fileTypes = $this->getAcceptedFileTypes()) { - $validationRules[] = 'mimes:'.$fileTypes; + $validationRules[] = 'extensions:'.$fileTypes; + } + + if ($this->mimeTypes) { + $validationRules[] = 'mimes:'.$this->mimeTypes; } $validation = Validator::make( diff --git a/modules/backend/formwidgets/fileupload/assets/js/fileupload.js b/modules/backend/formwidgets/fileupload/assets/js/fileupload.js index 82ef73a3a..09b7af045 100644 --- a/modules/backend/formwidgets/fileupload/assets/js/fileupload.js +++ b/modules/backend/formwidgets/fileupload/assets/js/fileupload.js @@ -112,7 +112,7 @@ FileUpload.prototype.onUploadAddedFile = function(file) { // Remove any exisiting objects for single variety if (!this.options.isMulti) { - $('> *', this.$filesContainer).not(file.previewElement).remove() + $(file.previewElement).siblings().remove() } this.evalIsPopulated() @@ -254,6 +254,11 @@ errorMsg = $('[data-dz-errormessage]', $target).text(), $template = $(this.options.errorTemplate) + // Remove any exisiting objects for single variety + if (!this.options.isMulti) { + $target.siblings().remove() + } + $target.ocPopover({ content: Mustache.render($template.html(), { errorMsg: errorMsg }), modal: true, diff --git a/modules/system/ServiceProvider.php b/modules/system/ServiceProvider.php index c9e695c88..075858636 100644 --- a/modules/system/ServiceProvider.php +++ b/modules/system/ServiceProvider.php @@ -7,6 +7,7 @@ use Config; use Backend; use Request; use DbDongle; +use Validator; use BackendMenu; use BackendAuth; use Twig_Environment; @@ -52,6 +53,7 @@ class ServiceProvider extends ModuleServiceProvider $this->registerMailer(); $this->registerMarkupTags(); $this->registerAssetBundles(); + $this->registerValidator(); /* * Register other module providers @@ -447,4 +449,23 @@ class ServiceProvider extends ModuleServiceProvider }); } + /** + * Extends the validator with custom rules + */ + protected function registerValidator() + { + /* + * Allowed file extensions, as opposed to mime types. + * - extensions: png,jpg,txt + */ + Validator::extend('extensions', function($attribute, $value, $parameters) { + $extension = $value->getClientOriginalExtension(); + return in_array($extension, $parameters); + }); + + Validator::replacer('extensions', function($message, $attribute, $rule, $parameters) { + return strtr($message, [':values' => implode(', ', $parameters)]); + }); + } + } diff --git a/modules/system/lang/en/validation.php b/modules/system/lang/en/validation.php index 783396d13..fa4ad367e 100644 --- a/modules/system/lang/en/validation.php +++ b/modules/system/lang/en/validation.php @@ -46,6 +46,7 @@ return array( "array" => "The :attribute may not have more than :max items.", ), "mimes" => "The :attribute must be a file of type: :values.", + "extensions" => "The :attribute must have an extension of: :values.", "min" => array( "numeric" => "The :attribute must be at least :min.", "file" => "The :attribute must be at least :min kilobytes.",