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