From fd34fce3c1168decaeac42fff1bc6241cbe3d598 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 22 Apr 2021 13:49:11 +0300 Subject: [PATCH] Fixed a bug in Flex Object `refresh()` method --- CHANGELOG.md | 1 + .../Common/Flex/Types/Users/UserObject.php | 5 --- system/src/Grav/Framework/Flex/FlexObject.php | 31 ++++++++++++++----- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17f378b1d..13e84a697 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ 1. [](#bugfix) * Fixed `The "Grav/Common/Twig/TwigExtension" extension is not enabled` when using markdown twig tag [#3317](https://github.com/getgrav/grav/issues/3317) * Fixed text field maxlength validation newline issue [#3324](https://github.com/getgrav/grav/issues/3324) + * Fixed a bug in Flex Object `refresh()` method # v1.7.12 ## 04/15/2021 diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 4109eec34..40e6101e9 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -22,7 +22,6 @@ use Grav\Common\Grav; use Grav\Common\Media\Interfaces\MediaCollectionInterface; use Grav\Common\Media\Interfaces\MediaUploadInterface; use Grav\Common\Page\Media; -use Grav\Common\Page\Medium\Medium; use Grav\Common\Page\Medium\MediumFactory; use Grav\Common\User\Access; use Grav\Common\User\Authentication; @@ -78,16 +77,12 @@ class UserObject extends FlexObject implements UserInterface, Countable /** @var array|null */ protected $_uploads_original; - /** @var FileInterface|null */ protected $_storage; - /** @var UserGroupIndex */ protected $_groups; - /** @var Access */ protected $_access; - /** @var array|null */ protected $access; diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 09c563825..b65e5aeab 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -196,9 +196,10 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface /** * Refresh object from the storage. * + * @param bool $keepMissing * @return bool True if the object was refreshed */ - public function refresh(): bool + public function refresh(bool $keepMissing = false): bool { $key = $this->getStorageKey(); if ('' === $key) { @@ -216,20 +217,36 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface return false; } + // Get current elements (if requested). + $current = $keepMissing ? $this->getElements() : []; + // Get elements from the filesystem. $elements = $storage->readRows([$key => null])[$key] ?? null; - if (null !== $elements || isset($elements['__ERROR'])) { - $meta = $elements['_META'] ?? $meta; + if (null !== $elements) { + $meta = $elements['__META'] ?? $meta; + unset($elements['__META']); $this->filterElements($elements); $newKey = $meta['key'] ?? $this->getKey(); if ($meta) { $this->setMetaData($meta); } $this->objectConstruct($elements, $newKey); - } - /** @var Debugger $debugger */ - $debugger = Grav::instance()['debugger']; - $debugger->addMessage("Refreshed {$this->getFlexType()} object {$this->getKey()}", 'debug'); + if ($current) { + // Inject back elements which are missing in the filesystem. + $data = $this->getBlueprint()->flattenData($current); + foreach ($data as $property => $value) { + if (strpos($property, '.') === false) { + $this->defProperty($property, $value); + } else { + $this->defNestedProperty($property, $value); + } + } + } + + /** @var Debugger $debugger */ + $debugger = Grav::instance()['debugger']; + $debugger->addMessage("Refreshed {$this->getFlexType()} object {$this->getKey()}", 'debug'); + } return true; }