diff --git a/src/Forms/TextareaField.php b/src/Forms/TextareaField.php index 0a0f69c98e1..0ffbc23a19a 100644 --- a/src/Forms/TextareaField.php +++ b/src/Forms/TextareaField.php @@ -152,7 +152,6 @@ public function getAttributes() return $attributes; } - /** * {@inheritdoc} */ @@ -167,6 +166,41 @@ public function Type() return $parent; } + /** + * Validate this field + * + * @param Validator $validator + * @return bool + */ + public function validate($validator) + { + if (!is_null($this->maxLength) && mb_strlen($this->value ?? '') > $this->maxLength) { + $name = strip_tags($this->Title() ? $this->Title() : $this->getName()); + $validator->validationError( + $this->name, + _t( + 'SilverStripe\\Forms\\TextField.VALIDATEMAXLENGTH', + 'The value for {name} must not exceed {maxLength} characters in length', + ['name' => $name, 'maxLength' => $this->maxLength] + ), + "validation" + ); + return false; + } + return true; + } + + public function getSchemaValidation() + { + $rules = parent::getSchemaValidation(); + if ($this->getMaxLength()) { + $rules['max'] = [ + 'length' => $this->getMaxLength(), + ]; + } + return $rules; + } + /** * Return value with all values encoded in html entities * diff --git a/tests/php/Forms/TextareaFieldTest.php b/tests/php/Forms/TextareaFieldTest.php index accd6a5872e..f75bd4589ad 100644 --- a/tests/php/Forms/TextareaFieldTest.php +++ b/tests/php/Forms/TextareaFieldTest.php @@ -4,6 +4,7 @@ use SilverStripe\Dev\SapphireTest; use SilverStripe\Forms\TextareaField; +use SilverStripe\Forms\RequiredFields; class TextareaFieldTest extends SapphireTest { @@ -50,6 +51,30 @@ public function testReadonlyDisplaySpecialHTML() ); } + /** + * Tests the TextareaField Max Length Validation Failure + */ + public function testMaxLengthValidationFail() + { + $field = new TextareaField("Test", "Test"); + $field->setMaxLength(5); + $field->setValue("John Doe"); // 8 characters, so should fail + $result = $field->validate(new RequiredFields()); + $this->assertFalse($result); + } + + /** + * Tests the TextareaField Max Length Validation Success + */ + public function testMaxLengthValidationSuccess() + { + $field = new TextareaField("Test", "Test"); + $field->setMaxLength(5); + $field->setValue("John"); // 4 characters, so should pass + $result = $field->validate(new RequiredFields()); + $this->assertTrue($result); + } + public function testValueEntities() { $inputText = "These are some unicodes: äöü";