diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9a19303..00d97a7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -54,6 +54,7 @@ Yii Framework 2 Change Log - Bug #2624: Html::textArea() should respect "name" option. (qiangxue) - Bug #2653: Fixed the bug that unsetting an unpopulated AR relation would trigger exception (qiangxue) - Bug #2681: Fixed the bug of php build-in server https://bugs.php.net/bug.php?id=66606 (dizews) +- Bug #2695: Fixed the issue that `FileValidator::isEmpty()` always returns true for validate multiple files (ZhandosKz) - Bug: Fixed `Call to a member function registerAssetFiles() on a non-object` in case of wrong `sourcePath` for an asset bundle (samdark) - Bug: Fixed incorrect event name for `yii\jui\Spinner` (samdark) - Bug: Json::encode() did not handle objects that implement JsonSerializable interface correctly (cebe) diff --git a/framework/validators/FileValidator.php b/framework/validators/FileValidator.php index ae92736..bf56538 100644 --- a/framework/validators/FileValidator.php +++ b/framework/validators/FileValidator.php @@ -229,7 +229,9 @@ class FileValidator extends Validator */ public function isEmpty($value, $trim = false) { - return !$value instanceof UploadedFile || $value->error == UPLOAD_ERR_NO_FILE; + $value = is_array($value) && !empty($value) ? $value[0] : $value; + + return !$value instanceof UploadedFile || $value->error == UPLOAD_ERR_NO_FILE; } /** diff --git a/tests/unit/data/validators/models/FakedValidationModel.php b/tests/unit/data/validators/models/FakedValidationModel.php index e4de44b..f935795 100644 --- a/tests/unit/data/validators/models/FakedValidationModel.php +++ b/tests/unit/data/validators/models/FakedValidationModel.php @@ -30,6 +30,8 @@ class FakedValidationModel extends Model return [ [['val_attr_a', 'val_attr_b'], 'required', 'on' => 'reqTest'], ['val_attr_c', 'integer'], + ['attr_images', 'file', 'maxFiles' => 3, 'types' => ['png'], 'on' => 'validateMultipleFiles'], + ['attr_image', 'file', 'types' => ['png'], 'on' => 'validateFile'] ]; } diff --git a/tests/unit/framework/validators/FileValidatorTest.php b/tests/unit/framework/validators/FileValidatorTest.php index aae82df..1159da2 100644 --- a/tests/unit/framework/validators/FileValidatorTest.php +++ b/tests/unit/framework/validators/FileValidatorTest.php @@ -107,6 +107,68 @@ class FileValidatorTest extends TestCase $val->validateAttribute($m, 'attr_files'); $this->assertTrue($m->hasErrors()); $this->assertTrue(stripos(current($m->getErrors('attr_files')), 'you can upload at most') !== false); + + $m = FakedValidationModel::createWithAttributes( + [ + 'attr_images' => $this->createTestFiles( + [ + [ + 'name' => 'image.png', + 'size' => 1024, + 'type' => 'image/png' + ], + [ + 'name' => 'image.png', + 'size' => 1024, + 'type' => 'image/png' + ], + [ + 'name' => 'text.txt', + 'size' => 1024 + ], + ] + ) + ] + ); + $m->setScenario('validateMultipleFiles'); + $this->assertFalse($m->validate()); + $this->assertTrue(stripos(current($m->getErrors('attr_images')), 'Only files with these extensions are allowed') !== false); + + $m = FakedValidationModel::createWithAttributes( + [ + 'attr_images' => $this->createTestFiles( + [ + [ + 'name' => 'image.png', + 'size' => 1024, + 'type' => 'image/png' + ], + [ + 'name' => 'image.png', + 'size' => 1024, + 'type' => 'image/png' + ], + ] + ) + ] + ); + $m->setScenario('validateMultipleFiles'); + $this->assertTrue($m->validate()); + + $m = FakedValidationModel::createWithAttributes( + [ + 'attr_image' => $this->createTestFiles( + [ + [ + 'name' => 'text.txt', + 'size' => 1024, + ], + ] + ) + ] + ); + $m->setScenario('validateFile'); + $this->assertFalse($m->validate()); } /**