From 7905fb5180ea4a0768f088c187d41bb2f9200cd7 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Thu, 21 Mar 2019 06:26:06 -0400 Subject: [PATCH] Add support for page.sort in PageFinder (DB selectors) per processwire/processwire-issues#496 --- wire/core/PageFinder.php | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/wire/core/PageFinder.php b/wire/core/PageFinder.php index dbcf4f9c..a7679ae6 100644 --- a/wire/core/PageFinder.php +++ b/wire/core/PageFinder.php @@ -1176,26 +1176,35 @@ class PageFinder extends Wire { if(count($fields) > 1) $fields = $this->arrangeFields($fields); $fieldsStr = ':' . implode(':', $fields) . ':'; // for strpos $field = reset($fields); // first field - $subfield = ''; - if(strpos($field, '.')) list($field, $subfield) = explode('.', $field); + $fieldAndSubfield = $field; + if(strpos($field, '.')) list($field,) = explode('.', $field); // TODO Make native fields and path/url multi-field and multi-value aware - if($field == 'sort' && $selector->operator === '=' && !$subfield) { - $sortSelectors[] = $selector; - continue; - - } else if($field == 'limit' || $field == 'start') { + if($fieldAndSubfield === 'sort' && $selector->operator === '=') { + $sortSelectors[] = $selector; + continue; + + } else if($fieldAndSubfield === 'sort' || $fieldAndSubfield === 'page.sort') { + if(!in_array($selector->operator, array('=', '!=', '<', '>', '>=', '<='))) { + throw new PageFinderSyntaxException("Property '$fieldAndSubfield' may not use operator: $selector->operator"); + } + $selector->field = 'sort'; + $selector->value = (int) $selector->value(); + $this->getQueryNativeField($query, $selector, array('sort'), $options, $selectors); continue; - } else if($field == 'path' || $field == 'url') { + } else if($field === 'limit' || $field === 'start') { + continue; + + } else if($field === 'path' || $field === 'url') { $this->getQueryJoinPath($query, $selector); continue; - } else if($field == 'has_parent' || $field == 'hasParent') { + } else if($field === 'has_parent' || $field === 'hasParent') { $this->getQueryHasParent($query, $selector); continue; - } else if($field == 'num_children' || $field == 'numChildren' || ($field == 'children' && $subfield == 'count')) { + } else if($field === 'num_children' || $field === 'numChildren' || $fieldAndSubfield === 'children.count') { $this->getQueryNumChildren($query, $selector); continue;