From 19c30ca00deeb908983bfe696f2207062f24572c Mon Sep 17 00:00:00 2001 From: Andres Campanario Date: Wed, 8 Mar 2023 16:09:39 +0100 Subject: [PATCH 1/3] adapt paginator to request type as post --- .../DatatablesPaginatorComponent.php | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Controller/Component/DatatablesPaginatorComponent.php b/src/Controller/Component/DatatablesPaginatorComponent.php index ab75f3c..6ed5e55 100644 --- a/src/Controller/Component/DatatablesPaginatorComponent.php +++ b/src/Controller/Component/DatatablesPaginatorComponent.php @@ -39,9 +39,14 @@ public function paginate(object $object, array $settings = []): ResultSetInterfa */ protected function applyOrder(ServerRequest $request, array $settings): array { - // translate ordering - $dtColumns = $request->getQuery('columns'); - $dtOrders = (array)$request->getQuery('order'); + if ($request->is('post')) { + $dtColumns = $request->getData('columns'); + $dtOrders = (array)$request->getData('order'); + } else { + $dtColumns = $request->getQuery('columns'); + $dtOrders = (array)$request->getQuery('order'); + } + foreach ($dtOrders as $dtOrder) { $colIndex = (int)($dtOrder['column'] ?? 0); $colOrder = $dtOrder['dir'] ?? 'asc'; @@ -65,8 +70,13 @@ protected function applyOrder(ServerRequest $request, array $settings): array */ protected function applyLimits(ServerRequest $request, array $settings): array { - $dtStart = (int)$request->getQuery('start'); - $dtLength = $request->getQuery('length') ? (int)$request->getQuery('length') : null; + if ($request->is('post')) { + $dtStart = (int)$request->getData('start'); + $dtLength = $request->getData('length') ? (int)$request->getData('length') : null; + } else { + $dtStart = (int)$request->getQuery('start'); + $dtLength = $request->getQuery('length') ? (int)$request->getQuery('length') : null; + } $settings['limit'] = $dtLength; if ($dtStart === 0) { @@ -119,14 +129,21 @@ public function prepareRequestQueryParams(): void { // translate ordering $request = $this->getController()->getRequest(); - $dtColumns = $request->getQuery('columns', []); + + if ($request->is('post')) { + $dtColumns = $request->getData('columns', []); + } else { + $dtColumns = $request->getQuery('columns', []); + } + $newQueryParams = []; foreach ($dtColumns as $dtColumn) { if (($dtColumn['searchable'] ?? null) !== 'true') { continue; } $colName = $dtColumn['data']; - if ($request->getQuery($colName)) { + + if ($request->is('post') ? $request->getData($colName): $request->getQuery($colName)) { // we already have a query param with values, ignoring this column continue; } @@ -140,6 +157,7 @@ public function prepareRequestQueryParams(): void } $newQueryParams[$colName] = $colSearch; } + $request = $request->withQueryParams($request->getQueryParams() + $newQueryParams); $this->getController()->setRequest($request); } From 7ab560cf3bc1c81d1576b8903f297f65a694787e Mon Sep 17 00:00:00 2001 From: Andres Campanario Date: Wed, 8 Mar 2023 16:57:37 +0100 Subject: [PATCH 2/3] refactor check request type and check key exists --- .../DatatablesPaginatorComponent.php | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/Controller/Component/DatatablesPaginatorComponent.php b/src/Controller/Component/DatatablesPaginatorComponent.php index 6ed5e55..e12ec41 100644 --- a/src/Controller/Component/DatatablesPaginatorComponent.php +++ b/src/Controller/Component/DatatablesPaginatorComponent.php @@ -22,9 +22,11 @@ class DatatablesPaginatorComponent extends PaginatorComponent public function paginate(object $object, array $settings = []): ResultSetInterface { - $request = $this->_registry->getController()->getRequest(); - $settings = $this->applyOrder($request, $settings); - $settings = $this->applyLimits($request, $settings); + $request = $this->getController()->getRequest(); + $dtData = $request->is('post') ? $request->getData() : $request->getQueryParams(); + + $settings = $this->applyOrder($dtData, $settings); + $settings = $this->applyLimits($dtData, $settings); $resultSet = parent::paginate($object, $settings); return $resultSet; @@ -37,15 +39,10 @@ public function paginate(object $object, array $settings = []): ResultSetInterfa * @param array $settings * @return array */ - protected function applyOrder(ServerRequest $request, array $settings): array + protected function applyOrder(array $data, array $settings): array { - if ($request->is('post')) { - $dtColumns = $request->getData('columns'); - $dtOrders = (array)$request->getData('order'); - } else { - $dtColumns = $request->getQuery('columns'); - $dtOrders = (array)$request->getQuery('order'); - } + $dtColumns = $data['columns']; + $dtOrders = $data['order']; foreach ($dtOrders as $dtOrder) { $colIndex = (int)($dtOrder['column'] ?? 0); @@ -68,15 +65,10 @@ protected function applyOrder(ServerRequest $request, array $settings): array * @param array $settings * @return array */ - protected function applyLimits(ServerRequest $request, array $settings): array + protected function applyLimits(array $data, array $settings): array { - if ($request->is('post')) { - $dtStart = (int)$request->getData('start'); - $dtLength = $request->getData('length') ? (int)$request->getData('length') : null; - } else { - $dtStart = (int)$request->getQuery('start'); - $dtLength = $request->getQuery('length') ? (int)$request->getQuery('length') : null; - } + $dtStart = (int)$data['start']; + $dtLength = (int)$data['length']; $settings['limit'] = $dtLength; if ($dtStart === 0) { @@ -130,17 +122,18 @@ public function prepareRequestQueryParams(): void // translate ordering $request = $this->getController()->getRequest(); - if ($request->is('post')) { - $dtColumns = $request->getData('columns', []); - } else { - $dtColumns = $request->getQuery('columns', []); - } + $dtColumns = $request->is('post') ? + $request->getData('columns', []) : $request->getQuery('columns', []); $newQueryParams = []; foreach ($dtColumns as $dtColumn) { if (($dtColumn['searchable'] ?? null) !== 'true') { continue; } + if (!array_key_exists('data',$dtColumn)) { + continue; + } + $colName = $dtColumn['data']; if ($request->is('post') ? $request->getData($colName): $request->getQuery($colName)) { From 1bf6319edee5085e1bce637e1556daa38a4b5d31 Mon Sep 17 00:00:00 2001 From: Andres Campanario Date: Wed, 8 Mar 2023 17:11:44 +0100 Subject: [PATCH 3/3] check keys exists --- .../Component/DatatablesPaginatorComponent.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Controller/Component/DatatablesPaginatorComponent.php b/src/Controller/Component/DatatablesPaginatorComponent.php index e12ec41..2d2902b 100644 --- a/src/Controller/Component/DatatablesPaginatorComponent.php +++ b/src/Controller/Component/DatatablesPaginatorComponent.php @@ -41,8 +41,8 @@ public function paginate(object $object, array $settings = []): ResultSetInterfa */ protected function applyOrder(array $data, array $settings): array { - $dtColumns = $data['columns']; - $dtOrders = $data['order']; + $dtColumns = $data['columns'] ?? []; + $dtOrders = $data['order'] ?? []; foreach ($dtOrders as $dtOrder) { $colIndex = (int)($dtOrder['column'] ?? 0); @@ -67,8 +67,8 @@ protected function applyOrder(array $data, array $settings): array */ protected function applyLimits(array $data, array $settings): array { - $dtStart = (int)$data['start']; - $dtLength = (int)$data['length']; + $dtStart = (int)$data['start'] ?? 0; + $dtLength = (int)$data['length'] ?? 0; $settings['limit'] = $dtLength; if ($dtStart === 0) { @@ -133,7 +133,7 @@ public function prepareRequestQueryParams(): void if (!array_key_exists('data',$dtColumn)) { continue; } - + $colName = $dtColumn['data']; if ($request->is('post') ? $request->getData($colName): $request->getQuery($colName)) {