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