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', 'contracts'));
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
262// Emails templates for notification
263
264print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
265print '<input type="hidden" name="token" value="'.newToken().'">';
266print '<input type="hidden" name="action" value="settemplates">';
267
268$title = $langs->trans("TemplatesForNotifications");
269
270print load_fiche_titre($title, '', 'email');
271
272// Load array of available notifications
273$notificationtrigger = new InterfaceNotification($db);
274$listofnotifiedevents = $notificationtrigger->getListOfManagedEvents();
275
276// Editing global variables not related to a specific theme
277$constantes = array();
278foreach ($listofnotifiedevents as $notifiedevent) {
279 $label = $langs->trans("Notify_".$notifiedevent['code']);
280 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
281
282 $model = $notifiedevent['elementtype'];
283
284 if ($notifiedevent['elementtype'] == 'order_supplier') {
285 $elementLabel = $langs->trans('SupplierOrder');
286 } elseif ($notifiedevent['elementtype'] == 'propal') {
287 $elementLabel = $langs->trans('Proposal');
288 } elseif ($notifiedevent['elementtype'] == 'facture') {
289 $elementLabel = $langs->trans('Bill');
290 } elseif ($notifiedevent['elementtype'] == 'commande') {
291 $elementLabel = $langs->trans('Order');
292 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
293 $elementLabel = $langs->trans('Intervention');
294 } elseif ($notifiedevent['elementtype'] == 'shipping') {
295 $elementLabel = $langs->trans('Shipping');
296 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
297 $elementLabel = $langs->trans('ExpenseReport');
298 } elseif ($notifiedevent['elementtype'] == 'contrat') {
299 $elementLabel = $langs->trans('Contract');
300 }
301
302 if ($notifiedevent['elementtype'] == 'propal') {
303 $model = 'propal_send';
304 } elseif ($notifiedevent['elementtype'] == 'commande') {
305 $model = 'order_send';
306 } elseif ($notifiedevent['elementtype'] == 'facture') {
307 $model = 'facture_send';
308 } elseif ($notifiedevent['elementtype'] == 'shipping') {
309 $model = 'shipping_send';
310 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
311 $model = 'fichinter_send';
312 } elseif ($notifiedevent['elementtype'] == 'expensereport') {
313 $model = 'expensereport_send';
314 } elseif ($notifiedevent['elementtype'] == 'order_supplier') {
315 $model = 'order_supplier_send';
316 } elseif ($notifiedevent['elementtype'] == 'invoice_supplier') {
317 $model = 'invoice_supplier_send';
318 } elseif ($notifiedevent['elementtype'] == 'member') {
319 $model = 'member';
320 } elseif ($notifiedevent['elementtype'] == 'contrat') {
321 $model = 'contract_send';
322 }
323
324 $constantes[$notifiedevent['code'].'_TEMPLATE'] = array('type'=>'emailtemplate:'.$model, 'label'=>$label);
325}
326
327$helptext = $langs->trans("EmailTemplateHelp", $langs->transnoentitiesnoconv("Tools"), $langs->transnoentitiesnoconv("EMailTemplates"));
328form_constantes($constantes, 3, $helptext, 'EmailTemplate');
329
330print $form->buttonsSaveCancel("Save", '');
331
332/*
333} else {
334 print '<table class="noborder centpercent">';
335 print '<tr class="liste_titre">';
336 print '<td>'.$langs->trans("Label").'</td>';
337 //print '<td class="right">'.$langs->trans("NbOfTargetedContacts").'</td>';
338 print "</tr>\n";
339
340 print '<tr class="oddeven">';
341 print '<td>';
342
343 $i = 0;
344 foreach ($listofnotifiedevents as $notifiedevent) {
345 $label = $langs->trans("Notify_".$notifiedevent['code']); //!=$langs->trans("Notify_".$notifiedevent['code'])?$langs->trans("Notify_".$notifiedevent['code']):$notifiedevent['label'];
346 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
347
348 if ($notifiedevent['elementtype'] == 'order_supplier') {
349 $elementLabel = $langs->trans('SupplierOrder');
350 } elseif ($notifiedevent['elementtype'] == 'propal') {
351 $elementLabel = $langs->trans('Proposal');
352 } elseif ($notifiedevent['elementtype'] == 'facture') {
353 $elementLabel = $langs->trans('Bill');
354 } elseif ($notifiedevent['elementtype'] == 'commande') {
355 $elementLabel = $langs->trans('Order');
356 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
357 $elementLabel = $langs->trans('Intervention');
358 } elseif ($notifiedevent['elementtype'] == 'shipping') {
359 $elementLabel = $langs->trans('Shipping');
360 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
361 $elementLabel = $langs->trans('ExpenseReport');
362 }
363
364 if ($i) {
365 print ', ';
366 }
367 print $label;
368
369 $i++;
370 }
371
372 print '</td></tr>';
373 print '</table>';
374
375 print '<div class="opacitymedium">';
376 print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
377 if (isModEnabled("societe")) {
378 print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
379 }
380 print '</div>';
381}
382*/
383
384print '</form>';
385
386
387print '<br><br>';
388
389
390print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
391print '<input type="hidden" name="token" value="'.newToken().'">';
392print '<input type="hidden" name="action" value="setfixednotif">';
393print '<input type="hidden" name="page_y" value="">';
394
395print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', 'email');
396
397print '<div class="info">';
398print $langs->trans("Note").':<br>';
399print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
400if (isModEnabled("societe")) {
401 print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
402}
403print '</div>';
404
405print '<div class="div-table-responsive">';
406print '<table class="noborder centpercent">';
407print '<tr class="liste_titre">';
408print '<td>'.$langs->trans("Module").'</td>';
409print '<td>'.$langs->trans("Code").'</td>';
410print '<td>'.$langs->trans("Label").'</td>';
411print '<td>'.$langs->trans("FixedEmailTarget").'</td>';
412print '<td>'.$langs->trans("Threshold").'</td>';
413print '<td></td>';
414print "</tr>\n";
415
416foreach ($listofnotifiedevents as $notifiedevent) {
417 $label = $langs->trans("Notify_".$notifiedevent['code']);
418
419 $elementPicto = $notifiedevent['elementtype'];
420 $elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
421 // Special cases
422 if ($notifiedevent['elementtype'] == 'order_supplier') {
423 $elementPicto = 'supplier_order';
424 $elementLabel = $langs->trans('SupplierOrder');
425 } elseif ($notifiedevent['elementtype'] == 'propal') {
426 $elementLabel = $langs->trans('Proposal');
427 } elseif ($notifiedevent['elementtype'] == 'facture') {
428 $elementPicto = 'bill';
429 $elementLabel = $langs->trans('Bill');
430 } elseif ($notifiedevent['elementtype'] == 'commande') {
431 $elementPicto = 'order';
432 $elementLabel = $langs->trans('Order');
433 } elseif ($notifiedevent['elementtype'] == 'ficheinter') {
434 $elementPicto = 'intervention';
435 $elementLabel = $langs->trans('Intervention');
436 } elseif ($notifiedevent['elementtype'] == 'shipping') {
437 $elementPicto = 'shipment';
438 $elementLabel = $langs->trans('Shipping');
439 } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
440 $elementPicto = 'expensereport';
441 $elementLabel = $langs->trans('ExpenseReport');
442 } elseif ($notifiedevent['elementtype'] == 'contrat') {
443 $elementPicto = 'contract';
444 $elementLabel = $langs->trans('Contract');
445 } elseif ($notifiedevent['elementtype'] == 'agenda') {
446 $elementPicto = 'action';
447 }
448
449 $labelfortrigger = 'AmountHT';
450 $codehasnotrigger = 0;
451 if (preg_match('/^(ACTION|HOLIDAY)/', $notifiedevent['code'])) {
452 $codehasnotrigger++;
453 }
454
455 print '<tr class="oddeven">';
456 print '<td>';
457 print img_picto('', $elementPicto, 'class="pictofixedwidth"');
458 print $elementLabel;
459 print '</td>';
460 print '<td>'.$notifiedevent['code'].'</td>';
461 print '<td><span class="opacitymedium">'.$label.'</span></td>';
462 print '<td>';
463 $inputfieldalreadyshown = 0;
464 // Notification with threshold
465 foreach ($conf->global as $key => $val) {
466 if ($val == '' || !preg_match('/^NOTIFICATION_FIXEDEMAIL_'.preg_quote($notifiedevent['code'], '/').'_THRESHOLD_HIGHER_(.*)/', $key, $reg)) {
467 continue;
468 }
469
470 $param = 'NOTIFICATION_FIXEDEMAIL_'.$notifiedevent['code'].'_THRESHOLD_HIGHER_'.$reg[1];
471 $value = GETPOST('NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_key') ? GETPOST('NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_key', 'alpha') : getDolGlobalString($param);
472
473 $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.
474 $arrayemail = explode(',', $value);
475 $showwarning = 0;
476 foreach ($arrayemail as $keydet => $valuedet) {
477 $valuedet = trim($valuedet);
478 if (!empty($valuedet) && !isValidEmail($valuedet, 1)) {
479 $showwarning++;
480 }
481 }
482 if (getDolGlobalString($param) && $showwarning) {
483 $s .= ' '.img_warning($langs->trans("ErrorBadEMail"));
484 }
485 print $form->textwithpicto($s, $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients").'<br>'.$langs->trans("YouCanAlsoUseSupervisorKeyword"), 1, 'help', '', 0, 2);
486 print '<br>';
487
488 $inputfieldalreadyshown++;
489 }
490 // New entry input fields
491 if (empty($inputfieldalreadyshown) || !$codehasnotrigger) {
492 $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.
493 print $form->textwithpicto($s, $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients").'<br>'.$langs->trans("YouCanAlsoUseSupervisorKeyword"), 1, 'help', '', 0, 2);
494 }
495 print '</td>';
496
497 print '<td>';
498 // Notification with threshold
499 $inputfieldalreadyshown = 0;
500 foreach ($conf->global as $key => $val) {
501 if ($val == '' || !preg_match('/^NOTIFICATION_FIXEDEMAIL_'.$notifiedevent['code'].'_THRESHOLD_HIGHER_(.*)/', $key, $reg)) {
502 continue;
503 }
504
505 if (!$codehasnotrigger) {
506 print $langs->trans($labelfortrigger).' >= <input type="text" size="4" name="NOTIF_'.$notifiedevent['code'].'_old_'.$reg[1].'_amount" value="'.dol_escape_htmltag($reg[1]).'">';
507 print '<br>';
508
509 $inputfieldalreadyshown++;
510 }
511 }
512 // New entry input fields
513 if (!$codehasnotrigger) {
514 print $langs->trans($labelfortrigger).' >= <input type="text" size="4" name="NOTIF_'.$notifiedevent['code'].'_new_amount" value="">';
515 }
516 print '</td>';
517
518 print '<td>';
519 // TODO Add link to show message content
520
521 print '</td>';
522 print '</tr>';
523}
524print '</table>';
525print '</div>';
526
527print $form->buttonsSaveCancel("Save", '');
528
529print '</form>';
530
531// End of page
532llxFooter();
533$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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.