Commit d1c2b137 by Tomek Romik Committed by Qiang Xue

Added client-side file validator

parent 390a6c78
......@@ -17,7 +17,7 @@ yii.validation = (function ($) {
},
addMessage: function (messages, message, value) {
messages.push(message.replace(/\{value\}/g, value));
messages.push(message.replace(/\{(value|file)\}/g, value));
},
required: function (value, messages, options) {
......@@ -68,6 +68,56 @@ yii.validation = (function ($) {
pub.addMessage(messages, options.notEqual, value);
}
},
file: function(value, messages, options, attribute) {
var files = $(attribute.input).get(0).files,
index, ext;
if ( options.message && !files ) {
pub.addMessage(messages, options.message, value);
}
if ( !options.skipOnEmpty && files.length == 0) {
pub.addMessage(messages, options.uploadRequired, value);
} else if ( files.length == 0) {
return;
}
if ( options.maxFiles && options.maxFiles < files.length ) {
pub.addMessage(messages, options.tooMany);
}
Array.prototype.slice.call(files).forEach(function(file) {
if ( options.extensions && options.extensions.length > 0 ) {
index = file.name.lastIndexOf('.');
if ( !~index ) {
ext = '';
} else {
ext = file.name.substr(index+1, file.name.length).toLowerCase();
}
if ( !~options.extensions.indexOf(ext) ) {
pub.addMessage(messages, options.wrongExtension, file);
}
}
if ( options.mimeTypes && options.mimeTypes.length > 0 ) {
if ( !~options.mimeTypes.indexOf(file.type) ) {
pub.addMessage(messages, options.wrongMimeType, file.name);
}
}
if ( options.maxSize && options.maxSize < file.size ) {
pub.addMessage(messages, options.tooBig, file.name);
}
if ( options.maxSize && options.minSize > file.size ) {
pub.addMessage(messages, options.tooSmall, file.name);
}
});
},
number: function (value, messages, options) {
if (options.skipOnEmpty && pub.isEmpty(value)) {
......
......@@ -326,5 +326,59 @@ class FileValidator extends Validator
return true;
}
public function clientValidateAttribute($object, $attribute, $view) {
$label = $object->getAttributeLabel($attribute);
if ( $this->message !== null ){
$options['message'] = Yii::$app->getI18n()->format($this->message, [
'attribute' => $label,
], Yii::$app->language);
}
$options['skipOnEmpty'] = $this->skipOnEmpty;
if ( !$this->skipOnEmpty ) {
$options['uploadRequired'] = Yii::$app->getI18n()->format($this->uploadRequired, [], Yii::$app->language);
}
if ( is_array($this->mimeTypes) ) {
$options['mimeTypes'] = $this->mimeTypes;
$options['wrongMimeType'] = Yii::$app->getI18n()->format($this->wrongMimeType, [
'mimeTypes' => join(', ', $this->mimeTypes)
], Yii::$app->language);
}
if ( !empty($this->extensions) ) {
$options['extensions'] = $this->extensions;
$options['wrongExtension'] = Yii::$app->getI18n()->format($this->wrongExtension, [
'extensions' => join(', ', $this->extensions)
], Yii::$app->language);
}
if ( $this->minSize !== null ) {
$options['minSize'] = $this->minSize;
$options['tooSmall'] = Yii::$app->getI18n()->format($this->tooSmall, [
'limit' => $this->minSize
], Yii::$app->language);
}
if ( $this->maxSize !== null ) {
$options['maxSize'] = $this->maxSize;
$options['tooBig'] = Yii::$app->getI18n()->format($this->tooBig, [
'limit' => $this->maxSize
], Yii::$app->language);
}
if ( $this->maxFiles !== null ) {
$options['maxFiles'] = $this->maxFiles;
$options['tooMany'] = Yii::$app->getI18n()->format($this->tooMany, [
'limit' => $this->maxFiles
], Yii::$app->language);
}
ValidationAsset::register($view);
return 'yii.validation.file(value, messages, ' . json_encode($options) . ', attribute);';
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment