new: [custom pagination] component added

- simply paginate arrays as opposed to going to the DB for data
- just use $this->CustomPagination->paginate($array);

- it will automatically use the pagination options passed in the request
- compatible with the default cakePHP pagination helper
pull/38/head
iglocska 2021-01-13 14:24:52 +01:00
parent e092a95951
commit c223dcede5
No known key found for this signature in database
GPG Key ID: BEA224F1FEF113AC
1 changed files with 103 additions and 0 deletions

View File

@ -0,0 +1,103 @@
<?php
namespace App\Controller\Component;
use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use Cake\Http\Exception\NotFoundException;
use InvalidArgumentException;
use Cake\Controller\Component\PaginatorComponent;
use Cake\Utility\Hash;
class CustomPaginationComponent extends Component
{
public function __construct(ComponentRegistry $registry, array $config = [])
{
parent::__construct($registry, $config);
}
protected $defaults = [
'limit' => 10,
'direction' => 'asc'
];
protected $settings = [
];
protected $validFields = [
'limit',
'page',
'sort',
'direction'
];
public function paginate(array $data): array
{
$request = $this->_registry->getController()->getRequest();
$params = $request->getQueryParams();
$settings = $this->defaults;
foreach ($this->validFields as $validField) {
if (isset($params[$validField])) {
$settings[$validField] = $params[$validField];
}
}
$count = count($data);
if (!empty($settings['sort'])) {
$data = $this->_sortData($data, $settings);
}
if (!empty($settings['limit'])) {
$data = $this->_truncateData($data, $settings);
}
$this->_setPagingParams($settings, $count, count($data));
return $data;
}
protected function _sortData(array $data, array &$settings): array
{
return Hash::sort($data, '{n}.' . $settings['sort'], strtolower($settings['direction']));
}
protected function _truncateData(array $data, array $settings): array
{
$page = $settings['page'] ?? 1;
$limit = $settings['limit'] ?? 50;
$offset = ($page - 1) * $limit;
return array_slice($data, $offset, $limit);
}
protected function _setPagingParams(array $settings, int $count, int $currentCount): void
{
$controller = $this->getController();
$request = $controller->getRequest();
$limit = $settings['limit'] ?? 0;
$pageCount = empty($settings['limit']) ? 1 : ceil($count/$limit);
$page = $settings['page'] ?? 1;
$start = $end = 0;
$prevPage = $page > 1;
$nextPage = true;
if ($count) {
$nextPage = $count > ($page * $limit);
}
if ($currentCount > 0) {
$start = (($page - 1) * $limit) + 1;
$end = $start + $currentCount - 1;
}
$paging = [
'count' => $count,
'current' => $currentCount,
'perPage' => $limit,
'page' => $page,
'requestedPage' => $settings['page'] ?? 1,
'pageCount' => $pageCount,
'start' => $start,
'end' => $end,
'prevPage' => $page > 1,
'nextPage' => $nextPage
];
$paging = ['organisations' => $paging + $settings];
$controller->setRequest($request->withAttribute('paging', $paging));
}
}