From 8e41b51cb7d508384e561b9c6caabe43a6cadb9f Mon Sep 17 00:00:00 2001 From: Andrew Koebbe Date: Thu, 20 Aug 2015 23:37:29 -0500 Subject: [PATCH 1/2] Allow the use of any custom page date field for dateRange collection filtering. --- system/src/Grav/Common/Page/Collection.php | 11 ++++++++--- system/src/Grav/Common/Page/Page.php | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php index 9cd237c04..76701c9b4 100644 --- a/system/src/Grav/Common/Page/Collection.php +++ b/system/src/Grav/Common/Page/Collection.php @@ -211,17 +211,19 @@ class Collection extends Iterator } /** - * Returns the items between a set of date ranges where second value is optional + * Returns the items between a set of date ranges of either the page date field (default) or + * an arbitrary datetime page field where end date is optional * Dates can be passed in as text that strtotime() can process * http://php.net/manual/en/function.strtotime.php * + * @param $field * @param $startDate * @param bool $endDate * * @return $this * @throws \Exception */ - public function dateRange($startDate, $endDate = false) + public function dateRange($field = false, $startDate, $endDate = false) { $start = strtotime($startDate); $end = $endDate ? strtotime($endDate) : strtotime("now +1000 years"); @@ -230,7 +232,10 @@ class Collection extends Iterator foreach ($this->items as $path => $slug) { $page = $this->pages->get($path); - if ($page->date() > $start && $page->date() < $end) { + + $date = $field ? strtotime($page->value($field)) : $page->date(); + + if ($date > $start && $date < $end) { $date_range[$path] = $slug; } } diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index ab2d3426c..25df98edd 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -1841,9 +1841,10 @@ class Page // TODO: END OF MOVE if (isset($params['dateRange'])) { + $field = isset($params['dateRange']['field']) ? $params['dateRange']['field'] : false; $start = isset($params['dateRange']['start']) ? $params['dateRange']['start'] : 0; $end = isset($params['dateRange']['end']) ? $params['dateRange']['end'] : false; - $collection->dateRange($start, $end); + $collection->dateRange($field, $start, $end); } if (isset($params['order'])) { From b688660ff380b8d71c129c1784cc05ce54a1839f Mon Sep 17 00:00:00 2001 From: Andrew Koebbe Date: Fri, 21 Aug 2015 09:54:14 -0500 Subject: [PATCH 2/2] Move the $field param to the end of the method for backward compatibility. --- system/src/Grav/Common/Page/Collection.php | 4 ++-- system/src/Grav/Common/Page/Page.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php index 76701c9b4..029788f2f 100644 --- a/system/src/Grav/Common/Page/Collection.php +++ b/system/src/Grav/Common/Page/Collection.php @@ -216,14 +216,14 @@ class Collection extends Iterator * Dates can be passed in as text that strtotime() can process * http://php.net/manual/en/function.strtotime.php * - * @param $field * @param $startDate * @param bool $endDate + * @param $field * * @return $this * @throws \Exception */ - public function dateRange($field = false, $startDate, $endDate = false) + public function dateRange($startDate, $endDate = false, $field = false) { $start = strtotime($startDate); $end = $endDate ? strtotime($endDate) : strtotime("now +1000 years"); diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 25df98edd..278826661 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -1841,10 +1841,10 @@ class Page // TODO: END OF MOVE if (isset($params['dateRange'])) { - $field = isset($params['dateRange']['field']) ? $params['dateRange']['field'] : false; $start = isset($params['dateRange']['start']) ? $params['dateRange']['start'] : 0; $end = isset($params['dateRange']['end']) ? $params['dateRange']['end'] : false; - $collection->dateRange($field, $start, $end); + $field = isset($params['dateRange']['field']) ? $params['dateRange']['field'] : false; + $collection->dateRange($start, $end, $field); } if (isset($params['order'])) {