dolibarr 20.0.0
new.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2001-2002 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2006-2013 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2012 J. Fernando Lagrange <fernando@demo-tic.org>
7 * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
8 * Copyright (C) 2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
9 * Copyright (C) 2021 Waël Almoman <info@almoman.com>
10 * Copyright (C) 2022 Udo Tamm <dev@dolibit.de>
11 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
34if (!defined('NOLOGIN')) {
35 define("NOLOGIN", 1); // This means this output page does not require to be logged.
36}
37if (!defined('NOCSRFCHECK')) {
38 define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
39}
40if (!defined('NOBROWSERNOTIF')) {
41 define('NOBROWSERNOTIF', '1');
42}
43
44
45// For MultiCompany module.
46// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
47// Because 2 entities can have the same ref
48$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
49if (is_numeric($entity)) {
50 define("DOLENTITY", $entity);
51}
52
53
54// Load Dolibarr environment
55require '../../main.inc.php';
56require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
57require_once DOL_DOCUMENT_ROOT . '/core/lib/payments.lib.php';
58require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
59require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent_type.class.php';
60require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
61require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
62require_once DOL_DOCUMENT_ROOT . '/core/class/cunits.class.php';
63require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
64require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php';
65// Init vars
66$backtopage = GETPOST('backtopage', 'alpha');
67$action = GETPOST('action', 'aZ09');
68
69$errmsg = '';
70$num = 0;
71$error = 0;
72
73// Load translation files
74$langs->loadLangs(array("main", "members", "companies", "install", "other", "errors"));
75
76// Security check
77if (!isModEnabled('societe')) {
78 httponly_accessforbidden('Module Thirdparty not enabled');
79}
80
81if (!getDolGlobalString('SOCIETE_ENABLE_PUBLIC')) {
82 httponly_accessforbidden("Online form for contact for public visitors has not been enabled");
83}
84
85
86//permissions
87
88$permissiontoadd = $user->hasRight('societe', 'creer');
89
90// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
91$hookmanager->initHooks(array('publicnewmembercard', 'globalcard'));
92
93$extrafields = new ExtraFields($db);
94
95
96$objectsoc = new Societe($db);
97$user->loadDefaultValues();
98
99
111function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = [], $arrayofcss = [])
112{
113 global $conf, $langs, $mysoc;
114
115 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers
116
117 print '<body id="mainbody" class="publicnewmemberform">';
118
119 // Define urllogo
120 $urllogo = DOL_URL_ROOT . '/theme/common/login_logo.png';
121
122 if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output . '/logos/thumbs/' . $mysoc->logo_small)) {
123 $urllogo = DOL_URL_ROOT . '/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file=' . urlencode('logos/thumbs/' . $mysoc->logo_small);
124 } elseif (!empty($mysoc->logo) && is_readable($conf->mycompany->dir_output . '/logos/' . $mysoc->logo)) {
125 $urllogo = DOL_URL_ROOT . '/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file=' . urlencode('logos/' . $mysoc->logo);
126 } elseif (is_readable(DOL_DOCUMENT_ROOT . '/theme/dolibarr_logo.svg')) {
127 $urllogo = DOL_URL_ROOT . '/theme/dolibarr_logo.svg';
128 }
129
130 print '<header class="center">';
131
132 // Output html code for logo
133 if ($urllogo) {
134 print '<div class="backgreypublicpayment">';
135 print '<div class="logopublicpayment">';
136 print '<img id="dolpaymentlogo" src="' . $urllogo . '">';
137 print '</div>';
138 if (!getDolGlobalString('MAIN_HIDE_POWERED_BY')) {
139 print '<div class="poweredbypublicpayment opacitymedium right"><a class="poweredbyhref" href="https://www.dolibarr.org?utm_medium=website&utm_source=poweredby" target="dolibarr" rel="noopener">' . $langs->trans("PoweredBy") . '<br><img class="poweredbyimg" src="' . DOL_URL_ROOT . '/theme/dolibarr_logo.svg" width="80px"></a></div>';
140 }
141 print '</div>';
142 }
143
144 if (getDolGlobalString('MEMBER_IMAGE_PUBLIC_REGISTRATION')) {
145 print '<div class="backimagepublicregistration">';
146 print '<img id="idEVENTORGANIZATION_IMAGE_PUBLIC_INTERFACE" src="' . getDolGlobalString('MEMBER_IMAGE_PUBLIC_REGISTRATION') . '">';
147 print '</div>';
148 }
149
150 print '</header>';
151
152 print '<div class="divmainbodylarge">';
153}
154
161{
162 global $conf, $langs;
163
164 $ext = '';
165
166 print '</div>';
167
168 printCommonFooter('public');
169
170 if (!empty($conf->use_javascript_ajax)) {
171 print "\n" . '<!-- Includes JS Footer of Dolibarr -->' . "\n";
172 print '<script src="' . DOL_URL_ROOT . '/core/js/lib_foot.js.php?lang=' . $langs->defaultlang . (!empty($ext) ? '&' . $ext : '') . '"></script>' . "\n";
173 }
174
175 print "</body>\n";
176 print "</html>\n";
177}
178
179
180
181/*
182 * Actions
183 */
184
185$parameters = array();
186// Note that $action and $object may have been modified by some hooks
187$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
188if ($reshook < 0) {
189 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
190}
191
192// Action called when page is submitted
193if (empty($reshook) && $action == 'add') {
194 $error = 0;
195 $urlback = '';
196
197 $db->begin();
198
199 if (!GETPOST('name')) {
200 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Company")), null, 'errors');
201 $error++;
202 }
203
204 // Check Captcha code if is enabled
205 if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA')) {
206 $sessionkey = 'dol_antispam_value';
207 $ok = (array_key_exists($sessionkey, $_SESSION) === true && (strtolower($_SESSION[$sessionkey]) == strtolower(GETPOST('code'))));
208 if (!$ok) {
209 $error++;
210 $errmsg .= $langs->trans("ErrorBadValueForCode") . "<br>\n";
211 $action = '';
212 }
213 }
214
215 if (!$error) {
216 $societe = new Societe($db);
217
218 $societe->name = GETPOST('name', 'alphanohtml');
219
220 $societe->client = GETPOSTINT('client') ? GETPOSTINT('client') : $societe->client;
221
222 $societe->address = GETPOST('address', 'alphanohtml');
223
224 $societe->country_id = GETPOSTINT('country_id');
225
226 $societe->phone = GETPOST('phone', 'alpha');
227
228 $societe->fax = GETPOST('fax', 'alpha');
229
230 $societe->email = trim(GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL));
231
232 $societe->client = 2 ; // our client is a prospect
233
234 $societe->code_client = '-1';
235
236 $societe->name_alias = GETPOST('name_alias', 'alphanohtml');
237
238 $societe->note_private = GETPOST('note_private');
239 if (!$error) {
240 $result = $societe->create($user);
241 if ($result > 0) {
242 require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
243 $objectsoc = $societe;
244
245 if (!empty($backtopage)) {
246 $urlback = $backtopage;
247 } elseif (getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION')) {
248 $urlback = getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION');
249 // TODO Make replacement of __AMOUNT__, etc...
250 } else {
251 $urlback = $_SERVER["PHP_SELF"] . "?action=added&token=" . newToken();
252 }
253 } else {
254 $error++;
255 $errmsg .= implode('<br>', $societe->errors);
256 }
257 }
258 }
259
260 if (!$error) {
261 $db->commit();
262
263 header("Location: " . $urlback);
264 exit;
265 } else {
266 $db->rollback();
267 $action = "create";
268 }
269}
270
271// Action called after a submitted was send and prospect created successfully
272// If MEMBER_URL_REDIRECT_SUBSCRIPTION is set to an url, we never go here because a redirect was done to this url. Same if we ask to redirect to the payment page.
273// backtopage parameter with an url was set on prospect submit page, we never go here because a redirect was done to this url.
274
275if (empty($reshook) && $action == 'added') {
276 llxHeaderVierge("newSocieteAdded");
277
278 // If we have not been redirected
279 print '<br><br>';
280 print '<div class="center">';
281 print $langs->trans("newSocieteAdded");
282 print '</div>';
283
285 exit;
286}
287
288
289
290/*
291 * View
292 */
293
294$form = new Form($db);
295$formcompany = new FormCompany($db);
296$adht = new AdherentType($db);
297$formadmin = new FormAdmin($db);
298$extrafields->fetch_name_optionals_label($objectsoc->table_element); // fetch optionals attributes and labels
299
300
301llxHeaderVierge($langs->trans("ContactUs"));
302
303print '<br>';
304print load_fiche_titre(img_picto('', 'member_nocolor', 'class="pictofixedwidth"') . ' &nbsp; ' . $langs->trans("ContactUs"), '', '', 0, 0, 'center');
305
306
307print '<div align="center">';
308print '<div id="divsubscribe">';
309
310print '<div class="center subscriptionformhelptext opacitymedium justify">';
311if (getDolGlobalString('COMPANY_NEWFORM_TEXT')) {
312 print $langs->trans(getDolGlobalString('COMPANY_NEWFORM_TEXT')) . "<br>\n";
313} else {
314 print $langs->trans("ContactUsDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL")) . "<br>\n";
315}
316print '</div>';
317
318dol_htmloutput_errors($errmsg);
320
321// Print form
322print '<form action="' . $_SERVER["PHP_SELF"] . '" method="POST" name="newprospect">' . "\n";
323print '<input type="hidden" name="token" value="' . newToken() . '" / >';
324print '<input type="hidden" name="entity" value="' . $entity . '" />';
325print '<input type="hidden" name="action" value="add" />';
326print '<br>';
327
328$messagemandatory = '<span class="">' . $langs->trans("FieldsWithAreMandatory", '*') . '</span>';
329//print '<br><span class="opacitymedium">'.$langs->trans("FieldsWithAreMandatory", '*').'</span><br>';
330//print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
331
332print dol_get_fiche_head();
333
334print '<script type="text/javascript">
335jQuery(document).ready(function () {
336 jQuery(document).ready(function () {
337 function initmorphy()
338 {
339 console.log("Call initmorphy");
340 if (jQuery("#morphy").val() == \'phy\') {
341 jQuery("#trcompany").hide();
342 }
343 if (jQuery("#morphy").val() == \'mor\') {
344 jQuery("#trcompany").show();
345 }
346 }
347 initmorphy();
348 jQuery("#morphy").change(function() {
349 initmorphy();
350 });
351 jQuery("#selectcountry_id").change(function() {
352 document.newprospect.action.value="create";
353 document.newprospect.submit();
354 });
355 jQuery("#typeid").change(function() {
356 document.newprospect.action.value="create";
357 document.newprospect.submit();
358 });
359 });
360});
361</script>';
362
363
364print '<table class="border" summary="form to subscribe" id="tablesubscribe">' . "\n";
365//Third party name
366/*
367if ($objectsoc->particulier || $private) {
368 print '<span id="TypeName" class="fieldrequired">'.$langs->trans('ThirdPartyName').' / '.$langs->trans('LastName', 'name').'</span>';
369} else {
370 print '<span id="TypeName" class="fieldrequired">'.$form->editfieldkey('ThirdPartyName', 'name', '', $objectsoc, 0).'</span>';
371}
372*/
373print '<tr class="tr-field-thirdparty-name"><td class="titlefieldcreate">'; // text appreas left
374print '<input type="hidden" name="ThirdPartyName" value="' . $langs->trans('ThirdPartyName') . '">';
375print '<span id="TypeName" class="fieldrequired" title="' .dol_escape_htmltag($langs->trans("FieldsWithAreMandatory", '*')) . '" >' . $form->editfieldkey('Company', 'name', '', $objectsoc, 0) . '<span class="star"> *</span></span>';
376print '</td><td>'; // inline input
377print '<input type="text" class="minwidth300" maxlength="128" name="name" id="name" value="' . dol_escape_htmltag($objectsoc->name) . '" autofocus="autofocus">';
378//
379
380// Name and lastname
381print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Firstname") . ' <span class="star">*</span></td><td><input type="text" name="firstname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('firstname')) . '"></td></tr>' . "\n";
382
383print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Lastname") . ' <span class="star">*</span></td><td><input type="text" name="lastname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('lastname')) . '"></td></tr>' . "\n";
384
385// Address
386print '<tr><td class="tdtop">';
387print $form->editfieldkey('Address', 'address', '', $objectsoc, 0);
388print '</td>';
389print '<td>';
390print '<textarea name="address" id="address" class="quatrevingtpercent" rows="' . ROWS_2 . '" wrap="soft">';
391print dol_escape_htmltag($objectsoc->address, 0, 1);
392print '</textarea>';
393print $form->widgetForTranslation("address", $objectsoc, $permissiontoadd, 'textarea', 'alphanohtml', 'quatrevingtpercent');
394print '</td></tr>';
395
396// Country
397print '<tr><td>' . $form->editfieldkey('Country', 'selectcountry_id', '', $objectsoc, 0) . '</td><td class="maxwidthonsmartphone">';
398print img_picto('', 'country', 'class="pictofixedwidth"');
399print $form->select_country((GETPOSTISSET('country_id') ? GETPOST('country_id') : $objectsoc->country_id), 'country_id', '', 0, 'minwidth300 maxwidth500 widthcentpercentminusx');
400if ($user->admin) {
401 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
402}
403print '</td></tr>';
404
405// Phone / Fax
406print '<tr><td>' . $form->editfieldkey('Phone', 'phone', '', $objectsoc, 0) . '</td>';
407print '<td>' . img_picto('', 'object_phoning', 'class="pictofixedwidth"') . ' <input type="text" name="phone" id="phone" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('phone') ? GETPOST('phone', 'alpha') : $objectsoc->phone) . '"></td>';
408print '</tr>';
409
410print '<tr>';
411print '<td>' . $form->editfieldkey('Fax', 'fax', '', $objectsoc, 0) . '</td>';
412print '<td>' . img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"') . ' <input type="text" name="fax" id="fax" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $objectsoc->fax) . '"></td>';
413print '</tr>';
414
415// Email / Web
416print '<tr><td>' . $form->editfieldkey('EMail', 'email', '', $objectsoc, 0, 'string', '', !getDolGlobalString('SOCIETE_EMAIL_MANDATORY') ? '' : $conf->global->SOCIETE_EMAIL_MANDATORY) . '</td>';
417print '<td>' . img_picto('', 'object_email', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth200 widthcentpercentminusx" name="email" id="email" value="' . $objectsoc->email . '"></td>';
418if (isModEnabled('mailing') && getDolGlobalString('THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION')) {
419 if ($conf->browser->layout == 'phone') {
420 print '</tr><tr>';
421 }
422 print '<td class="individualline noemail">' . $form->editfieldkey($langs->trans('No_Email') . ' (' . $langs->trans('Contact') . ')', 'contact_no_email', '', $objectsoc, 0) . '</td>';
423 print '<td class="individualline" ' . (($conf->browser->layout == 'phone') || !isModEnabled('mailing') ? ' colspan="3"' : '') . '>' . $form->selectyesno('contact_no_email', (GETPOSTISSET("contact_no_email") ? GETPOST("contact_no_email", 'alpha') : (empty($objectsoc->no_email) ? 0 : 1)), 1, false, 1) . '</td>';
424}
425print '</tr>';
426
427print '<tr><td>' . $form->editfieldkey('Web', 'url', '', $objectsoc, 0) . '</td>';
428print '<td>' . img_picto('', 'globe', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth500 widthcentpercentminusx" name="url" id="url" value="' . $objectsoc->url . '"></td></tr>';
429
430
431// Comments
432print '<tr>';
433print '<td class="tdtop">' . $langs->trans("Comments") . '</td>';
434print '<td class="tdtop"><textarea name="note_private" id="note_private" wrap="soft" class="quatrevingtpercent" rows="' . ROWS_3 . '">' . dol_escape_htmltag(GETPOST('note_private', 'restricthtml'), 0, 1) . '</textarea></td>';
435print '</tr>' . "\n";
436// TODO Move this into generic feature.
437
438
439
440// Display Captcha code if is enabled
441if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA')) {
442 require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php';
443 print '<tr><td class="titlefield"><label for="email"><span class="fieldrequired">' . $langs->trans("SecurityCode") . '</span></label></td><td>';
444 print '<span class="span-icon-security inline-block">';
445 print '<input id="securitycode" placeholder="' . $langs->trans("SecurityCode") . '" class="flat input-icon-security width150" type="text" maxlength="5" name="code" tabindex="3" />';
446 print '</span>';
447 print '<span class="nowrap inline-block">';
448 print '<img class="inline-block valignmiddle" src="' . DOL_URL_ROOT . '/core/antispamimage.php" border="0" width="80" height="32" id="img_securitycode" />';
449 print '<a class="inline-block valignmiddle" href="' . $php_self . '" tabindex="4" data-role="button">' . img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"') . '</a>';
450 print '</span>';
451 print '</td></tr>';
452}
453
454print "</table>\n";
455
456print dol_get_fiche_end();
457
458// Save / Submit
459print '<div class="center">';
460print '<input type="submit" value="' . $langs->trans("Send") . '" id="submitsave" class="button">';
461if (!empty($backtopage)) {
462 print ' &nbsp; &nbsp; <input type="submit" value="' . $langs->trans("Cancel") . '" id="submitcancel" class="button button-cancel">';
463}
464print '</div>';
465
466
467print "</form>\n";
468print "<br>";
469print '</div></div>';
470
471
472
474
475$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined( 'NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined( 'NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) if(!defined( 'NOLOGIN')) if(!defined('NOCSRFCHECK')) if(!defined( 'NOIPCHECK')) llxHeaderVierge()
Header function.
Class to manage members type.
Class to manage standard extra fields.
Class to generate html code for admin pages.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
llxFooterVierge()
Show footer for new societe.
Definition new.php:160
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)
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
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...
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.