dolibarr 21.0.3
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 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024 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
36// Load Dolibarr environment
37require '../main.inc.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/asset/class/asset.class.php';
42
43// Load translation files required by the page
44$langs->loadLangs(array("assets", "other"));
45
46// Get parameters
47$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
48$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
49$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
50$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
51$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
52$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
53$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'assetlist'; // To manage different context of search
54$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
55$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
56$mode = GETPOST('mode', 'aZ'); // The display mode ('list', 'kanban', 'hierarchy', 'calendar', 'gantt', ...)
57$groupby = GETPOST('groupby', 'aZ09'); // Example: $groupby = 'p.fk_opp_status' or $groupby = 'p.fk_statut'
58
59$id = GETPOSTINT('id');
60
61// Load variable for pagination
62$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
63$sortfield = GETPOST('sortfield', 'aZ09comma');
64$sortorder = GETPOST('sortorder', 'aZ09comma');
65$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
66if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
67 // If $page is not defined, or '' or -1 or if we click on clear filters
68 $page = 0;
69}
70$offset = $limit * $page;
71$pageprev = $page - 1;
72$pagenext = $page + 1;
73
74// Initialize technical objects
75$object = new Asset($db);
76$extrafields = new ExtraFields($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($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
135$object->fields = dol_sort_array($object->fields, 'position');
136$arrayfields = dol_sort_array($arrayfields, 'position');
137
138$permissiontoread = $user->hasRight('asset', 'read');
139$permissiontoadd = $user->hasRight('asset', 'write');
140$permissiontodelete = $user->hasRight('asset', 'delete');
141
142// Security check
143if (!isModEnabled('asset')) {
144 accessforbidden('Module not enabled');
145}
146
147// Security check (enable the most restrictive one)
148if ($user->socid > 0) {
150}
151$socid = 0;
152if ($user->socid > 0) {
153 $socid = $user->socid;
154}
155$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
156restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
157if (!isModEnabled('asset')) {
159}
160if (!$permissiontoread) {
162}
163
164
165
166/*
167 * Actions
168 */
169
170if (GETPOST('cancel', 'alpha')) {
171 $action = 'list';
172 $massaction = '';
173}
174if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
175 $massaction = '';
176}
177
178$parameters = array('arrayfields' => &$arrayfields);
179$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
180if ($reshook < 0) {
181 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
182}
183
184if (empty($reshook)) {
185 // Selection of new fields
186 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
187
188 // Purge search criteria
189 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
190 foreach ($object->fields as $key => $val) {
191 $search[$key] = '';
192 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
193 $search[$key.'_dtstart'] = '';
194 $search[$key.'_dtend'] = '';
195 }
196 }
197 $search_all = '';
198 $toselect = array();
199 $search_array_options = array();
200 }
201 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
202 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
203 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
204 }
205
206 // Mass actions
207 $objectclass = 'Asset';
208 $objectlabel = 'Asset';
209 $uploaddir = $conf->asset->dir_output;
210
211 global $error;
212 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
213}
214
215
216
217/*
218 * View
219 */
220
221$form = new Form($db);
222
223$now = dol_now();
224
225$help_url = '';
226$title = $langs->trans('ListOf', $langs->transnoentitiesnoconv("Assets"));
227$morejs = array();
228$morecss = array();
229
230
231// Build and execute select
232// --------------------------------------------------------------------
233$sql = "SELECT";
234$sql .= " ".$object->getFieldList('t');
235// Add fields from extrafields
236if (!empty($extrafields->attributes[$object->table_element]['label'])) {
237 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
238 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
239 }
240}
241// Add fields from hooks
242$parameters = array();
243$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
244$sql .= $hookmanager->resPrint;
245$sql = preg_replace('/,\s*$/', '', $sql);
246
247$sqlfields = $sql; // $sql fields to remove for count total
248
249$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
250if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
251 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
252}
253// Add table from hooks
254$parameters = array();
255$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
256$sql .= $hookmanager->resPrint;
257if ($object->ismultientitymanaged == 1) {
258 $sql .= " WHERE t.entity IN (".getEntity($object->element, (GETPOSTINT('search_current_entity') ? 0 : 1)).")";
259} else {
260 $sql .= " WHERE 1 = 1";
261}
262foreach ($search as $key => $val) {
263 if (array_key_exists($key, $object->fields)) {
264 if ($key == 'status' && $search[$key] == -1) {
265 continue;
266 }
267 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
268 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
269 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
270 $search[$key] = '';
271 }
272 $mode_search = 2;
273 }
274 if (empty($object->fields[$key]['searchmulti'])) {
275 if (!is_array($search[$key]) && $search[$key] != '') {
276 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
277 }
278 } else {
279 if (is_array($search[$key]) && !empty($search[$key])) {
280 $sql .= natural_search("t.".$db->escape($key), implode(',', $search[$key]), (($key == 'status') ? 2 : $mode_search));
281 }
282 }
283 } else {
284 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
285 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
286 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
287 if (preg_match('/_dtstart$/', $key)) {
288 $sql .= " AND t.".$db->sanitize($columnName)." >= '".$db->idate($search[$key])."'";
289 }
290 if (preg_match('/_dtend$/', $key)) {
291 $sql .= " AND t.".$db->sanitize($columnName)." <= '".$db->idate($search[$key])."'";
292 }
293 }
294 }
295 }
296}
297if ($search_all) {
298 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
299}
300//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
301// Add where from extra fields
302include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
303// Add where from hooks
304$parameters = array();
305$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
306$sql .= $hookmanager->resPrint;
307
308/* If a group by is required
309$sql .= " GROUP BY ";
310foreach($object->fields as $key => $val) {
311 $sql .= "t.".$db->sanitize($key).", ";
312}
313// Add fields from extrafields
314if (!empty($extrafields->attributes[$object->table_element]['label'])) {
315 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
316 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
317 }
318}
319// Add groupby from hooks
320$parameters = array();
321$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
322$sql .= $hookmanager->resPrint;
323$sql = preg_replace('/,\s*$/', '', $sql);
324*/
325
326// Add HAVING from hooks
327/*
328$parameters = array();
329$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
330$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
331*/
332
333// Count total nb of records
334$nbtotalofrecords = '';
335if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
336 /* The fast and low memory method to get and count full list converts the sql into a sql count */
337 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
338 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
339 $resql = $db->query($sqlforcount);
340 if ($resql) {
341 $objforcount = $db->fetch_object($resql);
342 $nbtotalofrecords = $objforcount->nbtotalofrecords;
343 } else {
344 dol_print_error($db);
345 }
346
347 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
348 $page = 0;
349 $offset = 0;
350 }
351 $db->free($resql);
352}
353
354// Complete request and execute it with limit
355$sql .= $db->order($sortfield, $sortorder);
356if ($limit) {
357 $sql .= $db->plimit($limit + 1, $offset);
358}
359
360$resql = $db->query($sql);
361if (!$resql) {
362 dol_print_error($db);
363 exit;
364}
365
366$num = $db->num_rows($resql);
367
368
369// Direct jump if only one record found
370if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
371 $obj = $db->fetch_object($resql);
372 $id = $obj->rowid;
373 header("Location: ".DOL_URL_ROOT.'/asset/card.php?id='.((int) $id));
374 exit;
375}
376
377
378// Output page
379// --------------------------------------------------------------------
380
381llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'mod-asset page-list bodyforlist');
382
383$arrayofselected = is_array($toselect) ? $toselect : array();
384
385$param = '';
386if (!empty($mode)) {
387 $param .= '&mode='.urlencode($mode);
388}
389if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
390 $param .= '&contextpage='.urlencode($contextpage);
391}
392if ($limit > 0 && $limit != $conf->liste_limit) {
393 $param .= '&limit='.((int) $limit);
394}
395if ($optioncss != '') {
396 $param .= '&optioncss='.urlencode($optioncss);
397}
398if ($groupby != '') {
399 $param .= '&groupby='.urlencode($groupby);
400}
401foreach ($search as $key => $val) {
402 if (is_array($search[$key])) {
403 foreach ($search[$key] as $skey) {
404 if ($skey != '') {
405 $param .= '&search_'.$key.'[]='.urlencode($skey);
406 }
407 }
408 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
409 $param .= '&search_'.$key.'month='.GETPOSTINT('search_'.$key.'month');
410 $param .= '&search_'.$key.'day='.GETPOSTINT('search_'.$key.'day');
411 $param .= '&search_'.$key.'year='.GETPOSTINT('search_'.$key.'year');
412 } elseif ($search[$key] != '') {
413 $param .= '&search_'.$key.'='.urlencode($search[$key]);
414 }
415}
416// Add $param from extra fields
417include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
418// Add $param from hooks
419$parameters = array('param' => &$param);
420$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
421$param .= $hookmanager->resPrint;
422
423// List of mass actions available
424$arrayofmassactions = array(
425 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
426 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
427 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
428 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
429);
430if (!empty($permissiontodelete)) {
431 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
432}
433if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
434 $arrayofmassactions = array();
435}
436$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
437
438print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
439if ($optioncss != '') {
440 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
441}
442print '<input type="hidden" name="token" value="'.newToken().'">';
443print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
444print '<input type="hidden" name="action" value="list">';
445print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
446print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
447print '<input type="hidden" name="page" value="'.$page.'">';
448print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
449print '<input type="hidden" name="page_y" value="">';
450print '<input type="hidden" name="mode" value="'.$mode.'">';
451
452
453$newcardbutton = '';
454$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/asset/card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
455
456print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
457
458// Add code for pre mass action (confirmation or email presend form)
459$topicmail = "SendAssetRef";
460$modelmail = "asset";
461$objecttmp = new Asset($db);
462$trackid = 'asset'.$object->id;
463include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
464
465if ($search_all) {
466 $setupstring = '';
467 // @phan-suppress-next-line PhanEmptyForeach
468 foreach ($fieldstosearchall as $key => $val) {
469 $fieldstosearchall[$key] = $langs->trans($val);
470 $setupstring .= $key."=".$val.";";
471 }
472 print '<!-- Search done like if ASSET_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
473 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
474}
475
476$moreforfilter = '';
477/*$moreforfilter.='<div class="divsearchfield">';
478$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
479$moreforfilter.= '</div>';*/
480
481$parameters = array();
482$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
483if (empty($reshook)) {
484 $moreforfilter .= $hookmanager->resPrint;
485} else {
486 $moreforfilter = $hookmanager->resPrint;
487}
488$parameters = array(
489 'arrayfields' => &$arrayfields,
490);
491
492if (!empty($moreforfilter)) {
493 print '<div class="liste_titre liste_titre_bydiv centpercent">';
494 print $moreforfilter;
495 print '</div>';
496}
497
498$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
499$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields
500$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
501$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
502
503print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
504print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
505
506
507// Fields title search
508// --------------------------------------------------------------------
509print '<tr class="liste_titre_filter">';
510// Action column
511if ($conf->main_checkbox_left_column) {
512 print '<td class="liste_titre center maxwidthsearch">';
513 $searchpicto = $form->showFilterButtons('left');
514 print $searchpicto;
515 print '</td>';
516}
517foreach ($object->fields as $key => $val) {
518 //$searchkey = empty($search[$key]) ? '' : $search[$key];
519 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
520 if ($key == 'status') {
521 $cssforfield .= ($cssforfield ? ' ' : '').'center';
522 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
523 $cssforfield .= ($cssforfield ? ' ' : '').'center';
524 } elseif (in_array($val['type'], array('timestamp'))) {
525 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
526 } 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'])) {
527 $cssforfield .= ($cssforfield ? ' ' : '').'right';
528 }
529 if (!empty($arrayfields['t.'.$key]['checked'])) {
530 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
531 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
532 if (empty($val['searchmulti'])) {
533 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);
534 } else {
535 print $form->multiselectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 0, 0, 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
536 }
537 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
538 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
539 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
540 print '<div class="nowrap">';
541 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
542 print '</div>';
543 print '<div class="nowrap">';
544 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
545 print '</div>';
546 } elseif ($key == 'lang') {
547 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
548 $formadmin = new FormAdmin($db);
549 print $formadmin->select_language((isset($search[$key]) ? $search[$key] : ''), 'search_lang', 0, array(), 1, 0, 0, 'minwidth100imp maxwidth125', 2);
550 } else {
551 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] : '').'">';
552 }
553 print '</td>';
554 }
555}
556// Extra fields
557include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
558
559// Fields from hook
560$parameters = array('arrayfields' => $arrayfields);
561$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
562print $hookmanager->resPrint;
563// Action column
564if (!$conf->main_checkbox_left_column) {
565 print '<td class="liste_titre center maxwidthsearch">';
566 $searchpicto = $form->showFilterButtons();
567 print $searchpicto;
568 print '</td>';
569}
570print '</tr>'."\n";
571
572$totalarray = array();
573$totalarray['nbfield'] = 0;
574
575// Fields title label
576// --------------------------------------------------------------------
577print '<tr class="liste_titre">';
578// Action column
579if ($conf->main_checkbox_left_column) {
580 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
581 $totalarray['nbfield']++;
582}
583foreach ($object->fields as $key => $val) {
584 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
585 if ($key == 'status') {
586 $cssforfield .= ($cssforfield ? ' ' : '').'center';
587 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
588 $cssforfield .= ($cssforfield ? ' ' : '').'center';
589 } elseif (in_array($val['type'], array('timestamp'))) {
590 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
591 } 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'])) {
592 $cssforfield .= ($cssforfield ? ' ' : '').'right';
593 }
594 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
595 if (!empty($arrayfields['t.'.$key]['checked'])) {
596 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";
597 $totalarray['nbfield']++;
598 }
599}
600// Extra fields
601include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
602// Hook fields
603$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
604$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
605print $hookmanager->resPrint;
606// Action column
607if (!$conf->main_checkbox_left_column) {
608 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
609 $totalarray['nbfield']++;
610}
611print '</tr>'."\n";
612
613
614// Detect if we need a fetch on each output line
615$needToFetchEachLine = 0;
616if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
617 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
618 if (!is_null($val) && preg_match('/\$object/', $val)) {
619 $needToFetchEachLine++; // There is at least one compute field that use $object
620 }
621 }
622}
623
624
625// Loop on record
626// --------------------------------------------------------------------
627$i = 0;
628$savnbfield = $totalarray['nbfield'];
629$totalarray = array();
630$totalarray['nbfield'] = 0;
631$imaxinloop = ($limit ? min($num, $limit) : $num);
632while ($i < $imaxinloop) {
633 $obj = $db->fetch_object($resql);
634 if (empty($obj)) {
635 break; // Should not happen
636 }
637
638 // Store properties in $object
639 $object->setVarsFromFetchObj($obj);
640
641 // Show line of result
642 $j = 0;
643 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
644
645 // Action column
646 if ($conf->main_checkbox_left_column) {
647 print '<td class="nowrap center">';
648 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
649 $selected = 0;
650 if (in_array($object->id, $arrayofselected)) {
651 $selected = 1;
652 }
653 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
654 }
655 print '</td>';
656 if (!$i) {
657 $totalarray['nbfield']++;
658 }
659 }
660 // Fields
661 foreach ($object->fields as $key => $val) {
662 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
663 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
664 $cssforfield .= ($cssforfield ? ' ' : '').'center';
665 } elseif ($key == 'status') {
666 $cssforfield .= ($cssforfield ? ' ' : '').'center';
667 }
668
669 if (in_array($val['type'], array('timestamp'))) {
670 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
671 } elseif ($key == 'ref') {
672 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
673 }
674
675 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'])) {
676 $cssforfield .= ($cssforfield ? ' ' : '').'right';
677 }
678 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
679
680 if (!empty($arrayfields['t.'.$key]['checked'])) {
681 print '<td'.($cssforfield ? ' class="'.$cssforfield.((preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key)) ? ' classfortooltip' : '').'"' : '');
682 if (preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key) && !in_array($key, array('ref'))) {
683 print ' title="'.dol_escape_htmltag($object->$key).'"';
684 }
685 print '>';
686 if ($key == 'status') {
687 print $object->getLibStatut(5);
688 } elseif ($key == 'rowid') {
689 print $object->showOutputField($val, $key, $object->id, '');
690 } else {
691 print $object->showOutputField($val, $key, $object->$key, '');
692 }
693 print '</td>';
694 if (!$i) {
695 $totalarray['nbfield']++;
696 }
697 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
698 if (!$i) {
699 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
700 }
701 if (!isset($totalarray['val'])) {
702 $totalarray['val'] = array();
703 }
704 if (!isset($totalarray['val']['t.'.$key])) {
705 $totalarray['val']['t.'.$key] = 0;
706 }
707 $totalarray['val']['t.'.$key] += $object->$key;
708 }
709 }
710 }
711 // Extra fields
712 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
713 // Fields from hook
714 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
715 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
716 print $hookmanager->resPrint;
717 // Action column
718 if (empty($conf->main_checkbox_left_column)) {
719 print '<td class="nowrap center">';
720 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
721 $selected = 0;
722 if (in_array($object->id, $arrayofselected)) {
723 $selected = 1;
724 }
725 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
726 }
727 print '</td>';
728 if (!$i) {
729 $totalarray['nbfield']++;
730 }
731 }
732
733 print '</tr>'."\n";
734
735 $i++;
736}
737
738// Show total line
739include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
740
741// If no record found
742if ($num == 0) {
743 $colspan = 1;
744 foreach ($arrayfields as $key => $val) {
745 if (!empty($val['checked'])) {
746 $colspan++;
747 }
748 }
749 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
750}
751
752
753$db->free($resql);
754
755$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
756$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
757print $hookmanager->resPrint;
758
759print '</table>'."\n";
760print '</div>'."\n";
761
762print '</form>'."\n";
763
764if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
765 $hidegeneratedfilelistifempty = 1;
766 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
767 $hidegeneratedfilelistifempty = 0;
768 }
769
770 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
771 $formfile = new FormFile($db);
772
773 // Show list of available documents
774 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
775 $urlsource .= str_replace('&amp;', '&', $param);
776
777 $filedir = $diroutputmassaction;
778 $genallowed = $permissiontoread;
779 $delallowed = $permissiontoadd;
780
781 print $formfile->showdocuments('massfilesarea_asset', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
782}
783
784// End of page
785llxFooter();
786$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:87
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:71
Class for Asset.
Class to manage standard extra fields.
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.
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...
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)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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...
dol_now($mode='auto')
Return date for now.
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...
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
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.