dolibarr  18.0.6
list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2021 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
6  * Copyright (C) 2016 Marcos García <marcosgdf@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 // Load Dolibarr environment
29 require '../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
31 if (isModEnabled('categorie')) {
32  require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
33 }
34 
35 // Load translation files required by page
36 $langs->loadLangs(array('users', 'companies', 'hrm', 'salaries'));
37 
38 $action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
39 $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
40 $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
41 $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
42 $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
43 $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
44 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search
45 $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
46 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
47 $mode = GETPOST("mode", 'aZ');
48 
49 // Security check (for external users)
50 $socid = 0;
51 if ($user->socid > 0) {
52  $socid = $user->socid;
53 }
54 
55 // Load variable for pagination
56 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
57 $sortfield = GETPOST('sortfield', 'aZ09comma');
58 $sortorder = GETPOST('sortorder', 'aZ09comma');
59 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
60 if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
61  // If $page is not defined, or '' or -1 or if we click on clear filters
62  $page = 0;
63 }
64 $offset = $limit * $page;
65 $pageprev = $page - 1;
66 $pagenext = $page + 1;
67 
68 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
69 $object = new User($db);
70 $extrafields = new ExtraFields($db);
71 $diroutputmassaction = $conf->user->dir_output.'/temp/massgeneration/'.$user->id;
72 $hookmanager->initHooks(array('userlist'));
73 
74 // Fetch optionals attributes and labels
75 $extrafields->fetch_name_optionals_label($object->table_element);
76 
77 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
78 
79 if (!$sortfield) {
80  $sortfield = "u.login";
81 }
82 if (!$sortorder) {
83  $sortorder = "ASC";
84 }
85 
86 // Initialize array of search criterias
87 $search_all = GETPOST('search_all', 'alphanohtml');
88 $search = array();
89 foreach ($object->fields as $key => $val) {
90  if (GETPOST('search_'.$key, 'alpha') !== '') {
91  $search[$key] = GETPOST('search_'.$key, 'alpha');
92  }
93  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
94  $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
95  $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
96  }
97 }
98 
99 $userstatic = new User($db);
100 $companystatic = new Societe($db);
101 $form = new Form($db);
102 
103 // List of fields to search into when doing a "search in all"
104 $fieldstosearchall = array(
105  'u.login'=>"Login",
106  'u.lastname'=>"Lastname",
107  'u.firstname'=>"Firstname",
108  'u.accountancy_code'=>"AccountancyCode",
109  'u.office_phone'=>"PhonePro",
110  'u.user_mobile'=>"PhoneMobile",
111  'u.email'=>"EMail",
112  'u.note_public'=>"NotePublic",
113  'u.note_private'=>"NotePrivate"
114 );
115 if (isModEnabled('api')) {
116  $fieldstosearchall['u.api_key'] = "ApiKey";
117 }
118 
119 $permissiontoreadhr = $user->hasRight('hrm', 'read_personal_information', 'read') || $user->hasRight('hrm', 'write_personal_information', 'write');
120 $permissiontowritehr = $user->hasRight('hrm', 'write_personal_information', 'write');
121 
122 // Definition of fields for list
123 $arrayfields = array(
124  'u.login'=>array('label'=>"Login", 'checked'=>1, 'position'=>10),
125  'u.lastname'=>array('label'=>"Lastname", 'checked'=>1, 'position'=>15),
126  'u.firstname'=>array('label'=>"Firstname", 'checked'=>1, 'position'=>20),
127  'u.entity'=>array('label'=>"Entity", 'checked'=>1, 'position'=>50, 'enabled'=>(isModEnabled('multicompany') && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))),
128  'u.gender'=>array('label'=>"Gender", 'checked'=>0, 'position'=>22),
129  'u.employee'=>array('label'=>"Employee", 'checked'=>($contextpage == 'employeelist' ? 1 : 0), 'position'=>25),
130  'u.fk_user'=>array('label'=>"HierarchicalResponsible", 'checked'=>1, 'position'=>27, 'csslist'=>'maxwidth150'),
131  'u.accountancy_code'=>array('label'=>"AccountancyCode", 'checked'=>0, 'position'=>30),
132  'u.office_phone'=>array('label'=>"PhonePro", 'checked'=>1, 'position'=>31),
133  'u.user_mobile'=>array('label'=>"PhoneMobile", 'checked'=>1, 'position'=>32),
134  'u.email'=>array('label'=>"EMail", 'checked'=>1, 'position'=>35),
135  'u.api_key'=>array('label'=>"ApiKey", 'checked'=>0, 'position'=>40, "enabled"=>(isModEnabled('api') && $user->admin)),
136  'u.fk_soc'=>array('label'=>"Company", 'checked'=>($contextpage == 'employeelist' ? 0 : 1), 'position'=>45),
137  'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>-1, 'position'=>60, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)),
138  'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>-1, 'position'=>61, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)),
139  'u.job'=>array('label'=>"PostOrFunction", 'checked'=>-1, 'position'=>50),
140  'u.salary'=>array('label'=>"Salary", 'checked'=>-1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall")), 'isameasure'=>1),
141  'u.datelastlogin'=>array('label'=>"LastConnexion", 'checked'=>1, 'position'=>100),
142  'u.datepreviouslogin'=>array('label'=>"PreviousConnexion", 'checked'=>0, 'position'=>110),
143  'u.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500),
144  'u.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500),
145  'u.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000),
146 );
147 // Extra fields
148 include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_array_fields.tpl.php';
149 
150 $object->fields = dol_sort_array($object->fields, 'position');
151 $arrayfields = dol_sort_array($arrayfields, 'position');
152 
153 // Init search fields
154 $search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
155 $search_user = GETPOST('search_user', 'alpha');
156 $search_login = GETPOST('search_login', 'alpha');
157 $search_lastname = GETPOST('search_lastname', 'alpha');
158 $search_firstname = GETPOST('search_firstname', 'alpha');
159 $search_gender = GETPOST('search_gender', 'alpha');
160 $search_employee = GETPOST('search_employee', 'alpha');
161 $search_accountancy_code = GETPOST('search_accountancy_code', 'alpha');
162 $search_phonepro = GETPOST('search_phonepro', 'alpha');
163 $search_phonemobile = GETPOST('search_phonemobile', 'alpha');
164 $search_email = GETPOST('search_email', 'alpha');
165 $search_api_key = GETPOST('search_api_key', 'alphanohtml');
166 $search_statut = GETPOST('search_statut', 'intcomma');
167 $search_thirdparty = GETPOST('search_thirdparty', 'alpha');
168 $search_job = GETPOST('search_job', 'alpha');
169 $search_warehouse = GETPOST('search_warehouse', 'alpha');
170 $search_supervisor = GETPOST('search_supervisor', 'intcomma');
171 $search_categ = GETPOST("search_categ", 'int');
172 $searchCategoryUserOperator = 0;
173 if (GETPOSTISSET('formfilteraction')) {
174  $searchCategoryUserOperator = GETPOSTINT('search_category_user_operator');
175 } elseif (!empty($conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT)) {
176  $searchCategoryUserOperator = $conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT;
177 }
178 $searchCategoryUserList = GETPOST('search_category_user_list', 'array');
179 $catid = GETPOST('catid', 'int');
180 if (!empty($catid) && empty($searchCategoryUserList)) {
181  $searchCategoryUserList = array($catid);
182 }
183 $catid = GETPOST('catid', 'int');
184 if (!empty($catid) && empty($search_categ)) {
185  $search_categ = $catid;
186 }
187 
188 // Default search
189 if ($search_statut == '') {
190  $search_statut = '1';
191 }
192 if ($contextpage == 'employeelist' && !GETPOSTISSET('search_employee')) {
193  $search_employee = 1;
194 }
195 
196 // Define value to know what current user can do on users
197 $permissiontoadd = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
198 $canreaduser = (!empty($user->admin) || $user->hasRight("user", "user", "read"));
199 $canedituser = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
200 $candisableuser = (!empty($user->admin) || $user->hasRight("user", "user", "delete"));
201 $canreadgroup = $canreaduser;
202 $caneditgroup = $canedituser;
203 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
204  $canreadgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "read"));
205  $caneditgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "write"));
206 }
207 
208 $error = 0;
209 
210 // Permission to list
211 if (isModEnabled('salaries') && $contextpage == 'employeelist' && $search_employee == 1) {
212  if (!$user->hasRight("salaries", "read")) {
213  accessforbidden();
214  }
215 } else {
216  if (!$user->hasRight("user", "user", "read") && empty($user->admin)) {
217  accessforbidden();
218  }
219 }
220 
221 $childids = $user->getAllChildIds(1);
222 
223 
224 /*
225  * Actions
226  */
227 
228 if (GETPOST('cancel', 'alpha')) {
229  $action = 'list';
230  $massaction = '';
231 }
232 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
233  $massaction = '';
234 }
235 
236 $parameters = array();
237 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
238 if ($reshook < 0) {
239  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
240 }
241 
242 if (empty($reshook)) {
243  // Selection of new fields
244  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
245 
246  // Purge search criteria
247  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
248  $search_user = "";
249  $search_login = "";
250  $search_lastname = "";
251  $search_firstname = "";
252  $search_gender = "";
253  $search_employee = "";
254  $search_accountancy_code = "";
255  $search_phonepro = "";
256  $search_phonemobile = "";
257  $search_email = "";
258  $search_statut = "";
259  $search_thirdparty = "";
260  $search_job = "";
261  $search_warehouse = "";
262  $search_supervisor = "";
263  $search_api_key = "";
264  $search_datelastlogin = "";
265  $search_datepreviouslogin = "";
266  $search_date_creation = "";
267  $search_date_update = "";
268  $search_categ = 0;
269  $toselect = array();
270  $search_array_options = array();
271  }
272  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
273  || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
274  $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
275  }
276 
277  // Mass actions
278  $objectclass = 'User';
279  $objectlabel = 'User';
280  $uploaddir = $conf->user->dir_output;
281  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
282 
283  // Disable or Enable records
284  if (!$error && ($massaction == 'disable' || $massaction == 'reactivate') && $permissiontoadd) {
285  $objecttmp = new User($db);
286 
287  if (!$error) {
288  $db->begin();
289 
290  $nbok = 0;
291  foreach ($toselect as $toselectid) {
292  if ($toselectid == $user->id) {
293  setEventMessages($langs->trans($massaction == 0 ? 'CantDisableYourself' : 'CanEnableYourself'), null, 'errors');
294  $error++;
295  break;
296  }
297 
298  $result = $objecttmp->fetch($toselectid);
299  if ($result > 0) {
300  if ($objecttmp->admin) {
301  setEventMessages($langs->trans($massaction == 0 ? 'CantDisableAnAdminUserWithMassActions' : 'CantEnableAnAdminUserWithMassActions', $objecttmp->login), null, 'errors');
302  $error++;
303  break;
304  }
305 
306  $result = $objecttmp->setstatus($massaction == 'disable' ? 0 : 1);
307  if ($result == 0) {
308  // Nothing is done
309  } elseif ($result < 0) {
310  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
311  $error++;
312  break;
313  } else {
314  $nbok++;
315  }
316  } else {
317  setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
318  $error++;
319  break;
320  }
321  }
322 
323  if (!$error && !empty($conf->file->main_limit_users)) {
324  $nb = $object->getNbOfUsers("active");
325  if ($nb >= $conf->file->main_limit_users) {
326  $error++;
327  setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
328  }
329  }
330 
331  if (!$error) {
332  if ($nbok > 1) {
333  setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
334  } else {
335  setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
336  }
337  $db->commit();
338  } else {
339  $db->rollback();
340  }
341  }
342  }
343 }
344 
345 
346 /*
347  * View
348  */
349 
350 $formother = new FormOther($db);
351 $user2 = new User($db);
352 
353 $now = dol_now();
354 
355 $help_url = 'EN:Module_Users|FR:Module_Utilisateurs|ES:M&oacute;dulo_Usuarios|DE:Modul_Benutzer';
356 if ($contextpage == 'employeelist' && $search_employee == 1) {
357  $title = $langs->trans("Employees");
358 } else {
359  $title = $langs->trans("Users");
360 }
361 $morejs = array();
362 $morecss = array();
363 $morehtmlright = "";
364 
365 // Build and execute select
366 // --------------------------------------------------------------------
367 $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.admin, u.fk_soc, u.login, u.office_phone, u.user_mobile, u.email, u.api_key, u.accountancy_code, u.gender, u.employee, u.photo,";
368 $sql .= " u.fk_user,";
369 $sql .= " u.ref_employee, u.national_registration_number, u.job, u.salary, u.datelastlogin, u.datepreviouslogin,";
370 $sql .= " u.datestartvalidity, u.dateendvalidity,";
371 $sql .= " u.ldap_sid, u.statut as status, u.entity,";
372 $sql .= " u.tms as date_update, u.datec as date_creation,";
373 $sql .= " u2.rowid as id2, u2.login as login2, u2.firstname as firstname2, u2.lastname as lastname2, u2.admin as admin2, u2.fk_soc as fk_soc2, u2.office_phone as ofice_phone2, u2.user_mobile as user_mobile2, u2.email as email2, u2.gender as gender2, u2.photo as photo2, u2.entity as entity2, u2.statut as status2,";
374 $sql .= " s.nom as name, s.canvas";
375 // Add fields from extrafields
376 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
377  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
378  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
379  }
380 }
381 // Add fields from hooks
382 $parameters = array();
383 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
384 $sql .= $hookmanager->resPrint;
385 $sql = preg_replace('/,\s*$/', '', $sql);
386 
387 $sqlfields = $sql; // $sql fields to remove for count total
388 
389 $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as u";
390 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
391  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (u.rowid = ef.fk_object)";
392 }
393 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON u.fk_soc = s.rowid";
394 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u2 ON u.fk_user = u2.rowid";
395 // Add table from hooks
396 $parameters = array();
397 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
398 $sql .= $hookmanager->resPrint;
399 if ($reshook > 0) {
400  $sql .= $hookmanager->resPrint;
401 }
402 $sql .= " WHERE u.entity IN (".getEntity($object->element).")";
403 if ($socid > 0) {
404  $sql .= " AND u.fk_soc = ".((int) $socid);
405 }
406 //if ($search_user != '') $sql.=natural_search(array('u.login', 'u.lastname', 'u.firstname'), $search_user);
407 if ($search_supervisor > 0) {
408  $sql .= " AND u.fk_user IN (".$db->sanitize($search_supervisor).")";
409 }
410 if ($search_thirdparty != '') {
411  $sql .= natural_search(array('s.nom'), $search_thirdparty);
412 }
413 if ($search_warehouse > 0) {
414  $sql .= natural_search(array('u.fk_warehouse'), $search_warehouse);
415 }
416 if ($search_login != '') {
417  $sql .= natural_search("u.login", $search_login);
418 }
419 if ($search_lastname != '') {
420  $sql .= natural_search("u.lastname", $search_lastname);
421 }
422 if ($search_firstname != '') {
423  $sql .= natural_search("u.firstname", $search_firstname);
424 }
425 if ($search_gender != '' && $search_gender != '-1') {
426  $sql .= " AND u.gender = '".$db->escape($search_gender)."'"; // Cannot use natural_search as looking for %man% also includes woman
427 }
428 if (is_numeric($search_employee) && $search_employee >= 0) {
429  $sql .= ' AND u.employee = '.(int) $search_employee;
430 }
431 if ($search_accountancy_code != '') {
432  $sql .= natural_search("u.accountancy_code", $search_accountancy_code);
433 }
434 if ($search_phonepro != '') {
435  $sql .= natural_search("u.office_phone", $search_phonepro);
436 }
437 if ($search_phonemobile != '') {
438  $sql .= natural_search("u.user_mobile", $search_phonemobile);
439 }
440 if ($search_email != '') {
441  $sql .= natural_search("u.email", $search_email);
442 }
443 if ($search_api_key != '') {
444  $sql .= natural_search("u.api_key", $search_api_key);
445 }
446 if ($search_job != '') {
447  $sql .= natural_search(array('u.job'), $search_job);
448 }
449 if ($search_statut != '' && $search_statut >= 0) {
450  $sql .= " AND u.statut IN (".$db->sanitize($search_statut).")";
451 }
452 if ($search_all) {
453  $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
454 }
455 // Search for tag/category ($searchCategoryUserList is an array of ID)
456 $searchCategoryUserList = array($search_categ);
457 if (!empty($searchCategoryUserList)) {
458  $searchCategoryUserSqlList = array();
459  $listofcategoryid = '';
460  foreach ($searchCategoryUserList as $searchCategoryUser) {
461  if (intval($searchCategoryUser) == -2) {
462  $searchCategoryUserSqlList[] = "NOT EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user)";
463  } elseif (intval($searchCategoryUser) > 0) {
464  if ($searchCategoryUserOperator == 0) {
465  $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie = ".((int) $searchCategoryUser).")";
466  } else {
467  $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryUser);
468  }
469  }
470  }
471  if ($listofcategoryid) {
472  $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
473  }
474  if ($searchCategoryUserOperator == 1) {
475  if (!empty($searchCategoryUserSqlList)) {
476  $sql .= " AND (".implode(' OR ', $searchCategoryUserSqlList).")";
477  }
478  } else {
479  if (!empty($searchCategoryUserSqlList)) {
480  $sql .= " AND (".implode(' AND ', $searchCategoryUserSqlList).")";
481  }
482  }
483 }
484 if ($search_warehouse > 0) {
485  $sql .= " AND u.fk_warehouse = ".((int) $search_warehouse);
486 }
487 if (isModEnabled('salaries') && $contextpage == 'employeelist' && !$user->hasRight("salaries", "readall")) {
488  $sql .= " AND u.rowid IN (".$db->sanitize(join(',', $childids)).")";
489 }
490 // Add where from extra fields
491 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
492 // Add where from hooks
493 $parameters = array();
494 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
495 $sql .= $hookmanager->resPrint;
496 
497 // Count total nb of records
498 $nbtotalofrecords = '';
499 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
500  /* The fast and low memory method to get and count full list converts the sql into a sql count */
501  $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
502  $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
503  $resql = $db->query($sqlforcount);
504  if ($resql) {
505  $objforcount = $db->fetch_object($resql);
506  $nbtotalofrecords = $objforcount->nbtotalofrecords;
507  } else {
508  dol_print_error($db);
509  }
510 
511  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
512  $page = 0;
513  $offset = 0;
514  }
515  $db->free($resql);
516 }
517 
518 // Complete request and execute it with limit
519 $sql .= $db->order($sortfield, $sortorder);
520 if ($limit) {
521  $sql .= $db->plimit($limit + 1, $offset);
522 }
523 
524 $resql = $db->query($sql);
525 if (!$resql) {
526  dol_print_error($db);
527  exit;
528 }
529 
530 $num = $db->num_rows($resql);
531 
532 // Direct jump if only one record found
533 if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
534  $obj = $db->fetch_object($resql);
535  $id = $obj->rowid;
536  header("Location: ".DOL_URL_ROOT.'/user/card.php?id='.$id);
537  exit;
538 }
539 
540 // Output page
541 // --------------------------------------------------------------------
542 
543 llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
544 
545 $arrayofselected = is_array($toselect) ? $toselect : array();
546 
547 $param = '';
548 if (!empty($mode)) {
549  $param .= '&amp;mode='.urlencode($mode);
550 }
551 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
552  $param .= '&amp;contextpage='.urlencode($contextpage);
553 }
554 if ($limit > 0 && $limit != $conf->liste_limit) {
555  $param .= '&amp;limit='.((int) $limit);
556 }
557 if ($search_all != '') {
558  $param .= '&amp;search_all='.urlencode($search_all);
559 }
560 if ($search_user != '') {
561  $param .= "&amp;search_user=".urlencode($search_user);
562 }
563 if ($search_login != '') {
564  $param .= "&amp;search_login=".urlencode($search_login);
565 }
566 if ($search_lastname != '') {
567  $param .= "&amp;search_lastname=".urlencode($search_lastname);
568 }
569 if ($search_firstname != '') {
570  $param .= "&amp;search_firstname=".urlencode($search_firstname);
571 }
572 if ($search_gender != '' && $search_gender != '-1') {
573  $param .= "&amp;search_gender=".urlencode($search_gender);
574 }
575 if ($search_employee != '' && $search_employee != '-1') {
576  $param .= "&amp;search_employee=".urlencode($search_employee);
577 }
578 if ($search_accountancy_code != '') {
579  $param .= "&amp;search_accountancy_code=".urlencode($search_accountancy_code);
580 }
581 if ($search_phonepro != '') {
582  $param .= "&amp;search_phonepro=".urlencode($search_phonepro);
583 }
584 if ($search_phonemobile != '') {
585  $param .= "&amp;search_phonemobile=".urlencode($search_phonemobile);
586 }
587 if ($search_email != '') {
588  $param .= "&amp;search_email=".urlencode($search_email);
589 }
590 if ($search_api_key != '') {
591  $param .= "&amp;search_api_key=".urlencode($search_api_key);
592 }
593 if ($search_supervisor > 0) {
594  $param .= "&amp;search_supervisor=".urlencode($search_supervisor);
595 }
596 if ($search_statut != '') {
597  $param .= "&amp;search_statut=".urlencode($search_statut);
598 }
599 if ($optioncss != '') {
600  $param .= '&amp;optioncss='.urlencode($optioncss);
601 }
602 if ($search_categ > 0) {
603  $param .= '&amp;search_categ='.urlencode($search_categ);
604 }
605 if ($search_warehouse > 0) {
606  $param .= '&amp;search_warehouse='.urlencode($search_warehouse);
607 }
608 // Add $param from extra fields
609 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
610 
611 // List of mass actions available
612 $arrayofmassactions = array();
613 if ($permissiontoadd) {
614  $arrayofmassactions['disable'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("DisableUser");
615 }
616 if ($permissiontoadd) {
617  $arrayofmassactions['reactivate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Reactivate");
618 }
619 if (isModEnabled('category') && $permissiontoadd) {
620  $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
621 }
622 if ($permissiontoadd) {
623  $arrayofmassactions['presetsupervisor'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("SetSupervisor");
624 }
625 //if ($permissiontodelete) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
626 
627 if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'presetsupervisor'))) {
628  $arrayofmassactions = array();
629 }
630 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
631 
632 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
633 if ($optioncss != '') {
634  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
635 }
636 print '<input type="hidden" name="token" value="'.newToken().'">';
637 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
638 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
639 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
640 print '<input type="hidden" name="page" value="'.$page.'">';
641 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
642 print '<input type="hidden" name="page_y" value="">';
643 print '<input type="hidden" name="mode" value="'.$mode.'">';
644 
645 $url = DOL_URL_ROOT.'/user/card.php?action=create'.($contextpage == 'employeelist' ? '&search_employee=1' : '').'&leftmenu=';
646 if (!empty($socid)) {
647  $url .= '&socid='.urlencode($socid);
648 }
649 
650 $newcardbutton = '';
651 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars paddingleft imgforviewmode', DOL_URL_ROOT.'/user/list.php?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
652 $newcardbutton .= dolGetButtonTitle($langs->trans('HierarchicView'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/user/hierarchy.php?mode=hierarchy'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', (($mode == 'hierarchy') ? 2 : 1), array('morecss'=>'reposition'));
653 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
654 $newcardbutton .= dolGetButtonTitleSeparator();
655 $newcardbutton .= dolGetButtonTitle($langs->trans('NewUser'), '', 'fa fa-plus-circle', $url, '', $permissiontoadd);
656 
657 /*$moreparam = array('morecss'=>'btnTitleSelected');
658 $morehtmlright = dolGetButtonTitle($langs->trans("List"), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/user/list.php'.(($search_statut != '' && $search_statut >= 0) ? '?search_statut='.$search_statut : ''), '', 1, $moreparam);
659 $moreparam = array('morecss'=>'marginleftonly');
660 $morehtmlright .= dolGetButtonTitle($langs->trans("HierarchicView"), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/user/hierarchy.php'.(($search_statut != '' && $search_statut >= 0) ? '?search_statut='.$search_statut : ''), '', 1, $moreparam);
661 */
662 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'user', 0, $morehtmlright.' '.$newcardbutton, '', $limit, 0, 0, 1);
663 
664 
665 
666 // Add code for pre mass action (confirmation or email presend form)
667 $topicmail = "SendUserRef";
668 $modelmail = "user";
669 $objecttmp = new User($db);
670 $trackid = 'use'.$object->id;
671 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
672 
673 if (!empty($catid)) {
674  print "<div id='ways'>";
675  $c = new Categorie($db);
676  $ways = $c->print_all_ways(' &gt; ', 'user/list.php');
677  print " &gt; ".$ways[0]."<br>\n";
678  print "</div><br>";
679 }
680 
681 if ($search_all) {
682  foreach ($fieldstosearchall as $key => $val) {
683  $fieldstosearchall[$key] = $langs->trans($val);
684  }
685  print '<!-- Search done like if USER_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
686  print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'</div>';
687 }
688 
689 $moreforfilter = '';
690 /*$moreforfilter.='<div class="divsearchfield">';
691  $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
692  $moreforfilter.= '</div>';*/
693 
694 // Filter on categories
695 if (isModEnabled('categorie') && $user->hasRight("categorie", "read")) {
696  $moreforfilter .= '<div class="divsearchfield">';
697  $tmptitle = $langs->trans('Category');
698  $moreforfilter .= img_picto($langs->trans("Category"), 'category', 'class="pictofixedwidth"').$formother->select_categories(Categorie::TYPE_USER, $search_categ, 'search_categ', 1, $tmptitle);
699  $moreforfilter .= '</div>';
700 }
701 // Filter on warehouse
702 if (isModEnabled('stock') && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER)) {
703  require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
704  $formproduct = new FormProduct($db);
705  $moreforfilter .= '<div class="divsearchfield">';
706  $tmptitle = $langs->trans('Warehouse');
707  $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', $tmptitle, 0, 0, $tmptitle);
708  $moreforfilter .= '</div>';
709 }
710 
711 $parameters = array();
712 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
713 if (empty($reshook)) {
714  $moreforfilter .= $hookmanager->resPrint;
715 } else {
716  $moreforfilter = $hookmanager->resPrint;
717 }
718 
719 if (!empty($moreforfilter)) {
720  print '<div class="liste_titre liste_titre_bydiv centpercent">';
721  print $moreforfilter;
722  print '</div>';
723 }
724 
725 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
726 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
727 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
728 
729 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
730 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
731 
732 // Fields title search
733 // --------------------------------------------------------------------
734 print '<tr class="liste_titre_filter">';
735 // Action column
736 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
737  print '<td class="liste_titre center maxwidthsearch">';
738  $searchpicto = $form->showFilterButtons('left');
739  print $searchpicto;
740  print '</td>';
741 }
742 if (!empty($arrayfields['u.login']['checked'])) {
743  print '<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.$search_login.'"></td>';
744 }
745 if (!empty($arrayfields['u.lastname']['checked'])) {
746  print '<td class="liste_titre"><input type="text" name="search_lastname" class="maxwidth50" value="'.$search_lastname.'"></td>';
747 }
748 if (!empty($arrayfields['u.firstname']['checked'])) {
749  print '<td class="liste_titre"><input type="text" name="search_firstname" class="maxwidth50" value="'.$search_firstname.'"></td>';
750 }
751 if (!empty($arrayfields['u.gender']['checked'])) {
752  print '<td class="liste_titre center">';
753  $arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother"));
754  print $form->selectarray('search_gender', $arraygender, $search_gender, 1);
755  print '</td>';
756 }
757 if (!empty($arrayfields['u.employee']['checked'])) {
758  print '<td class="liste_titre">';
759  print $form->selectyesno('search_employee', $search_employee, 1, false, 1);
760  print '</td>';
761 }
762 // Supervisor
763 if (!empty($arrayfields['u.fk_user']['checked'])) {
764  print '<td class="liste_titre">';
765  print $form->select_dolusers($search_supervisor, 'search_supervisor', 1, array(), 0, '', 0, 0, 0, 0, '', 0, '', 'maxwidth125');
766  print '</td>';
767 }
768 if (!empty($arrayfields['u.accountancy_code']['checked'])) {
769  print '<td class="liste_titre"><input type="text" name="search_accountancy_code" class="maxwidth50" value="'.$search_accountancy_code.'"></td>';
770 }
771 if (!empty($arrayfields['u.office_phone']['checked'])) {
772  print '<td class="liste_titre"><input type="text" name="search_phonepro" class="maxwidth50" value="'.$search_phonepro.'"></td>';
773 }
774 if (!empty($arrayfields['u.user_mobile']['checked'])) {
775  print '<td class="liste_titre"><input type="text" name="search_phonemobile" class="maxwidth50" value="'.$search_phonemobile.'"></td>';
776 }
777 if (!empty($arrayfields['u.email']['checked'])) {
778  print '<td class="liste_titre"><input type="text" name="search_email" class="maxwidth75" value="'.$search_email.'"></td>';
779 }
780 if (!empty($arrayfields['u.api_key']['checked'])) {
781  print '<td class="liste_titre"><input type="text" name="search_api_key" class="maxwidth50" value="'.$search_api_key.'"></td>';
782 }
783 if (!empty($arrayfields['u.fk_soc']['checked'])) {
784  print '<td class="liste_titre"><input type="text" name="search_thirdparty" class="maxwidth75" value="'.$search_thirdparty.'"></td>';
785 }
786 if (!empty($arrayfields['u.entity']['checked'])) {
787  print '<td class="liste_titre"></td>';
788 }
789 if (!empty($arrayfields['u.ref_employee']['checked'])) {
790  print '<td class="liste_titre"></td>';
791 }
792 if (!empty($arrayfields['u.national_registration_number']['checked'])) {
793  print '<td class="liste_titre"></td>';
794 }
795 if (!empty($arrayfields['u.job']['checked'])) {
796  print '<td class="liste_titre"><input type="text" name="search_job" class="maxwidth75" value="'.$search_job.'"></td>';
797 }
798 if (!empty($arrayfields['u.salary']['checked'])) {
799  print '<td class="liste_titre"></td>';
800 }
801 if (!empty($arrayfields['u.datelastlogin']['checked'])) {
802  print '<td class="liste_titre"></td>';
803 }
804 if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
805  print '<td class="liste_titre"></td>';
806 }
807 // Extra fields
808 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
809 // Fields from hook
810 $parameters = array('arrayfields'=>$arrayfields);
811 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
812 print $hookmanager->resPrint;
813 if (!empty($arrayfields['u.datec']['checked'])) {
814  // Date creation
815  print '<td class="liste_titre">';
816  print '</td>';
817 }
818 if (!empty($arrayfields['u.tms']['checked'])) {
819  // Date modification
820  print '<td class="liste_titre">';
821  print '</td>';
822 }
823 if (!empty($arrayfields['u.statut']['checked'])) {
824  // Status
825  print '<td class="liste_titre center parentonrightofpage">';
826  print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
827  print '</td>';
828 }
829 // Action column
830 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
831  print '<td class="liste_titre maxwidthsearch">';
832  $searchpicto = $form->showFilterButtons();
833  print $searchpicto;
834  print '</td>';
835 }
836 print '</tr>'."\n";
837 
838 $totalarray = array();
839 $totalarray['nbfield'] = 0;
840 
841 // Fields title label
842 // --------------------------------------------------------------------
843 print '<tr class="liste_titre">';
844 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
845  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
846  $totalarray['nbfield']++;
847 }
848 if (!empty($arrayfields['u.login']['checked'])) {
849  print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER['PHP_SELF'], "u.login", $param, "", "", $sortfield, $sortorder);
850  $totalarray['nbfield']++;
851 }
852 if (!empty($arrayfields['u.lastname']['checked'])) {
853  print_liste_field_titre("Lastname", $_SERVER['PHP_SELF'], "u.lastname", $param, "", "", $sortfield, $sortorder);
854  $totalarray['nbfield']++;
855 }
856 if (!empty($arrayfields['u.firstname']['checked'])) {
857  print_liste_field_titre("FirstName", $_SERVER['PHP_SELF'], "u.firstname", $param, "", "", $sortfield, $sortorder);
858  $totalarray['nbfield']++;
859 }
860 if (!empty($arrayfields['u.gender']['checked'])) {
861  print_liste_field_titre("Gender", $_SERVER['PHP_SELF'], "u.gender", $param, "", "", $sortfield, $sortorder, 'center ');
862  $totalarray['nbfield']++;
863 }
864 if (!empty($arrayfields['u.employee']['checked'])) {
865  print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.employee", $param, "", "", $sortfield, $sortorder, 'center ');
866  $totalarray['nbfield']++;
867 }
868 if (!empty($arrayfields['u.fk_user']['checked'])) {
869  print_liste_field_titre("HierarchicalResponsible", $_SERVER['PHP_SELF'], "u.fk_user", $param, "", "", $sortfield, $sortorder);
870  $totalarray['nbfield']++;
871 }
872 if (!empty($arrayfields['u.accountancy_code']['checked'])) {
873  print_liste_field_titre("AccountancyCode", $_SERVER['PHP_SELF'], "u.accountancy_code", $param, "", "", $sortfield, $sortorder);
874  $totalarray['nbfield']++;
875 }
876 if (!empty($arrayfields['u.office_phone']['checked'])) {
877  print_liste_field_titre("PhonePro", $_SERVER['PHP_SELF'], "u.office_phone", $param, "", "", $sortfield, $sortorder);
878  $totalarray['nbfield']++;
879 }
880 if (!empty($arrayfields['u.user_mobile']['checked'])) {
881  print_liste_field_titre("PhoneMobile", $_SERVER['PHP_SELF'], "u.user_mobile", $param, "", "", $sortfield, $sortorder);
882  $totalarray['nbfield']++;
883 }
884 if (!empty($arrayfields['u.email']['checked'])) {
885  print_liste_field_titre("EMail", $_SERVER['PHP_SELF'], "u.email", $param, "", "", $sortfield, $sortorder);
886  $totalarray['nbfield']++;
887 }
888 if (!empty($arrayfields['u.api_key']['checked'])) {
889  print_liste_field_titre("ApiKey", $_SERVER['PHP_SELF'], "u.api_key", $param, "", "", $sortfield, $sortorder);
890  $totalarray['nbfield']++;
891 }
892 if (!empty($arrayfields['u.fk_soc']['checked'])) {
893  print_liste_field_titre("Company", $_SERVER['PHP_SELF'], "u.fk_soc", $param, "", "", $sortfield, $sortorder);
894  $totalarray['nbfield']++;
895 }
896 if (!empty($arrayfields['u.entity']['checked'])) {
897  print_liste_field_titre($arrayfields['u.entity']['label'], $_SERVER['PHP_SELF'], "u.entity", $param, "", "", $sortfield, $sortorder);
898  $totalarray['nbfield']++;
899 }
900 if (!empty($arrayfields['u.job']['checked'])) {
901  print_liste_field_titre($arrayfields['u.job']['label'], $_SERVER['PHP_SELF'], "u.job", $param, "", "", $sortfield, $sortorder);
902  $totalarray['nbfield']++;
903 }
904 if (!empty($arrayfields['u.ref_employee']['checked'])) {
905  print_liste_field_titre("RefEmployee", $_SERVER['PHP_SELF'], "u.ref_employee", $param, "", "", $sortfield, $sortorder);
906  $totalarray['nbfield']++;
907 }
908 if (!empty($arrayfields['u.national_registration_number']['checked'])) {
909  print_liste_field_titre("NationalRegistrationNumber", $_SERVER['PHP_SELF'], "u.national_registration_number", $param, "", "", $sortfield, $sortorder);
910  $totalarray['nbfield']++;
911 }
912 if (!empty($arrayfields['u.salary']['checked'])) {
913  print_liste_field_titre("Salary", $_SERVER['PHP_SELF'], "u.salary", $param, "", "", $sortfield, $sortorder, 'right ');
914  $totalarray['nbfield']++;
915 }
916 if (!empty($arrayfields['u.datelastlogin']['checked'])) {
917  print_liste_field_titre("LastConnexion", $_SERVER['PHP_SELF'], "u.datelastlogin", $param, "", '', $sortfield, $sortorder, 'center ');
918  $totalarray['nbfield']++;
919 }
920 if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
921  print_liste_field_titre("PreviousConnexion", $_SERVER['PHP_SELF'], "u.datepreviouslogin", $param, "", '', $sortfield, $sortorder, 'center ');
922  $totalarray['nbfield']++;
923 }
924 // Extra fields
925 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
926 // Hook fields
927 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
928 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
929 print $hookmanager->resPrint;
930 if (!empty($arrayfields['u.datec']['checked'])) {
931  print_liste_field_titre("DateCreationShort", $_SERVER["PHP_SELF"], "u.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
932  $totalarray['nbfield']++;
933 }
934 if (!empty($arrayfields['u.tms']['checked'])) {
935  print_liste_field_titre("DateModificationShort", $_SERVER["PHP_SELF"], "u.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
936  $totalarray['nbfield']++;
937 }
938 if (!empty($arrayfields['u.statut']['checked'])) {
939  print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "u.statut", "", $param, '', $sortfield, $sortorder, 'center ');
940  $totalarray['nbfield']++;
941 }
942 // Action column
943 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
944  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
945  $totalarray['nbfield']++;
946 }
947 print '</tr>'."\n";
948 
949 
950 // Detect if we need a fetch on each output line
951 $needToFetchEachLine = 0;
952 if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
953  foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
954  if (!is_null($val) && preg_match('/\$object/', $val)) {
955  $needToFetchEachLine++; // There is at least one compute field that use $object
956  }
957  }
958 }
959 
960 
961 // Loop on record
962 // --------------------------------------------------------------------
963 $i = 0;
964 $savnbfield = $totalarray['nbfield'];
965 $totalarray = array('val'=>array('u.salary'=>0));
966 $totalarray['nbfield'] = 0;
967 $imaxinloop = ($limit ? min($num, $limit) : $num);
968 while ($i < $imaxinloop) {
969  $obj = $db->fetch_object($resql);
970  if (empty($obj)) {
971  break; // Should not happen
972  }
973 
974  if (empty($obj->country_code)) {
975  $obj->country_code = ''; // TODO Add join in select with country table to get country_code
976  }
977 
978  // Store properties in $object
979  $object->setVarsFromFetchObj($obj);
980 
981  $object->id = $obj->rowid;
982  $object->admin = $obj->admin;
983  $object->ref = $obj->rowid;
984  $object->login = $obj->login;
985  $object->statut = $obj->status;
986  $object->status = $obj->status;
987  $object->office_phone = $obj->office_phone;
988  $object->user_mobile = $obj->user_mobile;
989  $object->job = $obj->job;
990  $object->email = $obj->email;
991  $object->gender = $obj->gender;
992  $object->socid = $obj->fk_soc;
993  $object->firstname = $obj->firstname;
994  $object->lastname = $obj->lastname;
995  $object->employee = $obj->employee;
996  $object->photo = $obj->photo;
997  $object->datestartvalidity = $db->jdate($obj->datestartvalidity);
998  $object->dateendvalidity = $db->jdate($obj->dateendvalidity);
999 
1000  $li = $object->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1);
1001 
1002  $canreadhrmdata = 0;
1003  if ((isModEnabled('salaries') && $user->hasRight("salaries", "read") && in_array($obj->rowid, $childids))
1004  || (isModEnabled('salaries') && $user->hasRight("salaries", "readall"))
1005  || (isModEnabled('hrm') && $user->hasRight("hrm", "employee", "read"))) {
1006  $canreadhrmdata = 1;
1007  }
1008  $canreadsecretapi = 0;
1009  if ($user->id == $obj->rowid || !empty($user->admin)) { // Current user or admin
1010  $canreadsecretapi = 1;
1011  }
1012 
1013  if ($mode == 'kanban') {
1014  if ($i == 0) {
1015  print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1016  print '<div class="box-flex-container kanban">';
1017  }
1018 
1019  // Output Kanban
1020  print $object->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
1021  if ($i == ($imaxinloop - 1)) {
1022  print '</div>';
1023  print '</td></tr>';
1024  }
1025  } else {
1026  // Show here line of result
1027  $j = 0;
1028  print '<tr data-rowid="'.$object->id.'" class="oddeven">';
1029  // Action column
1030  if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1031  print '<td class="nowrap center">';
1032  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1033  $selected = 0;
1034  if (in_array($object->id, $arrayofselected)) {
1035  $selected = 1;
1036  }
1037  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
1038  }
1039  print '</td>';
1040  if (!$i) {
1041  $totalarray['nbfield']++;
1042  }
1043  }
1044  // Login
1045  if (!empty($arrayfields['u.login']['checked'])) {
1046  print '<td class="nowraponall tdoverflowmax150">';
1047  print $li;
1048  if (isModEnabled('multicompany') && $obj->admin && !$obj->entity) {
1049  print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright paddingleft"');
1050  } elseif ($obj->admin) {
1051  print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright paddingleft"');
1052  }
1053  print '</td>';
1054  if (!$i) {
1055  $totalarray['nbfield']++;
1056  }
1057  }
1058  if (!empty($arrayfields['u.lastname']['checked'])) {
1059  print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).'">'.dol_escape_htmltag($obj->lastname).'</td>';
1060  if (!$i) {
1061  $totalarray['nbfield']++;
1062  }
1063  }
1064  if (!empty($arrayfields['u.firstname']['checked'])) {
1065  print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).'">'.dol_escape_htmltag($obj->firstname).'</td>';
1066  if (!$i) {
1067  $totalarray['nbfield']++;
1068  }
1069  }
1070  if (!empty($arrayfields['u.gender']['checked'])) {
1071  print '<td class="center">';
1072  if ($obj->gender) {
1073  // Preparing gender's display if there is one
1074  $addgendertxt = '';
1075  switch ($obj->gender) {
1076  case 'man':
1077  $addgendertxt .= '<i class="fas fa-mars" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1078  break;
1079  case 'woman':
1080  $addgendertxt .= '<i class="fas fa-venus" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1081  break;
1082  case 'other':
1083  $addgendertxt .= '<i class="fas fa-transgender" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1084  break;
1085  }
1086  print $addgendertxt;
1087  //print $langs->trans("Gender".$obj->gender);
1088  }
1089  print '</td>';
1090  if (!$i) {
1091  $totalarray['nbfield']++;
1092  }
1093  }
1094  // Employee yes/no
1095  if (!empty($arrayfields['u.employee']['checked'])) {
1096  print '<td class="center">'.yn($obj->employee).'</td>';
1097  if (!$i) {
1098  $totalarray['nbfield']++;
1099  }
1100  }
1101 
1102  // Supervisor
1103  if (!empty($arrayfields['u.fk_user']['checked'])) {
1104  print '<td class="tdoverflowmax125">';
1105  if ($obj->login2) {
1106  $user2->id = $obj->id2;
1107  $user2->login = $obj->login2;
1108  $user2->lastname = $obj->lastname2;
1109  $user2->firstname = $obj->firstname2;
1110  $user2->gender = $obj->gender2;
1111  $user2->photo = $obj->photo2;
1112  $user2->admin = $obj->admin2;
1113  $user2->office_phone = $obj->office_phone;
1114  $user2->user_mobile = $obj->user_mobile;
1115  $user2->email = $obj->email2;
1116  $user2->socid = $obj->fk_soc2;
1117  $user2->statut = $obj->status2;
1118  $user2->status = $obj->status2;
1119  if (isModEnabled('multicompany') && $obj->admin2 && !$obj->entity2) {
1120  print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright"');
1121  } elseif ($obj->admin2) {
1122  print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright"');
1123  }
1124  print $user2->getNomUrl(-1, '', 0, 0, 24, 0, '', '', 1);
1125  }
1126  print '</td>';
1127  if (!$i) {
1128  $totalarray['nbfield']++;
1129  }
1130  }
1131 
1132  if (!empty($arrayfields['u.accountancy_code']['checked'])) {
1133  print '<td>'.$obj->accountancy_code.'</td>';
1134  if (!$i) {
1135  $totalarray['nbfield']++;
1136  }
1137  }
1138 
1139  // Phone
1140  if (!empty($arrayfields['u.office_phone']['checked'])) {
1141  print '<td class="tdoverflowmax125">'.dol_print_phone($obj->office_phone, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')."</td>\n";
1142  if (!$i) {
1143  $totalarray['nbfield']++;
1144  }
1145  }
1146  if (!empty($arrayfields['u.user_mobile']['checked'])) {
1147  print '<td class="tdoverflowmax125">'.dol_print_phone($obj->user_mobile, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'mobile')."</td>\n";
1148  if (!$i) {
1149  $totalarray['nbfield']++;
1150  }
1151  }
1152  if (!empty($arrayfields['u.email']['checked'])) {
1153  print '<td class="tdoverflowmax150">'.dol_print_email($obj->email, $obj->rowid, $obj->fk_soc, 'AC_EMAIL', 0, 0, 1)."</td>\n";
1154  if (!$i) {
1155  $totalarray['nbfield']++;
1156  }
1157  }
1158  if (!empty($arrayfields['u.api_key']['checked'])) {
1159  $api_key = dolDecrypt($obj->api_key);
1160  print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($api_key).'">';
1161  if ($api_key) {
1162  if ($canreadsecretapi) {
1163  print '<span class="opacitymedium">';
1164  print showValueWithClipboardCPButton($object->api_key, 1, dol_trunc($api_key, 3)); // TODO Add an option to also reveal the hash, not only copy paste
1165  print '</span>';
1166  } else {
1167  print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
1168  }
1169  }
1170  print '</td>';
1171  if (!$i) {
1172  $totalarray['nbfield']++;
1173  }
1174  }
1175  if (!empty($arrayfields['u.fk_soc']['checked'])) {
1176  print '<td class="tdoverflowmax150">';
1177  if ($obj->fk_soc > 0) {
1178  $companystatic->id = $obj->fk_soc;
1179  $companystatic->name = $obj->name;
1180  $companystatic->canvas = $obj->canvas;
1181  print $companystatic->getNomUrl(1);
1182  } elseif ($obj->ldap_sid) {
1183  print '<span class="opacitymedium">'.$langs->trans("DomainUser").'</span>';
1184  } else {
1185  print '<span class="opacitymedium">'.$langs->trans("InternalUser").'</span>';
1186  }
1187  print '</td>';
1188  if (!$i) {
1189  $totalarray['nbfield']++;
1190  }
1191  }
1192  // Multicompany enabled
1193  if (isModEnabled('multicompany') && is_object($mc) && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1194  if (!empty($arrayfields['u.entity']['checked'])) {
1195  if (!$obj->entity) {
1196  $labeltouse = $langs->trans("AllEntities");
1197  } else {
1198  $mc->getInfo($obj->entity);
1199  $labeltouse = $mc->label;
1200  }
1201  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltouse).'">';
1202  print $labeltouse;
1203  print '</td>';
1204  if (!$i) {
1205  $totalarray['nbfield']++;
1206  }
1207  }
1208  }
1209 
1210  // Ref employee
1211  if (!empty($arrayfields['u.ref_employee']['checked'])) {
1212  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->ref_employee).'">';
1213  print dol_escape_htmltag($obj->ref_employee);
1214  print '</td>';
1215  if (!$i) {
1216  $totalarray['nbfield']++;
1217  }
1218  }
1219  // National number
1220  if (!empty($arrayfields['u.national_registration_number']['checked'])) {
1221  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->national_registration_number).'">';
1222  print dol_escape_htmltag($obj->national_registration_number);
1223  print '</td>';
1224  if (!$i) {
1225  $totalarray['nbfield']++;
1226  }
1227  }
1228  // Job position
1229  if (!empty($arrayfields['u.job']['checked'])) {
1230  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->job).'">';
1231  print dol_escape_htmltag($obj->job);
1232  print '</td>';
1233  if (!$i) {
1234  $totalarray['nbfield']++;
1235  }
1236  }
1237 
1238  // Salary
1239  if (!empty($arrayfields['u.salary']['checked'])) {
1240  print '<td class="nowraponall right amount">';
1241  if ($obj->salary) {
1242  if ($canreadhrmdata) {
1243  print price($obj->salary);
1244  } else {
1245  print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
1246  }
1247  }
1248  print '</td>';
1249  if (!$i) {
1250  $totalarray['nbfield']++;
1251  }
1252  if (!$i) {
1253  $totalarray['pos'][$totalarray['nbfield']] = 'u.salary';
1254  }
1255  if (!isset($totalarray['val'])) {
1256  $totalarray['val'] = array();
1257  }
1258  if (!isset($totalarray['val']['u.salary'])) {
1259  $totalarray['val']['u.salary'] = 0;
1260  }
1261  $totalarray['val']['u.salary'] += $obj->salary;
1262  }
1263 
1264  // Date last login
1265  if (!empty($arrayfields['u.datelastlogin']['checked'])) {
1266  print '<td class="nowrap center">'.dol_print_date($db->jdate($obj->datelastlogin), "dayhour").'</td>';
1267  if (!$i) {
1268  $totalarray['nbfield']++;
1269  }
1270  }
1271  // Date previous login
1272  if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
1273  print '<td class="nowrap center">'.dol_print_date($db->jdate($obj->datepreviouslogin), "dayhour").'</td>';
1274  if (!$i) {
1275  $totalarray['nbfield']++;
1276  }
1277  }
1278 
1279  // Extra fields
1280  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1281  // Fields from hook
1282  $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1283  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
1284  print $hookmanager->resPrint;
1285  // Date creation
1286  if (!empty($arrayfields['u.datec']['checked'])) {
1287  print '<td class="center nowraponall">';
1288  print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1289  print '</td>';
1290  if (!$i) {
1291  $totalarray['nbfield']++;
1292  }
1293  }
1294  // Date modification
1295  if (!empty($arrayfields['u.tms']['checked'])) {
1296  print '<td class="center nowraponall">';
1297  print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
1298  print '</td>';
1299  if (!$i) {
1300  $totalarray['nbfield']++;
1301  }
1302  }
1303  // Status
1304  if (!empty($arrayfields['u.statut']['checked'])) {
1305  print '<td class="center">'.$object->getLibStatut(5).'</td>';
1306  if (!$i) {
1307  $totalarray['nbfield']++;
1308  }
1309  }
1310  // Action column
1311  if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1312  print '<td class="nowrap center">';
1313  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1314  $selected = 0;
1315  if (in_array($object->id, $arrayofselected)) {
1316  $selected = 1;
1317  }
1318  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
1319  }
1320  print '</td>';
1321  if (!$i) {
1322  $totalarray['nbfield']++;
1323  }
1324  }
1325 
1326  print '</tr>'."\n";
1327  }
1328 
1329  $i++;
1330 }
1331 
1332 // Show total line
1333 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1334 
1335 // If no record found
1336 if ($num == 0) {
1337  $colspan = 1;
1338  foreach ($arrayfields as $key => $val) {
1339  if (!empty($val['checked'])) {
1340  $colspan++;
1341  }
1342  }
1343  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1344 }
1345 
1346 
1347 $db->free($resql);
1348 
1349 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1350 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1351 print $hookmanager->resPrint;
1352 
1353 print '</table>'."\n";
1354 print '</div>'."\n";
1355 
1356 print '</form>'."\n";
1357 
1358 
1359 // End of page
1360 llxFooter();
1361 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage categories.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:48
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dolDecrypt($chain, $key='')
Decode a string with a symetric encryption.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.