dolibarr 21.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 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27// Load Dolibarr environment
28require '../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
31require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/asset/class/asset.class.php';
33
34// Load translation files required by the page
35$langs->loadLangs(array("assets", "other"));
36
37// Get parameters
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 = GETPOSTINT('show_files'); // 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') : 'assetlist'; // 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', 'alpha'); // mode view (kanban or common)
48$id = GETPOSTINT('id');
49
50// Load variable for pagination
51$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
52$sortfield = GETPOST('sortfield', 'aZ09comma');
53$sortorder = GETPOST('sortorder', 'aZ09comma');
54$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
55if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) {
56 $page = 0;
57} // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action
58$offset = $limit * $page;
59$pageprev = $page - 1;
60$pagenext = $page + 1;
61
62// Initialize a technical objects
63$object = new Asset($db);
64$extrafields = new ExtraFields($db);
65$diroutputmassaction = $conf->asset->dir_output.'/temp/massgeneration/'.$user->id;
66$hookmanager->initHooks(array('assetlist')); // Note that conf->hooks_modules contains array
67
68// Fetch optionals attributes and labels
69$extrafields->fetch_name_optionals_label($object->table_element);
70//$extrafields->fetch_name_optionals_label($object->table_element_line);
71
72$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
73
74// Default sort order (if not yet defined by previous GETPOST)
75if (!$sortfield) {
76 reset($object->fields); // Reset is required to avoid key() to return null.
77 $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
78}
79if (!$sortorder) {
80 $sortorder = "ASC";
81}
82
83// Initialize array of search criteria
84$search_all = GETPOST('search_all', 'alphanohtml');
85$search = array();
86foreach ($object->fields as $key => $val) {
87 if (GETPOST('search_'.$key, 'alpha') !== '') {
88 $search[$key] = GETPOST('search_'.$key, 'alpha');
89 }
90 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
91 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
92 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
93 }
94}
95
96// List of fields to search into when doing a "search in all"
97$fieldstosearchall = array();
98foreach ($object->fields as $key => $val) {
99 if (!empty($val['searchall'])) {
100 $fieldstosearchall['t.'.$key] = $val['label'];
101 }
102}
103
104// Definition of array of fields for columns
105$arrayfields = array();
106foreach ($object->fields as $key => $val) {
107 // If $val['visible']==0, then we never show the field
108 if (!empty($val['visible'])) {
109 $visible = (int) dol_eval((string) $val['visible'], 1);
110 $arrayfields['t.'.$key] = array(
111 'label'=>$val['label'],
112 'checked'=>(($visible < 0) ? 0 : 1),
113 'enabled'=>(abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
114 'position'=>$val['position'],
115 'help'=> isset($val['help']) ? $val['help'] : ''
116 );
117 }
118}
119// Extra fields
120include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
121
122$object->fields = dol_sort_array($object->fields, 'position');
123$arrayfields = dol_sort_array($arrayfields, 'position');
124
125$permissiontoread = $user->hasRight('asset', 'read');
126$permissiontoadd = $user->hasRight('asset', 'write');
127$permissiontodelete = $user->hasRight('asset', 'delete');
128
129// Security check
130if (!isModEnabled('asset')) {
131 accessforbidden('Module not enabled');
132}
133
134// Security check (enable the most restrictive one)
135if ($user->socid > 0) {
137}
138$socid = 0; if ($user->socid > 0) {
139 $socid = $user->socid;
140}
141$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
142restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
143if (!isModEnabled('asset')) {
145}
146if (!$permissiontoread) {
148}
149
150
151
152/*
153 * Actions
154 */
155
156if (GETPOST('cancel', 'alpha')) {
157 $action = 'list';
158 $massaction = '';
159}
160if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
161 $massaction = '';
162}
163
164$parameters = array();
165$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
166if ($reshook < 0) {
167 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
168}
169
170if (empty($reshook)) {
171 // Selection of new fields
172 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
173
174 // Purge search criteria
175 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
176 foreach ($object->fields as $key => $val) {
177 $search[$key] = '';
178 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
179 $search[$key.'_dtstart'] = '';
180 $search[$key.'_dtend'] = '';
181 }
182 }
183 $toselect = array();
184 $search_array_options = array();
185 }
186 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
187 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
188 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
189 }
190
191 // Mass actions
192 $objectclass = 'Asset';
193 $objectlabel = 'Asset';
194 $uploaddir = $conf->asset->dir_output;
195 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
196}
197
198
199
200/*
201 * View
202 */
203
204$form = new Form($db);
205
206$now = dol_now();
207
208$help_url = '';
209$title = $langs->trans('ListOf', $langs->transnoentitiesnoconv("Assets"));
210$morejs = array();
211$morecss = array();
212
213
214// Build and execute select
215// --------------------------------------------------------------------
216$sql = 'SELECT ';
217$sql .= $object->getFieldList('t');
218// Add fields from extrafields
219if (!empty($extrafields->attributes[$object->table_element]['label'])) {
220 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
221 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
222 }
223}
224// Add fields from hooks
225$parameters = array();
226$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
227$sql .= $hookmanager->resPrint;
228$sql = preg_replace('/,\s*$/', '', $sql);
229
230$sqlfields = $sql; // $sql fields to remove for count total
231
232$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
233if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
234 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
235}
236// Add table from hooks
237$parameters = array();
238$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
239$sql .= $hookmanager->resPrint;
240if ($object->ismultientitymanaged == 1) {
241 $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
242} else {
243 $sql .= " WHERE 1 = 1";
244}
245foreach ($search as $key => $val) {
246 if (array_key_exists($key, $object->fields)) {
247 if ($key == 'status' && $search[$key] == -1) {
248 continue;
249 }
250 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
251 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
252 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
253 $search[$key] = '';
254 }
255 $mode_search = 2;
256 }
257 if ($search[$key] != '') {
258 $sql .= natural_search($key, $search[$key], (($key == 'status') ? 2 : $mode_search));
259 }
260 } else {
261 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
262 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
263 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
264 if (preg_match('/_dtstart$/', $key)) {
265 $sql .= " AND t.".$columnName." >= '".$db->idate($search[$key])."'";
266 }
267 if (preg_match('/_dtend$/', $key)) {
268 $sql .= " AND t." . $columnName . " <= '" . $db->idate($search[$key]) . "'";
269 }
270 }
271 }
272 }
273}
274if ($search_all) {
275 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
276}
277//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
278// Add where from extra fields
279include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
280// Add where from hooks
281$parameters = array();
282$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
283$sql .= $hookmanager->resPrint;
284
285/* If a group by is required
286$sql .= " GROUP BY ";
287foreach($object->fields as $key => $val) {
288 $sql .= "t.".$key.", ";
289}
290// Add fields from extrafields
291if (!empty($extrafields->attributes[$object->table_element]['label'])) {
292 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
293 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
294 }
295}
296// Add where from hooks
297$parameters = array();
298$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
299$sql .= $hookmanager->resPrint;
300$sql = preg_replace('/,\s*$/', '', $sql);
301*/
302
303// Add HAVING from hooks
304/*
305$parameters = array();
306$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
307$sql .= !empty($hookmanager->resPrint) ? (" HAVING 1=1 " . $hookmanager->resPrint) : "";
308*/
309
310// Count total nb of records
311$nbtotalofrecords = '';
312if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
313 /* The fast and low memory method to get and count full list converts the sql into a sql count */
314 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
315 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
316 $resql = $db->query($sqlforcount);
317 if ($resql) {
318 $objforcount = $db->fetch_object($resql);
319 $nbtotalofrecords = $objforcount->nbtotalofrecords;
320 } else {
321 dol_print_error($db);
322 }
323
324 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
325 $page = 0;
326 $offset = 0;
327 }
328 $db->free($resql);
329}
330
331// Complete request and execute it with limit
332$sql .= $db->order($sortfield, $sortorder);
333if ($limit) {
334 $sql .= $db->plimit($limit + 1, $offset);
335}
336
337$resql = $db->query($sql);
338if (!$resql) {
339 dol_print_error($db);
340 exit;
341}
342
343$num = $db->num_rows($resql);
344
345
346// Direct jump if only one record found
347if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
348 $obj = $db->fetch_object($resql);
349 $id = $obj->rowid;
350 header("Location: ".DOL_URL_ROOT.'/asset/card.php?id='.$id);
351 exit;
352}
353
354
355// Output page
356// --------------------------------------------------------------------
357
358llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist mod-asset page-list');
359
360$arrayofselected = is_array($toselect) ? $toselect : array();
361
362$param = '';
363if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
364 $param .= '&contextpage='.urlencode($contextpage);
365}
366if ($limit > 0 && $limit != $conf->liste_limit) {
367 $param .= '&limit='.((int) $limit);
368}
369foreach ($search as $key => $val) {
370 if (is_array($search[$key]) && count($search[$key])) {
371 foreach ($search[$key] as $skey) {
372 if ($skey != '') {
373 $param .= '&search_'.$key.'[]='.urlencode($skey);
374 }
375 }
376 } elseif ($search[$key] != '') {
377 $param .= '&search_'.$key.'='.urlencode($search[$key]);
378 }
379}
380if ($optioncss != '') {
381 $param .= '&optioncss='.urlencode($optioncss);
382}
383// Add $param from extra fields
384include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
385// Add $param from hooks
386$parameters = array('param' => &$param);
387$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
388$param .= $hookmanager->resPrint;
389
390// List of mass actions available
391$arrayofmassactions = array(
392 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
393 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
394 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
395 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
396);
397if ($permissiontodelete) {
398 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
399}
400if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
401 $arrayofmassactions = array();
402}
403$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
404
405print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
406if ($optioncss != '') {
407 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
408}
409print '<input type="hidden" name="token" value="'.newToken().'">';
410print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
411print '<input type="hidden" name="action" value="list">';
412print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
413print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
414print '<input type="hidden" name="page" value="'.$page.'">';
415print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
416
417$newcardbutton = '';
418$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/asset/card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
419
420print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
421
422// Add code for pre mass action (confirmation or email presend form)
423$topicmail = "SendAssetRef";
424$modelmail = "asset";
425$objecttmp = new Asset($db);
426$trackid = 'asset'.$object->id;
427include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
428
429if ($search_all) {
430 foreach ($fieldstosearchall as $key => $val) {
431 $fieldstosearchall[$key] = $langs->trans($val);
432 }
433 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
434}
435
436$moreforfilter = '';
437/*$moreforfilter.='<div class="divsearchfield">';
438$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
439$moreforfilter.= '</div>';*/
440
441$parameters = array();
442$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
443if (empty($reshook)) {
444 $moreforfilter .= $hookmanager->resPrint;
445} else {
446 $moreforfilter = $hookmanager->resPrint;
447}
448
449if (!empty($moreforfilter)) {
450 print '<div class="liste_titre liste_titre_bydiv centpercent">';
451 print $moreforfilter;
452 print '</div>';
453}
454
455$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
456$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
457$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
458
459print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
460print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
461
462
463// Fields title search
464// --------------------------------------------------------------------
465print '<tr class="liste_titre">';
466foreach ($object->fields as $key => $val) {
467 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
468 if ($key == 'status') {
469 $cssforfield .= ($cssforfield ? ' ' : '').'center';
470 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
471 $cssforfield .= ($cssforfield ? ' ' : '').'center';
472 } elseif (in_array($val['type'], array('timestamp'))) {
473 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
474 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
475 $cssforfield .= ($cssforfield ? ' ' : '').'right';
476 }
477 if (!empty($arrayfields['t.'.$key]['checked'])) {
478 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').'">';
479 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
480 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
481 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
482 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1);
483 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
484 print '<div class="nowrap">';
485 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
486 print '</div>';
487 print '<div class="nowrap">';
488 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
489 print '</div>';
490 } elseif ($key == 'lang') {
491 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
492 $formadmin = new FormAdmin($db);
493 print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth100imp maxwidth125', 2);
494 } else {
495 print '<input type="text" class="flat maxwidth'.($val['type'] == 'integer' ? '50' : '75').'" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
496 }
497 print '</td>';
498 }
499}
500// Extra fields
501include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
502
503// Fields from hook
504$parameters = array('arrayfields'=>$arrayfields);
505$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
506print $hookmanager->resPrint;
507// Action column
508print '<td class="liste_titre maxwidthsearch">';
509$searchpicto = $form->showFilterButtons();
510print $searchpicto;
511print '</td>';
512print '</tr>'."\n";
513
514
515// Fields title label
516// --------------------------------------------------------------------
517print '<tr class="liste_titre">';
518foreach ($object->fields as $key => $val) {
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')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
527 $cssforfield .= ($cssforfield ? ' ' : '').'right';
528 }
529 if (!empty($arrayfields['t.'.$key]['checked'])) {
530 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
531 }
532}
533// Extra fields
534include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
535// Hook fields
536$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
537$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
538print $hookmanager->resPrint;
539// Action column
540print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
541print '</tr>'."\n";
542
543
544// Detect if we need a fetch on each output line
545$needToFetchEachLine = 0;
546if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
547 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
548 if (!is_null($val) && preg_match('/\$object/', $val)) {
549 $needToFetchEachLine++; // There is at least one compute field that use $object
550 }
551 }
552}
553
554
555// Loop on record
556// --------------------------------------------------------------------
557$i = 0;
558$totalarray = array();
559$totalarray['nbfield'] = 0;
560while ($i < ($limit ? min($num, $limit) : $num)) {
561 $obj = $db->fetch_object($resql);
562 if (empty($obj)) {
563 break; // Should not happen
564 }
565
566 // Store properties in $object
567 $object->setVarsFromFetchObj($obj);
568
569 // Show here line of result
570 print '<tr class="oddeven">';
571 foreach ($object->fields as $key => $val) {
572 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
573 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
574 $cssforfield .= ($cssforfield ? ' ' : '').'center';
575 } elseif ($key == 'status') {
576 $cssforfield .= ($cssforfield ? ' ' : '').'center';
577 }
578
579 if (in_array($val['type'], array('timestamp'))) {
580 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
581 } elseif ($key == 'ref') {
582 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
583 }
584
585 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
586 $cssforfield .= ($cssforfield ? ' ' : '').'right';
587 }
588 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
589
590 if (!empty($arrayfields['t.'.$key]['checked'])) {
591 print '<td'.($cssforfield ? ' class="'.$cssforfield.'"' : '').'>';
592 if ($key == 'status') {
593 print $object->getLibStatut(5);
594 } elseif ($key == 'rowid') {
595 print $object->showOutputField($val, $key, $object->id, '');
596 } else {
597 print $object->showOutputField($val, $key, $object->$key, '');
598 }
599 print '</td>';
600 if (!$i) {
601 $totalarray['nbfield']++;
602 }
603 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
604 if (!$i) {
605 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
606 }
607 if (!isset($totalarray['val'])) {
608 $totalarray['val'] = array();
609 }
610 if (!isset($totalarray['val']['t.'.$key])) {
611 $totalarray['val']['t.'.$key] = 0;
612 }
613 $totalarray['val']['t.'.$key] += $object->$key;
614 }
615 }
616 }
617 // Extra fields
618 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
619 // Fields from hook
620 $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
621 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
622 print $hookmanager->resPrint;
623 // Action column
624 print '<td class="nowrap center">';
625 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
626 $selected = 0;
627 if (in_array($object->id, $arrayofselected)) {
628 $selected = 1;
629 }
630 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
631 }
632 print '</td>';
633 if (!$i) {
634 $totalarray['nbfield']++;
635 }
636
637 print '</tr>'."\n";
638
639 $i++;
640}
641
642// Show total line
643include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
644
645// If no record found
646if ($num == 0) {
647 $colspan = 1;
648 foreach ($arrayfields as $key => $val) {
649 if (!empty($val['checked'])) {
650 $colspan++;
651 }
652 }
653 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
654}
655
656
657$db->free($resql);
658
659$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
660$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
661print $hookmanager->resPrint;
662
663print '</table>'."\n";
664print '</div>'."\n";
665
666print '</form>'."\n";
667
668if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
669 $hidegeneratedfilelistifempty = 1;
670 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
671 $hidegeneratedfilelistifempty = 0;
672 }
673
674 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
675 $formfile = new FormFile($db);
676
677 // Show list of available documents
678 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
679 $urlsource .= str_replace('&amp;', '&', $param);
680
681 $filedir = $diroutputmassaction;
682 $genallowed = $permissiontoread;
683 $delallowed = $permissiontoadd;
684
685 print $formfile->showdocuments('massfilesarea_asset', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
686}
687
688// End of page
689llxFooter();
690$db->close();
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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:70
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.
llxFooter()
Footer empty.
Definition document.php:107
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)
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...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...
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.