From 85095ef995da94b04deedcbbaba453a1f900b56a Mon Sep 17 00:00:00 2001 From: osaajani <> Date: Wed, 21 Jul 2021 16:42:25 +0200 Subject: [PATCH] add server side computing for event listing + fix ordering for some entities --- controllers/internals/Event.php | 17 ++++++++++ controllers/publics/Event.php | 29 +++++++++++++++-- models/Event.php | 58 +++++++++++++++++++++++++++++++++ templates/call/list.php | 2 +- templates/discussion/list.php | 1 + templates/event/list.php | 4 ++- templates/received/list.php | 1 + templates/sended/list.php | 1 + 8 files changed, 108 insertions(+), 5 deletions(-) diff --git a/controllers/internals/Event.php b/controllers/internals/Event.php index cdf62b3..29f76cb 100644 --- a/controllers/internals/Event.php +++ b/controllers/internals/Event.php @@ -15,6 +15,23 @@ namespace controllers\internals; { protected $model; + /** + * @param int $id_user : User id + * @param ?int $limit : Number of entry to return + * @param ?int $offset : Number of entry to avoid + * @param ?string $search : String to search for + * @param ?array $search_columns : List of columns to search on + * @param ?string $order_column : Name of the column to order by + * @param bool $order_desc : Should result be ordered DESC, if false order ASC + * @param bool $count : Should the query only count results + * + * @return array : Entries list + */ + public function datatable_list_for_user(int $id_user, ?int $limit = null, ?int $offset = null, ?string $search = null, ?array $search_columns = [], ?string $order_column = null, bool $order_desc = false, $count = false) + { + return $this->get_model()->datatable_list_for_user($id_user, $limit, $offset, $search, $search_columns, $order_column, $order_desc, $count); + } + /** * Disabled methods. */ diff --git a/controllers/publics/Event.php b/controllers/publics/Event.php index 3d6d9a4..5f93b98 100644 --- a/controllers/publics/Event.php +++ b/controllers/publics/Event.php @@ -42,20 +42,43 @@ namespace controllers\publics; { $this->render('event/list'); } - + /** * Return events as json. */ public function list_json() { - $entities = $this->internal_event->list_for_user($_SESSION['user']['id']); + $draw = (int) ($_GET['draw'] ?? false); + + $columns = [ + 0 => 'type', + 1 => 'at', + 2 => 'text', + 3 => 'updated_at', + ]; + + $search = $_GET['search']['value'] ?? null; + $order_column = $columns[$_GET['order'][0]['column']] ?? null; + $order_desc = ($_GET['order'][0]['dir'] ?? 'asc') == 'desc' ? true : false; + $offset = (int) ($_GET['start'] ?? 0); + $limit = (int) ($_GET['length'] ?? 25); + + $entities = $this->internal_event->datatable_list_for_user($_SESSION['user']['id'], $limit, $offset, $search, $columns, $order_column, $order_desc); + $count_entities = $this->internal_event->datatable_list_for_user($_SESSION['user']['id'], $limit, $offset, $search, $columns, $order_column, $order_desc, true); foreach ($entities as &$entity) { $entity['icon'] = \controllers\internals\Tool::event_type_to_icon($entity['type']); } + $records_total = $this->internal_event->count_for_user($_SESSION['user']['id']); + header('Content-Type: application/json'); - echo json_encode(['data' => $entities]); + echo json_encode([ + 'draw' => $draw, + 'recordsTotal' => $records_total, + 'recordsFiltered' => $count_entities, + 'data' => $entities, + ]); } /** diff --git a/models/Event.php b/models/Event.php index 0026750..843f442 100644 --- a/models/Event.php +++ b/models/Event.php @@ -13,6 +13,64 @@ namespace models; class Event extends StandardModel { + /** + * Return a list of event for a user. + * + * @param int $id_user : user id + * @param ?int $limit : Number of entry to return or null + * @param ?int $offset : Number of entry to ignore or null + * + * @return array + */ + public function datatable_list_for_user(int $id_user, ?int $limit = null, ?int $offset = null, ?string $search = null, ?array $search_columns = [], ?string $order_column = null, bool $order_desc = false, ?bool $count = false) + { + $params = [ + 'id_user' => $id_user, + ]; + + $query = $count ? 'SELECT COUNT(*) as nb' : 'SELECT * '; + $query .= ' + FROM ( + SELECT * FROM event + WHERE id_user = :id_user + ) as results + '; + + if ($search && $search_columns) + { + $like_search = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $search) . '%'; + $params[':like_search'] = $like_search; + + $query .= ' WHERE (0'; + + foreach ($search_columns as $column) + { + $query .= ' OR ' . $column . ' LIKE :like_search'; + } + + $query .= ')'; + } + + if ($order_column) + { + $query .= ' ORDER BY ' . $order_column . ($order_desc ? ' DESC' : ' ASC'); + } + + if (null !== $limit && !$count) + { + $limit = (int) $limit; + + $query .= ' LIMIT ' . $limit; + if (null !== $offset) + { + $offset = (int) $offset; + $query .= ' OFFSET ' . $offset; + } + } + + return $count ? $this->_run_query($query, $params)[0]['nb'] ?? 0 : $this->_run_query($query, $params); + } + /** * Gets lasts x events for a user order by date. * diff --git a/templates/call/list.php b/templates/call/list.php index 208a8d5..a8a51ab 100644 --- a/templates/call/list.php +++ b/templates/call/list.php @@ -77,7 +77,7 @@ jQuery(document).ready(function () 'targets': 'checkcolumn', 'orderable': false, }], - + "order": [[2, "desc"]], "ajax": { 'url': '', 'dataSrc': 'data', diff --git a/templates/discussion/list.php b/templates/discussion/list.php index fe8edcb..9b3d156 100644 --- a/templates/discussion/list.php +++ b/templates/discussion/list.php @@ -68,6 +68,7 @@ jQuery(document).ready(function () "language": { "url": HTTP_PWD + "/assets/js/datatables/french.json", }, + "order": [[0, "desc"]], "columnDefs": [{ 'targets': 'checkcolumn', 'orderable': false, diff --git a/templates/event/list.php b/templates/event/list.php index 17a69c6..5b44142 100644 --- a/templates/event/list.php +++ b/templates/event/list.php @@ -75,11 +75,13 @@ jQuery(document).ready(function () "language": { "url": HTTP_PWD + "/assets/js/datatables/french.json", }, + "orderMulti": false, + "order": [[1, "desc"]], "columnDefs": [{ 'targets': 'checkcolumn', 'orderable': false, }], - + "serverSide": true, "ajax": { 'url': '', 'dataSrc': 'data', diff --git a/templates/received/list.php b/templates/received/list.php index cd240b6..7b77d41 100644 --- a/templates/received/list.php +++ b/templates/received/list.php @@ -84,6 +84,7 @@ jQuery(document).ready(function () "url": HTTP_PWD + "/assets/js/datatables/french.json", }, "orderMulti": false, + "order": [[3, "desc"]], "columnDefs": [{ 'targets': 'checkcolumn', 'orderable': false, diff --git a/templates/sended/list.php b/templates/sended/list.php index 9cb1761..ff25420 100644 --- a/templates/sended/list.php +++ b/templates/sended/list.php @@ -74,6 +74,7 @@ jQuery(document).ready(function () "url": HTTP_PWD + "/assets/js/datatables/french.json", }, "orderMulti": false, + "order": [[3, "desc"]], "columnDefs": [{ 'targets': 'checkcolumn', 'orderable': false,