From 869ab1f2e031a53f47e6cbccc71cb5d7910757e0 Mon Sep 17 00:00:00 2001 From: Max P <46793832+PxaMMaxP@users.noreply.github.com> Date: Sat, 2 Dec 2023 14:35:38 +0100 Subject: [PATCH] Enhanced Sorting by Nested Meta Values in Pages (#681) * Added functionality for sorting pages by nested meta values. * Additional variables removed. * Added comment to the config template file about the possibility to access nested metadata with a dot as separator for sorting. * Added entry in the changelog about the possibility to access nested metadata with a dot as separator for sorting. * Changelog and config template adapted according to the suggestions. * Added old entry back in the Config template. --- CHANGELOG.md | 2 ++ config/config.yml.template | 1 + lib/Pico.php | 15 +++++++++++---- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43ade98e9..307109810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,8 @@ Released: - now receive the (optional) `$pageId` argument for the new `%page_*%` Markdown placeholders * [New] Add `page()` Twig function to access a page's data +* [New] Enhance `pages_order_by_meta` functionality to allow sorting by + nested meta values using '.' notation (e.g., 'author.info') * [Changed] ! Pico now requires PHP 7.2.5 or later (this includes full PHP 8 support, also see #528, #534, #608) * [Changed] ! Pico now depends on Twig 3.3, skipping Twig 2.x altogether; this diff --git a/config/config.yml.template b/config/config.yml.template index 2a5647d6f..37d06ebb4 100644 --- a/config/config.yml.template +++ b/config/config.yml.template @@ -31,6 +31,7 @@ twig_config: # Twig template engine config date_format: "%D %T" # Pico's default date format; # See https://php.net/manual/en/function.strftime.php for more info pages_order_by_meta: author # Sort pages by meta value "author" (set "pages_order_by" to "meta") + # Use '.' notation for nested meta keys (e.g. 'author.info') pages_order_by: alpha # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta") pages_order: asc # Sort pages in ascending ("asc") or descending ("desc") order content_dir: ~ # The path to Pico's content directory diff --git a/lib/Pico.php b/lib/Pico.php index ae303854a..653380f36 100644 --- a/lib/Pico.php +++ b/lib/Pico.php @@ -1877,11 +1877,18 @@ protected function sortPages(): void if ($orderBy === 'meta') { // sort by arbitrary meta value $orderByMeta = $this->getConfig('pages_order_by_meta'); - uasort($this->pages, function ($a, $b) use ($alphaSortClosure, $order, $orderByMeta) { - $aSortValue = isset($a['meta'][$orderByMeta]) ? $a['meta'][$orderByMeta] : null; - $aSortValueNull = ($aSortValue === null); + $orderByMetaKeys = explode('.', $orderByMeta); + + uasort($this->pages, function ($a, $b) use ($alphaSortClosure, $order, $orderByMetaKeys) { + $aSortValue = $a['meta']; + $bSortValue = $b['meta']; + + foreach ($orderByMetaKeys as $key) { + $aSortValue = isset($aSortValue[$key]) ? $aSortValue[$key] : null; + $bSortValue = isset($bSortValue[$key]) ? $bSortValue[$key] : null; + } - $bSortValue = isset($b['meta'][$orderByMeta]) ? $b['meta'][$orderByMeta] : null; + $aSortValueNull = ($aSortValue === null); $bSortValueNull = ($bSortValue === null); $cmp = 0;