dolibarr  20.0.0-beta
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 <suport@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
30 require '../main.inc.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
33 require_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
39 if (!$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
52 if ($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 
94 if ($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 
119 if ($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 
173 llxHeader('', $langs->trans("NotificationSetup"));
174 
175 $linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
176 print load_fiche_titre($langs->trans("NotificationSetup"), $linkback, 'title_setup');
177 
178 print '<span class="opacitymedium">';
179 print $langs->trans("NotificationsDesc").'<br>';
180 print $langs->trans("NotificationsDescUser").'<br>';
181 if (isModEnabled("societe")) {
182  print $langs->trans("NotificationsDescContact").'<br>';
183 }
184 print $langs->trans("NotificationsDescGlobal").' - '.$langs->trans("YouAreHere").'<br>';
185 print '</span>';
186 print '<br>';
187 
188 print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
189 print '<input type="hidden" name="token" value="'.newToken().'">';
190 print '<input type="hidden" name="action" value="setvalue">';
191 
192 print '<div class="div-table-responsive-no-min">';
193 print '<table class="noborder centpercent">';
194 print '<tr class="liste_titre">';
195 print '<td>'.$langs->trans("Parameter").'</td>';
196 print '<td>'.$langs->trans("Value").'</td>';
197 print "</tr>\n";
198 
199 
200 print '<tr class="oddeven"><td>';
201 print $langs->trans("NotificationEMailFrom").'</td>';
202 print '<td>';
203 print img_picto('', 'email', 'class="pictofixedwidth"');
204 print '<input class="width150 quatrevingtpercentminusx" type="email" name="email_from" value="'.getDolGlobalString('NOTIFICATION_EMAIL_FROM').'">';
205 if (getDolGlobalString('NOTIFICATION_EMAIL_FROM') && !isValidEmail(getDolGlobalString('NOTIFICATION_EMAIL_FROM'))) {
206  print ' '.img_warning($langs->trans("ErrorBadEMail"));
207 }
208 print '</td>';
209 print '</tr>';
210 
211 
212 print '<tr class="oddeven"><td>';
213 print $langs->trans("NotificationDisableConfirmMessageUser").'</td>';
214 print '<td>';
215 if ($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 }
221 print '</td>';
222 print '</tr>';
223 
224 
225 print '<tr class="oddeven"><td>';
226 print $langs->trans("NotificationDisableConfirmMessageContact").'</td>';
227 print '<td>';
228 if ($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 }
234 print '</td>';
235 print '</tr>';
236 
237 
238 print '<tr class="oddeven"><td>';
239 print $langs->trans("NotificationDisableConfirmMessageFix").'</td>';
240 print '<td>';
241 if ($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 }
247 print '</td>';
248 print '</tr>';
249 
250 
251 print '</table>';
252 print '</div>';
253 
254 print $form->buttonsSaveCancel("Save", '');
255 
256 print '</form>';
257 
258 
259 print '<br><br>';
260 
261 
262 print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
263 print '<input type="hidden" name="token" value="'.newToken().'">';
264 print '<input type="hidden" name="action" value="settemplates">';
265 
266 // Notification per contacts
267 $title = $langs->trans("TemplatesForNotifications");
268 
269 print 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();
277 foreach ($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 = '';
322 form_constantes($constantes, 3, $helptext, 'EmailTemplate');
323 
324 print $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 
378 print '</form>';
379 
380 
381 print '<br><br>';
382 
383 
384 print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
385 print '<input type="hidden" name="token" value="'.newToken().'">';
386 print '<input type="hidden" name="action" value="setfixednotif">';
387 print '<input type="hidden" name="page_y" value="">';
388 
389 print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', 'email');
390 
391 print '<div class="info">';
392 print $langs->trans("Note").':<br>';
393 print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
394 if (isModEnabled("societe")) {
395  print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
396 }
397 print '</div>';
398 
399 print '<div class="div-table-responsive">';
400 print '<table class="noborder centpercent">';
401 print '<tr class="liste_titre">';
402 print '<td>'.$langs->trans("Module").'</td>';
403 print '<td>'.$langs->trans("Code").'</td>';
404 print '<td>'.$langs->trans("Label").'</td>';
405 print '<td>'.$langs->trans("FixedEmailTarget").'</td>';
406 print '<td>'.$langs->trans("Threshold").'</td>';
407 print '<td></td>';
408 print "</tr>\n";
409 
410 foreach ($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 }
515 print '</table>';
516 print '</div>';
517 
518 print $form->buttonsSaveCancel("Save", '');
519 
520 print '</form>';
521 
522 // End of page
523 llxFooter();
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).
Definition: admin.lib.php:656
form_constantes($tableau, $strictw3c=2, $helptext='', $text='Value')
Show array with constants to edit.
Definition: admin.lib.php:1684
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
Definition: admin.lib.php:580
ajax_constantonoff($code, $input=array(), $entity=null, $revertonoff=0, $strict=0, $forcereload=0, $marginleftonlyshort=2, $forcenoajax=0, $setzeroinsteadofdel=0, $suffix='', $mode='', $morecss='inline-block')
On/off button for constant.
Definition: ajax.lib.php:641
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
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.
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.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.