chg: [crud:index] Added better support of pagination for API

develop-unstable
Sami Mokaddem 2023-02-13 15:36:21 +01:00
parent 72932c582d
commit fce564f798
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
1 changed files with 13 additions and 8 deletions

View File

@ -46,7 +46,8 @@ class CRUDComponent extends Component
$options['filters'][] = 'filteringTags'; $options['filters'][] = 'filteringTags';
} }
$optionFilters = empty($options['filters']) ? [] : $options['filters']; $optionFilters = [];
$optionFilters += empty($options['filters']) ? [] : $options['filters'];
foreach ($optionFilters as $i => $filter) { foreach ($optionFilters as $i => $filter) {
$optionFilters[] = "{$filter} !="; $optionFilters[] = "{$filter} !=";
$optionFilters[] = "{$filter} >="; $optionFilters[] = "{$filter} >=";
@ -79,7 +80,13 @@ class CRUDComponent extends Component
if ($this->metaFieldsSupported()) { if ($this->metaFieldsSupported()) {
$query = $this->includeRequestedMetaFields($query); $query = $this->includeRequestedMetaFields($query);
} }
$data = $query->all(); if (!$this->Controller->ParamHandler->isRest()) {
$this->setRequestedEntryAmount();
}
$data = $this->Controller->paginate($query, $this->Controller->paginate ?? []);
$totalCount = $this->Controller->getRequest()->getAttribute('paging')[$this->TableAlias]['count'];
if ($this->Controller->ParamHandler->isRest()) {
$data = $this->Controller->paginate($query, $this->Controller->paginate ?? []);
if (isset($options['hidden'])) { if (isset($options['hidden'])) {
$data->each(function($value, $key) use ($options) { $data->each(function($value, $key) use ($options) {
$hidden = is_array($options['hidden']) ? $options['hidden'] : [$options['hidden']]; $hidden = is_array($options['hidden']) ? $options['hidden'] : [$options['hidden']];
@ -110,13 +117,11 @@ class CRUDComponent extends Component
return $this->attachMetaTemplatesIfNeeded($value, $metaTemplates); return $this->attachMetaTemplatesIfNeeded($value, $metaTemplates);
}); });
} }
$this->Controller->restResponsePayload = $this->RestResponse->viewData($data, 'json'); $this->Controller->restResponsePayload = $this->RestResponse->viewData($data, 'json', false, false, false, [
'X-Total-Count' => $totalCount,
]);
} else { } else {
if ($this->metaFieldsSupported()) { $this->Controller->setResponse($this->Controller->getResponse()->withHeader('X-Total-Count', $totalCount));
$query = $this->includeRequestedMetaFields($query);
}
$this->setRequestedEntryAmount();
$data = $this->Controller->paginate($query, $this->Controller->paginate ?? []);
if (isset($options['afterFind'])) { if (isset($options['afterFind'])) {
$function = $options['afterFind']; $function = $options['afterFind'];
if (is_callable($function)) { if (is_callable($function)) {