From 0c09eec6f84ab541e0c0615313b39231a22b4bda Mon Sep 17 00:00:00 2001 From: Chris Penny Date: Mon, 6 Jul 2020 08:41:59 +1200 Subject: [PATCH 1/2] DOC Add docs around creating custom fields. Fixed #928 (#932) * Add docs around creating custom fields * Update docs/en/creating-custom-fields.md Co-authored-by: Steve Boyd --- docs/en/creating-custom-fields.md | 43 +++++++++++++++++++++++++++++++ docs/en/index.md | 1 + 2 files changed, 44 insertions(+) create mode 100644 docs/en/creating-custom-fields.md diff --git a/docs/en/creating-custom-fields.md b/docs/en/creating-custom-fields.md new file mode 100644 index 0000000..18f19d7 --- /dev/null +++ b/docs/en/creating-custom-fields.md @@ -0,0 +1,43 @@ +# Creating custom fields + +To create and use your own custom fields, depending on what you want to accomplish, you may need to create two +new classes subclassed from the following: + +- `EditableFormField` - this Field represents what will be seen/used in the CMS userforms interface +- `FormField` - this Field represents what will be seen/used in the frontend user form when the above field has been +added + +## How (without the "why") + +You need to create your own subclass of `EditableFormField` (the field which will be used in the CMS). This class needs to +implement the method `getFormField()`, which will need to return an instantiated `FormField` to be used in the +frontend form. + +`EditableTextField` and `TextField` are two existing classes and probably the best example to look in to. + +## Why two different Fields? + +Consider the following example (`EditableTextField` and `TextField`). + +We have a field type that allows us to (optionally) set a minimum and maximum number of characters that can be input +into that particular field. + +As an author, when I create this field in the CMS, I want the ability to specify what those `min`/`max` settings are. +As a developer, I want to be able to add validation to make sure that these `min`/`max` values are valid (EG: `min` +is less than `max`). So, this class is going to need DB fields to store these min/max values, and it's going to need +some validation for when an author fills in those fields. + +As a frontend user, I want to fill in the field, and be notified when the value I have entered does not meet the +requirements. As a developer, I need to now compare the value entered by the user with the `min`/`max` values that the +author specified. + +So, we have two fields, with two different concerns. + +The subclass of `EditableFormField` is what you want to create to represent the field as it is used in the CMS. Its +validation should be based on what you require your **content authors** to enter. + +The subclass of `FormField` is what you want to create to represent the field as it is used on the frontend. Its +validation should be based on what you require your **frontend users** to enter. + +The subclass of `EditableFormField` is in charge of instantiating its `FormField` with any/all information the `FormField` +requires to perform its duty. diff --git a/docs/en/index.md b/docs/en/index.md index ef07f18..07b8b13 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -28,6 +28,7 @@ See the "require" section of [composer.json](https://github.com/silverstripe/sil * [Troubleshooting](troubleshooting.md) * [User Documentation](userguide/index.md) * [Compiling Front-End Files](compiling-front-end-files.md) + * [Creating Custom Fields](creating-custom-fields.md) * [Upgrading to SilverStripe 4](upgrading.md) ## Thanks From 59cd87d842ce7006857f80e296a9e8938ba8ae47 Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Tue, 14 Jul 2020 16:41:36 +1200 Subject: [PATCH 2/2] FIX Trim recipient email addresses before write --- code/Model/Recipient/EmailRecipient.php | 11 +++++++++++ tests/Model/Recipient/EmailRecipientTest.php | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/code/Model/Recipient/EmailRecipient.php b/code/Model/Recipient/EmailRecipient.php index ff3487d..0fa482d 100644 --- a/code/Model/Recipient/EmailRecipient.php +++ b/code/Model/Recipient/EmailRecipient.php @@ -116,6 +116,17 @@ class EmailRecipient extends DataObject DB::query("UPDATE \"UserDefinedForm_EmailRecipient\" SET \"FormClass\" = 'Page' WHERE \"FormClass\" IS NULL"); } + public function onBeforeWrite() + { + parent::onBeforeWrite(); + + // email addresses have trim() applied to them during validation for a slightly nicer UX + // apply trim() here too before saving to the database + $this->EmailAddress = trim($this->EmailAddress); + $this->EmailFrom = trim($this->EmailFrom); + $this->EmailReplyTo = trim($this->EmailReplyTo); + } + public function summaryFields() { $fields = parent::summaryFields(); diff --git a/tests/Model/Recipient/EmailRecipientTest.php b/tests/Model/Recipient/EmailRecipientTest.php index 30cf0cc..652a612 100644 --- a/tests/Model/Recipient/EmailRecipientTest.php +++ b/tests/Model/Recipient/EmailRecipientTest.php @@ -38,4 +38,16 @@ class EmailRecipientTest extends SapphireTest $recipient->EmailFrom = 'test@example.com'; $recipient->write(); } + + public function testEmailAddressesTrimmed() + { + $recipient = new EmailRecipient(); + $recipient->EmailAddress = 'test1@example.com '; + $recipient->EmailFrom = 'test2@example.com '; + $recipient->EmailReplyTo = 'test3@example.com '; + $recipient->write(); + $this->assertSame('test1@example.com', $recipient->EmailAddress); + $this->assertSame('test2@example.com', $recipient->EmailFrom); + $this->assertSame('test3@example.com', $recipient->EmailReplyTo); + } }