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