Skip to content

Commit

Permalink
Merge branch '5' into 6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
emteknetnz committed Jan 29, 2025
2 parents c184016 + e7cccf6 commit 3a69e16
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 4 deletions.
69 changes: 67 additions & 2 deletions src/Core/Validation/ValidationResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use InvalidArgumentException;
use SilverStripe\Core\Injector\Injectable;
use SilverStripe\Dev\Deprecation;

/**
* A class that combined as a boolean result with an optional list of error messages.
Expand Down Expand Up @@ -77,9 +78,25 @@ public function addError(
$message,
$messageType = ValidationResult::TYPE_ERROR,
$code = null,
$cast = ValidationResult::CAST_TEXT,
$cast = ValidationResult::CAST_TEXT
) {
return $this->addFieldError(null, $message, $messageType, $code, $cast);
if ($code === null) {
Deprecation::notice(
'5.4.0',
'Passing $code as null is deprecated. Pass a blank string instead.',
Deprecation::SCOPE_GLOBAL
);
$code = '';
}
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
return $this->addFieldError('', $message, $messageType, $code, $cast);
}

/**
Expand All @@ -102,6 +119,22 @@ public function addFieldError(
$code = null,
$cast = ValidationResult::CAST_TEXT,
) {
if ($code === null) {
Deprecation::notice(
'5.4.0',
'Passing $code as null is deprecated. Pass a blank string instead.',
Deprecation::SCOPE_GLOBAL
);
$code = '';
}
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
$this->isValid = false;
return $this->addFieldMessage($fieldName, $message, $messageType, $code, $cast);
}
Expand All @@ -124,6 +157,22 @@ public function addMessage(
$code = null,
$cast = ValidationResult::CAST_TEXT,
) {
if ($code === null) {
Deprecation::notice(
'5.4.0',
'Passing $code as null is deprecated. Pass a blank string instead.',
Deprecation::SCOPE_GLOBAL
);
$code = '';
}
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
return $this->addFieldMessage(null, $message, $messageType, $code, $cast);
}

Expand All @@ -147,6 +196,22 @@ public function addFieldMessage(
$code = null,
$cast = ValidationResult::CAST_TEXT,
) {
if ($code === null) {
Deprecation::notice(
'5.4.0',
'Passing $code as null is deprecated. Pass a blank string instead.',
Deprecation::SCOPE_GLOBAL
);
$code = '';
}
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
if ($code && is_numeric($code)) {
throw new InvalidArgumentException("Don't use a numeric code '$code'. Use a string.");
}
Expand Down
24 changes: 24 additions & 0 deletions src/Forms/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,14 @@ public function FieldMap()
*/
public function sessionMessage($message, $type = ValidationResult::TYPE_ERROR, $cast = ValidationResult::CAST_TEXT)
{
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
$this->setMessage($message, $type, $cast);
$result = $this->getSessionValidationResult() ?: ValidationResult::create();
$result->addMessage($message, $type, null, $cast);
Expand All @@ -1202,6 +1210,14 @@ public function sessionMessage($message, $type = ValidationResult::TYPE_ERROR, $
*/
public function sessionError($message, $type = ValidationResult::TYPE_ERROR, $cast = ValidationResult::CAST_TEXT)
{
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
$this->setMessage($message, $type, $cast);
$result = $this->getSessionValidationResult() ?: ValidationResult::create();
$result->addError($message, $type, null, $cast);
Expand All @@ -1219,6 +1235,14 @@ public function sessionError($message, $type = ValidationResult::TYPE_ERROR, $ca
*/
public function sessionFieldError($message, $fieldName, $type = ValidationResult::TYPE_ERROR, $cast = ValidationResult::CAST_TEXT)
{
if ($cast === null) {
Deprecation::notice(
'5.4.0',
'Passing $cast as null is deprecated. Pass a ValidationResult::CAST_* constant instead.',
Deprecation::SCOPE_GLOBAL
);
$cast = ValidationResult::CAST_TEXT;
}
$this->setMessage($message, $type, $cast);
$result = $this->getSessionValidationResult() ?: ValidationResult::create();
$result->addFieldMessage($fieldName, $message, $type, null, $cast);
Expand Down
2 changes: 2 additions & 0 deletions src/Forms/FormField.php
Original file line number Diff line number Diff line change
Expand Up @@ -459,9 +459,11 @@ public function getValue(): mixed
* for instance to add localisation or formatting.
*
* @return mixed
* @deprecated 5.4.0 Will be replaced by getFormattedValue() and getValue()
*/
public function Value()
{
Deprecation::notice('5.4.0', 'Will be replaced by getFormattedValue() and getValue()');
return $this->value;
}

Expand Down
43 changes: 42 additions & 1 deletion src/Forms/GridField/GridFieldFilterHeader.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\Filters\PartialMatchFilter;
use SilverStripe\ORM\Search\BasicSearchContext;
use SilverStripe\ORM\Search\SearchContext;
use SilverStripe\Model\List\SS_List;
use SilverStripe\Model\ArrayData;
Expand Down Expand Up @@ -240,7 +243,17 @@ public function getSearchContext(GridField $gridField)
. " or implement a getDefaultSearchContext() method on $modelClass"
);
}
$this->searchContext = $singleton->getDefaultSearchContext();

$list = $gridField->getList();
$searchContext = $singleton->getDefaultSearchContext();

// In case we are working with a list not backed by the database we need to convert the search context into a BasicSearchContext
// This is because the scaffolded filters use the ORM for data searching
if (!$list instanceof DataList) {
$searchContext = $this->getBasicSearchContext($gridField, $searchContext);
}

$this->searchContext = $searchContext;
}

return $this->searchContext;
Expand Down Expand Up @@ -448,4 +461,32 @@ private function getTitle(object $inst): string

return ClassInfo::shortName($inst);
}

/**
* Transform search context into BasicSearchContext (preserves all relevant search settings)
*/
private function getBasicSearchContext(GridField $gridField, SearchContext $searchContext): BasicSearchContext
{
// Retrieve filters settings as these can be carried over as is
$defaultSearchFields = $searchContext->getSearchFields();
$defaultFilters = $searchContext->getFilters();
$list = $gridField->getList();

// Carry over any search form settings
$basicSearchContext = BasicSearchContext::create($gridField->getModelClass());
$basicSearchContext->setFields($defaultSearchFields);

// Carry over filter configuration (make changes to filter classes so they work with this list)
foreach ($defaultFilters as $defaultFilter) {
$fieldFilter = PartialMatchFilter::create(
// Use name instead of full name as this plain filter doesn't understand relations
$defaultFilter->getName(),
$defaultFilter->getValue(),
$defaultFilter->getModifiers(),
);
$basicSearchContext->addFilter($fieldFilter);
}

return $basicSearchContext;
}
}
3 changes: 3 additions & 0 deletions src/Forms/TextareaField.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace SilverStripe\Forms;

use SilverStripe\Core\Validation\FieldValidation\StringFieldValidator;
use SilverStripe\Dev\Deprecation;

/**
* TextareaField creates a multi-line text field,
Expand Down Expand Up @@ -189,9 +190,11 @@ public function getSchemaValidation()
* Return value with all values encoded in html entities
*
* @return string Raw HTML
* @deprecated 5.4.0 Use getFormattedValueEntities() instead
*/
public function ValueEntities()
{
Deprecation::noticeWithNoReplacment('5.4.0', 'Will be replaced by getFormattedValueEntities()');
return htmlentities($this->Value() ?? '', ENT_COMPAT, 'UTF-8');
}
}
2 changes: 1 addition & 1 deletion tests/php/Core/Validation/ConstraintValidatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ public function testValidateResults(mixed $value, Constraint|array $constraints,

$this->assertCount($countViolations, $violations);
foreach ($violations as $violation) {
$this->assertSame($fieldName ?: null, $violation['fieldName']);
$this->assertSame($fieldName ?: '', $violation['fieldName']);
}
}

Expand Down
76 changes: 76 additions & 0 deletions tests/php/Forms/GridField/GridFieldFilterHeaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\Model\ArrayData;
use SilverStripe\ORM\Filters\PartialMatchFilter;
use SilverStripe\ORM\Filters\SearchFilter;
use SilverStripe\ORM\Search\BasicSearchContext;
use SilverStripe\ORM\Search\SearchContext;

class GridFieldFilterHeaderTest extends SapphireTest
{
Expand Down Expand Up @@ -267,4 +271,76 @@ public function testGetDisplayFieldsThrowsException()

$component->getSearchContext($gridField);
}

public function testGetBasicSearchContext(): void
{
$arrayList = new ArrayList();
$arrayList->setDataClass(Team::class);
$arrayListFilter = new GridFieldFilterHeader();
$arrayListGridField = new GridField('dummy', 'dummy', $arrayList);
$arrayListSearchContext = $arrayListFilter->getSearchContext($arrayListGridField);

$dataList = Team::get();
$dataListFilter = new GridFieldFilterHeader();
$dataListGridField = new GridField('dummy', 'dummy', $dataList);
$dataListSearchContext = $dataListFilter->getSearchContext($dataListGridField);

$this->assertInstanceOf(
BasicSearchContext::class,
$arrayListSearchContext,
'We expect a basic search context as our GridField list is provided via ArrayList'
);

$this->assertNotInstanceOf(
BasicSearchContext::class,
$dataListSearchContext,
'We expect a regular search context as our GridField list is provided via DataList'
);

$arrayListSearchFields = $arrayListSearchContext
->getSearchFields()
->column('Name');

$dataListSearchFields = $dataListSearchContext
->getSearchFields()
->column('Name');

$this->assertSame(
$arrayListSearchFields,
$dataListSearchFields,
'We expect the search fields to be the same regardless of how data is provided to the GridField'
);

$arrayListFilters = $arrayListSearchContext->getFilters();
$dataListFilters = $dataListSearchContext->getFilters();

$getFilterName = static function (SearchFilter $filter): string {
return $filter->getName();
};
$arrayListSearchFilterNames = array_map($getFilterName, $arrayListFilters);
$dataListSearchFilterNames = array_map($getFilterName, $dataListFilters);
$arrayListSearchFilterNames = array_values($arrayListSearchFilterNames);
$dataListSearchFilterNames = array_values($dataListSearchFilterNames);

$this->assertSame(
$arrayListSearchFilterNames,
$dataListSearchFilterNames,
'We expect the search filters to be the same regardless of how data is provided to the GridField'
);

$getFilterType = static function (SearchFilter $filter): string {
return $filter::class;
};
$arrayListSearchFilterTypes = array_map($getFilterType, $arrayListFilters);
$arrayListSearchFilterTypes = array_unique($arrayListSearchFilterTypes);

$this->assertCount(1, $arrayListSearchFilterTypes, 'We expect all filters to be of the same type');
$arrayListSearchFilterType = array_shift($arrayListSearchFilterTypes);

$this->assertEquals(
PartialMatchFilter::class,
$arrayListSearchFilterType,
'We expect partial match filters'
);
}
}

0 comments on commit 3a69e16

Please sign in to comment.