mirror of
https://github.com/symbiote/silverstripe-gridfieldextensions.git
synced 2024-10-22 17:05:39 +02:00
Merge pull request #341 from silverstripeltd/pull/performance-fixes
ENH: Add performance fixes on saving editable columns
This commit is contained in:
commit
0405d919fc
@ -19,10 +19,10 @@ use SilverStripe\Forms\GridField\GridField_URLHandler;
|
||||
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
|
||||
use SilverStripe\Forms\LiteralField;
|
||||
use SilverStripe\Forms\ReadonlyField;
|
||||
use SilverStripe\ORM\ArrayList;
|
||||
use SilverStripe\ORM\DataList;
|
||||
use SilverStripe\ORM\DataObject;
|
||||
use SilverStripe\ORM\DataObjectInterface;
|
||||
use SilverStripe\ORM\FieldType\DBField;
|
||||
use SilverStripe\ORM\ManyManyList;
|
||||
|
||||
/**
|
||||
@ -130,14 +130,23 @@ class GridFieldEditableColumns extends GridFieldDataColumns implements
|
||||
/** @var GridFieldOrderableRows $sortable */
|
||||
$sortable = $grid->getConfig()->getComponentByType(GridFieldOrderableRows::class);
|
||||
|
||||
// Fetch the items before processing them
|
||||
$ids = array_keys($value[self::POST_KEY]);
|
||||
if (empty($ids)) {
|
||||
return;
|
||||
}
|
||||
$itemsCollection = ArrayList::create($list->filter('ID', $ids)->toArray());
|
||||
|
||||
foreach ($value[self::POST_KEY] as $id => $fields) {
|
||||
if (!is_numeric($id) || !is_array($fields)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$item = $list->byID($id);
|
||||
// Find the item from the fetched collection of items
|
||||
$item = $itemsCollection->find('ID', $id);
|
||||
|
||||
if (!$item || !$item->canEdit()) {
|
||||
// Skip not found item, or don't have any changed fields, or current user can't edit
|
||||
if (!$item || !$this->isChanged($item, $fields) || !$item->canEdit()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -323,4 +332,18 @@ class GridFieldEditableColumns extends GridFieldDataColumns implements
|
||||
$name
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not an object in the grid field has changed data.
|
||||
*/
|
||||
private function isChanged(DataObject $item, array $fields): bool
|
||||
{
|
||||
foreach ($fields as $name => $value) {
|
||||
if ((string) $item->getField($name) !== (string) $value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user