From 3e7f021de79d65a347cd14a037242bfad7e5bf5d Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Fri, 7 Jul 2017 16:09:39 +1200 Subject: [PATCH] FIX Compatibility with userforms 3/4 getCMSFields, remove deprecated getSettings use etc --- code/EditableSpamProtectionField.php | 85 +++++++++++++++++++---- composer.json | 2 +- tests/EditableSpamProtectionFieldTest.php | 19 +++++ 3 files changed, 93 insertions(+), 13 deletions(-) diff --git a/code/EditableSpamProtectionField.php b/code/EditableSpamProtectionField.php index bc68ebf..8993f28 100644 --- a/code/EditableSpamProtectionField.php +++ b/code/EditableSpamProtectionField.php @@ -24,6 +24,10 @@ if (class_exists('EditableFormField')) { 'EditableNumericField' ); + private static $db = array( + 'SpamFieldSettings' => 'Text' + ); + /** * @var FormField */ @@ -45,7 +49,7 @@ if (class_exists('EditableFormField')) { $fieldMapping = array(); foreach ($this->getCandidateFields() as $otherField) { $mapSetting = "Map-{$otherField->Name}"; - $spamField = $this->getSetting($mapSetting); + $spamField = $this->spamMapValue($mapSetting); $fieldMapping[$otherField->Name] = $spamField; } $protector->setFieldMapping($fieldMapping); @@ -89,9 +93,47 @@ if (class_exists('EditableFormField')) { ->exclude('Title', ''); // Ignore this field and those without titles } + /** + * This method is in place for userforms 2.x + * + * @deprecated 3.0 Please use {@link getCMSFields()} instead + */ public function getFieldConfiguration() { - $fields = parent::getFieldConfiguration(); + return $this->getCMSFields(); + } + + /** + * Write the spam field mapping values to a serialised DB field + * + * {@inheritDoc} + */ + public function onBeforeWrite() + { + $fieldMap = Convert::json2array($this->SpamFieldSettings); + if (empty($fieldMap)) { + $fieldMap = array(); + } + + foreach ($this->record as $key => $value) { + if (substr($key, 0, 8) === 'spammap-') { + $fieldMap[substr($key, 8)] = $value; + } + } + $this->setField('SpamFieldSettings', Convert::raw2json($fieldMap)); + + return parent::onBeforeWrite(); + } + + /** + * Used in userforms 3.x and above + * + * {@inheritDoc} + */ + public function getCMSFields() + { + /** @var FieldList $fields */ + $fields = parent::getCMSFields(); // Get protector $protector = FormSpamProtectionExtension::get_protector(); @@ -104,13 +146,13 @@ if (class_exists('EditableFormField')) { } // Each other text field in this group can be assigned a field mapping - $mapGroup = FieldGroup::create(_t( - 'EditableSpamProtectionField.SPAMFIELDMAPPING', - 'Spam Field Mapping' - ))->setDescription(_t( - 'EditableSpamProtectionField.SPAMFIELDMAPPINGDESCRIPTION', - 'Select the form fields that correspond to any relevant spam protection identifiers' - )); + $mapGroup = FieldGroup::create() + ->setTitle(_t('EditableSpamProtectionField.SPAMFIELDMAPPING', 'Spam Field Mapping')) + ->setName('SpamFieldMapping') + ->setDescription(_t( + 'EditableSpamProtectionField.SPAMFIELDMAPPINGDESCRIPTION', + 'Select the form fields that correspond to any relevant spam protection identifiers' + )); // Generate field specific settings $mappableFields = Config::inst()->get('FormSpamProtectionExtension', 'mappable_fields'); @@ -118,18 +160,37 @@ if (class_exists('EditableFormField')) { foreach ($this->getCandidateFields() as $otherField) { $mapSetting = "Map-{$otherField->Name}"; $fieldOption = DropdownField::create( - $this->getSettingName($mapSetting), + 'spammap-' . $mapSetting, $otherField->Title, $mappableFieldsMerged, - $this->getSetting($mapSetting) + $this->spamMapValue($mapSetting) )->setEmptyString(''); $mapGroup->push($fieldOption); } - $fields->insertBefore($mapGroup, $this->getSettingName('ExtraClass')); + $fields->addFieldToTab('Root.Main', $mapGroup); return $fields; } + /** + * Try to retrieve a value for the given spam field map name from the serialised data + * + * @param string $mapSetting + * @return string + */ + public function spamMapValue($mapSetting) + { + $map = Convert::json2array($this->SpamFieldSettings); + if (empty($map)) { + $map = array(); + } + + if (array_key_exists($mapSetting, $map)) { + return $map[$mapSetting]; + } + return ''; + } + /** * Using custom validateField method * as Spam Protection Field implementations may have their own error messages diff --git a/composer.json b/composer.json index f6ff030..9084db8 100644 --- a/composer.json +++ b/composer.json @@ -24,4 +24,4 @@ }, "extra": [], "license": "BSD-3-Clause" -} \ No newline at end of file +} diff --git a/tests/EditableSpamProtectionFieldTest.php b/tests/EditableSpamProtectionFieldTest.php index 228711d..5a5660f 100644 --- a/tests/EditableSpamProtectionFieldTest.php +++ b/tests/EditableSpamProtectionFieldTest.php @@ -81,6 +81,25 @@ class EditableSpamProtectionFieldTest extends SapphireTest $formFieldMock->validateField(array('MyField' => null), $formMock); } + public function testSpamConfigurationShowsInCms() + { + $field = $this->getEditableFormFieldMock(); + $fields = $field->getCMSFields(); + + $this->assertInstanceOf('FieldGroup', $fields->fieldByName('Root.Main.SpamFieldMapping')); + } + + public function testSpamMapSettingsAreSerialised() + { + $field = $this->getEditableFormFieldMock(); + $field->SpamFieldSettings = json_encode(array('foo' => 'bar', 'bar' => 'baz')); + $field->write(); + + $this->assertJson($field->SpamFieldSettings); + $this->assertSame('bar', $field->spamMapValue('foo')); + $this->assertSame('baz', $field->spamMapValue('bar')); + } + protected function getFormMock() { $formMock = $this->getMockBuilder('Form', array('addErrorMessage'))