Compare commits

...

5 Commits

Author SHA1 Message Date
Guy Sartorelli 730be25d59
Merge 55fda28f9b into 0c8fcfb54c 2024-05-08 05:30:35 +12:00
Guy Sartorelli 0c8fcfb54c
Merge pull request #11213 from creative-commoners/pulls/5/required-has-one
FIX Handle getting HasOneRelationFieldInterface passed as an array
2024-05-07 13:01:59 +12:00
Guy Sartorelli 3449d8bf21
FIX Revert "ENH Add Nice to DBField" (#11222)
This reverts commit b167f470d7.
2024-05-07 11:45:48 +12:00
Steve Boyd b8f0b8ca4f FIX Handle getting HasOneRelationFieldInterface passed as an array 2024-05-02 12:06:43 +12:00
Guy Sartorelli 55fda28f9b
API Don't publicly expose extension hook methods 2022-09-27 13:57:14 +13:00
26 changed files with 82 additions and 64 deletions

View File

@ -21,7 +21,7 @@ class DatabaseAdminExtension extends Extension
* @param bool $testMode * @param bool $testMode
* @throws ReflectionException * @throws ReflectionException
*/ */
public function onAfterBuild(bool $quiet, bool $populate, bool $testMode): void protected function onAfterBuild(bool $quiet, bool $populate, bool $testMode): void
{ {
$service = RelationValidationService::singleton(); $service = RelationValidationService::singleton();

View File

@ -113,7 +113,12 @@ class RequiredFields extends Validator
if ($formField instanceof FileField && isset($value['error']) && $value['error']) { if ($formField instanceof FileField && isset($value['error']) && $value['error']) {
$error = true; $error = true;
} else { } else {
$error = (count($value ?? [])) ? false : true; if (is_a($formField, HasOneRelationFieldInterface::class) && isset($value['value'])) {
$stringValue = (string) $value['value'];
$error = in_array($stringValue, ['0', '']);
} else {
$error = (count($value ?? [])) ? false : true;
}
} }
} else { } else {
$stringValue = (string) $value; $stringValue = (string) $value;

View File

@ -5,8 +5,9 @@ namespace SilverStripe\Forms;
use SilverStripe\Dev\Deprecation; use SilverStripe\Dev\Deprecation;
use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\DropdownField;
use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataList;
use SilverStripe\Forms\HasOneRelationFieldInterface;
class SearchableDropdownField extends DropdownField class SearchableDropdownField extends DropdownField implements HasOneRelationFieldInterface
{ {
use SearchableDropdownTrait; use SearchableDropdownTrait;

View File

@ -25,7 +25,7 @@ abstract class DataExtension extends Extension
* @param ValidationResult $validationResult Local validation result * @param ValidationResult $validationResult Local validation result
* @throws ValidationException * @throws ValidationException
*/ */
public function validate(ValidationResult $validationResult) protected function validate(ValidationResult $validationResult)
{ {
} }
@ -35,7 +35,7 @@ abstract class DataExtension extends Extension
* @param SQLSelect $query Query to augment. * @param SQLSelect $query Query to augment.
* @param DataQuery $dataQuery Container DataQuery for this SQLSelect * @param DataQuery $dataQuery Container DataQuery for this SQLSelect
*/ */
public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) protected function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
{ {
} }
@ -45,7 +45,7 @@ abstract class DataExtension extends Extension
* When duplicating a table's structure, remember to duplicate the create options * When duplicating a table's structure, remember to duplicate the create options
* as well. See {@link Versioned->augmentDatabase} for an example. * as well. See {@link Versioned->augmentDatabase} for an example.
*/ */
public function augmentDatabase() protected function augmentDatabase()
{ {
} }
@ -54,7 +54,7 @@ abstract class DataExtension extends Extension
* *
* @param array $manipulation Array of operations to augment. * @param array $manipulation Array of operations to augment.
*/ */
public function augmentWrite(&$manipulation) protected function augmentWrite(&$manipulation)
{ {
} }
@ -63,7 +63,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::onBeforeWrite()} for context. * See {@link DataObject::onBeforeWrite()} for context.
*/ */
public function onBeforeWrite() protected function onBeforeWrite()
{ {
} }
@ -72,7 +72,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::onAfterWrite()} for context. * See {@link DataObject::onAfterWrite()} for context.
*/ */
public function onAfterWrite() protected function onAfterWrite()
{ {
} }
@ -81,7 +81,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::onBeforeDelete()} for context. * See {@link DataObject::onBeforeDelete()} for context.
*/ */
public function onBeforeDelete() protected function onBeforeDelete()
{ {
} }
@ -90,7 +90,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::onAfterDelete()} for context. * See {@link DataObject::onAfterDelete()} for context.
*/ */
public function onAfterDelete() protected function onAfterDelete()
{ {
} }
@ -99,7 +99,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::requireDefaultRecords()} for context. * See {@link DataObject::requireDefaultRecords()} for context.
*/ */
public function requireDefaultRecords() protected function requireDefaultRecords()
{ {
} }
@ -108,7 +108,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::populateDefaults()} for context. * See {@link DataObject::populateDefaults()} for context.
*/ */
public function populateDefaults() protected function populateDefaults()
{ {
} }
@ -117,7 +117,7 @@ abstract class DataExtension extends Extension
* *
* See {@link DataObject::onAfterBuild()} for context. * See {@link DataObject::onAfterBuild()} for context.
*/ */
public function onAfterBuild() protected function onAfterBuild()
{ {
} }
@ -131,7 +131,7 @@ abstract class DataExtension extends Extension
* @param Member $member * @param Member $member
* @return bool|null * @return bool|null
*/ */
public function can($member) protected function can($member)
{ {
} }
@ -145,7 +145,7 @@ abstract class DataExtension extends Extension
* @param Member $member * @param Member $member
* @return bool|null * @return bool|null
*/ */
public function canEdit($member) protected function canEdit($member)
{ {
} }
@ -159,7 +159,7 @@ abstract class DataExtension extends Extension
* @param Member $member * @param Member $member
* @return bool|null * @return bool|null
*/ */
public function canDelete($member) protected function canDelete($member)
{ {
} }
@ -173,7 +173,7 @@ abstract class DataExtension extends Extension
* @param Member $member * @param Member $member
* @return bool|null * @return bool|null
*/ */
public function canCreate($member) protected function canCreate($member)
{ {
} }
@ -188,7 +188,7 @@ abstract class DataExtension extends Extension
* @return array Returns a map where the keys are db, has_one, etc, and * @return array Returns a map where the keys are db, has_one, etc, and
* the values are additional fields/relations to be defined. * the values are additional fields/relations to be defined.
*/ */
public function extraStatics($class = null, $extension = null) protected function extraStatics($class = null, $extension = null)
{ {
return []; return [];
} }
@ -206,7 +206,7 @@ abstract class DataExtension extends Extension
* *
* @param FieldList $fields FieldList with a contained TabSet * @param FieldList $fields FieldList with a contained TabSet
*/ */
public function updateCMSFields(FieldList $fields) protected function updateCMSFields(FieldList $fields)
{ {
} }
@ -217,7 +217,7 @@ abstract class DataExtension extends Extension
* *
* @param CompositeValidator $compositeValidator * @param CompositeValidator $compositeValidator
*/ */
public function updateCMSCompositeValidator(CompositeValidator $compositeValidator): void protected function updateCMSCompositeValidator(CompositeValidator $compositeValidator): void
{ {
} }
@ -229,7 +229,7 @@ abstract class DataExtension extends Extension
* *
* @param FieldList $fields FieldList without TabSet nesting * @param FieldList $fields FieldList without TabSet nesting
*/ */
public function updateFrontEndFields(FieldList $fields) protected function updateFrontEndFields(FieldList $fields)
{ {
} }
@ -239,7 +239,7 @@ abstract class DataExtension extends Extension
* *
* @param FieldList $actions FieldList * @param FieldList $actions FieldList
*/ */
public function updateCMSActions(FieldList $actions) protected function updateCMSActions(FieldList $actions)
{ {
} }
@ -251,7 +251,7 @@ abstract class DataExtension extends Extension
* *
* @param array $fields Array of field names * @param array $fields Array of field names
*/ */
public function updateSummaryFields(&$fields) protected function updateSummaryFields(&$fields)
{ {
$summary_fields = Config::inst()->get(static::class, 'summary_fields'); $summary_fields = Config::inst()->get(static::class, 'summary_fields');
if ($summary_fields) { if ($summary_fields) {
@ -274,7 +274,7 @@ abstract class DataExtension extends Extension
* *
* @param array $labels Array of field labels * @param array $labels Array of field labels
*/ */
public function updateFieldLabels(&$labels) protected function updateFieldLabels(&$labels)
{ {
$field_labels = Config::inst()->get(static::class, 'field_labels'); $field_labels = Config::inst()->get(static::class, 'field_labels');
if ($field_labels) { if ($field_labels) {

View File

@ -516,14 +516,6 @@ abstract class DBField extends ViewableData implements DBIndexable
return $this->XML(); return $this->XML();
} }
/**
* @return string
*/
public function Nice()
{
return $this->XML();
}
/** /**
* Returns the value to be set in the database to blank this field. * Returns the value to be set in the database to blank this field.
* Usually it's a choice between null, 0, and '' * Usually it's a choice between null, 0, and ''

View File

@ -116,7 +116,7 @@ class Hierarchy extends DataExtension
* *
* @param ValidationResult $validationResult * @param ValidationResult $validationResult
*/ */
public function validate(ValidationResult $validationResult) protected function validate(ValidationResult $validationResult)
{ {
// The object is new, won't be looping. // The object is new, won't be looping.
$owner = $this->owner; $owner = $this->owner;

View File

@ -25,7 +25,7 @@ class ControllerExtension extends Extension implements TestOnly
/** /**
* Called whenever there is an HTTP error * Called whenever there is an HTTP error
*/ */
public function onBeforeHTTPError() protected function onBeforeHTTPError()
{ {
self::$called_error = true; self::$called_error = true;
} }
@ -33,7 +33,7 @@ class ControllerExtension extends Extension implements TestOnly
/** /**
* Called whenever there is an 404 error * Called whenever there is an 404 error
*/ */
public function onBeforeHTTPError404() protected function onBeforeHTTPError404()
{ {
self::$called_404_error = true; self::$called_404_error = true;
} }

View File

@ -7,7 +7,7 @@ use SilverStripe\Dev\TestOnly;
class ExtendTest1 extends Extension implements TestOnly class ExtendTest1 extends Extension implements TestOnly
{ {
public function extendableMethod(&$argument = null) protected function extendableMethod(&$argument = null)
{ {
if ($argument) { if ($argument) {
$argument = 'modified'; $argument = 'modified';

View File

@ -15,7 +15,7 @@ class ExtendTest2 extends Extension implements TestOnly
$this->constructorArgs = func_get_args(); $this->constructorArgs = func_get_args();
} }
public function extendableMethod($argument = null) protected function extendableMethod($argument = null)
{ {
$args = implode(',', array_filter(func_get_args())); $args = implode(',', array_filter(func_get_args()));
return "ExtendTest2($args)"; return "ExtendTest2($args)";

View File

@ -15,7 +15,7 @@ class ExtendTest3 extends Extension implements TestOnly
$this->constructorArgs = func_get_args(); $this->constructorArgs = func_get_args();
} }
public function extendableMethod($argument = null) protected function extendableMethod($argument = null)
{ {
return "ExtendTest3($argument)"; return "ExtendTest3($argument)";
} }

View File

@ -38,7 +38,7 @@ class ControllerExtension extends Extension
* @param string $name * @param string $name
* @param array $context * @param array $context
*/ */
public function updateFormActions(FieldList &$actions, Controller $controller, $name, $context = []) protected function updateFormActions(FieldList &$actions, Controller $controller, $name, $context = [])
{ {
// Add publish button if record is versioned // Add publish button if record is versioned
if (empty($context['Record'])) { if (empty($context['Record'])) {
@ -59,7 +59,7 @@ class ControllerExtension extends Extension
* @param string $name * @param string $name
* @param array $context * @param array $context
*/ */
public function updateFormFields(FieldList &$fields, Controller $controller, $name, $context = []) protected function updateFormFields(FieldList &$fields, Controller $controller, $name, $context = [])
{ {
// Add preview link // Add preview link
if (empty($context['Record'])) { if (empty($context['Record'])) {

View File

@ -8,7 +8,7 @@ use SilverStripe\Dev\TestOnly;
class TestExtension extends Extension implements TestOnly class TestExtension extends Extension implements TestOnly
{ {
public function updateAttributes(&$attrs) protected function updateAttributes(&$attrs)
{ {
$attrs['extended'] = true; $attrs['extended'] = true;
} }

View File

@ -13,7 +13,7 @@ class ArticleExtension extends DataExtension implements TestOnly
'ExtendedField' => 'Varchar' 'ExtendedField' => 'Varchar'
]; ];
public function updateCMSFields(FieldList $fields) protected function updateCMSFields(FieldList $fields)
{ {
$fields->addFieldToTab( $fields->addFieldToTab(
'Root.Main', 'Root.Main',

View File

@ -9,7 +9,7 @@ use SilverStripe\Forms\Tests\GridField\GridFieldTest\StadiumExtension;
class StadiumExtension extends DataExtension implements TestOnly class StadiumExtension extends DataExtension implements TestOnly
{ {
public function updateSearchableFields(&$fields) protected function updateSearchableFields(&$fields)
{ {
$fields['Type']['filter'] = new FulltextFilter(); $fields['Type']['filter'] = new FulltextFilter();
} }

View File

@ -5,6 +5,7 @@ namespace SilverStripe\Forms\Tests;
use SilverStripe\Dev\SapphireTest; use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\RequiredFields; use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form; use SilverStripe\Forms\Form;
use SilverStripe\Forms\SearchableDropdownField;
use SilverStripe\Forms\TreeDropdownField; use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\Security\Group; use SilverStripe\Security\Group;
@ -289,16 +290,35 @@ class RequiredFieldsTest extends SapphireTest
); );
} }
public function testTreedropFieldValidation() public function provideHasOneRelationFieldInterfaceValidation(): array
{
return [
[
'className' => TreeDropdownField::class,
],
[
'className' => SearchableDropdownField::class,
]
];
}
/**
* @dataProvider provideHasOneRelationFieldInterfaceValidation
*/
public function testHasOneRelationFieldInterfaceValidation(string $className)
{ {
$form = new Form(); $form = new Form();
$field = new TreeDropdownField('TestField', 'TestField', Group::class); $param = $className === TreeDropdownField::class ? Group::class : Group::get();
$field = new $className('TestField', 'TestField', $param);
$form->Fields()->push($field); $form->Fields()->push($field);
$validator = new RequiredFields('TestField'); $validator = new RequiredFields('TestField');
$validator->setForm($form); $validator->setForm($form);
// blank string and '0' are fail required field validation // blank string and 0 and '0' and array with value of 0 fail required field validation
$this->assertFalse($validator->php(['TestField' => ''])); $this->assertFalse($validator->php(['TestField' => '']));
$this->assertFalse($validator->php(['TestField' => 0]));
$this->assertFalse($validator->php(['TestField' => '0'])); $this->assertFalse($validator->php(['TestField' => '0']));
$this->assertFalse($validator->php(['TestField' => ['value' => 0]]));
$this->assertFalse($validator->php(['TestField' => ['value' => '0']]));
// '1' passes required field validation // '1' passes required field validation
$this->assertTrue($validator->php(['TestField' => '1'])); $this->assertTrue($validator->php(['TestField' => '1']));
} }

View File

@ -17,7 +17,7 @@ class CMSFieldsBaseExtension extends DataExtension implements TestOnly
'ExtendedFieldRemove' => 'Varchar(255)' 'ExtendedFieldRemove' => 'Varchar(255)'
]; ];
public function updateCMSFields(FieldList $fields) protected function updateCMSFields(FieldList $fields)
{ {
$fields->addFieldToTab('Root.Test', new TextField('ExtendedFieldRemove')); $fields->addFieldToTab('Root.Test', new TextField('ExtendedFieldRemove'));
$fields->addFieldToTab('Root.Test', new TextField('ExtendedFieldKeep')); $fields->addFieldToTab('Root.Test', new TextField('ExtendedFieldKeep'));

View File

@ -8,17 +8,17 @@ use SilverStripe\ORM\DataExtension;
class Extension1 extends DataExtension implements TestOnly class Extension1 extends DataExtension implements TestOnly
{ {
public function canOne($member = null) protected function canOne($member = null)
{ {
return true; return true;
} }
public function canTwo($member = null) protected function canTwo($member = null)
{ {
return false; return false;
} }
public function canThree($member = null) protected function canThree($member = null)
{ {
} }
} }

View File

@ -8,17 +8,17 @@ use SilverStripe\ORM\DataExtension;
class Extension2 extends DataExtension implements TestOnly class Extension2 extends DataExtension implements TestOnly
{ {
public function canOne($member = null) protected function canOne($member = null)
{ {
return true; return true;
} }
public function canTwo($member = null) protected function canTwo($member = null)
{ {
return true; return true;
} }
public function canThree($member = null) protected function canThree($member = null)
{ {
} }
} }

View File

@ -24,7 +24,7 @@ class Team_Extension extends DataExtension implements TestOnly
return "extended dynamic field"; return "extended dynamic field";
} }
public function augmentHydrateFields() protected function augmentHydrateFields()
{ {
return [ return [
'CustomHydratedField' => true, 'CustomHydratedField' => true,

View File

@ -10,7 +10,7 @@ use SilverStripe\ORM\DataExtension;
*/ */
class AlwaysFailExtension extends DataExtension implements TestOnly class AlwaysFailExtension extends DataExtension implements TestOnly
{ {
public function updatePHP($data, $form) protected function updatePHP($data, $form)
{ {
return false; return false;
} }

View File

@ -8,17 +8,17 @@ use SilverStripe\ORM\DataExtension;
class EditingAllowedDeletingDeniedExtension extends DataExtension implements TestOnly class EditingAllowedDeletingDeniedExtension extends DataExtension implements TestOnly
{ {
public function canView($member = null) protected function canView($member = null)
{ {
return true; return true;
} }
public function canEdit($member = null) protected function canEdit($member = null)
{ {
return true; return true;
} }
public function canDelete($member = null) protected function canDelete($member = null)
{ {
return false; return false;
} }

View File

@ -11,7 +11,7 @@ use SilverStripe\ORM\ValidationResult;
*/ */
class ExtendedChangePasswordExtension extends DataExtension implements TestOnly class ExtendedChangePasswordExtension extends DataExtension implements TestOnly
{ {
public function onBeforeChangePassword($newPassword, $valid) protected function onBeforeChangePassword($newPassword, $valid)
{ {
$valid->addError('Extension failed to handle Mary changing her password'); $valid->addError('Extension failed to handle Mary changing her password');
} }

View File

@ -9,7 +9,7 @@ use SilverStripe\ORM\DataExtension;
class FieldsExtension extends DataExtension implements TestOnly class FieldsExtension extends DataExtension implements TestOnly
{ {
public function updateCMSFields(FieldList $fields) protected function updateCMSFields(FieldList $fields)
{ {
$fields->addFieldToTab('Root.Main', new TextField('TestMemberField', 'Test')); $fields->addFieldToTab('Root.Main', new TextField('TestMemberField', 'Test'));
} }

View File

@ -10,7 +10,7 @@ use SilverStripe\ORM\DataExtension;
*/ */
class SurnameMustMatchFirstNameExtension extends DataExtension implements TestOnly class SurnameMustMatchFirstNameExtension extends DataExtension implements TestOnly
{ {
public function updatePHP($data, $form) protected function updatePHP($data, $form)
{ {
return $data['FirstName'] == $data['Surname']; return $data['FirstName'] == $data['Surname'];
} }

View File

@ -8,7 +8,7 @@ use SilverStripe\ORM\DataExtension;
class ViewingAllowedExtension extends DataExtension implements TestOnly class ViewingAllowedExtension extends DataExtension implements TestOnly
{ {
public function canView($member = null) protected function canView($member = null)
{ {
return true; return true;
} }

View File

@ -8,7 +8,7 @@ use SilverStripe\ORM\DataExtension;
class ViewingDeniedExtension extends DataExtension implements TestOnly class ViewingDeniedExtension extends DataExtension implements TestOnly
{ {
public function canView($member = null) protected function canView($member = null)
{ {
return false; return false;
} }