dolibarr 20.0.5
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
25// Load Dolibarr environment
26require '../main.inc.php';
27require_once DOL_DOCUMENT_ROOT.'/core/lib/asset.lib.php';
28require_once DOL_DOCUMENT_ROOT.'/asset/class/asset.class.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
31
32// Load translation files required by the page
33$langs->loadLangs(array("assets", "other"));
34
35// Get parameters
36$id = GETPOSTINT('id');
37$ref = GETPOST('ref', 'alpha');
38$action = GETPOST('action', 'aZ09');
39$confirm = GETPOST('confirm', 'alpha');
40$cancel = GETPOST('cancel', 'aZ09');
41$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'assetcard'; // To manage different context of search
42$backtopage = GETPOST('backtopage', 'alpha');
43$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
44
45// Initialize technical objects
46$object = new Asset($db);
47$extrafields = new ExtraFields($db);
48$diroutputmassaction = $conf->asset->dir_output.'/temp/massgeneration/'.$user->id;
49$hookmanager->initHooks(array('assetcard', 'globalcard')); // Note that conf->hooks_modules contains array
50
51// Fetch optionals attributes and labels
52$extrafields->fetch_name_optionals_label($object->table_element);
53
54$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
55
56// Initialize array of search criteria
57$search_all = GETPOST("search_all", 'alpha');
58$search = array();
59foreach ($object->fields as $key => $val) {
60 if (GETPOST('search_'.$key, 'alpha')) {
61 $search[$key] = GETPOST('search_'.$key, 'alpha');
62 }
63}
64
65if (empty($action) && empty($id) && empty($ref)) {
66 $action = 'view';
67}
68
69// Load object
70include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
71
72$permissiontoread = $user->hasRight('asset', 'read');
73$permissiontoadd = $user->hasRight('asset', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
74$permissiontodelete = $user->hasRight('asset', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
75$permissionnote = $user->hasRight('asset', 'write'); // Used by the include of actions_setnotes.inc.php
76$permissiondellink = $user->hasRight('asset', 'write'); // Used by the include of actions_dellink.inc.php
77$upload_dir = $conf->asset->multidir_output[isset($object->entity) ? $object->entity : 1];
78
79// Security check (enable the most restrictive one)
80if ($user->socid > 0) {
82}
83if ($user->socid > 0) {
84 $socid = $user->socid;
85}
86$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
87restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
88if (!isModEnabled('asset')) {
90}
91if (!$permissiontoread) {
93}
94
95
96/*
97 * Actions
98 */
99
100$parameters = array();
101$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
102if ($reshook < 0) {
103 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
104}
105
106if (empty($reshook)) {
107 $error = 0;
108
109 $backurlforlist = DOL_URL_ROOT.'/asset/list.php';
110
111 if (empty($backtopage) || ($cancel && empty($id))) {
112 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
113 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
114 $backtopage = $backurlforlist;
115 } else {
116 $backtopage = DOL_URL_ROOT.'/asset/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
117 }
118 }
119 }
120
121 $object->oldcopy = dol_clone($object, 2);
122 $triggermodname = 'ASSET_MODIFY'; // Name of trigger action code to execute when we modify record
123
124 // Action dispose object
125 if ($action == 'confirm_disposal' && $confirm == 'yes' && $permissiontoadd) {
126 $object->disposal_date = dol_mktime(12, 0, 0, GETPOSTINT('disposal_datemonth'), GETPOSTINT('disposal_dateday'), GETPOSTINT('disposal_dateyear')); // for date without hour, we use gmt
127 $object->disposal_amount_ht = GETPOSTINT('disposal_amount');
128 $object->fk_disposal_type = GETPOSTINT('fk_disposal_type');
129 $disposal_invoice_id = GETPOSTINT('disposal_invoice_id');
130 $object->disposal_depreciated = ((GETPOST('disposal_depreciated') == '1' || GETPOST('disposal_depreciated') == 'on') ? 1 : 0);
131 $object->disposal_subject_to_vat = ((GETPOST('disposal_subject_to_vat') == '1' || GETPOST('disposal_subject_to_vat') == 'on') ? 1 : 0);
132
133 $result = $object->dispose($user, $disposal_invoice_id);
134 if ($result < 0) {
135 setEventMessages($object->error, $object->errors, 'errors');
136 }
137 $action = '';
138 } elseif ($action == "add" && $permissiontoadd) {
139 $object->supplier_invoice_id = GETPOSTINT('supplier_invoice_id');
140 }
141
142 // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
143 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
144
145 // Actions when linking object each other
146 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
147
148 // Actions when printing a doc from card
149 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
150
151 // Action to move up and down lines of object
152 //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
153
154 // Action to build doc
155 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
156
157 // Actions to send emails
158 $triggersendname = 'ASSET_SENTBYMAIL';
159 $autocopy = 'MAIN_MAIL_AUTOCOPY_ASSET_TO';
160 $trackid = 'asset'.$object->id;
161 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
162}
163
164
165/*
166 * View
167 *
168 */
169
170$form = new Form($db);
171$formfile = new FormFile($db);
172
173$title = $langs->trans("Asset").' - '.$langs->trans("Card");
174$help_url = '';
175llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-asset page-card');
176
177// Part to create
178if ($action == 'create') {
179 print load_fiche_titre($langs->trans("NewObject", $langs->transnoentitiesnoconv("Asset")), '', 'object_'.$object->picto);
180
181 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
182 print '<input type="hidden" name="token" value="'.newToken().'">';
183 print '<input type="hidden" name="action" value="add">';
184 if ($backtopage) {
185 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
186 }
187 if ($backtopageforcancel) {
188 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
189 }
190 if (GETPOSTISSET('supplier_invoice_id')) {
191 $object->fields['supplier_invoice_id'] = array('type' => 'integer:FactureFournisseur:fourn/class/fournisseur.facture.class.php:1:entity IN (__SHARED_ENTITIES__)', 'label' => 'SupplierInvoice', 'enabled' => '1', 'noteditable' => 1, 'position' => 280, 'notnull' => 0, 'visible' => 1, 'index' => 1, 'validate' => '1',);
192 print '<input type="hidden" name="supplier_invoice_id" value="' . GETPOSTINT('supplier_invoice_id') . '">';
193 }
194
195 print dol_get_fiche_head(array(), '');
196
197
198 print '<table class="border centpercent tableforfieldcreate">'."\n";
199
200 // Common attributes
201 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
202
203 // Other attributes
204 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
205
206 print '</table>'."\n";
207
208 print dol_get_fiche_end();
209
210 print $form->buttonsSaveCancel("Create");
211
212 print '</form>';
213
214 //dol_set_focus('input[name="ref"]');
215}
216
217// Part to edit record
218if (($id || $ref) && $action == 'edit') {
219 print load_fiche_titre($langs->trans("Asset"), '', 'object_'.$object->picto);
220
221 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
222 print '<input type="hidden" name="token" value="'.newToken().'">';
223 print '<input type="hidden" name="action" value="update">';
224 print '<input type="hidden" name="id" value="'.$object->id.'">';
225 if ($backtopage) {
226 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
227 }
228 if ($backtopageforcancel) {
229 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
230 }
231
232 print dol_get_fiche_head();
233
234 print '<table class="border centpercent tableforfieldedit">'."\n";
235
236 // Common attributes
237 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
238
239 // Other attributes
240 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
241
242 print '</table>';
243
244 print dol_get_fiche_end();
245
246 print $form->buttonsSaveCancel();
247
248 print '</form>';
249}
250
251// Part to show record
252if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
253 $res = $object->fetch_optionals();
254
255 $head = assetPrepareHead($object);
256 print dol_get_fiche_head($head, 'card', $langs->trans("Asset"), -1, $object->picto);
257
258 $formconfirm = '';
259
260 // Confirmation to delete
261 if ($action == 'delete') {
262 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteAsset'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
263 } elseif ($action == 'disposal') {
264 // Disposal
265 $langs->load('bills');
266
267 $disposal_date = dol_mktime(12, 0, 0, GETPOSTINT('disposal_datemonth'), GETPOSTINT('disposal_dateday'), GETPOSTINT('disposal_dateyear')); // for date without hour, we use gmt
268 $disposal_amount = GETPOSTINT('disposal_amount');
269 $fk_disposal_type = GETPOSTINT('fk_disposal_type');
270 $disposal_invoice_id = GETPOSTINT('disposal_invoice_id');
271 $disposal_depreciated = GETPOSTISSET('disposal_depreciated') ? GETPOST('disposal_depreciated') : 1;
272 $disposal_depreciated = !empty($disposal_depreciated) ? 1 : 0;
273 $disposal_subject_to_vat = GETPOSTISSET('disposal_subject_to_vat') ? GETPOST('disposal_subject_to_vat') : 1;
274 $disposal_subject_to_vat = !empty($disposal_subject_to_vat) ? 1 : 0;
275
276 $object->fields['fk_disposal_type']['visible'] = 1;
277 $disposal_type_form = $object->showInputField(null, 'fk_disposal_type', $fk_disposal_type, '', '', '', 0);
278 $object->fields['fk_disposal_type']['visible'] = -2;
279
280 $disposal_invoice_form = $form->selectForForms('Facture:compta/facture/class/facture.class.php::(entity:IN:__SHARED_ENTITIES__)', 'disposal_invoice_id', $disposal_invoice_id);
281
282 // Create an array for form
283 $formquestion = array(
284 array('type' => 'date', 'name' => 'disposal_date', 'tdclass' => 'fieldrequired', 'label' => $langs->trans("AssetDisposalDate"), 'value' => $disposal_date),
285 array('type' => 'text', 'name' => 'disposal_amount', 'tdclass' => 'fieldrequired', 'label' => $langs->trans("AssetDisposalAmount"), 'value' => $disposal_amount),
286 array('type' => 'other', 'name' => 'fk_disposal_type', 'tdclass' => 'fieldrequired', 'label' => $langs->trans("AssetDisposalType"), 'value' => $disposal_type_form),
287 array('type' => 'other', 'name' => 'disposal_invoice_id', 'label' => $langs->trans("InvoiceCustomer"), 'value' => $disposal_invoice_form),
288 array('type' => 'checkbox', 'name' => 'disposal_depreciated', 'label' => $langs->trans("AssetDisposalDepreciated"), 'value' => $disposal_depreciated),
289 array('type' => 'checkbox', 'name' => 'disposal_subject_to_vat', 'label' => $langs->trans("AssetDisposalSubjectToVat"), 'value' => $disposal_subject_to_vat),
290 );
291 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('AssetDisposal'), $langs->trans('AssetConfirmDisposalAsk', $object->ref . ' - ' . $object->label), 'confirm_disposal', $formquestion, 'yes', 1);
292 } elseif ($action == 'reopen') {
293 // Re-open
294 // Create an array for form
295 $formquestion = array();
296 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ReOpen'), $langs->trans('AssetConfirmReOpenAsk', $object->ref), 'confirm_reopen', $formquestion, 'yes', 1);
297 }
298 // Clone confirmation
299 /* elseif ($action == 'clone') {
300 // Create an array for form
301 $formquestion = array();
302 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
303 }*/
304
305 // Call Hook formConfirm
306 $parameters = array('formConfirm' => $formconfirm);
307 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
308 if (empty($reshook)) {
309 $formconfirm .= $hookmanager->resPrint;
310 } elseif ($reshook > 0) {
311 $formconfirm = $hookmanager->resPrint;
312 }
313
314 // Print form confirm
315 print $formconfirm;
316
317
318 // Object card
319 // ------------------------------------------------------------
320 $linkback = '<a href="'.DOL_URL_ROOT.'/asset/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
321
322 $morehtmlref = '<div class="refidno">';
323 $morehtmlref .= '</div>';
324
325
326 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
327
328
329 print '<div class="fichecenter">';
330 print '<div class="fichehalfleft">';
331 print '<div class="underbanner clearboth"></div>';
332 print '<table class="border centpercent tableforfield">'."\n";
333
334 // Common attributes
335 $keyforbreak='date_acquisition'; // We change column just before this field
336 //unset($object->fields['fk_project']); // Hide field already shown in banner
337 //unset($object->fields['fk_soc']); // Hide field already shown in banner
338 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
339
340 // Other attributes. Fields from hook formObjectOptions and Extrafields.
341 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
342
343 print '</table>';
344 print '</div>';
345 print '</div>';
346
347 print '<div class="clearboth"></div>';
348
349 print dol_get_fiche_end();
350
351 // Buttons for actions
352 if ($action != 'presend' && $action != 'editline') {
353 print '<div class="tabsAction">' . "\n";
354 $parameters = array();
355 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
356 if ($reshook < 0) {
357 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
358 }
359
360 if (empty($reshook)) {
361 // Send
362 if (empty($user->socid)) {
363 print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=presend&mode=init&token=' . newToken() . '#formmailbeforetitle');
364 }
365
366 if ($object->status == $object::STATUS_DRAFT) {
367 print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=edit&token=' . newToken(), '', $permissiontoadd);
368 }
369
370 // Clone
371 //print dolGetButtonAction($langs->trans('ToClone'), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=clone&token=' . newToken(), '', false && $permissiontoadd);
372
373 if ($object->status == $object::STATUS_DRAFT) {
374 print dolGetButtonAction($langs->trans('AssetDisposal'), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=disposal&token=' . newToken(), '', $permissiontoadd);
375 } else {
376 print dolGetButtonAction($langs->trans('ReOpen'), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=reopen&token=' . newToken(), '', $permissiontoadd);
377 }
378
379 // Delete (need delete permission, or if draft, just need create/modify permission)
380 print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=delete&token=' . newToken(), '', $permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd));
381 }
382 print '</div>' . "\n";
383 }
384
385 // Select mail models is same action as presend
386 if (GETPOST('modelselected')) {
387 $action = 'presend';
388 }
389
390 if ($action != 'presend') {
391 print '<div class="fichecenter"><div class="fichehalfleft">';
392 print '<a name="builddoc"></a>'; // ancre
393
394 $includedocgeneration = 0;
395
396 // Documents
397 if ($includedocgeneration) {
398 $objref = dol_sanitizeFileName($object->ref);
399 $relativepath = $objref.'/'.$objref.'.pdf';
400 $filedir = $conf->asset->dir_output.'/'.$objref;
401 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
402 $genallowed = $user->hasRight('asset', 'read'); // If you can read, you can build the PDF to read content
403 $delallowed = $user->hasRight('asset', 'write'); // If you can create/edit, you can remove a file on card
404 print $formfile->showdocuments('asset:Asset', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
405 }
406
407 // Show links to link elements
408 $linktoelem = $form->showLinkToObjectBlock($object, null, array('asset'));
409 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
410
411
412 print '</div><div class="fichehalfright">';
413
414 $morehtmlcenter = '';
415 $MAXEVENT = 10;
416
417 $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/asset/agenda.php?id='.$object->id);
418
419 // List of actions on element
420 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
421 $formactions = new FormActions($db);
422 $somethingshown = $formactions->showactions($object, $object->element, 0, 1, '', $MAXEVENT, '', $morehtmlcenter);
423
424 print '</div></div>';
425 }
426
427 //Select mail models is same action as presend
428 if (GETPOST('modelselected')) {
429 $action = 'presend';
430 }
431
432 // Presend form
433 $modelmail = 'asset';
434 $defaulttopic = 'InformationMessage';
435 $diroutput = $conf->asset->dir_output;
436 $trackid = 'asset'.$object->id;
437
438 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
439}
440
441// End of page
442llxFooter();
443$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
assetPrepareHead(Asset $object)
Prepare array of tabs for Asset.
Definition asset.lib.php:87
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 for Asset.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
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_get_fiche_end($notab=0)
Return tab footer of a card.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.