fix pagination for entity-listings with extra parameters

Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
This commit is contained in:
Michael Kaufmann
2023-02-11 08:52:43 +01:00
parent 98cb36327e
commit c9b2bfe53c
4 changed files with 28 additions and 11 deletions

View File

@@ -104,7 +104,7 @@ if ($action == 'add_record' && !empty($_POST)) {
try { try {
$dns_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.dns.php'; $dns_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.dns.php';
$collection = (new Collection(DomainZones::class, $userinfo, ['id' => $domain_id])) $collection = (new Collection(DomainZones::class, $userinfo, ['id' => $domain_id]))
->withPagination($dns_list_data['dns_list']['columns'], $dns_list_data['dns_list']['default_sorting']); ->withPagination($dns_list_data['dns_list']['columns'], $dns_list_data['dns_list']['default_sorting'], ['domain_id='.$domain_id]);
} catch (Exception $e) { } catch (Exception $e) {
Response::dynamicError($e->getMessage()); Response::dynamicError($e->getMessage());
} }

View File

@@ -110,7 +110,7 @@ class Collection
return $this; return $this;
} }
public function withPagination(array $columns, array $default_sorting = []): Collection public function withPagination(array $columns, array $default_sorting = [], array $pagination_additional_params = []): Collection
{ {
// Get only searchable columns // Get only searchable columns
$sortableColumns = []; $sortableColumns = [];
@@ -121,7 +121,7 @@ class Collection
} }
// Prepare pagination // Prepare pagination
$this->pagination = new Pagination($sortableColumns, $this->count(), (int)Settings::Get('panel.paging'), $default_sorting); $this->pagination = new Pagination($sortableColumns, $this->count(), (int)Settings::Get('panel.paging'), $default_sorting, $pagination_additional_params);
$this->params = array_merge($this->params, $this->pagination->getApiCommandParams()); $this->params = array_merge($this->params, $this->pagination->getApiCommandParams());
return $this; return $this;

View File

@@ -48,6 +48,8 @@ class Pagination
private int $perPage; private int $perPage;
private string $paginationAdditional = "";
/** /**
* Create new pagination object to search/filter, limit and sort Api-listing() calls * Create new pagination object to search/filter, limit and sort Api-listing() calls
* *
@@ -55,9 +57,15 @@ class Pagination
* @param int $total_entries * @param int $total_entries
* @param int $perPage * @param int $perPage
* @param array $default_sorting array of key=sortfield,value=sortorder for default sorting * @param array $default_sorting array of key=sortfield,value=sortorder for default sorting
* @param array $pagination_additional_params
*/ */
public function __construct(array $fields = [], int $total_entries = 0, int $perPage = 20, array $default_sorting = []) public function __construct(
{ array $fields = [],
int $total_entries = 0,
int $perPage = 20,
array $default_sorting = [],
array $pagination_additional_params = []
) {
$this->fields = $fields; $this->fields = $fields;
$this->entries = $total_entries; $this->entries = $total_entries;
$this->perPage = $perPage; $this->perPage = $perPage;
@@ -72,7 +80,8 @@ class Pagination
$orderfields = array_keys($fields); $orderfields = array_keys($fields);
$this->searchfield = $orderfields[0]; $this->searchfield = $orderfields[0];
} }
if (isset($_REQUEST['searchtext']) && (preg_match('/[-_@\p{L}\p{N}*.]+$/u', $_REQUEST['searchtext']) || $_REQUEST['searchtext'] === '')) { if (isset($_REQUEST['searchtext']) && (preg_match('/[-_@\p{L}\p{N}*.]+$/u',
$_REQUEST['searchtext']) || $_REQUEST['searchtext'] === '')) {
$this->searchtext = trim($_REQUEST['searchtext']); $this->searchtext = trim($_REQUEST['searchtext']);
} }
if (isset($_REQUEST['searchfield']) && isset($fields[$_REQUEST['searchfield']])) { if (isset($_REQUEST['searchfield']) && isset($fields[$_REQUEST['searchfield']])) {
@@ -114,6 +123,13 @@ class Pagination
$this->pageno = 1; $this->pageno = 1;
} }
$this->addOffset(($this->pageno - 1) * Settings::Get('panel.paging')); $this->addOffset(($this->pageno - 1) * Settings::Get('panel.paging'));
// pagination additional parameters for url
if (!empty($pagination_additional_params)) {
foreach ($pagination_additional_params as $pap) {
$this->paginationAdditional .= "&" . $pap;
}
}
} }
/** /**
@@ -210,7 +226,8 @@ class Pagination
"last_page" => (Settings::Get('panel.paging') > 0) ? ceil($this->entries / $this->perPage) : -1, "last_page" => (Settings::Get('panel.paging') > 0) ? ceil($this->entries / $this->perPage) : -1,
"from" => $this->data['sql_offset'] ?? null, "from" => $this->data['sql_offset'] ?? null,
"to" => min($this->data['sql_offset'] + $this->perPage, $this->entries), "to" => min($this->data['sql_offset'] + $this->perPage, $this->entries),
'sortfields' => array_keys($this->fields), "sortfields" => array_keys($this->fields),
"link_additions" => $this->paginationAdditional,
] ]
]; ];
} }

View File

@@ -16,24 +16,24 @@
</li> </li>
{% elseif pagination.current_page > 1 %} {% elseif pagination.current_page > 1 %}
<li class="page-item"> <li class="page-item">
<a class="page-link" href="?page={{ page }}&action={{ action }}&pageno=1" tabindex="-1"> <a class="page-link" href="?page={{ page }}&action={{ action }}{{ pagination.link_additions }}&pageno=1" tabindex="-1">
<i class="fa-solid fa-angles-left"></i> <i class="fa-solid fa-angles-left"></i>
</a> </a>
</li> </li>
<li class="page-item"> <li class="page-item">
<a class="page-link" href="?page={{ page }}&action={{ action }}&pageno={{ pagination.current_page - 1 }}" tabindex="-1"> <a class="page-link" href="?page={{ page }}&action={{ action }}{{ pagination.link_additions }}&pageno={{ pagination.current_page - 1 }}" tabindex="-1">
<i class="fa-solid fa-chevron-left"></i> <i class="fa-solid fa-chevron-left"></i>
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if pagination.current_page < pagination.last_page %} {% if pagination.current_page < pagination.last_page %}
<li class="page-item"> <li class="page-item">
<a class="page-link" href="?page={{ page }}&action={{ action }}&pageno={{ pagination.current_page + 1 }}" tabindex="-1"> <a class="page-link" href="?page={{ page }}&action={{ action }}{{ pagination.link_additions }}&pageno={{ pagination.current_page + 1 }}" tabindex="-1">
<i class="fa-solid fa-chevron-right"></i> <i class="fa-solid fa-chevron-right"></i>
</a> </a>
</li> </li>
<li class="page-item"> <li class="page-item">
<a class="page-link" href="?page={{ page }}&action={{ action }}&pageno={{ pagination.last_page }}" tabindex="-1"> <a class="page-link" href="?page={{ page }}&action={{ action }}{{ pagination.link_additions }}&pageno={{ pagination.last_page }}" tabindex="-1">
<i class="fa-solid fa-angles-right"></i> <i class="fa-solid fa-angles-right"></i>
</a> </a>
</li> </li>