dolibarr 21.0.0-alpha
notification.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2015 Laurent Destailleur <eldy@users.sourceforge.org>
4 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2015 Bahfir Abbes <contact@dolibarrpar.org>
6 * Copyright (C) 2020 Thibault FOUCART <support@ptibogxiv.net>
7 * Copyright (C) 2022 Anthony Berton <anthony.berton@bb2a.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Load Dolibarr environment
30require '../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/triggers/interface_50_modNotification_Notification.class.php';
34
35// Load translation files required by the page
36$langs->loadLangs(array('admin', 'other', 'orders', 'propal', 'bills', 'errors', 'mails'));
37
38// Security check
39if (!$user->admin) {
41}
42
43$action = GETPOST('action', 'aZ09');
44$error = 0;
45
46
47/*
48 * Actions
49 */
50
51// Action to update or add a constant
52if ($action == 'settemplates' && $user->admin) {
53 $db->begin();
54
55 if (!$error && is_array($_POST)) {
56 $reg = array();
57 foreach ($_POST as $key => $val) {
58 if (!preg_match('/^constvalue_(.*)_TEMPLATE/', $key, $reg)) {
59 continue;
60 }
61
62 $triggername = $reg[1];
63 $constvalue = GETPOST($key, 'alpha');
64 $consttype = 'emailtemplate:xxx';
65 $tmparray = explode(':', $constvalue);
66 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
67 $constvalue = $tmparray[0];
68 $consttype = 'emailtemplate:'.$tmparray[1];
69 //var_dump($constvalue);
70 //var_dump($consttype);
71 $res = dolibarr_set_const($db, $triggername.'_TEMPLATE', $constvalue, $consttype, 0, '', $conf->entity);
72 if ($res < 0) {
73 $error++;
74 break;
75 }
76 } else {
77 $res = dolibarr_del_const($db, $triggername.'_TEMPLATE', $conf->entity);
78 }
79 }
80 }
81
82
83 if (!$error) {
84 $db->commit();
85
86 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
87 } else {
88 $db->rollback();
89
90 setEventMessages($langs->trans("Error"), null, 'errors');
91 }
92}
93
94if ($action == 'setvalue' && $user->admin) {
95 $db->begin();
96
97 $result = dolibarr_set_const($db, "NOTIFICATION_EMAIL_FROM", GETPOST("email_from", "alphawithlgt"), 'chaine', 0, '', $conf->entity);
98 if ($result < 0) {
99 $error++;
100 }
101
102 $result = dolibarr_set_const($db, "NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE", GETPOST("notif_disable", "alphawithlgt"), 'chaine', 0, '', $conf->entity);
103 if ($result < 0) {
104 $error++;
105 }
106
107 if (!$error) {
108 $db->commit();
109
110 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
111 } else {
112 $db->rollback();
113
114 setEventMessages($langs->trans("Error"), null, 'errors');
115 }
116}
117
118
119if ($action == 'setfixednotif' && $user->admin) {
120 $db->begin();
121
122 if (!$error && is_array($_POST)) {
123 $reg = array();
124 foreach ($_POST as $key => $val) {
125 if (!preg_match('/^NOTIF_(.*)_key$/', $key, $reg)) {
126 continue;
127 }
128
129 $newval = '';
130 $newkey = '';
131
132 $shortkey = preg_replace('/_key$/', '', $key);
133 //print $shortkey.'<br>';
134
135 if (preg_match('/^NOTIF_(.*)_old_(.*)_key/', $key, $reg)) {
136 dolibarr_del_const($db, 'NOTIFICATION_FIXEDEMAIL_'.$reg[1].'_THRESHOLD_HIGHER_'.$reg[2], $conf->entity);
137
138 $newkey = 'NOTIFICATION_FIXEDEMAIL_'.$reg[1].'_THRESHOLD_HIGHER_'.((int) GETPOST($shortkey.'_amount'));
139 $newval = GETPOST($shortkey.'_key');
140 //print $newkey.' - '.$newval.'<br>';
141 } elseif (preg_match('/^NOTIF_(.*)_new_key/', $key, $reg)) {
142 // Add a new entry
143 $newkey = 'NOTIFICATION_FIXEDEMAIL_'.$reg[1].'_THRESHOLD_HIGHER_'.((int) GETPOST($shortkey.'_amount'));
144 $newval = GETPOST($shortkey.'_key');
145 }
146
147 if ($newkey && $newval) {
148 $result = dolibarr_set_const($db, $newkey, $newval, 'chaine', 0, '', $conf->entity);
149 }
150 }
151 }
152
153 if (!$error) {
154 $db->commit();
155
156 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
157 } else {
158 $db->rollback();
159
160 setEventMessages($langs->trans("Error"), null, 'errors');
161 }
162}
163
164
165
166/*
167 * View
168 */
169
170$form = new Form($db);
171$notify = new Notify($db);
172
173llxHeader('', $langs->trans("NotificationSetup"), '', '', 0, 0, '', '', '', 'mod-admin page-notification');
174
175$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
176print load_fiche_titre($langs->trans("NotificationSetup"), $linkback, 'title_setup');
177
178print '<span class="opacitymedium">';
179print $langs->trans("NotificationsDesc").'<br>';
180print $langs->trans("NotificationsDescUser").'<br>';
181if (isModEnabled("societe")) {
182 print $langs->trans("NotificationsDescContact").'<br>';
183}
184print $langs->trans("NotificationsDescGlobal").' - '.$langs->trans("YouAreHere").'<br>';
185print '</span>';
186print '<br>';
187
188print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
189print '<input type="hidden" name="token" value="'.newToken().'">';
190print '<input type="hidden" name="action" value="setvalue">';
191
192print '<div class="div-table-responsive-no-min">';
193print '<table class="noborder centpercent">';
194print '<tr class="liste_titre">';
195print '<td>'.$langs->trans("Parameter").'</td>';
196print '<td>'.$langs->trans("Value").'</td>';
197print "</tr>\n";
198
199
200print '<tr class="oddeven"><td>';
201print $langs->trans("NotificationEMailFrom").'</td>';
202print '<td>';
203print img_picto('', 'email', 'class="pictofixedwidth"');
204print '<input class="width150 quatrevingtpercentminusx" type="email" name="email_from" value="'.getDolGlobalString('NOTIFICATION_EMAIL_FROM').'">';
205if (getDolGlobalString('NOTIFICATION_EMAIL_FROM') && !isValidEmail(getDolGlobalString('NOTIFICATION_EMAIL_FROM'))) {
206 print ' '.img_warning($langs->trans("ErrorBadEMail"));
207}
208print '</td>';
209print '</tr>';
210
211
212print '<tr class="oddeven"><td>';
213print $langs->trans("NotificationDisableConfirmMessageUser").'</td>';
214print '<td>';
215if ($conf->use_javascript_ajax) {
216 print ajax_constantonoff('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_USER');
217} else {
218 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
219 print $form->selectarray("NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_USER", $arrval, getDolGlobalString('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_USER'));
220}
221print '</td>';
222print '</tr>';
223
224
225print '<tr class="oddeven"><td>';
226print $langs->trans("NotificationDisableConfirmMessageContact").'</td>';
227print '<td>';
228if ($conf->use_javascript_ajax) {
229 print ajax_constantonoff('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT');
230} else {
231 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
232 print $form->selectarray("NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT", $arrval, getDolGlobalString('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT'));
233}
234print '</td>';
235print '</tr>';
236
237
238print '<tr class="oddeven"><td>';
239print $langs->trans("NotificationDisableConfirmMessageFix").'</td>';
240print '<td>';
241if ($conf->use_javascript_ajax) {
242 print ajax_constantonoff('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_FIX');
243} else {
244 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
245 print $form->selectarray("NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_FIX", $arrval, getDolGlobalString('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_FIX'));
246}
247print '</td>';
248print '</tr>';
249
250
251print '</table>';
252print '</div>';
253
254print $form->buttonsSaveCancel("Save", '');
255
256print '</form>';
257
258
259print '<br><br>';
260
261
262print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
263print '<input type="hidden" name="token" value="'.newToken().'">';
264print '<input type="hidden" name="action" value="settemplates">';
265
266// Notification per contacts
267$title = $langs->trans("TemplatesForNotifications");
268
269print load_fiche_titre($title, '', 'email');
270
271// Load array of available notifications
272$notificationtrigger = new InterfaceNotification($db);
273$listofnotifiedevents = $notificationtrigger->getListOfManagedEvents();
274
275// Editing global variables not related to a specific theme
276$constantes = array();
277foreach ($listofnotifiedevents as $notifiedevent) {
278 $label = $langs->trans("Notify_".$notifiedevent['code']);
279 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
280
281 $model = $notifiedevent['elementtype'];
282
283 if ($notifiedevent['elementtype'] == 'order_supplier') {
284 $elementLabel = $langs->trans('SupplierOrder');
285 } elseif ($notifiedevent['elementtype'] == 'propal') {
286 $elementLabel = $langs->trans('Proposal');
287 } elseif ($notifiedevent['elementtype'] == 'facture') {
288 $elementLabel = $langs->trans('Bill');
289 } elseif ($notifiedevent['elementtype'] == 'commande') {
290 $elementLabel = $langs->trans('Order');
291 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
292 $elementLabel = $langs->trans('Intervention');
293 } elseif ($notifiedevent['elementtype'] == 'shipping') {
294 $elementLabel = $langs->trans('Shipping');
295 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
296 $elementLabel = $langs->trans('ExpenseReport');
297 }
298
299 if ($notifiedevent['elementtype'] == 'propal') {
300 $model = 'propal_send';
301 } elseif ($notifiedevent['elementtype'] == 'commande') {
302 $model = 'order_send';
303 } elseif ($notifiedevent['elementtype'] == 'facture') {
304 $model = 'facture_send';
305 } elseif ($notifiedevent['elementtype'] == 'shipping') {
306 $model = 'shipping_send';
307 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
308 $model = 'fichinter_send';
309 } elseif ($notifiedevent['elementtype'] == 'expensereport') {
310 $model = 'expensereport_send';
311 } elseif ($notifiedevent['elementtype'] == 'order_supplier') {
312 $model = 'order_supplier_send';
313 // } elseif ($notifiedevent['elementtype'] == 'invoice_supplier') $model = 'invoice_supplier_send';
314 } elseif ($notifiedevent['elementtype'] == 'member') {
315 $model = 'member';
316 }
317
318 $constantes[$notifiedevent['code'].'_TEMPLATE'] = array('type'=>'emailtemplate:'.$model, 'label'=>$label);
319}
320
321$helptext = '';
322form_constantes($constantes, 3, $helptext, 'EmailTemplate');
323
324print $form->buttonsSaveCancel("Save", '');
325
326/*
327} else {
328 print '<table class="noborder centpercent">';
329 print '<tr class="liste_titre">';
330 print '<td>'.$langs->trans("Label").'</td>';
331 //print '<td class="right">'.$langs->trans("NbOfTargetedContacts").'</td>';
332 print "</tr>\n";
333
334 print '<tr class="oddeven">';
335 print '<td>';
336
337 $i = 0;
338 foreach ($listofnotifiedevents as $notifiedevent) {
339 $label = $langs->trans("Notify_".$notifiedevent['code']); //!=$langs->trans("Notify_".$notifiedevent['code'])?$langs->trans("Notify_".$notifiedevent['code']):$notifiedevent['label'];
340 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
341
342 if ($notifiedevent['elementtype'] == 'order_supplier') {
343 $elementLabel = $langs->trans('SupplierOrder');
344 } elseif ($notifiedevent['elementtype'] == 'propal') {
345 $elementLabel = $langs->trans('Proposal');
346 } elseif ($notifiedevent['elementtype'] == 'facture') {
347 $elementLabel = $langs->trans('Bill');
348 } elseif ($notifiedevent['elementtype'] == 'commande') {
349 $elementLabel = $langs->trans('Order');
350 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
351 $elementLabel = $langs->trans('Intervention');
352 } elseif ($notifiedevent['elementtype'] == 'shipping') {
353 $elementLabel = $langs->trans('Shipping');
354 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
355 $elementLabel = $langs->trans('ExpenseReport');
356 }
357
358 if ($i) {
359 print ', ';
360 }
361 print $label;
362
363 $i++;
364 }
365
366 print '</td></tr>';
367 print '</table>';
368
369 print '<div class="opacitymedium">';
370 print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
371 if (isModEnabled("societe")) {
372 print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
373 }
374 print '</div>';
375}
376*/
377
378print '</form>';
379
380
381print '<br><br>';
382
383
384print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
385print '<input type="hidden" name="token" value="'.newToken().'">';
386print '<input type="hidden" name="action" value="setfixednotif">';
387print '<input type="hidden" name="page_y" value="">';
388
389print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', 'email');
390
391print '<div class="info">';
392print $langs->trans("Note").':<br>';
393print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
394if (isModEnabled("societe")) {
395 print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
396}
397print '</div>';
398
399print '<div class="div-table-responsive">';
400print '<table class="noborder centpercent">';
401print '<tr class="liste_titre">';
402print '<td>'.$langs->trans("Module").'</td>';
403print '<td>'.$langs->trans("Code").'</td>';
404print '<td>'.$langs->trans("Label").'</td>';
405print '<td>'.$langs->trans("FixedEmailTarget").'</td>';
406print '<td>'.$langs->trans("Threshold").'</td>';
407print '<td></td>';
408print "</tr>\n";
409
410foreach ($listofnotifiedevents as $notifiedevent) {
411 $label = $langs->trans("Notify_".$notifiedevent['code']);
412
413 $elementPicto = $notifiedevent['elementtype'];
414 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
415 // Special cases
416 if ($notifiedevent['elementtype'] == 'order_supplier') {
417 $elementPicto = 'supplier_order';
418 $elementLabel = $langs->trans('SupplierOrder');
419 } elseif ($notifiedevent['elementtype'] == 'propal') {
420 $elementLabel = $langs->trans('Proposal');
421 } elseif ($notifiedevent['elementtype'] == 'facture') {
422 $elementPicto = 'bill';
423 $elementLabel = $langs->trans('Bill');
424 } elseif ($notifiedevent['elementtype'] == 'commande') {
425 $elementPicto = 'order';
426 $elementLabel = $langs->trans('Order');
427 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
428 $elementPicto = 'intervention';
429 $elementLabel = $langs->trans('Intervention');
430 } elseif ($notifiedevent['elementtype'] == 'shipping') {
431 $elementPicto = 'shipment';
432 $elementLabel = $langs->trans('Shipping');
433 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
434 $elementPicto = 'expensereport';
435 $elementLabel = $langs->trans('ExpenseReport');
436 } elseif ($notifiedevent['elementtype'] == 'agenda') {
437 $elementPicto = 'action';
438 }
439
440 $labelfortrigger = 'AmountHT';
441 $codehasnotrigger = 0;
442 if (preg_match('/^(ACTION|HOLIDAY)/', $notifiedevent['code'])) {
443 $codehasnotrigger++;
444 }
445
446 print '<tr class="oddeven">';
447 print '<td>';
448 print img_picto('', $elementPicto, 'class="pictofixedwidth"');
449 print $elementLabel;
450 print '</td>';
451 print '<td>'.$notifiedevent['code'].'</td>';
452 print '<td><span class="opacitymedium">'.$label.'</span></td>';
453 print '<td>';
454 $inputfieldalreadyshown = 0;
455 // Notification with threshold
456 foreach ($conf->global as $key => $val) {
457 if ($val == '' || !preg_match('/^NOTIFICATION_FIXEDEMAIL_'.preg_quote($notifiedevent['code'], '/').'_THRESHOLD_HIGHER_(.*)/', $key, $reg)) {
458 continue;
459 }
460
461 $param = 'NOTIFICATION_FIXEDEMAIL_'.$notifiedevent['code'].'_THRESHOLD_HIGHER_'.$reg[1];
462 $value = GETPOST('NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_key') ? GETPOST('NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_key', 'alpha') : getDolGlobalString($param);
463
464 $s = '<input type="text" class="minwidth200" name="NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_key" value="'.dol_escape_htmltag($value).'">'; // Do not use type="email" here, we must be able to enter a list of email with , separator.
465 $arrayemail = explode(',', $value);
466 $showwarning = 0;
467 foreach ($arrayemail as $keydet => $valuedet) {
468 $valuedet = trim($valuedet);
469 if (!empty($valuedet) && !isValidEmail($valuedet, 1)) {
470 $showwarning++;
471 }
472 }
473 if (getDolGlobalString($param) && $showwarning) {
474 $s .= ' '.img_warning($langs->trans("ErrorBadEMail"));
475 }
476 print $form->textwithpicto($s, $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients").'<br>'.$langs->trans("YouCanAlsoUseSupervisorKeyword"), 1, 'help', '', 0, 2);
477 print '<br>';
478
479 $inputfieldalreadyshown++;
480 }
481 // New entry input fields
482 if (empty($inputfieldalreadyshown) || !$codehasnotrigger) {
483 $s = '<input type="text" class="minwidth200" name="NOTIF_'.$notifiedevent['code'].'_new_key" value="">'; // Do not use type="email" here, we must be able to enter a list of email with , separator.
484 print $form->textwithpicto($s, $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients").'<br>'.$langs->trans("YouCanAlsoUseSupervisorKeyword"), 1, 'help', '', 0, 2);
485 }
486 print '</td>';
487
488 print '<td>';
489 // Notification with threshold
490 $inputfieldalreadyshown = 0;
491 foreach ($conf->global as $key => $val) {
492 if ($val == '' || !preg_match('/^NOTIFICATION_FIXEDEMAIL_'.$notifiedevent['code'].'_THRESHOLD_HIGHER_(.*)/', $key, $reg)) {
493 continue;
494 }
495
496 if (!$codehasnotrigger) {
497 print $langs->trans($labelfortrigger).' >= <input type="text" size="4" name="NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_amount" value="'.dol_escape_htmltag($reg[1]).'">';
498 print '<br>';
499
500 $inputfieldalreadyshown++;
501 }
502 }
503 // New entry input fields
504 if (!$codehasnotrigger) {
505 print $langs->trans($labelfortrigger).' >= <input type="text" size="4" name="NOTIF_'.$notifiedevent['code'].'_new_amount" value="">';
506 }
507 print '</td>';
508
509 print '<td>';
510 // TODO Add link to show message content
511
512 print '</td>';
513 print '</tr>';
514}
515print '</table>';
516print '</div>';
517
518print $form->buttonsSaveCancel("Save", '');
519
520print '</form>';
521
522// End of page
523llxFooter();
524$db->close();
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
form_constantes($tableau, $strictw3c=2, $helptext='', $text='Value')
Show array with constants to edit.
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage generation of HTML components Only common components must be here.
Class of triggers for notification module.
Class to manage the table of subscription to notifications.
llxFooter()
Footer empty.
Definition document.php:107
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.