From 378b60783c8f94fbfcb2507db6210a101527f3da Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 15 Jan 2020 11:55:40 +0200 Subject: [PATCH] Grav 1.7: Fixed `Flex Pages` unserialize issues if Flex-Objects Plugin has not been installed --- CHANGELOG.md | 1 + .../src/Grav/Common/Flex/Pages/PageObject.php | 18 ++++++++++++ .../src/Grav/Common/Flex/Users/UserObject.php | 28 ++++++------------- system/src/Grav/Common/Page/Pages.php | 8 ++++++ system/src/Grav/Framework/Flex/FlexObject.php | 18 +++++++----- 5 files changed, 47 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29ac6701a..d4277312f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * Fixed new `Flex Users` being stored with wrong filename, login issues [#2785](https://github.com/getgrav/grav/issues/2785) * Fixed `ignore_empty: true` not removing empty values in blueprint filtering * Fixed `{{ false|string }}` twig to return '0' instead of '' + * Grav 1.7: Fixed `Flex Pages` unserialize issues if Flex-Objects Plugin has not been installed # v1.7.0-rc.3 ## 01/02/2020 diff --git a/system/src/Grav/Common/Flex/Pages/PageObject.php b/system/src/Grav/Common/Flex/Pages/PageObject.php index f235ba245..4908614fb 100644 --- a/system/src/Grav/Common/Flex/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Pages/PageObject.php @@ -20,6 +20,7 @@ use Grav\Common\Flex\Pages\Traits\PageTranslateTrait; use Grav\Common\Page\Pages; use Grav\Common\Utils; use Grav\Framework\Filesystem\Filesystem; +use Grav\Framework\Flex\FlexDirectory; use Grav\Framework\Flex\FlexObject; use Grav\Framework\Flex\Pages\FlexPageObject; use Grav\Framework\Route\Route; @@ -344,6 +345,23 @@ class PageObject extends FlexPageObject ]; } + /** + * @param array $serialized + * @param FlexDirectory|null $directory + */ + protected function doUnserialize(array $serialized, FlexDirectory $directory = null): void + { + if (null === $directory) { + $grav = Grav::instance(); + if (!isset($grav['flex_objects'])) { + $pages = $grav['pages']; + $directory = $pages->getDirectory(); + } + } + + parent::doUnserialize($serialized, $directory); + } + /** * @param array $elements * @param bool $extended diff --git a/system/src/Grav/Common/Flex/Users/UserObject.php b/system/src/Grav/Common/Flex/Users/UserObject.php index da54d1b33..7f20e5e6f 100644 --- a/system/src/Grav/Common/Flex/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Users/UserObject.php @@ -889,29 +889,19 @@ class UserObject extends FlexObject implements UserInterface, MediaManipulationI /** * @param array $serialized + * @param FlexDirectory|null $directory */ - protected function doUnserialize(array $serialized): void + protected function doUnserialize(array $serialized, FlexDirectory $directory = null): void { - $grav = Grav::instance(); - $flex = $grav['flex_objects'] ?? null; - - // Use Flex plugin if possible -- fixes issues if admin has flex users admin, but it is not used in the session. - if ($flex) { - $directory = $flex->getDirectory($serialized['type']); - } else { - /** @var UserCollectionInterface|null $accounts */ - $accounts = $grav['accounts'] ?? null; - $directory = $accounts instanceof FlexCollectionInterface ? $accounts->getFlexDirectory() : null; + if (null === $directory) { + $grav = Grav::instance(); + if (!isset($grav['flex_objects'])) { + $accounts = $grav['accounts'] ?? null; + $directory = $accounts instanceof FlexCollectionInterface ? $accounts->getFlexDirectory() : null; + } } - if (!$directory) { - throw new \RuntimeException('Internal error, please clear cache'); - } - - $this->setFlexDirectory($directory); - $this->setStorage($serialized['storage']); - $this->setKey($serialized['key']); - $this->setElements($serialized['elements']); + parent::doUnserialize($serialized, $directory); } /** diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index caa4933fb..a49b237ce 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -108,6 +108,14 @@ class Pages $this->grav = $grav; } + /** + * @return FlexDirectory|null + */ + public function getDirectory(): ?FlexDirectory + { + return $this->directory; + } + /** * Method used in admin to disable frontend pages from being initialized. */ diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 60d99d6ef..b0a0590a0 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -849,8 +849,9 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface /** * @param array $serialized + * @param FlexDirectory|null $directory */ - protected function doUnserialize(array $serialized): void + protected function doUnserialize(array $serialized, FlexDirectory $directory = null): void { $type = $serialized['type'] ?? 'unknown'; @@ -858,13 +859,16 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface throw new \InvalidArgumentException("Cannot unserialize '{$type}': Bad data"); } - $grav = Grav::instance(); - /** @var Flex|null $flex */ - $flex = $grav['flex_objects'] ?? null; - $directory = $flex ? $flex->getDirectory($type) : null; - if (!$directory) { - throw new \InvalidArgumentException("Cannot unserialize '{$type}': Not found"); + if (null === $directory) { + $grav = Grav::instance(); + /** @var Flex|null $flex */ + $flex = $grav['flex_objects'] ?? null; + $directory = $flex ? $flex->getDirectory($type) : null; + if (!$directory) { + throw new \InvalidArgumentException("Cannot unserialize '{$type}': Not found"); + } } + $this->setFlexDirectory($directory); $this->setStorage($serialized['storage']); $this->setKey($serialized['key']);