From 8e43c53498c4dbeca7630b8cd15a5a6342b02288 Mon Sep 17 00:00:00 2001 From: osaajani <> Date: Mon, 19 Jul 2021 21:14:56 +0200 Subject: [PATCH] Add serverside list for contacts --- controllers/internals/Contact.php | 17 +++++++++ controllers/publics/Contact.php | 28 +++++++++++++-- models/Contact.php | 59 +++++++++++++++++++++++++++++++ templates/contact/list.php | 3 +- 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/controllers/internals/Contact.php b/controllers/internals/Contact.php index 8934d2e..b9d19f9 100644 --- a/controllers/internals/Contact.php +++ b/controllers/internals/Contact.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); + } + /** * Return a contact for a user by a number. * diff --git a/controllers/publics/Contact.php b/controllers/publics/Contact.php index 600e5e8..6fed079 100644 --- a/controllers/publics/Contact.php +++ b/controllers/publics/Contact.php @@ -45,19 +45,43 @@ namespace controllers\publics; return $this->render('contact/list'); } + /** * Return contacts as json. */ public function list_json() { - $entities = $this->internal_contact->list_for_user($_SESSION['user']['id']); + $draw = (int) ($_GET['draw'] ?? false); + + $columns = [ + 0 => 'name', + 1 => 'number', + 2 => 'created_at', + 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_contact->datatable_list_for_user($_SESSION['user']['id'], $limit, $offset, $search, $columns, $order_column, $order_desc); + $count_entities = $this->internal_contact->datatable_list_for_user($_SESSION['user']['id'], $limit, $offset, $search, $columns, $order_column, $order_desc, true); foreach ($entities as &$entity) { $entity['number_formatted'] = \controllers\internals\Tool::phone_link($entity['number']); } + $records_total = $this->internal_contact->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/Contact.php b/models/Contact.php index 5646424..b9e682e 100644 --- a/models/Contact.php +++ b/models/Contact.php @@ -13,6 +13,65 @@ namespace models; class Contact extends StandardModel { + /** + * Return a list of sended messages for a user. + * Add a column contact_name and phone_name when available. + * + * @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 contact + 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); + } + /** * Return a contact by his number for a user. * diff --git a/templates/contact/list.php b/templates/contact/list.php index 03de988..2284706 100644 --- a/templates/contact/list.php +++ b/templates/contact/list.php @@ -186,11 +186,12 @@ jQuery(document).ready(function() "language": { "url": HTTP_PWD + "/assets/js/datatables/french.json", }, + "orderMulti": false, "columnDefs": [{ 'targets': 'checkcolumn', 'orderable': false, }], - + "serverSide": true, "ajax": { 'url': '', 'dataSrc': 'data',