From e1901d838552c7291efed5512ca8c215525baecf Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 12 Apr 2022 14:17:03 +0300 Subject: [PATCH] Obey media ordering --- .../Grav/Common/Media/Traits/MediaTrait.php | 8 ------ system/src/Grav/Common/Page/Page.php | 17 ++++++++++- system/src/Grav/Common/Utils.php | 28 +++++++++++++++++++ .../Framework/Flex/Traits/FlexMediaTrait.php | 12 +++++++- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/system/src/Grav/Common/Media/Traits/MediaTrait.php b/system/src/Grav/Common/Media/Traits/MediaTrait.php index b53bffd5d..876812614 100644 --- a/system/src/Grav/Common/Media/Traits/MediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaTrait.php @@ -145,18 +145,10 @@ trait MediaTrait /** @var MediaFactory $factory */ $factory = Grav::instance()['media_factory']; - $order = $this->getNestedProperty($field); - if (is_array($order)) { - $order = array_is_list($order) ? $order : array_keys($order); - } else { - $order = []; - } - $params = $settings['media'] ?? []; $params += [ 'object' => $this, 'path' => $settings[$var], - 'order' => $order, 'load' => true ]; diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 0041a3641..82782110c 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -2911,7 +2911,22 @@ class Page implements PageInterface $schema = $this->getBlueprint()->schema(); $settings = $schema ? $schema->getProperty($field) : null; - return $this->parseMediaFieldSettings($field, $settings); + $settings = $this->parseMediaFieldSettings($field, $settings); + if ($settings && !isset($settings['media']['order'])) { + if (str_starts_with($field, 'header.')) { + $field = substr($field, 7); + } + $header = $this->header(); + $order = Utils::getField($header, $field); + + if (is_array($order)) { + $settings['media']['order'] = array_is_list($order) ? $order : array_keys($order); + } else { + $settings['media']['order'] = []; + } + } + + return $settings; } /** diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php index b84515bfc..cc52d1b7a 100644 --- a/system/src/Grav/Common/Utils.php +++ b/system/src/Grav/Common/Utils.php @@ -36,6 +36,7 @@ use function function_exists; use function in_array; use function is_array; use function is_callable; +use function is_object; use function is_string; use function strlen; @@ -1295,6 +1296,33 @@ abstract class Utils return $newArray; } + /** + * @param array|object $current + * @param string $name + * @param mixed|null $default + * @param string $separator + * @return mixed|null + */ + public static function getField($current, string $name, $default = null, string $separator = '.') + { + if ($name === '') { + return $current; + } + + $path = explode($separator, $name); + foreach ($path as $field) { + if (is_object($current) && isset($current->{$field})) { + $current = $current->{$field}; + } elseif (is_array($current) && isset($current[$field])) { + $current = $current[$field]; + } else { + return $default; + } + } + + return $current; + } + /** * Checks if the passed path contains the language code prefix * diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index be16c35d1..9b97a61fa 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -99,7 +99,17 @@ trait FlexMediaTrait $schema = $this->getBlueprint()->schema(); $settings = $schema ? $schema->getProperty($field) : null; - return $this->parseMediaFieldSettings($field, $settings); + $settings = $this->parseMediaFieldSettings($field, $settings); + if ($settings && !isset($settings['media']['order'])) { + $order = Utils::getField($this->getArrayElements(), $field); + if (is_array($order)) { + $settings['media']['order'] = array_is_list($order) ? $order : array_keys($order); + } else { + $settings['media']['order'] = []; + } + } + + return $settings; } /**