dolibarr 24.0.0-beta
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
143$object->fields = dol_sort_array($object->fields, 'position');
144//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
145$arrayfields = dol_sort_array($arrayfields, 'position');
146
147// There is several ways to check permission.
148// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
149$permissiontoread = $permissiontoadd = $permissiontodelete = (!empty($user->admin) ? 1 : 0);
150
151// Security check (enable the most restrictive one)
152if ($user->socid > 0) {
154}
155//if ($user->socid > 0) accessforbidden();
156//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
157//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
158//restrictedArea($user, $object->module, 0, $object->table_element, $object->element, 'fk_soc', 'rowid', $isdraft);
159if (!isModEnabled("webhook")) {
160 accessforbidden('Module webhook not enabled');
161}
162if (!$permissiontoread) {
164}
165
166
167/*
168 * Actions
169 */
170
171if (GETPOST('cancel', 'alpha')) {
172 $action = 'list';
173 $massaction = '';
174}
175if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
176 $massaction = '';
177}
178
179$parameters = array('arrayfields' => &$arrayfields);
180$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
181if ($reshook < 0) {
182 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
183}
184
185if (empty($reshook)) {
186 // Selection of new fields
187 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
188
189 // Purge search criteria
190 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
191 foreach ($object->fields as $key => $val) {
192 $search[$key] = '';
193 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
194 $search[$key.'_dtstart'] = '';
195 $search[$key.'_dtend'] = '';
196 }
197 }
198 $search_all = '';
199 $toselect = array();
200 $search_array_options = array();
201 }
202 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
203 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
204 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
205 }
206
207 // Mass actions
208 $objectclass = 'TriggerHistory';
209 $objectlabel = 'TriggerHistory';
210 $uploaddir = $conf->webhook->dir_output;
211
212 global $error;
213 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
214
215 // You can add more action here
216 // if ($action == 'xxx' && $permissiontoxxx) ...
217}
218
219
220
221/*
222 * View
223 */
224
225$form = new Form($db);
226
227$now = dol_now();
228
229$title = $langs->trans("");
230//$help_url = "EN:Module_History|FR:Module_History_FR|ES:Módulo_History";
231$help_url = '';
232$morejs = array();
233$morecss = array();
234
235
236// Build and execute select
237// --------------------------------------------------------------------
238$sql = "SELECT";
239$sql .= " ".$object->getFieldList('t');
240// Add fields from extrafields
241if (!empty($extrafields->attributes[$object->table_element]['label'])) {
242 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
243 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
244 }
245}
246// Add fields from hooks
247$parameters = array();
248$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
249$sql .= $hookmanager->resPrint;
250$sql = preg_replace('/,\s*$/', '', $sql);
251
252$sqlfields = $sql; // $sql fields to remove for count total
253
254$sql .= " FROM ".$db->prefix().$object->table_element." as t";
255//$sql .= " LEFT JOIN ".$db->prefix()."anothertable as rc ON rc.parent = t.rowid";
256if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
257 $sql .= " LEFT JOIN ".$db->prefix().$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
258}
259// Add table from hooks
260$parameters = array();
261$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
262$sql .= $hookmanager->resPrint;
263if ($object->ismultientitymanaged == 1) {
264 $sql .= " WHERE t.entity IN (".getEntity($object->element, (GETPOSTINT('search_current_entity') ? 0 : 1)).")";
265} else {
266 $sql .= " WHERE 1 = 1";
267}
268foreach ($search as $key => $val) {
269 if (array_key_exists($key, $object->fields)) {
270 if ($key == 'status' && $search[$key] == -1) {
271 continue;
272 }
273 $field_spec = $object->fields[$key];
274 $mode_search = (($object->isInt($field_spec) || $object->isFloat($field_spec)) ? 1 : 0);
275 if ((strpos($field_spec['type'], 'integer:') === 0) || (strpos($field_spec['type'], 'sellist:') === 0) || !empty($field_spec['arrayofkeyval'])) {
276 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($field_spec['arrayofkeyval']) || !array_key_exists('0', $field_spec['arrayofkeyval'])))) {
277 $search[$key] = '';
278 }
279 $mode_search = 2;
280 }
281 if ($field_spec['type'] === 'boolean') {
282 $mode_search = 1;
283 if ($search[$key] == '-1') {
284 $search[$key] = '';
285 }
286 }
287 if (empty($field_spec['searchmulti'])) {
288 if (!is_array($search[$key]) && $search[$key] != '') {
289 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
290 }
291 } else {
292 if (is_array($search[$key]) && !empty($search[$key])) {
293 $sql .= natural_search("t.".$db->escape($key), implode(',', $search[$key]), (($key == 'status') ? 2 : $mode_search));
294 }
295 }
296 } else {
297 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
298 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
299 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
300 if (preg_match('/_dtstart$/', $key)) {
301 $sql .= " AND t.".$db->sanitize($columnName)." >= '".$db->idate($search[$key])."'";
302 }
303 if (preg_match('/_dtend$/', $key)) {
304 $sql .= " AND t.".$db->sanitize($columnName)." <= '".$db->idate($search[$key])."'";
305 }
306 }
307 }
308 }
309}
310if ($search_all) {
311 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
312}
313/*
314// If the internal user must only see his customers, force searching by him
315$search_sale = 0;
316if (!$user->hasRight('societe', 'client', 'voir')) {
317 $search_sale = $user->id;
318}
319// Search on sale representative
320if ($search_sale && $search_sale != '-1') {
321 if ($search_sale == -2) {
322 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".$db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
323 } elseif ($search_sale > 0) {
324 $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).")";
325 }
326}
327// Search on socid
328if ($socid) {
329 $sql .= " AND t.fk_soc = ".((int) $socid);
330}
331*/
332//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
333// Add where from extra fields
334include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
335// Add where from hooks
336$parameters = array();
337$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
338$sql .= $hookmanager->resPrint;
339
340/* If a group by is required
341$sql .= " GROUP BY ";
342foreach($object->fields as $key => $val) {
343 $sql .= "t.".$db->sanitize($key).", ";
344}
345// Add fields from extrafields
346if (!empty($extrafields->attributes[$object->table_element]['label'])) {
347 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
348 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
349 }
350}
351// Add groupby from hooks
352$parameters = array();
353$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
354$sql .= $hookmanager->resPrint;
355$sql = preg_replace('/,\s*$/', '', $sql);
356*/
357
358// Add HAVING from hooks
359/*
360$parameters = array();
361$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
362$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
363*/
364
365// Count total nb of records
366$nbtotalofrecords = '';
367if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
368 /* The fast and low memory method to get and count full list converts the sql into a sql count */
369 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
370 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
371
372 $resql = $db->query($sqlforcount);
373 if ($resql) {
374 $objforcount = $db->fetch_object($resql);
375 $nbtotalofrecords = $objforcount->nbtotalofrecords;
376 } else {
378 }
379
380 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
381 $page = 0;
382 $offset = 0;
383 }
384 $db->free($resql);
385}
386
387// Complete request and execute it with limit
388$sql .= $db->order($sortfield, $sortorder);
389if ($limit) {
390 $sql .= $db->plimit($limit + 1, $offset);
391}
392
393$resql = $db->query($sql);
394if (!$resql) {
396 exit;
397}
398
399$num = $db->num_rows($resql);
400
401
402// Direct jump if only one record found
403if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
404 $obj = $db->fetch_object($resql);
405 $id = $obj->rowid;
406 header("Location: ".dol_buildpath('/webhook/history_card.php', 1).'?id='.((int) $id));
407 exit;
408}
409
410
411// Output page
412// --------------------------------------------------------------------
413
414llxHeader('', $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
415
416if ($mode == 'modulesetup') {
417 require_once DOL_DOCUMENT_ROOT.'/webhook/lib/webhook.lib.php';
418
419
420 $help_url = '';
421 $page_name = "WebhookSetup";
422 // Subheader
423 $linkback = '<a href="'.($backtopage ? $backtopage : DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1').'">'.$langs->trans("BackToModuleList").'</a>';
424 print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
425
426 $head = webhookAdminPrepareHead();
427 print dol_get_fiche_head($head, 'triggerhistory', $langs->trans($page_name), -1, "webhook");
428}
429
430$arrayofselected = is_array($toselect) ? $toselect : array();
431
432$param = '';
433if (!empty($mode)) {
434 $param .= '&mode='.urlencode($mode);
435}
436if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
437 $param .= '&contextpage='.urlencode($contextpage);
438}
439if ($limit > 0 && $limit != $conf->liste_limit) {
440 $param .= '&limit='.((int) $limit);
441}
442if ($optioncss != '') {
443 $param .= '&optioncss='.urlencode($optioncss);
444}
445if ($groupby != '') {
446 $param .= '&groupby='.urlencode($groupby);
447}
448foreach ($search as $key => $val) {
449 if (is_array($search[$key])) {
450 foreach ($search[$key] as $skey) {
451 if ($skey != '') {
452 $param .= '&search_'.$key.'[]='.urlencode($skey);
453 }
454 }
455 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
456 $param .= '&search_'.$key.'month='.GETPOSTINT('search_'.$key.'month');
457 $param .= '&search_'.$key.'day='.GETPOSTINT('search_'.$key.'day');
458 $param .= '&search_'.$key.'year='.GETPOSTINT('search_'.$key.'year');
459 } elseif ($search[$key] != '') {
460 $param .= '&search_'.$key.'='.urlencode($search[$key]);
461 }
462}
463// Add $param from extra fields
464include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
465// Add $param from hooks
466$parameters = array('param' => &$param);
467$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
468$param .= $hookmanager->resPrint;
469
470// List of mass actions available
471$arrayofmassactions = array(
472 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
473 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
474 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
475 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
476);
477if (!empty($permissiontodelete)) {
478 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
479}
480if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
481 $arrayofmassactions = array();
482}
483$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
484
485print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
486if ($optioncss != '') {
487 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
488}
489print '<input type="hidden" name="token" value="'.newToken().'">';
490print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
491print '<input type="hidden" name="action" value="list">';
492print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
493print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
494print '<input type="hidden" name="page" value="'.$page.'">';
495print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
496print '<input type="hidden" name="page_y" value="">';
497print '<input type="hidden" name="mode" value="'.$mode.'">';
498
499
500$newcardbutton = '';
501$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'));
502$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'));
503//$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'));
504//$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'));
505//$newcardbutton .= dolGetButtonTitleSeparator();
506//$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/webhook/history_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
507
508print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
509
510// Add code for pre mass action (confirmation or email presend form)
511$topicmail = "SendHistoryRef";
512$modelmail = "triggerhistory";
513$objecttmp = new TriggerHistory($db);
514$trackid = 'xxxx'.$object->id;
515include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
516
517if ($search_all) {
518 $setupstring = '';
519 // @phan-suppress-next-line PhanEmptyForeach
520 foreach ($fieldstosearchall as $key => $val) {
521 $fieldstosearchall[$key] = $langs->trans($val);
522 $setupstring .= $key."=".$val.";";
523 }
524 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
525 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
526}
527
528$moreforfilter = '';
529/*$moreforfilter.='<div class="divsearchfield">';
530$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
531$moreforfilter.= '</div>';*/
532
533$parameters = array();
534$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
535if (empty($reshook)) {
536 $moreforfilter .= $hookmanager->resPrint;
537} else {
538 $moreforfilter = $hookmanager->resPrint;
539}
540$parameters = array(
541 'arrayfields' => &$arrayfields,
542);
543
544if (!empty($moreforfilter)) {
545 print '<div class="liste_titre liste_titre_bydiv centpercent">';
546 print $moreforfilter;
547 print '</div>';
548}
549
550$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
551$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields with user setup
552$selectedfields = (($mode != 'kanban' && $mode != 'kanbangroupby') ? $htmlofselectarray : '');
553$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
554
555print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
556print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
557
558// Fields title search
559// --------------------------------------------------------------------
560print '<tr class="liste_titre_filter">';
561// Action column
562if ($conf->main_checkbox_left_column) {
563 print '<td class="liste_titre center maxwidthsearch">';
564 $searchpicto = $form->showFilterButtons('left');
565 print $searchpicto;
566 print '</td>';
567}
568foreach ($object->fields as $key => $val) {
569 //$searchkey = empty($search[$key]) ? '' : $search[$key];
570 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
571 if ($key == 'status') {
572 $cssforfield .= ($cssforfield ? ' ' : '').'center';
573 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
574 $cssforfield .= ($cssforfield ? ' ' : '').'center';
575 } elseif (in_array($val['type'], array('timestamp'))) {
576 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
577 } 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'])) {
578 $cssforfield .= ($cssforfield ? ' ' : '').'right';
579 }
580 if (!empty($arrayfields['t.'.$key]['checked'])) {
581 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
582 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
583 if (empty($val['searchmulti'])) {
584 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);
585 } else {
586 print $form->multiselectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 0, 0, 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
587 }
588 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
589 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
590 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
591 print '<div class="nowrap">';
592 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
593 print '</div>';
594 print '<div class="nowrap">';
595 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
596 print '</div>';
597 } elseif ($key == 'lang') {
598 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
599 $formadmin = new FormAdmin($db);
600 print $formadmin->select_language((isset($search[$key]) ? $search[$key] : ''), 'search_lang', 0, array(), 1, 0, 0, 'minwidth100imp maxwidth125', 2);
601 } elseif ($val['type'] === 'boolean') {
602 print $form->selectyesno('search_' . $key, $search[$key] ?? '', 1, false, 1);
603 } else {
604 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] : '').'">';
605 }
606 print '</td>';
607 }
608}
609// Extra fields
610include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
611
612// Fields from hook
613$parameters = array('arrayfields' => $arrayfields);
614$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
615print $hookmanager->resPrint;
616/*if (!empty($arrayfields['anotherfield']['checked'])) {
617 print '<td class="liste_titre"></td>';
618}*/
619// Action column
620if (!$conf->main_checkbox_left_column) {
621 print '<td class="liste_titre center maxwidthsearch">';
622 $searchpicto = $form->showFilterButtons();
623 print $searchpicto;
624 print '</td>';
625}
626print '</tr>'."\n";
627
628$totalarray = array();
629$totalarray['nbfield'] = 0;
630
631// Fields title label
632// --------------------------------------------------------------------
633print '<tr class="liste_titre">';
634// Action column
635if ($conf->main_checkbox_left_column) {
636 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
637 $totalarray['nbfield']++;
638}
639foreach ($object->fields as $key => $val) {
640 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
641 if ($key == 'status') {
642 $cssforfield .= ($cssforfield ? ' ' : '').'center';
643 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
644 $cssforfield .= ($cssforfield ? ' ' : '').'center';
645 } elseif (in_array($val['type'], array('timestamp'))) {
646 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
647 } 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'])) {
648 $cssforfield .= ($cssforfield ? ' ' : '').'right';
649 }
650 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
651 if (!empty($arrayfields['t.'.$key]['checked'])) {
652 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";
653 $totalarray['nbfield']++;
654 }
655}
656// Extra fields
657include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
658// Hook fields
659$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
660$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
661print $hookmanager->resPrint;
662/*if (!empty($arrayfields['anotherfield']['checked'])) {
663 print '<th class="liste_titre">'.$langs->trans("AnotherField").'</th>';
664 $totalarray['nbfield']++;
665}*/
666// Action column
667if (!$conf->main_checkbox_left_column) {
668 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
669 $totalarray['nbfield']++;
670}
671print '</tr>'."\n";
672
673// Detect if we need a fetch on each output line
674$needToFetchEachLine = 0;
675if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
676 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
677 if (!is_null($val) && preg_match('/\$object/', $val)) {
678 $needToFetchEachLine++; // There is at least one compute field that use $object
679 }
680 }
681}
682
683
684// Loop on record
685// --------------------------------------------------------------------
686$i = 0;
687$savnbfield = $totalarray['nbfield'];
688$totalarray = array();
689$totalarray['nbfield'] = 0;
690$imaxinloop = ($limit ? min($num, $limit) : $num);
691while ($i < $imaxinloop) {
692 $obj = $db->fetch_object($resql);
693 if (empty($obj)) {
694 break; // Should not happen
695 }
696
697 // Store properties in $object
698 $object->setVarsFromFetchObj($obj);
699
700 /*
701 $object->thirdparty = null;
702 if ($obj->fk_soc > 0) {
703 if (!empty($conf->cache['thirdparty'][$obj->fk_soc])) {
704 $companyobj = $conf->cache['thirdparty'][$obj->fk_soc];
705 } else {
706 $companyobj = new Societe($db);
707 $companyobj->fetch($obj->fk_soc);
708 $conf->cache['thirdparty'][$obj->fk_soc] = $companyobj;
709 }
710
711 $object->thirdparty = $companyobj;
712 }*/
713
714 if ($mode == 'kanban' || $mode == 'kanbangroupby') {
715 if ($i == 0) {
716 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
717 print '<div class="box-flex-container kanban">';
718 }
719 // Output Kanban
720 $selected = -1;
721 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
722 $selected = 0;
723 if (in_array($object->id, $arrayofselected)) {
724 $selected = 1;
725 }
726 }
727 //print $object->getKanbanView('', array('thirdparty'=>$object->thirdparty, 'selected' => $selected));
728 print $object->getKanbanView('', array('selected' => $selected));
729 if ($i == ($imaxinloop - 1)) {
730 print '</div>';
731 print '</td></tr>';
732 }
733 } else {
734 // Show line of result
735 $j = 0;
736 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
737
738 // Action column
739 if ($conf->main_checkbox_left_column) {
740 print '<td class="nowrap center">';
741 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
742 $selected = 0;
743 if (in_array($object->id, $arrayofselected)) {
744 $selected = 1;
745 }
746 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
747 }
748 print '</td>';
749 if (!$i) {
750 $totalarray['nbfield']++;
751 }
752 }
753 // Fields
754 foreach ($object->fields as $key => $val) {
755 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
756 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
757 $cssforfield .= ($cssforfield ? ' ' : '').'center';
758 } elseif ($key == 'status') {
759 $cssforfield .= ($cssforfield ? ' ' : '').'center';
760 }
761
762 if (in_array($val['type'], array('timestamp'))) {
763 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
764 } elseif ($key == 'ref') {
765 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
766 }
767
768 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'])) {
769 $cssforfield .= ($cssforfield ? ' ' : '').'right';
770 }
771 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
772
773 if (!empty($arrayfields['t.'.$key]['checked'])) {
774 print '<td'.($cssforfield ? ' class="'.$cssforfield.((preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key)) ? ' classfortooltip' : '').'"' : '');
775 if (preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key) && !in_array($key, array('ref'))) {
776 print ' title="'.dol_escape_htmltag((string) $object->$key).'"';
777 }
778 print '>';
779 if ($key == 'status') {
780 print $object->getLibStatut(5);
781 } elseif ($key == 'rowid') {
782 print $object->showOutputField($val, $key, (string) $object->id, '');
783 } else {
784 print $object->showOutputField($val, $key, (string) $object->$key, '');
785 }
786 print '</td>';
787 if (!$i) {
788 $totalarray['nbfield']++;
789 }
790 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
791 if (!$i) {
792 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
793 }
794 if (!isset($totalarray['val'])) {
795 $totalarray['val'] = array();
796 }
797 if (!isset($totalarray['val']['t.'.$key])) {
798 $totalarray['val']['t.'.$key] = 0;
799 }
800 $totalarray['val']['t.'.$key] += $object->$key;
801 }
802 }
803 }
804 // Extra fields
805 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
806 // Fields from hook
807 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
808 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
809 print $hookmanager->resPrint;
810
811 /*if (!empty($arrayfields['anotherfield']['checked'])) {
812 print '<td class="right">'.$obj->anotherfield.'</td>';
813 }*/
814
815 // Action column
816 if (empty($conf->main_checkbox_left_column)) {
817 print '<td class="nowrap center">';
818 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
819 $selected = 0;
820 if (in_array($object->id, $arrayofselected)) {
821 $selected = 1;
822 }
823 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
824 }
825 print '</td>';
826 if (!$i) {
827 $totalarray['nbfield']++;
828 }
829 }
830
831 print '</tr>'."\n";
832 }
833
834 $i++;
835}
836
837// Show total line
838include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
839
840// If no record found
841if ($num == 0) {
842 $colspan = 1;
843 foreach ($arrayfields as $key => $val) {
844 if (!empty($val['checked'])) {
845 $colspan++;
846 }
847 }
848 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
849}
850
851
852$db->free($resql);
853
854$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
855$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
856print $hookmanager->resPrint;
857
858print '</table>'."\n";
859print '</div>'."\n";
860
861print '</form>'."\n";
862
863if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
864 $hidegeneratedfilelistifempty = 1;
865 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
866 $hidegeneratedfilelistifempty = 0;
867 }
868
869 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
870 $formfile = new FormFile($db);
871
872 // Show list of available documents
873 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
874 $urlsource .= str_replace('&amp;', '&', $param);
875
876 $filedir = $diroutputmassaction;
877 $genallowed = $permissiontoread;
878 $delallowed = $permissiontoadd;
879
880 print $formfile->showdocuments('massfilesarea_'.$object->module, '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
881}
882
883// End of page
884llxFooter();
885$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:497
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
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...
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_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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...
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
buildzip.php
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.