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) 2024 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
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/assetmodel.class.php';
33
34// Load translation files required by the page
35$langs->loadLangs(array("assets", "other"));
36
37$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
38$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
39$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
40$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
41$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
42$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
43$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'assetmodellist'; // To manage different context of search
44$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
45$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
46
47$id = GETPOSTINT('id');
48
49// Load variable for pagination
50$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
51$sortfield = GETPOST('sortfield', 'aZ09comma');
52$sortorder = GETPOST('sortorder', 'aZ09comma');
53$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
54if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) {
55 $page = 0;
56} // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action
57$offset = $limit * $page;
58$pageprev = $page - 1;
59$pagenext = $page + 1;
60
61// Initialize a technical objects
62$object = new AssetModel($db);
63$extrafields = new ExtraFields($db);
64$diroutputmassaction = $conf->asset->dir_output.'/temp/massgeneration/'.$user->id;
65$hookmanager->initHooks(array('assetmodellist')); // Note that conf->hooks_modules contains array
66
67// Fetch optionals attributes and labels
68$extrafields->fetch_name_optionals_label($object->table_element);
69//$extrafields->fetch_name_optionals_label($object->table_element_line);
70
71$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
72
73// Default sort order (if not yet defined by previous GETPOST)
74if (!$sortfield) {
75 reset($object->fields); // Reset is required to avoid key() to return null.
76 $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
77}
78if (!$sortorder) {
79 $sortorder = "ASC";
80}
81
82// Initialize array of search criteria
83$search_all = GETPOST('search_all', 'alphanohtml');
84$search = array();
85foreach ($object->fields as $key => $val) {
86 if ($key == 'fk_pays' && !GETPOSTISSET('search_'.$key)) {
87 $search[$key] = $mysoc->country_id;
88 } elseif (GETPOST('search_'.$key, 'alpha') !== '') {
89 $search[$key] = GETPOST('search_'.$key, 'alpha');
90 }
91 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
92 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
93 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
94 }
95}
96
97// List of fields to search into when doing a "search in all"
98$fieldstosearchall = array();
99foreach ($object->fields as $key => $val) {
100 if (!empty($val['searchall'])) {
101 $fieldstosearchall['t.'.$key] = $val['label'];
102 }
103}
104
105// Definition of array of fields for columns
106$arrayfields = array();
107foreach ($object->fields as $key => $val) {
108 // If $val['visible']==0, then we never show the field
109 if (!empty($val['visible'])) {
110 $visible = (int) dol_eval((string) $val['visible'], 1);
111 $arrayfields['t.'.$key] = array(
112 'label' => $val['label'],
113 'checked' => (($visible < 0) ? 0 : 1),
114 'enabled' => (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
115 'position' => $val['position'],
116 'help' => isset($val['help']) ? $val['help'] : ''
117 );
118 }
119}
120// Extra fields
121include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
122
123$object->fields = dol_sort_array($object->fields, 'position');
124$arrayfields = dol_sort_array($arrayfields, 'position');
125
126$permissiontoread = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'read')) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'model_advance', 'read')));
127$permissiontoadd = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'write')) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'model_advance', 'write')));
128$permissiontodelete = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'delete')) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('asset', 'model_advance', 'delete')));
129
130// Security check
131if (!isModEnabled('asset')) {
132 accessforbidden('Module not enabled');
133}
134
135// Security check (enable the most restrictive one)
136if ($user->socid > 0) {
138}
139$socid = 0;
140if ($user->socid > 0) {
141 $socid = $user->socid;
142}
143$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
144restrictedArea($user, 'asset', $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
145if (!isModEnabled('asset')) {
147}
148if (!$permissiontoread) {
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 ($key == 'fk_pays') {
179 $search[$key] = $mysoc->country_id;
180 }
181 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
182 $search[$key.'_dtstart'] = '';
183 $search[$key.'_dtend'] = '';
184 }
185 }
186 $toselect = array();
187 $search_array_options = array();
188 }
189 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
190 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
191 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
192 }
193
194 // Mass actions
195 $objectclass = 'AssetModel';
196 $objectlabel = 'AssetModel';
197 $uploaddir = $conf->asset->dir_output;
198 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
199}
200
201
202
203/*
204 * View
205 */
206
207$form = new Form($db);
208
209$now = dol_now();
210
211$help_url = '';
212$title = $langs->trans('ListOf', $langs->transnoentitiesnoconv("AssetModels"));
213$morejs = array();
214$morecss = array();
215
216
217// Build and execute select
218// --------------------------------------------------------------------
219$sql = 'SELECT ';
220$sql .= $object->getFieldList('t');
221// Add fields from extrafields
222if (!empty($extrafields->attributes[$object->table_element]['label'])) {
223 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
224 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
225 }
226}
227// Add fields from hooks
228$parameters = array();
229$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
230$sql .= $hookmanager->resPrint;
231$sql = preg_replace('/,\s*$/', '', $sql);
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 /* This old and fast method to get and count full list returns all record so use a high amount of memory.
314 $result = $db->query($sql);
315 $nbtotalofrecords = $db->num_rows($result);
316 */
317 /* The fast and low memory method to get and count full list converts the sql into a sql count */
318 $sqlforcount = preg_replace('/^SELECT[a-z0-9\._\s\‍(\‍),]+FROM/Ui', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
319
320 $resql = $db->query($sqlforcount);
321 if ($resql) {
322 $objforcount = $db->fetch_object($resql);
323 $nbtotalofrecords = $objforcount->nbtotalofrecords;
324 } else {
325 dol_print_error($db);
326 }
327
328 if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
329 $page = 0;
330 $offset = 0;
331 }
332 $db->free($resql);
333}
334
335// Complete request and execute it with limit
336$sql .= $db->order($sortfield, $sortorder);
337if ($limit) {
338 $sql .= $db->plimit($limit + 1, $offset);
339}
340
341$resql = $db->query($sql);
342if (!$resql) {
343 dol_print_error($db);
344 exit;
345}
346
347$num = $db->num_rows($resql);
348
349
350// Direct jump if only one record found
351if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
352 $obj = $db->fetch_object($resql);
353 $id = $obj->rowid;
354 header("Location: ".DOL_URL_ROOT.'/asset/model/card.php?id='.$id);
355 exit;
356}
357
358
359// Output page
360// --------------------------------------------------------------------
361
362llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist mod-asset page-model-list');
363
364$arrayofselected = is_array($toselect) ? $toselect : array();
365
366$param = '';
367if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
368 $param .= '&contextpage='.urlencode($contextpage);
369}
370if ($limit > 0 && $limit != $conf->liste_limit) {
371 $param .= '&limit='.((int) $limit);
372}
373foreach ($search as $key => $val) {
374 if (is_array($search[$key]) && count($search[$key])) {
375 foreach ($search[$key] as $skey) {
376 if ($skey != '') {
377 $param .= '&search_'.$key.'[]='.urlencode($skey);
378 }
379 }
380 } elseif ($search[$key] != '') {
381 $param .= '&search_'.$key.'='.urlencode($search[$key]);
382 }
383}
384if ($optioncss != '') {
385 $param .= '&optioncss='.urlencode($optioncss);
386}
387// Add $param from extra fields
388include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
389// Add $param from hooks
390$parameters = array('param' => &$param);
391$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
392$param .= $hookmanager->resPrint;
393
394// List of mass actions available
395$arrayofmassactions = array(
396 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
397 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
398 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
399 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
400);
401if ($permissiontodelete) {
402 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
403}
404if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
405 $arrayofmassactions = array();
406}
407$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
408
409print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
410if ($optioncss != '') {
411 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
412}
413print '<input type="hidden" name="token" value="'.newToken().'">';
414print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
415print '<input type="hidden" name="action" value="list">';
416print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
417print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
418print '<input type="hidden" name="page" value="'.$page.'">';
419print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
420
421$newcardbutton = '';
422$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/asset/model/card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', (int) $permissiontoadd);
423
424print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
425
426// Add code for pre mass action (confirmation or email presend form)
427$topicmail = "SendAssetModelRef";
428$modelmail = "assetmodel";
429$objecttmp = new AssetModel($db);
430$trackid = 'assetmodel'.$object->id;
431include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
432
433if ($search_all) {
434 foreach ($fieldstosearchall as $key => $val) {
435 $fieldstosearchall[$key] = $langs->trans($val);
436 }
437 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
438}
439
440$moreforfilter = '';
441/*$moreforfilter.='<div class="divsearchfield">';
442$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
443$moreforfilter.= '</div>';*/
444
445$parameters = array();
446$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
447if (empty($reshook)) {
448 $moreforfilter .= $hookmanager->resPrint;
449} else {
450 $moreforfilter = $hookmanager->resPrint;
451}
452
453if (!empty($moreforfilter)) {
454 print '<div class="liste_titre liste_titre_bydiv centpercent">';
455 print $moreforfilter;
456 print '</div>';
457}
458
459$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
460$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
461$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
462
463print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
464print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
465
466
467// Fields title search
468// --------------------------------------------------------------------
469print '<tr class="liste_titre">';
470foreach ($object->fields as $key => $val) {
471 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
472 if ($key == 'status') {
473 $cssforfield .= ($cssforfield ? ' ' : '').'center';
474 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
475 $cssforfield .= ($cssforfield ? ' ' : '').'center';
476 } elseif (in_array($val['type'], array('timestamp'))) {
477 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
478 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
479 $cssforfield .= ($cssforfield ? ' ' : '').'right';
480 }
481 if (!empty($arrayfields['t.'.$key]['checked'])) {
482 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').'">';
483 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
484 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
485 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
486 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1);
487 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
488 print '<div class="nowrap">';
489 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
490 print '</div>';
491 print '<div class="nowrap">';
492 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
493 print '</div>';
494 } elseif ($key == 'lang') {
495 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
496 $formadmin = new FormAdmin($db);
497 print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth100imp maxwidth125', 2);
498 } else {
499 print '<input type="text" class="flat maxwidth'.($val['type'] == 'integer' ? '50' : '75').'" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
500 }
501 print '</td>';
502 }
503}
504// Extra fields
505include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
506
507// Fields from hook
508$parameters = array('arrayfields' => $arrayfields);
509$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
510print $hookmanager->resPrint;
511// Action column
512print '<td class="liste_titre maxwidthsearch">';
513$searchpicto = $form->showFilterButtons();
514print $searchpicto;
515print '</td>';
516print '</tr>'."\n";
517
518
519// Fields title label
520// --------------------------------------------------------------------
521print '<tr class="liste_titre">';
522foreach ($object->fields as $key => $val) {
523 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
524 if ($key == 'status') {
525 $cssforfield .= ($cssforfield ? ' ' : '').'center';
526 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
527 $cssforfield .= ($cssforfield ? ' ' : '').'center';
528 } elseif (in_array($val['type'], array('timestamp'))) {
529 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
530 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
531 $cssforfield .= ($cssforfield ? ' ' : '').'right';
532 }
533 if (!empty($arrayfields['t.'.$key]['checked'])) {
534 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
535 }
536}
537// Extra fields
538include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
539// Hook fields
540$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
541$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
542print $hookmanager->resPrint;
543// Action column
544print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
545print '</tr>'."\n";
546
547
548// Detect if we need a fetch on each output line
549$needToFetchEachLine = 0;
550if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
551 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
552 if (!is_null($val) && preg_match('/\$object/', $val)) {
553 $needToFetchEachLine++; // There is at least one compute field that use $object
554 }
555 }
556}
557
558
559// Loop on record
560// --------------------------------------------------------------------
561$i = 0;
562$totalarray = array();
563$totalarray['nbfield'] = 0;
564while ($i < ($limit ? min($num, $limit) : $num)) {
565 $obj = $db->fetch_object($resql);
566 if (empty($obj)) {
567 break; // Should not happen
568 }
569
570 // Store properties in $object
571 $object->setVarsFromFetchObj($obj);
572
573 // Show here line of result
574 print '<tr class="oddeven">';
575 foreach ($object->fields as $key => $val) {
576 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
577 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
578 $cssforfield .= ($cssforfield ? ' ' : '').'center';
579 } elseif ($key == 'status') {
580 $cssforfield .= ($cssforfield ? ' ' : '').'center';
581 }
582
583 if (in_array($val['type'], array('timestamp'))) {
584 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
585 } elseif ($key == 'ref') {
586 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
587 }
588
589 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
590 $cssforfield .= ($cssforfield ? ' ' : '').'right';
591 }
592 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
593
594 if (!empty($arrayfields['t.'.$key]['checked'])) {
595 print '<td'.($cssforfield ? ' class="'.$cssforfield.'"' : '').'>';
596 if ($key == 'status') {
597 print $object->getLibStatut(5);
598 } elseif ($key == 'rowid') {
599 print $object->showOutputField($val, $key, $object->id, '');
600 } else {
601 print $object->showOutputField($val, $key, $object->$key, '');
602 }
603 print '</td>';
604 if (!$i) {
605 $totalarray['nbfield']++;
606 }
607 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
608 if (!$i) {
609 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
610 }
611 if (!isset($totalarray['val'])) {
612 $totalarray['val'] = array();
613 }
614 if (!isset($totalarray['val']['t.'.$key])) {
615 $totalarray['val']['t.'.$key] = 0;
616 }
617 $totalarray['val']['t.'.$key] += $object->$key;
618 }
619 }
620 }
621 // Extra fields
622 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
623 // Fields from hook
624 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
625 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
626 print $hookmanager->resPrint;
627 // Action column
628 print '<td class="nowrap center">';
629 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
630 $selected = 0;
631 if (in_array($object->id, $arrayofselected)) {
632 $selected = 1;
633 }
634 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
635 }
636 print '</td>';
637 if (!$i) {
638 $totalarray['nbfield']++;
639 }
640
641 print '</tr>'."\n";
642
643 $i++;
644}
645
646// Show total line
647include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
648
649// If no record found
650if ($num == 0) {
651 $colspan = 1;
652 foreach ($arrayfields as $key => $val) {
653 if (!empty($val['checked'])) {
654 $colspan++;
655 }
656 }
657 print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
658}
659
660
661$db->free($resql);
662
663$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
664$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
665print $hookmanager->resPrint;
666
667print '</table>'."\n";
668print '</div>'."\n";
669
670print '</form>'."\n";
671
672if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
673 $hidegeneratedfilelistifempty = 1;
674 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
675 $hidegeneratedfilelistifempty = 0;
676 }
677
678 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
679 $formfile = new FormFile($db);
680
681 // Show list of available documents
682 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
683 $urlsource .= str_replace('&amp;', '&', $param);
684
685 $filedir = $diroutputmassaction;
686 $genallowed = $permissiontoread;
687 $delallowed = $permissiontoadd;
688
689 print $formfile->showdocuments('massfilesarea_asset', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
690}
691
692// End of page
693llxFooter();
694$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 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.
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.