From e8bb2ea93386fc44a16a5f738505c60ecbf33436 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 27 Jun 2023 18:17:51 +0200 Subject: [PATCH] MVC/ApiControllerBase::searchRecordsetBase - fill missing keys when sorting, prevents "sizes are inconsistent" and eases operation for the caller. ref https://github.com/opnsense/plugins/pull/3484#issuecomment-1609023477 --- .../OPNsense/Base/ApiControllerBase.php | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Base/ApiControllerBase.php b/src/opnsense/mvc/app/controllers/OPNsense/Base/ApiControllerBase.php index cde544e3b..8a30ae5b9 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Base/ApiControllerBase.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Base/ApiControllerBase.php @@ -61,22 +61,26 @@ class ApiControllerBase extends ControllerRoot $entry_keys = array_keys($records); $searchPhrase = (string)$this->request->getPost('searchPhrase', null, ''); + $sortOrder = SORT_ASC; + $sortKey = $defaultSort; if ( $this->request->hasPost('sort') && is_array($this->request->getPost('sort')) && !empty($this->request->getPost('sort')) ) { $keys = array_keys($this->request->getPost('sort')); - $order = $this->request->getPost('sort')[$keys[0]]; - $keys = array_column($records, $keys[0]); - if (!empty($keys)) { - array_multisort($keys, $order == 'asc' ? SORT_ASC : SORT_DESC, $sort_flags, $records); - } - } elseif (!empty($defaultSort)) { - $keys = array_column($records, $defaultSort); - if (!empty($keys)) { - array_multisort($keys, SORT_ASC, $sort_flags, $records); + $sortOrder = $this->request->getPost('sort')[$keys[0]] == 'asc' ? SORT_ASC : SORT_DESC; + $sortKey = $keys[0]; + } + if (!empty($sortKey) && !empty($records)) { + // make sure the sort key exists in the recordset to prevent "sizes are inconsistent" + foreach ($records as &$record) { + if (!isset($record[$sortKey])) { + $record[$sortKey] = null; + } } + $keys = array_column($records, $sortKey); + array_multisort($keys, $sortOrder, $sort_flags, $records); } $entry_keys = array_filter($entry_keys, function ($key) use ($searchPhrase, $filter_funct, $fields, $records) {