dolibarr 20.0.0
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
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()
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.
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.