dolibarr 25.0.0-alpha
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2018-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
4 * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
5 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.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
29require '../main.inc.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/asset/class/asset.class.php';
43
44// Load translation files required by the page
45$langs->loadLangs(array("assets", "other"));
46
47// Get parameters
48$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
49$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
50$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
51$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
52$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
53$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
54$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'assetlist'; // To manage different context of search
55$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
56$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
57$mode = GETPOST('mode', 'aZ'); // The display mode ('list', 'kanban', 'hierarchy', 'calendar', 'gantt', ...)
58$groupby = GETPOST('groupby', 'aZ09'); // Example: $groupby = 'p.fk_opp_status' or $groupby = 'p.fk_statut'
59
60$id = GETPOSTINT('id');
61
62// Load variable for pagination
63$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
64$sortfield = GETPOST('sortfield', 'aZ09comma');
65$sortorder = GETPOST('sortorder', 'aZ09comma');
66$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
67if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
68 // If $page is not defined, or '' or -1 or if we click on clear filters
69 $page = 0;
70}
71$offset = $limit * $page;
72$pageprev = $page - 1;
73$pagenext = $page + 1;
74
75// Initialize technical objects
76$object = new Asset($db);
77$diroutputmassaction = $conf->asset->dir_output.'/temp/massgeneration/'.$user->id;
78$hookmanager->initHooks(array($contextpage)); // Note that conf->hooks_modules contains array
79
80// Fetch optionals attributes and labels
81$extrafields->fetch_name_optionals_label($object->table_element);
82//$extrafields->fetch_name_optionals_label($object->table_element_line);
83
84$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
85
86// Default sort order (if not yet defined by previous GETPOST)
87if (!$sortfield) {
88 reset($object->fields); // Reset is required to avoid key() to return null.
89 $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
90}
91if (!$sortorder) {
92 $sortorder = "ASC";
93}
94
95// Initialize array of search criteria
96$search_all = trim(GETPOST('search_all', 'alphanohtml'));
97$search = array();
98foreach ($object->fields as $key => $val) {
99 if (GETPOST('search_'.$key, 'alpha') !== '') {
100 $search[$key] = GETPOST('search_'.$key, 'alpha');
101 }
102 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
103 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
104 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
105 }
106}
107
108// List of fields to search into when doing a "search in all"
109$fieldstosearchall = array();
110foreach ($object->fields as $key => $val) {
111 if (!empty($val['searchall'])) {
112 $fieldstosearchall['t.'.$key] = $val['label'];
113 }
114}
115
116// Definition of array of fields for columns
117$tableprefix = 't';
118$arrayfields = array();
119foreach ($object->fields as $key => $val) {
120 // If $val['visible']==0, then we never show the field
121 if (!empty($val['visible'])) {
122 $visible = (int) dol_eval((string) $val['visible'], 1);
123 $arrayfields[$tableprefix.'.'.$key] = array(
124 'label' => $val['label'],
125 'checked' => (($visible < 0) ? 0 : 1),
126 'enabled' => (abs($visible) != 3 && (bool) dol_eval((string) $val['enabled'], 1)),
127 'position' => $val['position'],
128 'help' => isset($val['help']) ? $val['help'] : ''
129 );
130 }
131}
132// Extra fields
133include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
134// Add hook to complete $arrayfield
135$parameters = array('arrayfields' => &$arrayfields);
136$reshook = $hookmanager->executeHooks('completeArrayFields', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
137
138$object->fields = dol_sort_array($object->fields, 'position');
139$arrayfields = dol_sort_array($arrayfields, 'position');
140
141$permissiontoread = $user->hasRight('asset', 'read');
142$permissiontoadd = $user->hasRight('asset', 'write');
143$permissiontodelete = $user->hasRight('asset', 'delete');
144
145// Security check
146if (!isModEnabled('asset')) {
147 accessforbidden('Module not enabled');
148}
149
150// Security check (enable the most restrictive one)
151if ($user->socid > 0) {
153}
154$socid = 0;
155if ($user->socid > 0) {
156 $socid = $user->socid;
157}
158$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
159restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
160if (!isModEnabled('asset')) {
162}
163if (!$permissiontoread) {
165}
166
167
168
169/*
170 * Actions
171 */
172
173if (GETPOST('cancel', 'alpha')) {
174 $action = 'list';
175 $massaction = '';
176}
177if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
178 $massaction = '';
179}
180
181$parameters = array('arrayfields' => &$arrayfields);
182$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
183if ($reshook < 0) {
184 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
185}
186
187if (empty($reshook)) {
188 // Selection of new fields
189 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
190
191 // Purge search criteria
192 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
193 foreach ($object->fields as $key => $val) {
194 $search[$key] = '';
195 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
196 $search[$key.'_dtstart'] = '';
197 $search[$key.'_dtend'] = '';
198 }
199 }
200 $search_all = '';
201 $toselect = array();
202 $search_array_options = array();
203 }
204 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
205 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
206 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
207 }
208
209 // Mass actions
210 $objectclass = 'Asset';
211 $objectlabel = 'Asset';
212 $uploaddir = $conf->asset->dir_output;
213
214 global $error;
215 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
216}
217
218
219
220/*
221 * View
222 */
223
224$form = new Form($db);
225
226$now = dol_now();
227
228$help_url = '';
229$title = $langs->trans('ListOf', $langs->transnoentitiesnoconv("Assets"));
230$morejs = array();
231$morecss = array();
232
233
234// Build and execute select
235// --------------------------------------------------------------------
236$sql = "SELECT";
237$sql .= " ".$object->getFieldList('t');
238// Add fields from extrafields
239if (!empty($extrafields->attributes[$object->table_element]['label'])) {
240 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
241 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
242 }
243}
244// Add fields from hooks
245$parameters = array();
246$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
247$sql .= $hookmanager->resPrint;
248$sql = preg_replace('/,\s*$/', '', $sql);
249
250$sqlfields = $sql; // $sql fields to remove for count total
251
252$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
253if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
254 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
255}
256// Add table from hooks
257$parameters = array();
258$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
259$sql .= $hookmanager->resPrint;
260if ($object->ismultientitymanaged == 1) {
261 $sql .= " WHERE t.entity IN (".getEntity($object->element, (GETPOSTINT('search_current_entity') ? 0 : 1)).")";
262} else {
263 $sql .= " WHERE 1 = 1";
264}
265foreach ($search as $key => $val) {
266 if (array_key_exists($key, $object->fields)) {
267 if ($key == 'status' && $search[$key] == -1) {
268 continue;
269 }
270 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
271 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
272 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
273 $search[$key] = '';
274 }
275 $mode_search = 2;
276 }
277 if (empty($object->fields[$key]['searchmulti'])) {
278 if (!is_array($search[$key]) && $search[$key] != '') {
279 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
280 }
281 } else {
282 if (is_array($search[$key]) && !empty($search[$key])) {
283 $sql .= natural_search("t.".$db->escape($key), implode(',', $search[$key]), (($key == 'status') ? 2 : $mode_search));
284 }
285 }
286 } else {
287 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
288 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
289 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
290 if (preg_match('/_dtstart$/', $key)) {
291 $sql .= " AND t.".$db->sanitize($columnName)." >= '".$db->idate($search[$key])."'";
292 }
293 if (preg_match('/_dtend$/', $key)) {
294 $sql .= " AND t.".$db->sanitize($columnName)." <= '".$db->idate($search[$key])."'";
295 }
296 }
297 }
298 }
299}
300if ($search_all) {
301 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
302}
303//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
304// Add where from extra fields
305include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
306// Add where from hooks
307$parameters = array();
308$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
309$sql .= $hookmanager->resPrint;
310
311// Count total nb of records
312$nbtotalofrecords = '';
313if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
314 /* The fast and low memory method to get and count full list converts the sql into a sql count */
315 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
316 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
317 $resql = $db->query($sqlforcount);
318 if ($resql) {
319 $objforcount = $db->fetch_object($resql);
320 $nbtotalofrecords = $objforcount->nbtotalofrecords;
321 } else {
323 }
324
325 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
326 $page = 0;
327 $offset = 0;
328 }
329 $db->free($resql);
330}
331
332// Complete request and execute it with limit
333$sql .= $db->order($sortfield, $sortorder);
334if ($limit) {
335 $sql .= $db->plimit($limit + 1, $offset);
336}
337
338$resql = $db->query($sql);
339if (!$resql) {
341 exit;
342}
343
344$num = $db->num_rows($resql);
345
346
347// Direct jump if only one record found
348if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
349 $obj = $db->fetch_object($resql);
350 $id = $obj->rowid;
351 header("Location: ".DOL_URL_ROOT.'/asset/card.php?id='.((int) $id));
352 exit;
353}
354
355
356// Output page
357// --------------------------------------------------------------------
358
359llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'mod-asset page-list bodyforlist');
360
361$arrayofselected = is_array($toselect) ? $toselect : array();
362
363$param = '';
364if (!empty($mode)) {
365 $param .= '&mode='.urlencode($mode);
366}
367if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
368 $param .= '&contextpage='.urlencode($contextpage);
369}
370if ($limit > 0 && $limit != $conf->liste_limit) {
371 $param .= '&limit='.((int) $limit);
372}
373if ($optioncss != '') {
374 $param .= '&optioncss='.urlencode($optioncss);
375}
376if ($groupby != '') {
377 $param .= '&groupby='.urlencode($groupby);
378}
379foreach ($search as $key => $val) {
380 if (is_array($search[$key])) {
381 foreach ($search[$key] as $skey) {
382 if ($skey != '') {
383 $param .= '&search_'.$key.'[]='.urlencode($skey);
384 }
385 }
386 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
387 $param .= '&search_'.$key.'month='.GETPOSTINT('search_'.$key.'month');
388 $param .= '&search_'.$key.'day='.GETPOSTINT('search_'.$key.'day');
389 $param .= '&search_'.$key.'year='.GETPOSTINT('search_'.$key.'year');
390 } elseif ($search[$key] != '') {
391 $param .= '&search_'.$key.'='.urlencode($search[$key]);
392 }
393}
394// Add $param from extra fields
395include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
396// Add $param from hooks
397$parameters = array('param' => &$param);
398$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
399$param .= $hookmanager->resPrint;
400
401// List of mass actions available
402$arrayofmassactions = array(
403 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
404 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
405 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
406 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
407);
408if (!empty($permissiontodelete)) {
409 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
410}
411if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
412 $arrayofmassactions = array();
413}
414$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
415
416print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
417if ($optioncss != '') {
418 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
419}
420print '<input type="hidden" name="token" value="'.newToken().'">';
421print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
422print '<input type="hidden" name="action" value="list">';
423print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
424print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
425print '<input type="hidden" name="page" value="'.$page.'">';
426print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
427print '<input type="hidden" name="page_y" value="">';
428print '<input type="hidden" name="mode" value="'.$mode.'">';
429
430
431$newcardbutton = '';
432$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/asset/card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
433
434print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
435
436// Add code for pre mass action (confirmation or email presend form)
437$topicmail = "SendAssetRef";
438$modelmail = "asset";
439$objecttmp = new Asset($db);
440$trackid = 'asset'.$object->id;
441include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
442
443if ($search_all) {
444 $setupstring = '';
445 // @phan-suppress-next-line PhanEmptyForeach
446 foreach ($fieldstosearchall as $key => $val) {
447 $fieldstosearchall[$key] = $langs->trans($val);
448 $setupstring .= $key."=".$val.";";
449 }
450 print '<!-- Search done like if ASSET_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
451 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
452}
453
454$moreforfilter = '';
455/*$moreforfilter.='<div class="divsearchfield">';
456$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
457$moreforfilter.= '</div>';*/
458
459$parameters = array();
460$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
461if (empty($reshook)) {
462 $moreforfilter .= $hookmanager->resPrint;
463} else {
464 $moreforfilter = $hookmanager->resPrint;
465}
466$parameters = array(
467 'arrayfields' => &$arrayfields,
468);
469
470if (!empty($moreforfilter)) {
471 print '<div class="liste_titre liste_titre_bydiv centpercent">';
472 print $moreforfilter;
473 print '</div>';
474}
475
476$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
477$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column ? 'left' : ''); // This also change content of $arrayfields
478$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
479$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
480
481print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
482print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
483
484
485// Fields title search
486// --------------------------------------------------------------------
487print '<tr class="liste_titre_filter">';
488// Action column
489if ($conf->main_checkbox_left_column) {
490 print '<td class="liste_titre center maxwidthsearch">';
491 $searchpicto = $form->showFilterButtons('left');
492 print $searchpicto;
493 print '</td>';
494}
495foreach ($object->fields as $key => $val) {
496 //$searchkey = empty($search[$key]) ? '' : $search[$key];
497 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
498 if ($key == 'status') {
499 $cssforfield .= ($cssforfield ? ' ' : '').'center';
500 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
501 $cssforfield .= ($cssforfield ? ' ' : '').'center';
502 } elseif (in_array($val['type'], array('timestamp'))) {
503 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
504 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
505 $cssforfield .= ($cssforfield ? ' ' : '').'right';
506 }
507 if (!empty($arrayfields['t.'.$key]['checked'])) {
508 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
509 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
510 if (empty($val['searchmulti'])) {
511 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 1, 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
512 } else {
513 print $form->multiselectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 0, 0, 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
514 }
515 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
516 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
517 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
518 print '<div class="nowrap">';
519 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
520 print '</div>';
521 print '<div class="nowrap">';
522 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
523 print '</div>';
524 } elseif ($key == 'lang') {
525 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
526 $formadmin = new FormAdmin($db);
527 print $formadmin->select_language((isset($search[$key]) ? $search[$key] : ''), 'search_lang', 0, array(), 1, 0, 0, 'minwidth100imp maxwidth125', 2);
528 } else {
529 print '<input type="text" class="flat maxwidth'.(in_array($val['type'], array('integer', 'price')) ? '50' : '75').'" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
530 }
531 print '</td>';
532 }
533}
534// Extra fields
535include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
536
537// Fields from hook
538$parameters = array('arrayfields' => $arrayfields);
539$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
540print $hookmanager->resPrint;
541// Action column
542if (!$conf->main_checkbox_left_column) {
543 print '<td class="liste_titre center maxwidthsearch">';
544 $searchpicto = $form->showFilterButtons();
545 print $searchpicto;
546 print '</td>';
547}
548print '</tr>'."\n";
549
550$totalarray = array();
551$totalarray['nbfield'] = 0;
552
553// Fields title label
554// --------------------------------------------------------------------
555print '<tr class="liste_titre">';
556// Action column
557if ($conf->main_checkbox_left_column) {
558 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
559 $totalarray['nbfield']++;
560}
561foreach ($object->fields as $key => $val) {
562 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
563 if ($key == 'status') {
564 $cssforfield .= ($cssforfield ? ' ' : '').'center';
565 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
566 $cssforfield .= ($cssforfield ? ' ' : '').'center';
567 } elseif (in_array($val['type'], array('timestamp'))) {
568 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
569 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
570 $cssforfield .= ($cssforfield ? ' ' : '').'right';
571 }
572 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
573 if (!empty($arrayfields['t.'.$key]['checked'])) {
574 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n";
575 $totalarray['nbfield']++;
576 }
577}
578// Extra fields
579include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
580// Hook fields
581$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
582$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
583print $hookmanager->resPrint;
584// Action column
585if (!$conf->main_checkbox_left_column) {
586 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
587 $totalarray['nbfield']++;
588}
589print '</tr>'."\n";
590
591
592// Detect if we need a fetch on each output line
593$needToFetchEachLine = 0;
594if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
595 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
596 if (!is_null($val) && preg_match('/\$object/', $val)) {
597 $needToFetchEachLine++; // There is at least one compute field that use $object
598 }
599 }
600}
601
602
603// Loop on record
604// --------------------------------------------------------------------
605$i = 0;
606$savnbfield = $totalarray['nbfield'];
607$totalarray = array();
608$totalarray['nbfield'] = 0;
609$imaxinloop = ($limit ? min($num, $limit) : $num);
610while ($i < $imaxinloop) {
611 $obj = $db->fetch_object($resql);
612 if (empty($obj)) {
613 break; // Should not happen
614 }
615
616 // Store properties in $object
617 $object->setVarsFromFetchObj($obj);
618
619 // Show line of result
620 $j = 0;
621 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
622
623 // Action column
624 if ($conf->main_checkbox_left_column) {
625 print '<td class="nowrap center">';
626 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
627 $selected = 0;
628 if (in_array($object->id, $arrayofselected)) {
629 $selected = 1;
630 }
631 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
632 }
633 print '</td>';
634 if (!$i) {
635 $totalarray['nbfield']++;
636 }
637 }
638 // Fields
639 foreach ($object->fields as $key => $val) {
640 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
641 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
642 $cssforfield .= ($cssforfield ? ' ' : '').'center';
643 } elseif ($key == 'status') {
644 $cssforfield .= ($cssforfield ? ' ' : '').'center';
645 }
646
647 if (in_array($val['type'], array('timestamp'))) {
648 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
649 } elseif ($key == 'ref') {
650 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
651 }
652
653 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && empty($val['arrayofkeyval'])) {
654 $cssforfield .= ($cssforfield ? ' ' : '').'right';
655 }
656 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
657
658 if (!empty($arrayfields['t.'.$key]['checked'])) {
659 print '<td'.($cssforfield ? ' class="'.$cssforfield.((preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key)) ? ' classfortooltip' : '').'"' : '');
660 if (preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key) && !in_array($key, array('ref'))) {
661 print ' title="'.dol_escape_htmltag((string) $object->$key).'"';
662 }
663 print '>';
664 if ($key == 'status') {
665 print $object->getLibStatut(5);
666 } elseif ($key == 'rowid') {
667 print $object->showOutputField($val, $key, (string) $object->id, '');
668 } else {
669 print $object->showOutputField($val, $key, $object->$key, '');
670 }
671 print '</td>';
672 if (!$i) {
673 $totalarray['nbfield']++;
674 }
675 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
676 if (!$i) {
677 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
678 }
679 if (!isset($totalarray['val'])) {
680 $totalarray['val'] = array();
681 }
682 if (!isset($totalarray['val']['t.'.$key])) {
683 $totalarray['val']['t.'.$key] = 0;
684 }
685 $totalarray['val']['t.'.$key] += $object->$key;
686 }
687 }
688 }
689 // Extra fields
690 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
691 // Fields from hook
692 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
693 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
694 print $hookmanager->resPrint;
695 // Action column
696 if (empty($conf->main_checkbox_left_column)) {
697 print '<td class="nowrap center">';
698 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
699 $selected = 0;
700 if (in_array($object->id, $arrayofselected)) {
701 $selected = 1;
702 }
703 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
704 }
705 print '</td>';
706 if (!$i) {
707 $totalarray['nbfield']++;
708 }
709 }
710
711 print '</tr>'."\n";
712
713 $i++;
714}
715
716// Show total line
717include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
718
719// If no record found
720if ($num == 0) {
721 $colspan = 1;
722 foreach ($arrayfields as $key => $val) {
723 if (!empty($val['checked'])) {
724 $colspan++;
725 }
726 }
727 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
728}
729
730
731$db->free($resql);
732
733$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
734$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
735print $hookmanager->resPrint;
736
737print '</table>'."\n";
738print '</div>'."\n";
739
740print '</form>'."\n";
741
742if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
743 $hidegeneratedfilelistifempty = 1;
744 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
745 $hidegeneratedfilelistifempty = 0;
746 }
747
748 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
749 $formfile = new FormFile($db);
750
751 // Show list of available documents
752 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
753 $urlsource .= str_replace('&amp;', '&', $param);
754
755 $filedir = $diroutputmassaction;
756 $genallowed = $permissiontoread;
757 $delallowed = $permissiontoadd;
758
759 print $formfile->showdocuments('massfilesarea_asset', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
760}
761
762// End of page
763llxFooter();
764$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:501
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class for Asset.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
isModEnabled($module)
Is Dolibarr module enabled.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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...
Definition html.lib.php:172
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.