From 49a7f08c07142b9cf4cf4afcf525f6b271efac85 Mon Sep 17 00:00:00 2001 From: GuySartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Tue, 19 Oct 2021 12:03:40 +1300 Subject: [PATCH] ENH: Display validation messages for GridFields (#10015) * FIX: Display validation messages for GridFields * ENH: Add test for GridField validation messages. --- src/Forms/GridField/GridField.php | 13 +++++++++++ tests/php/Forms/GridField/GridFieldTest.php | 26 +++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/Forms/GridField/GridField.php b/src/Forms/GridField/GridField.php index 4717a849a..6c71f1528 100644 --- a/src/Forms/GridField/GridField.php +++ b/src/Forms/GridField/GridField.php @@ -9,6 +9,7 @@ use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Control\HTTPResponse_Exception; use SilverStripe\Control\RequestHandler; +use SilverStripe\Core\Convert; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\Form; use SilverStripe\Forms\FormField; @@ -654,6 +655,18 @@ class GridField extends FormField $tableAttributes, $header . "\n" . $footer . "\n" . $body ); + + $message = Convert::raw2xml($this->getMessage()); + if (is_array($message)) { + $message = $message['message']; + } + if ($message) { + $content['after'] .= HTML::createTag( + 'p', + ['class' => 'message ' . $this->getMessageType()], + $message + ); + } return HTML::createTag( 'fieldset', diff --git a/tests/php/Forms/GridField/GridFieldTest.php b/tests/php/Forms/GridField/GridFieldTest.php index ee82cfd0e..8676e8790 100644 --- a/tests/php/Forms/GridField/GridFieldTest.php +++ b/tests/php/Forms/GridField/GridFieldTest.php @@ -20,6 +20,7 @@ use SilverStripe\Forms\GridField\GridFieldToolbarHeader; use SilverStripe\Forms\GridField\GridState; use SilverStripe\Forms\GridField\GridState_Component; use SilverStripe\Forms\GridField\GridState_Data; +use SilverStripe\Forms\RequiredFields; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Cheerleader; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Component; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Component2; @@ -27,7 +28,9 @@ use SilverStripe\Forms\Tests\GridField\GridFieldTest\HTMLFragments; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Player; use SilverStripe\Forms\Tests\GridField\GridFieldTest\Team; +use SilverStripe\Forms\Tests\ValidatorTest\TestValidator; use SilverStripe\ORM\ArrayList; +use SilverStripe\ORM\ValidationResult; use SilverStripe\Security\Group; use SilverStripe\Security\Member; use SilverStripe\Versioned\VersionedGridFieldStateExtension; @@ -640,4 +643,27 @@ class GridFieldTest extends SapphireTest $endList = $gridField->getManipulatedList(); $this->assertEquals($endList->count(), 10); } + + public function testValidationMessageInOutput() + { + $gridField = new GridField('testfield', 'testfield', new ArrayList(), new GridFieldConfig()); + $fieldList = new FieldList([$gridField]); + $validator = new TestValidator(); + $form = new Form(null, "testForm", $fieldList, new FieldList(), $validator); + + // A form that fails validation should display the validation error in the FieldHolder output. + $form->validationResult(); + $gridfieldOutput = $gridField->FieldHolder(); + $this->assertContains('

error

', $gridfieldOutput); + + // Clear validation error from previous assertion. + $validator->removeValidation(); + $gridField->setMessage(null); + + // A form that passes validation should not display a validation error in the FieldHolder output. + $form->setValidator(new RequiredFields()); + $form->validationResult(); + $gridfieldOutput = $gridField->FieldHolder(); + $this->assertNotContains('

', $gridfieldOutput); + } }