2015-09-29 02:54:25 +02:00
|
|
|
<?php
|
2018-07-19 11:48:22 +02:00
|
|
|
class CustomPaginationTool
|
|
|
|
{
|
|
|
|
public function createPaginationRules($items, $options, $model, $sort = 'id', $focusKey = 'uuid')
|
|
|
|
{
|
|
|
|
$params = array(
|
|
|
|
'model' => $model,
|
|
|
|
'current' => 1,
|
|
|
|
'count' => count($items),
|
|
|
|
'limit' => 60,
|
|
|
|
'page' => 1,
|
|
|
|
'sort' => $sort,
|
|
|
|
'direction' => 'asc',
|
|
|
|
'paramType' => 'named',
|
|
|
|
'prevPage' => false,
|
|
|
|
'nextPage' => false,
|
|
|
|
'options' => array(
|
|
|
|
),
|
|
|
|
);
|
2019-08-28 17:02:43 +02:00
|
|
|
$validOptions = array('sort', 'direction', 'page', 'focus', 'limit');
|
2018-07-19 11:48:22 +02:00
|
|
|
if ($model == 'events') {
|
|
|
|
$validOptions[] = 'attributeFilter';
|
|
|
|
}
|
|
|
|
foreach ($validOptions as $v) {
|
|
|
|
if (isset($options[$v])) {
|
|
|
|
$params[$v] = $options[$v];
|
|
|
|
$params['options'][$v] = $options[$v];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$maxPage = floor($params['count'] / $params['limit']);
|
|
|
|
if ($params['count'] % $params['limit'] != 0) {
|
|
|
|
$maxPage += 1;
|
|
|
|
}
|
|
|
|
if ($params['page'] == 0) {
|
|
|
|
$params['limit'] = $params['count'];
|
|
|
|
$params['current'] = 1;
|
|
|
|
} else {
|
|
|
|
$params['current'] = 1 + ($params['page'] - 1) * $params['limit'];
|
|
|
|
if ($params['page'] > 1) {
|
|
|
|
$params['prevPage'] = true;
|
|
|
|
}
|
|
|
|
if ($params['page'] < $maxPage) {
|
|
|
|
$params['nextPage'] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$params['pageCount'] = $maxPage;
|
|
|
|
return $params;
|
|
|
|
}
|
2016-06-04 01:08:16 +02:00
|
|
|
|
2018-07-19 11:48:22 +02:00
|
|
|
public function truncateByPagination(&$items, $params)
|
|
|
|
{
|
|
|
|
if (empty($items)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$items = array_slice($items, $params['current'] - 1, $params['limit']);
|
|
|
|
}
|
2016-06-04 01:08:16 +02:00
|
|
|
|
2019-08-28 17:02:43 +02:00
|
|
|
public function truncateByQuickFilter(&$items, $value)
|
|
|
|
{
|
|
|
|
if (empty($items)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ($value === '') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$value = strtolower($value);
|
|
|
|
foreach ($items as $k => $item) {
|
|
|
|
$keep = false;
|
|
|
|
foreach ($item as $field_name => $field_value) {
|
|
|
|
if (!is_array($field_value)) {
|
|
|
|
$field_value = array($field_value);
|
|
|
|
}
|
|
|
|
foreach ($field_value as $v) {
|
|
|
|
if (!is_array($v) && strpos(strtolower($v), $value) > -1) {
|
|
|
|
$keep = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!$keep) {
|
|
|
|
unset($items[$k]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$items = array_values($items);
|
|
|
|
}
|
|
|
|
|
2018-07-19 11:48:22 +02:00
|
|
|
public function sortArray($items, $params, $escapeReindex = false)
|
|
|
|
{
|
|
|
|
if (isset($params['sort'])) {
|
|
|
|
$sortArray = array();
|
|
|
|
foreach ($items as $k => $item) {
|
2019-08-28 17:02:43 +02:00
|
|
|
$sortArray[$k] = !empty(Hash::get($item, $params['sort'])) ? $item[$params['sort']] : '';
|
2018-07-19 11:48:22 +02:00
|
|
|
}
|
|
|
|
if (empty($params['options']['direction']) || $params['options']['direction'] == 'asc') {
|
|
|
|
asort($sortArray);
|
|
|
|
} else {
|
|
|
|
arsort($sortArray);
|
|
|
|
}
|
2016-06-04 01:08:16 +02:00
|
|
|
|
2018-07-19 11:48:22 +02:00
|
|
|
foreach ($sortArray as $k => $sortedElement) {
|
|
|
|
$sortArray[$k] = $items[$k];
|
|
|
|
}
|
|
|
|
$items = array();
|
|
|
|
$items = $sortArray;
|
|
|
|
}
|
|
|
|
if (!$escapeReindex) {
|
|
|
|
$items = array_values($items);
|
|
|
|
}
|
|
|
|
return $items;
|
|
|
|
}
|
2017-08-09 17:53:25 +02:00
|
|
|
|
2019-08-28 17:02:43 +02:00
|
|
|
public function applyRulesOnArray(&$items, $options, $model, $sort = 'id', $focusKey = 'uuid', $escapeReindex = false)
|
2018-07-19 11:48:22 +02:00
|
|
|
{
|
|
|
|
$params = $this->createPaginationRules($items, $options, $model, $sort, $focusKey);
|
2019-08-28 17:02:43 +02:00
|
|
|
$items = $this->sortArray($items, $params, $escapeReindex);
|
2018-07-19 11:48:22 +02:00
|
|
|
if (!empty($params['options']['focus'])) {
|
|
|
|
foreach ($items as $k => $item) {
|
|
|
|
if ($item[$focusKey] == $params['options']['focus']) {
|
|
|
|
$params['page'] = 1 + intval(floor($k / $params['limit']));
|
2019-08-28 17:02:43 +02:00
|
|
|
$params['current'] = 1 + ($params['page'] - 1) * $params['limit'];
|
2018-07-19 11:48:22 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
unset($params['options']['focus']);
|
|
|
|
}
|
|
|
|
array_unshift($items, 'dummy');
|
|
|
|
unset($items[0]);
|
|
|
|
$this->truncateByPagination($items, $params);
|
|
|
|
return $params;
|
|
|
|
}
|
2017-12-05 00:05:11 +01:00
|
|
|
|
2019-08-28 17:02:43 +02:00
|
|
|
public function truncateAndPaginate(&$items, &$params, $model, $escapeReindex = false)
|
|
|
|
{
|
|
|
|
if (!empty($params['named']['searchall'])) {
|
|
|
|
$this->truncateByQuickFilter($items, $params['named']['searchall']);
|
|
|
|
}
|
|
|
|
$passedArgs = $this->applyRulesOnArray($items, $params['named'], 'Feed', 'id', 'uuid', $escapeReindex);
|
|
|
|
$params->params['paging'] = array($model => $passedArgs);
|
|
|
|
}
|
|
|
|
|
2018-07-19 11:48:22 +02:00
|
|
|
public function cmp($a, $b)
|
|
|
|
{
|
|
|
|
$multiplier = 1;
|
|
|
|
if ($this->direction == 'desc') {
|
|
|
|
$multiplier = -1;
|
|
|
|
}
|
|
|
|
return strcmp(strtolower($a[$this->filterField]), strtolower($b[$this->filterField])) * $multiplier;
|
|
|
|
}
|
2015-09-29 02:54:25 +02:00
|
|
|
}
|