mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX: Readonly transformation of lazy-loaded searchable dropdown (#11297)
Co-authored-by: johannes.hammersen <Johannes.Hammersen@funkemedien.de>
This commit is contained in:
parent
8a576f91be
commit
fb7b1734eb
@ -586,4 +586,18 @@ trait SearchableDropdownTrait
|
|||||||
}
|
}
|
||||||
return $options;
|
return $options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function performReadonlyTransformation()
|
||||||
|
{
|
||||||
|
// This is calling a non-static method statically
|
||||||
|
// using call_user_func() here to prevent an IDE warning
|
||||||
|
// The reason we're calling FormField::castedCopy directly is to prevent an ancestor
|
||||||
|
// call to $this->getSource() which will load the entire DataList into memory which
|
||||||
|
// causes issues with very large datasets and isn't needed when the field is read-only
|
||||||
|
$field = call_user_func('SilverStripe\\Forms\\FormField::castedCopy', SearchableLookupField::class);
|
||||||
|
$field->setSource($this->sourceList);
|
||||||
|
$field->setReadonly(true);
|
||||||
|
|
||||||
|
return $field;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
50
src/Forms/SearchableLookupField.php
Normal file
50
src/Forms/SearchableLookupField.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Forms;
|
||||||
|
|
||||||
|
use SilverStripe\Core\Convert;
|
||||||
|
use SilverStripe\ORM\ArrayLib;
|
||||||
|
use SilverStripe\ORM\DataObjectInterface;
|
||||||
|
use SilverStripe\ORM\FieldType\DBField;
|
||||||
|
use SilverStripe\ORM\ArrayList;
|
||||||
|
use SilverStripe\ORM\DataList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read-only complement of {@link SearchableDropdownField} and {@link SearchableMultiDropdownField}.
|
||||||
|
*
|
||||||
|
* Shows the "human value" of the SearchableDropdownField for the currently selected
|
||||||
|
* values.
|
||||||
|
*/
|
||||||
|
class SearchableLookupField extends LookupField
|
||||||
|
{
|
||||||
|
private ?DataList $sourceList = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To retain compatibility with ancestor getSource() this returns an array of only the selected values
|
||||||
|
*/
|
||||||
|
public function getSource(): array
|
||||||
|
{
|
||||||
|
$values = $this->getValueArray();
|
||||||
|
if (empty($values) || $this->sourceList === null) {
|
||||||
|
$selectedValuesList = ArrayList::create();
|
||||||
|
} else {
|
||||||
|
$selectedValuesList = $this->sourceList->filterAny(['ID' => $values]);
|
||||||
|
}
|
||||||
|
return $this->getListMap($selectedValuesList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $source
|
||||||
|
*/
|
||||||
|
public function setSource($source): static
|
||||||
|
{
|
||||||
|
// Setting to $this->sourceList instead of $this->source because SelectField.source
|
||||||
|
// docblock type is array|ArrayAccess i.e. does not allow DataList
|
||||||
|
if ($source instanceof DataList) {
|
||||||
|
$this->sourceList = $source;
|
||||||
|
} else {
|
||||||
|
$this->sourceList = null;
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user