From 643fedaf21560536616ff7385134487463a7e23d Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Thu, 12 Aug 2021 13:35:02 +1200 Subject: [PATCH] FIX Allow fields without parents to be programatically created --- code/EditableSpamProtectionField.php | 8 ++++++-- composer.json | 5 +++-- tests/EditableSpamProtectionFieldTest.php | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/code/EditableSpamProtectionField.php b/code/EditableSpamProtectionField.php index 6260b03..a88b3e0 100644 --- a/code/EditableSpamProtectionField.php +++ b/code/EditableSpamProtectionField.php @@ -9,6 +9,7 @@ use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldGroup; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FormField; +use SilverStripe\ORM\DataList; use SilverStripe\ORM\UnsavedRelationList; use SilverStripe\SpamProtection\Extension\FormSpamProtectionExtension; use SilverStripe\UserForms\Model\EditableFormField; @@ -112,8 +113,11 @@ class EditableSpamProtectionField extends EditableFormField } // Get all candidates of the above types - return $this - ->Parent() + $parent = $this->Parent(); + if (!$parent) { + return DataList::create(EditableFormField::class); + } + return $parent ->Fields() ->filter('ClassName', $typesInherit) ->exclude('Title', ''); // Ignore this field and those without titles diff --git a/composer.json b/composer.json index ce0f2a7..4eda29d 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,8 @@ "require-dev": { "sminnee/phpunit": "^5.7", "silverstripe/versioned": "^1.0", - "squizlabs/php_codesniffer": "^3.0" + "squizlabs/php_codesniffer": "^3.0", + "silverstripe/userforms": "^5" }, "extra": { "expose": [ @@ -38,4 +39,4 @@ "license": "BSD-3-Clause", "minimum-stability": "dev", "prefer-stable": true -} \ No newline at end of file +} diff --git a/tests/EditableSpamProtectionFieldTest.php b/tests/EditableSpamProtectionFieldTest.php index 11010b0..af51b62 100644 --- a/tests/EditableSpamProtectionFieldTest.php +++ b/tests/EditableSpamProtectionFieldTest.php @@ -2,6 +2,8 @@ namespace SilverStripe\SpamProtection\Tests; +use ReflectionClass; +use SilverStripe\ORM\DataList; use SilverStripe\UserForms\Model\UserDefinedForm; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; @@ -153,4 +155,24 @@ class EditableSpamProtectionFieldTest extends SapphireTest return $editableFormFieldMock; } + + public function testGetCandidateFieldsParentStatus() + { + $field = new EditableSpamProtectionField(); + $field->Name = 'MyField'; + $reflection = new ReflectionClass($field); + $method = $reflection->getMethod('getCandidateFields'); + $method->setAccessible(true); + // Assert with no parent + $list = $method->invoke($field); + $this->assertTrue($list instanceof DataList); + // Assert with parent + $page = new UserDefinedForm(); + $page->write(); + $field->ParentID = $page->ID; + $field->ParentClass = get_class($page); + $field->write(); + $list = $method->invoke($field); + $this->assertTrue($list instanceof DataList); + } }