44 $micro_start_time = 0;
45 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
46 list($usec, $sec) = explode(
" ", microtime());
47 $micro_start_time = ((
float) $usec + (
float) $sec);
50 if (defined(
'XDEBUGCOVERAGE')) {
51 xdebug_start_code_coverage();
65 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
68 if (preg_match(
'/^x/i', $newstringnumentity)) {
69 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
73 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
74 return chr((
int) $newstringnumentity);
77 return '&#'.$matches[1];
101 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
103 $val = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
108 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
109 $val = preg_replace(
'/[\r\n\t]/',
'', $val);
110 }
while ($oldval != $val);
121 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
124 if ($newval != $val) {
131 if ($type == 1 || $type == 3) {
133 $inj += preg_match(
'/delete\s*from/i', $val);
134 $inj += preg_match(
'/create\s*table/i', $val);
135 $inj += preg_match(
'/insert\s*into/i', $val);
136 $inj += preg_match(
'/select\s*from/i', $val);
137 $inj += preg_match(
'/into\s*(outfile|dumpfile)/i', $val);
138 $inj += preg_match(
'/user\s*\(/i', $val);
139 $inj += preg_match(
'/information_schema/i', $val);
140 $inj += preg_match(
'/<svg/i', $val);
141 $inj += preg_match(
'/update[^&=\w].*set.+=/i', $val);
142 $inj += preg_match(
'/union.+select/i', $val);
146 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s*by|concat|count|from|union/i', $val);
149 $inj += preg_match(
'/updatexml\(/i', $val);
150 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
151 $inj += preg_match(
'/\s@@/', $val);
154 $inj += preg_match(
'/<\/textarea/i', $val);
160 $inj += preg_match(
'/<audio/i', $val);
161 $inj += preg_match(
'/<embed/i', $val);
162 $inj += preg_match(
'/<iframe/i', $val);
163 $inj += preg_match(
'/<object/i', $val);
164 $inj += preg_match(
'/<script/i', $val);
165 $inj += preg_match(
'/Set\.constructor/i', $val);
166 if (!defined(
'NOSTYLECHECK')) {
167 $inj += preg_match(
'/<style/i', $val);
169 $inj += preg_match(
'/base\s+href/si', $val);
170 $inj += preg_match(
'/=data:/si', $val);
172 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $val);
173 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $val);
174 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $val);
175 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $val);
176 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $val);
177 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $val);
179 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i', $val);
182 $tmpval = preg_replace(
'/<[^<]+>/',
'', $val);
184 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $tmpval);
185 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $tmpval);
186 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $tmpval);
187 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $tmpval);
188 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $tmpval);
189 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $tmpval);
191 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i', $tmpval);
194 $inj += preg_match(
'/:|:|:/i', $val);
195 $inj += preg_match(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i', $val);
196 $inj += preg_match(
'/vbscript\s*:/i', $val);
198 if ($type == 1 || $type == 3) {
199 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
200 $inj += preg_match(
'/"/i', $val);
203 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
218 if (is_array($var)) {
219 foreach ($var as $key => $value) {
224 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
225 $errormessage =
'Access refused to '.htmlentities($ip, ENT_COMPAT,
'UTF-8').
' by SQL or Script injection protection in main.inc.php - GETPOST type='.htmlentities($type, ENT_COMPAT,
'UTF-8').
' paramkey='.htmlentities($key, ENT_COMPAT,
'UTF-8').
' paramvalue='.htmlentities($value, ENT_COMPAT,
'UTF-8').
' page='.htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT,
'UTF-8');
228 if (function_exists(
'error_log')) {
229 error_log($errormessage);
247 if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
248 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
251 if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
252 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
257 if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
258 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
262 if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
266 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
270 if (!defined(
'NOSCANPOSTFORINJECTION')) {
275 if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
276 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
280 require_once
'filefunc.inc.php';
285 if (!empty($_POST[
"DOL_AUTOSET_COOKIE"])) {
286 $tmpautoset = explode(
':', $_POST[
"DOL_AUTOSET_COOKIE"], 2);
287 $tmplist = explode(
',', $tmpautoset[1]);
288 $cookiearrayvalue = array();
289 foreach ($tmplist as $tmpkey) {
290 $postkey = $tmpautoset[0].
'_'.$tmpkey;
292 if (!empty($_POST[$postkey])) {
293 $cookiearrayvalue[$tmpkey] = $_POST[$postkey];
296 $cookiename = $tmpautoset[0];
297 $cookievalue = json_encode($cookiearrayvalue);
299 if (PHP_VERSION_ID < 70300) {
300 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
303 $cookieparams = array(
304 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
307 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
311 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
313 if (empty($cookievalue)) {
314 unset($_COOKIE[$cookiename]);
320 if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
321 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
327 $prefix = dol_getprefix(
'');
328 $sessionname =
'DOLSESSID_'.$prefix;
329 $sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
330 if (!empty($_COOKIE[$sessiontimeout])) {
331 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
336 if (!defined(
'NOSESSION')) {
337 if (PHP_VERSION_ID < 70300) {
338 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
341 $sessioncookieparams = array(
345 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
349 session_set_cookie_params($sessioncookieparams);
351 session_name($sessionname);
358 require_once
'master.inc.php';
361 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
363 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
365 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
367 } elseif (defined(
'NOREQUIREDB')) {
369 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
371 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
375 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
376 print
'Sorry, your application is offline.'.
"\n";
377 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
378 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
379 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
381 print
'Sorry, your application is offline. Only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
382 $nexturl = DOL_URL_ROOT.
'/';
383 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
391 register_shutdown_function(
'dol_shutdown');
394 if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
396 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
398 $renderer = $debugbar->getRenderer();
399 if (empty($conf->global->MAIN_HTML_HEADER)) {
400 $conf->global->MAIN_HTML_HEADER =
'';
402 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
404 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
408 if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
410 $conf->browser->name = $tmp[
'browsername'];
411 $conf->browser->os = $tmp[
'browseros'];
412 $conf->browser->version = $tmp[
'browserversion'];
413 $conf->browser->ua = $tmp[
'browserua'];
414 $conf->browser->layout = $tmp[
'layout'];
417 if ($conf->browser->layout ==
'phone') {
418 $conf->dol_no_mouse_hover = 1;
423 if (
GETPOST(
'theme',
'aZ09')) {
424 $conf->theme =
GETPOST(
'theme',
'aZ09');
425 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
429 if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
430 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
435 if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on') && !defined(
'NOHTTPSREDIRECT')) {
437 if (is_numeric($conf->file->main_force_https)) {
438 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
439 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
440 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
444 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
448 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
453 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
454 header(
"Location: ".$newurl);
457 dol_syslog(
"main.inc: dolibarr_main_force_https is on but we failed to forge new https url so no redirect is done", LOG_WARNING);
461 if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
462 $listofip = explode(
',', $dolibarr_main_restrict_ip);
464 foreach ($listofip as $ip) {
466 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
472 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
478 if (!defined(
'NOREQUIREHTML')) {
479 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
481 if (!defined(
'NOREQUIREAJAX')) {
482 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
486 if (!empty($conf->global->MAIN_NOT_INSTALLED) || !empty($conf->global->MAIN_NOT_UPGRADED)) {
487 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
488 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
492 if ((!empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
493 || (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && !empty($conf->global->MAIN_VERSION_LAST_INSTALL) && ($conf->global->MAIN_VERSION_LAST_INSTALL != DOL_VERSION))) {
494 $versiontocompare = empty($conf->global->MAIN_VERSION_LAST_UPGRADE) ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
496 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
497 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
498 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
500 if (empty($conf->global->MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE) || $rescomp < 3) {
502 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
503 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
510 if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
512 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
514 if (isset($_SESSION[
'newtoken'])) {
515 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
518 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
522 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
523 $_SESSION[
'newtoken'] = $token;
524 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
532 if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
534 $sensitiveget =
false;
537 if (
GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'specimen'))) {
538 $sensitiveget =
true;
542 $arrayofactiontoforcetokencheck = array(
544 'doprev',
'donext',
'dvprev',
'dvnext',
545 'freezone',
'install',
548 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
549 $sensitiveget =
true;
552 if (preg_match(
'/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
553 $sensitiveget =
true;
560 $_SERVER[
'REQUEST_METHOD'] ==
'POST' ||
566 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
568 if (
GETPOST(
'uploadform',
'int')) {
569 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
570 $langs->loadLangs(array(
"errors",
"install"));
571 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
572 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
574 http_response_code(403);
575 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
576 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (CSRFCHECK_WITH_TOKEN protection) in main.inc.php. Token not provided.", LOG_WARNING);
577 print
"Access to a page that needs a token (constant CSRFCHECK_WITH_TOKEN is defined) is refused by CSRF protection in main.inc.php. Token not provided.\n";
579 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (POST method or GET with a sensible value for 'action' parameter) in main.inc.php. Token not provided.", LOG_WARNING);
580 print
"Access to this page this way (POST method or GET with a sensible value for 'action' parameter) is refused by CSRF protection in main.inc.php. Token not provided.\n";
581 print
"If you access your server behind a proxy using url rewriting and the parameter is provided by caller, you might check that all HTTP header are propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file or MAIN_SECURITY_CSRF_WITH_TOKEN to 0";
582 if (!empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
583 print
" instead of ".$conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN;
585 print
" into setup).\n";
592 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
595 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (invalid token), so we disable POST and some GET parameters - referer=".(empty($_SERVER[
'HTTP_REFERER'])?
'':$_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
598 if (!defined(
'NOTOKENRENEWAL')) {
600 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
603 if (isset($_POST[
'id'])) {
604 $savid = ((int) $_POST[
'id']);
607 unset($_GET[
'confirm']);
608 unset($_GET[
'action']);
609 unset($_GET[
'confirmmassaction']);
610 unset($_GET[
'massaction']);
611 unset($_GET[
'token']);
613 $_POST[
'id'] = ((int) $savid);
616 $_GET[
'errorcode'] =
'InvalidToken';
624 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
626 if (!empty($_SESSION[
"disablemodules"])) {
627 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal');
629 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
630 foreach ($disabled_modules as $module) {
632 if (empty($conf->$module)) {
633 $conf->$module =
new stdClass();
635 $conf->$module->enabled =
false;
636 foreach ($modulepartkeys as $modulepartkey) {
637 unset($conf->modules_parts[$modulepartkey][$module]);
639 if ($module ==
'fournisseur') {
640 $conf->supplier_order->enabled = 0;
641 $conf->supplier_invoice->enabled = 0;
648 $modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
649 if (is_array($modulepart) && count($modulepart) > 0) {
650 foreach ($conf->modules as $module) {
651 if (in_array($module, $modulepart)) {
652 $modulepart = $module;
657 if (is_array($modulepart)) {
666 if (!defined(
'NOLOGIN')) {
670 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
671 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
674 if (empty($dolibarr_main_authentication)) {
675 $dolibarr_main_authentication =
'dolibarr';
678 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
679 $dolibarr_auto_user =
'auto';
683 $authmode = explode(
',', $dolibarr_main_authentication);
686 if (!count($authmode)) {
687 $langs->load(
'main');
688 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
695 $resultFetchUser =
'';
697 if (!isset($_SESSION[
"dol_login"])) {
699 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
701 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
702 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
703 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
704 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
705 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
706 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
707 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
708 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
709 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
710 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
714 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
715 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
716 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFER']).
")");
718 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
719 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
720 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
721 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
722 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
723 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
724 header(
"Location: ".$url);
731 $hookmanager->initHooks(array(
'login'));
732 $parameters = array();
733 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
740 if ($test &&
GETPOST(
"username",
"alpha", 2) && !empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA) && !isset($_SESSION[
'dol_bypass_antispam'])) {
741 $sessionkey =
'dol_antispam_value';
742 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
746 dol_syslog(
'Bad value for code, connexion refused');
748 $langs->loadLangs(array(
'main',
'errors'));
750 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
754 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
757 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
765 $hookmanager->initHooks(array(
'login'));
766 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
767 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
776 $allowedmethodtopostusername = 3;
777 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
778 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
781 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
782 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
783 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
786 $goontestloop =
false;
787 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
788 $goontestloop =
true;
790 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
791 $goontestloop =
true;
793 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
794 $goontestloop =
true;
796 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
797 $goontestloop =
true;
799 if (
GETPOST(
'beforeoauthloginredirect',
'int') ||
GETPOST(
'afteroauthloginreturn')) {
800 $goontestloop =
true;
802 if (!empty($_COOKIE[
'login_dolibarr'])) {
803 $goontestloop =
true;
806 if (!is_object($langs)) {
807 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
809 $langcode = (
GETPOST(
'lang',
'aZ09', 1) ?
GETPOST(
'lang',
'aZ09', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ?
'auto' : $conf->global->MAIN_LANG_DEFAULT));
810 if (defined(
'MAIN_LANG_DEFAULT')) {
811 $langcode = constant(
'MAIN_LANG_DEFAULT');
813 $langs->setDefaultLang($langcode);
820 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
822 if ($login ===
'--bad-login-validity--') {
829 $dol_authmode = $conf->authmode;
830 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
831 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
832 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
833 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
834 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
837 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
838 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
839 if ($dol_dst_first && $dol_dst_second) {
840 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
844 if ($datenow >= $datefirst && $datenow < $datesecond) {
848 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
849 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
854 dol_syslog(
'Bad password, connexion refused', LOG_DEBUG);
856 $langs->loadLangs(array(
'main',
'errors'));
860 if (empty($_SESSION[
"dol_loginmesg"])) {
861 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
865 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
868 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
876 $hookmanager->initHooks(array(
'login'));
877 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
878 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
888 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
890 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" - action=".
GETPOST(
'action',
'aZ09').
" - actionlogin=".
GETPOST(
'actionlogin',
'aZ09').
" - showing the login form and exit", LOG_NOTICE);
891 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
896 return 'ERROR_NOT_LOGGED';
898 if ($_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
899 http_response_code(401);
901 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
906 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
907 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
908 dol_syslog(
'User not found or not valid, connexion refused');
910 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
911 session_name($sessionname);
914 if ($resultFetchUser == 0) {
916 $langs->loadLangs(array(
'main',
'errors'));
918 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
920 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
921 } elseif ($resultFetchUser < 0) {
922 $_SESSION[
"dol_loginmesg"] = $user->error;
924 $user->context[
'audit'] = $user->error;
927 $langs->loadLangs(array(
'main',
'errors'));
929 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
931 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
935 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
944 $hookmanager->initHooks(array(
'login'));
945 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
946 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
951 $paramsurl = array();
952 if (
GETPOST(
'textbrowser',
'int')) {
953 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
956 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
959 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
961 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
965 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
966 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
971 $login = $_SESSION[
"dol_login"];
972 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
973 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
975 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
979 if ($resultFetchUser <= 0
980 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
981 || ($user->status != $user::STATUS_ENABLED)
982 || ($user->isNotIntoValidityDateRange())) {
983 if ($resultFetchUser <= 0) {
985 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
986 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
988 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
989 } elseif ($user->status != $user::STATUS_ENABLED) {
994 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], curren date is ".
dol_now());
997 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
998 session_name($sessionname);
1001 if ($resultFetchUser == 0) {
1002 $langs->loadLangs(array(
'main',
'errors'));
1004 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1006 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1007 } elseif ($resultFetchUser < 0) {
1008 $_SESSION[
"dol_loginmesg"] = $user->error;
1010 $user->context[
'audit'] = $user->error;
1012 $langs->loadLangs(array(
'main',
'errors'));
1014 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1016 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1020 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1028 $hookmanager->initHooks(array(
'login'));
1029 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1030 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1035 $paramsurl = array();
1036 if (
GETPOST(
'textbrowser',
'int')) {
1037 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1040 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1042 if (
GETPOST(
'lang',
'aZ09')) {
1043 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1045 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1049 $hookmanager->initHooks(array(
'main'));
1052 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1053 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1054 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1056 if (constant(
'DOL_URL_ROOT')) {
1057 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1059 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1060 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1064 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1065 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1066 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1068 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1069 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1070 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1072 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1073 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1074 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1076 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1077 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1078 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1080 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1081 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1082 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1085 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1086 if (empty($_SESSION[
'pageforbacktolist'])) {
1087 $pageforbacktolistarray = array();
1089 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1091 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1092 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1093 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1094 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1099 $parameters = array();
1100 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1109 if (!isset($_SESSION[
"dol_login"])) {
1114 $_SESSION[
"dol_login"] = $user->login;
1115 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1116 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1117 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1118 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1119 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1120 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1121 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1122 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1123 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1124 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1126 $_SESSION[
"dol_entity"] = $conf->entity;
1128 if (!empty($dol_hide_topmenu)) {
1129 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1131 if (!empty($dol_hide_leftmenu)) {
1132 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1134 if (!empty($dol_optimize_smallscreen)) {
1135 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1137 if (!empty($dol_no_mouse_hover)) {
1138 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1140 if (!empty($dol_use_jmobile)) {
1141 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1144 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1148 $user->update_last_login_date();
1150 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1151 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1154 $user->context[
'audit'] = $loginfo;
1155 $user->context[
'authentication_method'] = $dol_authmode;
1158 $result = $user->call_trigger(
'USER_LOGIN', $user);
1166 $hookmanager->initHooks(array(
'login'));
1167 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1168 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1176 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1183 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (empty($conf->global->MAIN_LANDING_PAGE) ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->conf->MAIN_LANDING_PAGE);
1184 if (!empty($landingpage)) {
1186 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1187 header(
'Location: '.$newpath);
1196 $user->rights->user->user->lire = 1;
1197 $user->rights->user->user->creer = 1;
1198 $user->rights->user->user->password = 1;
1199 $user->rights->user->user->supprimer = 1;
1200 $user->rights->user->self->creer = 1;
1201 $user->rights->user->self->password = 1;
1204 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1205 if (empty($user->rights->user->user_advance)) {
1206 $user->rights->user->user_advance =
new stdClass();
1208 if (empty($user->rights->user->self_advance)) {
1209 $user->rights->user->self_advance =
new stdClass();
1211 if (empty($user->rights->user->group_advance)) {
1212 $user->rights->user->group_advance =
new stdClass();
1215 $user->rights->user->user_advance->readperms = 1;
1216 $user->rights->user->user_advance->write = 1;
1217 $user->rights->user->self_advance->readperms = 1;
1218 $user->rights->user->self_advance->writeperms = 1;
1219 $user->rights->user->group_advance->read = 1;
1220 $user->rights->user->group_advance->readperms = 1;
1221 $user->rights->user->group_advance->write = 1;
1222 $user->rights->user->group_advance->delete = 1;
1231 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1232 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1234 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1235 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1239 if (empty($conf->global->MAIN_FORCETHEME) && !empty($user->conf->MAIN_THEME)) {
1240 $conf->theme = $user->conf->MAIN_THEME;
1241 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1245 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1246 $user->loadDefaultValues();
1252 if (
GETPOST(
'theme',
'aZ09')) {
1253 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1254 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1259 $conf->use_javascript_ajax = 0;
1261 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1262 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1267 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1268 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1272 $conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1275 if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1276 $conf->dol_hide_leftmenu = 1;
1278 if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1279 $conf->dol_hide_topmenu = 1;
1281 if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1282 $conf->dol_optimize_smallscreen = 1;
1284 if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1285 $conf->dol_no_mouse_hover = 1;
1287 if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1288 $conf->dol_use_jmobile = 1;
1291 if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1292 $conf->dol_no_mouse_hover = 1;
1296 if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1297 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1298 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1299 || !empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
1301 $conf->dol_optimize_smallscreen = 1;
1303 if (isset($conf->global->PRODUIT_DESC_IN_FORM) && $conf->global->PRODUIT_DESC_IN_FORM == 1) {
1304 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1308 if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1309 $conf->theme =
'eldy';
1310 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1313 if (!defined(
'NOREQUIRETRAN')) {
1314 if (!
GETPOST(
'lang',
'aZ09')) {
1316 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1319 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1320 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1326 if (!defined(
'NOLOGIN')) {
1329 if (!$user->login) {
1334 if ($user->statut < 1) {
1336 $langs->loadLangs(array(
"errors",
"other"));
1337 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1345 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
' - action='.
GETPOST(
'action',
'aZ09').
', massaction='.
GETPOST(
'massaction',
'aZ09').(defined(
'NOTOKENRENEWAL') ?
' NOTOKENRENEWAL='.constant(
'NOTOKENRENEWAL') :
''), LOG_NOTICE);
1350 if (!defined(
'NOREQUIRETRAN')) {
1352 $langs->loadLangs(array(
'main',
'dict'));
1356 $bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1357 $bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1358 $bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1359 $bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1362 $mesg =
''; $warning =
''; $error = 0;
1364 $mesgs = array(); $warnings = array(); $errors = array();
1367 if (empty($conf->browser->firefox)) {
1368 define(
'ROWS_1', 1);
1369 define(
'ROWS_2', 2);
1370 define(
'ROWS_3', 3);
1371 define(
'ROWS_4', 4);
1372 define(
'ROWS_5', 5);
1373 define(
'ROWS_6', 6);
1374 define(
'ROWS_7', 7);
1375 define(
'ROWS_8', 8);
1376 define(
'ROWS_9', 9);
1378 define(
'ROWS_1', 0);
1379 define(
'ROWS_2', 1);
1380 define(
'ROWS_3', 2);
1381 define(
'ROWS_4', 3);
1382 define(
'ROWS_5', 4);
1383 define(
'ROWS_6', 5);
1384 define(
'ROWS_7', 6);
1385 define(
'ROWS_8', 7);
1386 define(
'ROWS_9', 8);
1389 $heightforframes = 50;
1392 if (!defined(
'NOREQUIREMENU')) {
1393 if (empty($user->socid)) {
1394 $conf->standard_menu = (empty($conf->global->MAIN_MENU_STANDARD_FORCED) ? (empty($conf->global->MAIN_MENU_STANDARD) ?
'eldy_menu.php' : $conf->global->MAIN_MENU_STANDARD) : $conf->global->MAIN_MENU_STANDARD_FORCED);
1397 $conf->standard_menu = (empty($conf->global->MAIN_MENUFRONT_STANDARD_FORCED) ? (empty($conf->global->MAIN_MENUFRONT_STANDARD) ?
'eldy_menu.php' : $conf->global->MAIN_MENUFRONT_STANDARD) : $conf->global->MAIN_MENUFRONT_STANDARD_FORCED);
1401 $file_menu = $conf->standard_menu;
1402 if (
GETPOST(
'menu',
'alpha')) {
1403 $file_menu =
GETPOST(
'menu',
'alpha');
1405 if (!class_exists(
'MenuManager')) {
1407 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1408 foreach ($dirmenus as $dirmenu) {
1410 if (class_exists(
'MenuManager')) {
1414 if (!class_exists(
'MenuManager')) {
1415 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1416 $file_menu =
'eldy_menu.php';
1417 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1420 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1421 $menumanager->loadMenu();
1424 if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1425 $message =
GETPOST(
'seteventmessages',
'alpha');
1426 $messages = explode(
',', $message);
1427 foreach ($messages as $key => $msg) {
1428 $tmp = explode(
':', $msg);
1435 if (!function_exists(
"llxHeader")) {
1456 function llxHeader($head =
'', $title =
'',
$help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1458 global $conf, $hookmanager;
1461 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1463 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1465 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1467 if ($mainmenu !=
'website') {
1468 $tmpcsstouse = $morecssonbody;
1472 if (!empty($conf->global->MAIN_OPTIMIZEFORCOLORBLIND)) {
1473 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1476 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1478 $parameters = array(
'help_url' =>
$help_url);
1479 $reshook = $hookmanager->executeHooks(
'changeHelpURL', $parameters);
1485 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1486 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring,
$help_url);
1489 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1494 if ($replacemainareaby) {
1495 print $replacemainareaby;
1512 global $db, $conf, $hookmanager;
1514 if ($contenttype ==
'text/html') {
1515 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1517 header(
"Content-Type: ".$contenttype);
1523 header(
"X-Content-Type-Options: nosniff");
1526 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1527 header(
"X-Frame-Options: SAMEORIGIN");
1529 header(
"X-Frame-Options: ALLOWALL");
1536 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1551 if (!is_object($hookmanager)) {
1552 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1555 $hookmanager->initHooks(array(
"main"));
1557 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'reportonly');
1558 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1560 $contentsecuritypolicy = $hookmanager->resPrint;
1562 $contentsecuritypolicy .= $hookmanager->resPrint;
1565 if (!empty($contentsecuritypolicy)) {
1566 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1569 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1573 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1588 if (!is_object($hookmanager)) {
1589 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1592 $hookmanager->initHooks(array(
"main"));
1594 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'active');
1595 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1597 $contentsecuritypolicy = $hookmanager->resPrint;
1599 $contentsecuritypolicy .= $hookmanager->resPrint;
1602 if (!empty($contentsecuritypolicy)) {
1603 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1606 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1612 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1615 header(
"Referrer-Policy: ".$referrerpolicy);
1618 if ($forcenocache) {
1619 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1641 function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1643 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1647 if (empty($conf->css)) {
1648 $conf->css =
'/theme/eldy/style.css.php';
1651 print
'<!doctype html>'.
"\n";
1653 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1656 if (empty($disablehead)) {
1657 if (!is_object($hookmanager)) {
1658 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1661 $hookmanager->initHooks(array(
"main"));
1663 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
1667 if (
GETPOST(
'dol_basehref',
'alpha')) {
1668 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1672 print
'<meta charset="utf-8">'.
"\n";
1673 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1674 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1675 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1676 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1677 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1679 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1682 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1683 if (!empty($mysoc->logo_squarred_mini)) {
1684 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1689 if (empty($conf->dol_use_jmobile)) {
1690 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1698 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1699 if (!empty($manifest)) {
1700 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1703 if (!empty($conf->global->THEME_ELDY_TOPMENU_BACK1)) {
1705 print
'<meta name="theme-color" content="rgb('.$conf->global->THEME_ELDY_TOPMENU_BACK1.
')">'.
"\n";
1709 if (
GETPOST(
'autorefresh',
'int') > 0) {
1710 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1714 $appli = constant(
'DOL_APPLICATION_TITLE');
1715 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1716 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1721 if ($title && !empty($conf->global->MAIN_HTML_TITLE) && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1729 $parameters = array(
'title'=>$titletoshow);
1730 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1732 $titletoshow = $hookmanager->resPrint;
1734 $titletoshow .= $hookmanager->resPrint;
1742 if (
GETPOST(
'version',
'int')) {
1743 $ext =
'version='.GETPOST(
'version',
'int');
1746 if (
GETPOST(
'dol_resetcache')) {
1750 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1752 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1754 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1757 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1760 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1763 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1766 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1769 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1772 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1775 if (!empty($conf->global->MAIN_ENABLE_FONT_ROBOTO)) {
1776 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1777 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1780 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1781 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1782 $jquerytheme =
'base';
1783 if (!empty($conf->global->MAIN_USE_JQUERY_THEME)) {
1784 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1786 if (constant(
'JS_JQUERY_UI')) {
1787 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1789 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1791 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1792 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1794 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1795 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1796 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1800 if (!defined(
'DISABLE_FONT_AWSOME')) {
1801 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1802 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1803 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/v4-shims.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1806 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1810 if (!empty($conf->modules_parts[
'theme'])) {
1811 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1814 $themesubdir = $reldir;
1821 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1822 if (!empty($conf->global->MAIN_FIX_FLASH_ON_CHROME)) {
1823 print
'<!-- Includes CSS that does not exists as a workaround of flash bug of chrome -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="filethatdoesnotexiststosolvechromeflashbug">'.
"\n";
1827 if (!empty($conf->modules_parts[
'css'])) {
1828 $arraycss = (array) $conf->modules_parts[
'css'];
1829 foreach ($arraycss as $modcss => $filescss) {
1830 $filescss = (array) $filescss;
1831 foreach ($filescss as $cssfile) {
1832 if (empty($cssfile)) {
1833 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1837 if ($urlforcss && $urlforcss !=
'/') {
1838 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1840 if (!preg_match(
'/\.css$/i', $cssfile)) {
1845 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1851 if (is_array($arrayofcss)) {
1852 foreach ($arrayofcss as $cssfile) {
1853 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1854 $urltofile = $cssfile;
1858 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1860 if (!preg_match(
'/\.css$/i', $cssfile)) {
1870 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1874 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1876 print
'<!-- Includes JS for JQuery -->'.
"\n";
1877 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1878 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1880 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1882 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1883 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1885 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1888 if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1889 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1892 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1893 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1896 if (empty($disableforlogin) && (empty($conf->global->MAIN_JS_GRAPH) || $conf->global->MAIN_JS_GRAPH ==
'chart') && !defined(
'DISABLE_JS_GRAPH')) {
1897 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1901 if (!empty($conf->global->MAIN_USE_JQUERY_JEDITABLE) && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1902 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1903 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1904 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1905 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1906 print
'<script>'.
"\n";
1907 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1908 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1909 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1910 print 'var placeholderInPlace = \
' \';'.
"\n";
1911 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1912 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1913 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1914 print
'var withInPlace = 300;';
1915 print
'</script>'.
"\n";
1916 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1917 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1920 if (!empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1921 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1922 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1924 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1926 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1927 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1929 if (!defined(
'DISABLE_MULTISELECT')) {
1930 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1934 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1936 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') && (empty($conf->global->FCKEDITOR_EDITORNAME) || $conf->global->FCKEDITOR_EDITORNAME ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1937 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1938 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1939 $jsckeditor =
'ckeditor.js';
1940 if (constant(
'JS_CKEDITOR')) {
1942 $pathckeditor = constant(
'JS_CKEDITOR');
1944 print
'<script nonce="'.getNonce().
'">';
1945 print
'/* enable ckeditor by main.inc.php */';
1946 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1947 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1948 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1949 print
'var ckeditorFilebrowserImageBrowseUrl = \''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Type=Image&Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1950 print
'</script>'.
"\n";
1951 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1953 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1954 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1956 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1958 print
'</script>'.
"\n";
1962 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1963 $enablebrowsernotif =
false;
1964 if (
isModEnabled(
'agenda') && !empty($conf->global->AGENDA_REMINDER_BROWSER)) {
1965 $enablebrowsernotif =
true;
1967 if ($conf->browser->layout ==
'phone') {
1968 $enablebrowsernotif =
false;
1970 if ($enablebrowsernotif) {
1971 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1972 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1977 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1978 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1981 if (!empty($conf->modules_parts[
'js'])) {
1982 $arrayjs = (array) $conf->modules_parts[
'js'];
1983 foreach ($arrayjs as $modjs => $filesjs) {
1984 $filesjs = (array) $filesjs;
1985 foreach ($filesjs as $jsfile) {
1988 if ($urlforjs && $urlforjs !=
'/') {
1989 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1990 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1992 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1998 if (is_array($arrayofjs)) {
1999 print
'<!-- Includes JS added by page -->'.
"\n";
2000 foreach ($arrayofjs as $jsfile) {
2001 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2002 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2004 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2011 if (!empty($conf->global->ALLOW_THEME_JS)) {
2012 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2013 if (file_exists($theme_js)) {
2014 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2018 if (!empty($head)) {
2021 if (!empty($conf->global->MAIN_HTML_HEADER)) {
2022 print $conf->global->MAIN_HTML_HEADER.
"\n";
2025 $parameters = array();
2026 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2027 print $hookmanager->resPrint;
2029 print
"</head>\n\n";
2032 $conf->headerdone = 1;
2052 function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $helppagename =
'')
2054 global $user, $conf, $langs, $db;
2055 global $dolibarr_main_authentication, $dolibarr_main_demo;
2056 global $hookmanager, $menumanager;
2061 $hookmanager->initHooks(array(
'toprightmenu'));
2066 if (empty($conf->headerdone)) {
2067 $disablenofollow = 0;
2068 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2069 print
'<body id="mainbody">';
2075 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2077 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2081 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2083 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
2086 print
'<div id="tmenu_tooltip'.(empty($conf->global->MAIN_MENU_INVERT) ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2087 $menumanager->atarget = $target;
2088 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
2092 $appli = constant(
'DOL_APPLICATION_TITLE');
2093 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2094 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2095 if (preg_match(
'/\d\.\d/', $appli)) {
2096 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2097 $appli .=
" (".DOL_VERSION.
")";
2100 $appli .=
" ".DOL_VERSION;
2103 $appli .=
" ".DOL_VERSION;
2107 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2111 $logouthtmltext =
'';
2112 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2114 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2115 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2117 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2118 if ($conf->browser->name ==
'chrome') {
2119 $stringforfirstkey .=
' ALT +';
2120 } elseif ($conf->browser->name ==
'firefox') {
2121 $stringforfirstkey .=
' ALT + SHIFT +';
2123 $stringforfirstkey .=
' CTL +';
2126 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2127 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle');
2128 $logouttext .=
'</a>';
2130 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2131 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2135 print
'<div class="login_block usedropdown">'.
"\n";
2137 $toprightmenu .=
'<div class="login_block_other">';
2140 $parameters = array();
2141 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2142 if (is_numeric($result)) {
2144 $toprightmenu .= $hookmanager->resPrint;
2146 $toprightmenu = $hookmanager->resPrint;
2149 $toprightmenu .= $result;
2154 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2156 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2158 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2162 if (empty($conf->global->MAIN_PRINT_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2165 if (isset($_POST) && is_array($_POST)) {
2166 foreach ($_POST as $key => $value) {
2167 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2168 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2171 if (!is_array($value)) {
2172 if ($value !==
'') {
2173 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2176 foreach ($value as $value2) {
2177 if (($value2 !==
'') && (!is_array($value2))) {
2178 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2184 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2185 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2187 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2189 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2193 if (empty($conf->global->MAIN_HELP_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2194 $langs->load(
"help");
2201 if (empty($helppagename)) {
2202 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2204 $helppresent =
'helppresent';
2209 $helpbaseurl = $arrayres[
'helpbaseurl'];
2210 $helppage = $arrayres[
'helppage'];
2211 $mode = $arrayres[
'mode'];
2214 if ($helpbaseurl && $helppage) {
2216 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2217 if ($mode ==
'wiki') {
2218 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2220 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2222 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2225 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2226 if ($mode ==
'wiki') {
2227 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2229 $text .= sprintf($helpbaseurl, $helppage);
2232 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2233 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2235 $toprightmenu .=
$form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2239 if (!empty($conf->global->MAIN_SHOWDATABASENAMEINHELPPAGESLINK)) {
2240 $langs->load(
'admin');
2241 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2245 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2246 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2247 $toprightmenu .=
$form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2251 $toprightmenu .=
$form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2253 $toprightmenu .=
'</div>';
2257 $toprightmenu .=
'<div class="login_block_user">';
2261 $toprightmenu .=
'<div class="inline-block nowrap"><div class="inline-block login_block_elem login_block_elem_name" style="padding: 0px;">';
2263 if (!empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2268 if (!empty($conf->global->MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN)) {
2279 $toprightmenu .=
'</div></div>';
2281 $toprightmenu .=
'</div>'.
"\n";
2284 print $toprightmenu;
2291 print
'<div style="clear: both;"></div>';
2292 print
"<!-- End top horizontal menu -->\n\n";
2295 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2296 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2310 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2311 global $dolibarr_main_authentication, $dolibarr_main_demo;
2312 global $menumanager;
2314 $langs->load(
'companies');
2316 $userImage = $userDropDownImage =
'';
2317 if (!empty($user->photo)) {
2318 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2319 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2321 $nophoto =
'/public/theme/common/user_anonymous.png';
2322 if ($user->gender ==
'man') {
2323 $nophoto =
'/public/theme/common/user_man.png';
2325 if ($user->gender ==
'woman') {
2326 $nophoto =
'/public/theme/common/user_woman.png';
2329 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2330 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2334 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2335 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2337 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2338 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2341 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2344 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2347 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2350 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2353 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2357 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2359 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2361 $dropdownBody .=
'</div>';
2363 $dropdownBody .=
'<br>';
2364 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2365 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2368 if (!empty($user->admin)) {
2369 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2371 if (!empty($user->socid)) {
2372 $thirdpartystatic =
new Societe($db);
2373 $thirdpartystatic->fetch($user->socid);
2374 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2375 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2377 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2378 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2379 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2380 $dropdownBody .=
'<br>';
2382 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2383 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2384 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2385 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2387 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2388 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2389 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2390 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2391 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2393 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2395 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2396 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2397 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2402 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')';
2403 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2404 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2405 if ($conf->browser->layout ==
'phone') {
2406 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2408 if (!empty($_SESSION[
"disablemodules"])) {
2409 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2411 $dropdownBody .=
'</div>';
2414 $parameters = array(
'user'=>$user,
'langs' => $langs);
2415 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2416 if (is_numeric($result)) {
2418 $dropdownBody .= $hookmanager->resPrint;
2420 $dropdownBody = $hookmanager->resPrint;
2424 if (empty($urllogout)) {
2425 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2430 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2431 if ($conf->browser->name ==
'chrome') {
2432 $stringforfirstkey .=
' ALT +';
2433 } elseif ($conf->browser->name ==
'firefox') {
2434 $stringforfirstkey .=
' ALT + SHIFT +';
2436 $stringforfirstkey .=
' CTL +';
2440 $profilLink =
'<a accesskey="u" href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"YourUserFile").
' ('.$stringforfirstkey.
' u)').
'"><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2441 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2442 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->trans(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.$stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.$stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover',
"closeTopMenuLoginDropdown()",
'',
'v');
2443 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt padingright"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2445 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2446 if (!empty($user->admin)) {
2447 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2451 $appli = constant(
'DOL_APPLICATION_TITLE');
2452 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2453 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2454 if (preg_match(
'/\d\.\d/', $appli)) {
2455 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2456 $appli .=
" (".DOL_VERSION.
")";
2459 $appli .=
" ".DOL_VERSION;
2462 $appli .=
" ".DOL_VERSION;
2465 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2466 $btnUser =
'<!-- div for user link -->
2467 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2468 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a" data-toggle="dropdown">
2469 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2471 <div class="dropdown-menu">
2473 <div class="user-header">
2474 '.$userDropDownImage.
'
2476 '.$profilName.
'<br>';
2477 if ($user->datelastlogin) {
2478 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2479 if ($user->datepreviouslogin) {
2480 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2483 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock"></i> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser').
'</small><br>';
2484 if ($user->datepreviouslogin) {
2485 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock opacitymedium"></i> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser').
'</small><br>';
2493 <!-- Menu Body user-->
2494 <div class="user-body">'.$dropdownBody.
'</div>
2497 <div class="user-footer">
2498 <div class="pull-left">
2501 <div class="pull-left">
2502 '.$virtuelcardLink.
'
2504 <div class="pull-right">
2507 <div class="clearboth"></div>
2513 $btnUser =
'<!-- div for user link -->
2514 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2515 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'">
2517 <span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone">'.
dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>
2522 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2524 <!-- Code to show/hide the user drop-down -->
2526 function closeTopMenuLoginDropdown() {
2527 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2529 jQuery("#topmenu-login-dropdown").removeClass("open");
2531 jQuery(document).ready(function() {
2532 jQuery(document).on("click", function(event) {
2533 // console.log("Click somewhere on screen");
2534 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2535 closeTopMenuLoginDropdown();
2541 if ($conf->theme !=
'md') {
2543 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2544 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2545 event.preventDefault();
2546 jQuery("#topmenu-login-dropdown").toggleClass("open");
2549 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2550 console.log("Clik on #topmenulogincompanyinfo-btn");
2551 jQuery("#topmenulogincompanyinfo").slideToggle();
2554 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2555 console.log("Clik on #topmenuloginmoreinfo-btn");
2556 jQuery("#topmenuloginmoreinfo").slideToggle();
2576 global $conf, $langs;
2582 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2583 if ($conf->browser->os ===
'macintosh') {
2584 $stringforfirstkey .=
' CTL +';
2586 if ($conf->browser->name ==
'chrome') {
2587 $stringforfirstkey .=
' ALT +';
2588 } elseif ($conf->browser->name ==
'firefox') {
2589 $stringforfirstkey .=
' ALT + SHIFT +';
2591 $stringforfirstkey .=
' CTL +';
2595 $html .=
'<!-- div for quick add link -->
2596 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2597 <a accesskey="a" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$stringforfirstkey.
' a)"><i class="fa fa-plus-circle"></i></a>
2601 <!-- Code to show/hide the user drop-down -->
2603 jQuery(document).ready(function() {
2604 jQuery(document).on("click", function(event) {
2605 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2607 $("#topmenu-quickadd-dropdown").removeClass("open");
2610 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2611 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2612 openQuickAddDropDown(event);
2616 $(document).keydown(function(event){
2617 var ostype = "'.$conf->browser->os.
'";
2618 if (ostype === "macintosh") {
2619 if ( event.which === 65 && event.ctrlKey ) {
2620 console.log(\'control + a : trigger open quick add dropdown\');
2621 openQuickAddDropDown(event);
2624 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2625 console.log(\'control + shift + a : trigger open quick add dropdown\');
2626 openQuickAddDropDown(event);
2631 var openQuickAddDropDown = function(event) {
2632 event.preventDefault();
2633 $("#topmenu-quickadd-dropdown").toggleClass("open");
2634 //$("#top-quickadd-search-input").focus();
2649 global $conf, $user, $langs, $hookmanager;
2654 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2655 "title" =>
"MenuNewMember@members",
2656 "name" =>
"Adherent@members",
2657 "picto" =>
"object_member",
2658 "activation" =>
isModEnabled(
'adherent') && $user->hasRight(
"adherent",
"write"),
2662 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2663 "title" =>
"MenuNewThirdParty@companies",
2664 "name" =>
"ThirdParty@companies",
2665 "picto" =>
"object_company",
2666 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2670 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2671 "title" =>
"NewContactAddress@companies",
2672 "name" =>
"Contact@companies",
2673 "picto" =>
"object_contact",
2674 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2678 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2679 "title" =>
"NewPropal@propal",
2680 "name" =>
"Proposal@propal",
2681 "picto" =>
"object_propal",
2682 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2687 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2688 "title" =>
"NewOrder@orders",
2689 "name" =>
"Order@orders",
2690 "picto" =>
"object_order",
2691 "activation" =>
isModEnabled(
'commande') && $user->hasRight(
"commande",
"write"),
2695 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2696 "title" =>
"NewBill@bills",
2697 "name" =>
"Bill@bills",
2698 "picto" =>
"object_bill",
2699 "activation" =>
isModEnabled(
'facture') && $user->hasRight(
"facture",
"write"),
2703 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2704 "title" =>
"NewContractSubscription@contracts",
2705 "name" =>
"Contract@contracts",
2706 "picto" =>
"object_contract",
2707 "activation" =>
isModEnabled(
'contrat') && $user->hasRight(
"contrat",
"write"),
2711 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2712 "title" =>
"SupplierProposalNew@supplier_proposal",
2713 "name" =>
"SupplierProposal@supplier_proposal",
2714 "picto" =>
"supplier_proposal",
2715 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2719 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2720 "title" =>
"NewSupplierOrderShort@orders",
2721 "name" =>
"SupplierOrder@orders",
2722 "picto" =>
"supplier_order",
2723 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2727 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2728 "title" =>
"NewBill@bills",
2729 "name" =>
"SupplierBill@bills",
2730 "picto" =>
"supplier_invoice",
2731 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2735 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2736 "title" =>
"NewTicket@ticket",
2737 "name" =>
"Ticket@ticket",
2738 "picto" =>
"ticket",
2739 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2743 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2744 "title" =>
"NewIntervention@interventions",
2745 "name" =>
"Intervention@interventions",
2746 "picto" =>
"intervention",
2747 "activation" =>
isModEnabled(
'ficheinter') && $user->hasRight(
"ficheinter",
"creer"),
2751 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2752 "title" =>
"NewProduct@products",
2753 "name" =>
"Product@products",
2754 "picto" =>
"object_product",
2755 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2759 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2760 "title" =>
"NewService@products",
2761 "name" =>
"Service@products",
2762 "picto" =>
"object_service",
2763 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2767 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2768 "title" =>
"AddUser@users",
2769 "name" =>
"User@users",
2771 "activation" => $user->hasRight(
"user",
"user",
"write"),
2777 $dropDownQuickAddHtml =
'';
2780 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2781 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2784 $parameters = array();
2785 $hook_items = $items;
2786 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2787 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2788 if ($reshook == 0) {
2789 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2791 $items = $hookmanager->resArray;
2795 $position = array();
2796 foreach ($items[
'items'] as $key => $row) {
2797 $position[$key] = $row[
'position'];
2799 $array1_sort_order = SORT_ASC;
2800 array_multisort($position, $array1_sort_order, $items[
'items']);
2803 foreach ($items[
'items'] as $item) {
2804 if (!$item[
'activation']) {
2807 $langs->load(explode(
'@', $item[
'title'])[1]);
2808 $langs->load(explode(
'@', $item[
'name'])[1]);
2809 $dropDownQuickAddHtml .=
'
2810 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2811 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2815 $dropDownQuickAddHtml .=
'</div>';
2816 $dropDownQuickAddHtml .=
'</div>';
2818 return $dropDownQuickAddHtml;
2828 global $langs, $conf, $db, $user;
2833 if (!
isModEnabled(
'bookmark') || empty($user->rights->bookmark->lire)) {
2839 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2840 if ($conf->browser->os ===
'macintosh') {
2841 $stringforfirstkey .=
' CTL +';
2843 if ($conf->browser->name ==
'chrome') {
2844 $stringforfirstkey .=
' ALT +';
2845 } elseif ($conf->browser->name ==
'firefox') {
2846 $stringforfirstkey .=
' ALT + SHIFT +';
2848 $stringforfirstkey .=
' CTL +';
2852 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2853 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2854 $langs->load(
"bookmarks");
2856 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2857 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2861 $html .=
'<!-- div for bookmark link -->
2862 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2863 <a accesskey="b" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.$stringforfirstkey.
' b)"><i class="fa fa-star"></i></a>
2864 <div class="dropdown-menu">
2870 <!-- Code to show/hide the bookmark drop-down -->
2872 jQuery(document).ready(function() {
2873 jQuery(document).on("click", function(event) {
2874 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2875 //console.log("close bookmark dropdown - we click outside");
2877 $("#topmenu-bookmark-dropdown").removeClass("open");
2881 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2882 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2883 openBookMarkDropDown(event);
2887 jQuery(document).keydown(function(event) {
2888 var ostype = "'.$conf->browser->os.
'";
2889 if (ostype === "macintosh") {
2890 if ( event.which === 66 && event.ctrlKey ) {
2891 console.log("Click on control + b : trigger open bookmark dropdown");
2892 openBookMarkDropDown(event);
2895 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2896 console.log("Click on control + shift + b : trigger open bookmark dropdown");
2897 openBookMarkDropDown(event);
2902 var openBookMarkDropDown = function(event) {
2903 event.preventDefault();
2904 jQuery("#topmenu-bookmark-dropdown").toggleClass("open");
2905 jQuery("#top-bookmark-search-input").focus();
2923 global $langs, $conf, $db, $user, $hookmanager;
2928 $arrayresult =
null;
2929 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2933 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2934 if ($conf->browser->name ==
'chrome') {
2935 $stringforfirstkey .=
' ALT +';
2936 } elseif ($conf->browser->name ==
'firefox') {
2937 $stringforfirstkey .=
' ALT + SHIFT +';
2939 $stringforfirstkey .=
' CTL +';
2942 $searchInput =
'<input name="search_all"'.($stringforfirstkey ?
' title="'.dol_escape_htmltag($stringforfirstkey.
' s').
'"' :
'').
' id="top-global-search-input" class="dropdown-search-input search_component_input" placeholder="'.$langs->trans(
'Search').
'" autocomplete="off">';
2944 $defaultAction =
'';
2945 $buttonList =
'<div class="dropdown-global-search-button-list" >';
2947 foreach ($arrayresult as $keyItem => $item) {
2948 if (empty($defaultAction)) {
2949 $defaultAction = $item[
'url'];
2951 $buttonList .=
'<button class="dropdown-item global-search-item tdoverflowmax300" data-target="'.dol_escape_htmltag($item[
'url']).
'" >';
2952 $buttonList .= $item[
'text'];
2953 $buttonList .=
'</button>';
2955 $buttonList .=
'</div>';
2957 $dropDownHtml =
'<form id="top-menu-action-search" name="actionsearch" method="GET" action="'.$defaultAction.
'">';
2960 <!-- search input -->
2961 <div class="dropdown-header search-dropdown-header">
2967 <!-- Menu Body search -->
2968 <div class="dropdown-body search-dropdown-body">
2973 $dropDownHtml .=
'</form>';
2977 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2978 if ($conf->browser->name ==
'chrome') {
2979 $stringforfirstkey .=
' ALT +';
2980 } elseif ($conf->browser->name ==
'firefox') {
2981 $stringforfirstkey .=
' ALT + SHIFT +';
2983 $stringforfirstkey .=
' CTL +';
2986 $html .=
'<!-- div for Global Search -->
2987 <div id="topmenu-global-search-dropdown" class="atoplogin dropdown inline-block">
2988 <a accesskey="s" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Search').
' ('.$stringforfirstkey.
' s)">
2989 <i class="fa fa-search" ></i>
2991 <div class="dropdown-menu dropdown-search">
2997 <!-- Code to show/hide the user drop-down -->
2999 jQuery(document).ready(function() {
3001 // prevent submiting form on press ENTER
3002 jQuery("#top-global-search-input").keydown(function (e) {
3003 if (e.keyCode == 13) {
3004 var inputs = $(this).parents("form").eq(0).find(":button");
3005 if (inputs[inputs.index(this) + 1] != null) {
3006 inputs[inputs.index(this) + 1].focus();
3014 jQuery(document).keydown(function(e) {
3015 // Get the focused element:
3016 var $focused = $(":focus");
3017 if($focused.length && $focused.hasClass("global-search-item")){
3019 // UP - move to the previous line
3020 if (e.keyCode == 38) {
3022 $focused.prev().focus();
3025 // DOWN - move to the next line
3026 if (e.keyCode == 40) {
3028 $focused.next().focus();
3034 // submit form action
3035 jQuery(".dropdown-global-search-button-list .global-search-item").on("click", function(event) {
3036 jQuery("#top-menu-action-search").attr("action", $(this).data("target"));
3037 jQuery("#top-menu-action-search").submit();
3041 jQuery(document).on("click", function(event) {
3042 if (!$(event.target).closest("#topmenu-global-search-dropdown").length) {
3043 console.log("click close search - we click outside");
3045 jQuery("#topmenu-global-search-dropdown").removeClass("open");
3050 jQuery("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) {
3051 console.log("click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3052 openGlobalSearchDropDown();
3056 jQuery(document).keydown(function(e){
3057 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3058 console.log(\'control + shift + f : trigger open global-search dropdown\');
3059 openGlobalSearchDropDown();
3061 if ( e.which === 70 && e.alKey ) {
3062 console.log(\'alt + f : trigger open global-search dropdown\');
3063 openGlobalSearchDropDown();
3067 var openGlobalSearchDropDown = function() {
3068 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3069 jQuery("#top-global-search-input").focus();
3093 function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after =
'', $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3095 global $user, $conf, $langs, $db,
$form;
3096 global $hookmanager, $menumanager;
3100 if (!empty($menu_array_before)) {
3101 dol_syslog(
"Deprecated parameter menu_array_before was used when calling main::left_menu function. Menu entries of module should now be defined into module descriptor and not provided when calling left_menu.", LOG_WARNING);
3104 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3106 $hookmanager->initHooks(array(
'leftblock'));
3108 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3111 if (!is_object(
$form)) {
3115 if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
3117 if ($conf->browser->layout ==
'phone') {
3118 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3122 $arrayresult = array();
3123 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3125 if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3128 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3129 if ($conf->browser->name ==
'chrome') {
3130 $stringforfirstkey .=
' ALT +';
3131 } elseif ($conf->browser->name ==
'firefox') {
3132 $stringforfirstkey .=
' ALT + SHIFT +';
3134 $stringforfirstkey .=
' CTL +';
3137 $searchform .=
$form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (empty($conf->global->MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY) ? 1 : 0),
'vmenusearchselectcombo', 1, $langs->trans(
"Search"), 1, $stringforfirstkey.
' s');
3139 if (is_array($arrayresult)) {
3140 foreach ($arrayresult as $key => $val) {
3141 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3147 $parameters = array(
'searchform' => $searchform);
3148 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3149 if (empty($reshook)) {
3150 $searchform .= $hookmanager->resPrint;
3152 $searchform = $hookmanager->resPrint;
3156 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) || empty($conf->use_javascript_ajax)) {
3157 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3158 $searchform =
'<div class="blockvmenuimpair blockvmenusearchphone"><div id="divsearchforms1"><a href="'.$urltosearch.
'" accesskey="s" alt="'.
dol_escape_htmltag($langs->trans(
"ShowSearchFields")).
'">'.$langs->trans(
"Search").
'...</a></div></div>';
3159 } elseif ($conf->use_javascript_ajax && !empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3160 $searchform =
'<div class="blockvmenuimpair blockvmenusearchphone"><div id="divsearchforms1"><a href="#" alt="'.dol_escape_htmltag($langs->trans(
"ShowSearchFields")).
'">'.$langs->trans(
"Search").
'...</a></div><div id="divsearchforms2" style="display: none">'.$searchform.
'</div>';
3161 $searchform .=
'<script>
3162 jQuery(document).ready(function () {
3163 jQuery("#divsearchforms1").click(function(){
3164 jQuery("#divsearchforms2").toggle();
3168 $searchform .=
'</div>';
3172 $searchform .=
'<script>
3173 jQuery(document).keydown(function(e){
3174 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3175 console.log(\'control + shift + f : trigger open global-search dropdown\');
3176 openGlobalSearchDropDown();
3178 if( (e.which === 83 || e.which === 115) && e.altKey ){
3179 console.log(\'alt + s : trigger open global-search dropdown\');
3180 openGlobalSearchDropDown();
3184 var openGlobalSearchDropDown = function() {
3185 jQuery("#searchselectcombo").select2(\'open\');
3191 print
'<!-- Begin left menu -->'.
"\n";
3193 print
'<div class="vmenu"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ?
'' :
' title="Left menu"').
'>'.
"\n\n";
3196 $menumanager->menu_array = $menu_array_before;
3197 $menumanager->menu_array_after = $menu_array_after;
3198 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
3202 print
"<!-- Begin Help Block-->\n";
3203 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3206 if (!empty($conf->global->MAIN_SHOW_VERSION)) {
3207 $doliurl =
'https://www.dolibarr.org';
3209 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3210 $doliurl =
'https://www.dolibarr.fr';
3212 if (preg_match(
'/es/i', $langs->defaultlang)) {
3213 $doliurl =
'https://www.dolibarr.es';
3215 if (preg_match(
'/de/i', $langs->defaultlang)) {
3216 $doliurl =
'https://www.dolibarr.de';
3218 if (preg_match(
'/it/i', $langs->defaultlang)) {
3219 $doliurl =
'https://www.dolibarr.it';
3221 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3222 $doliurl =
'https://www.dolibarr.gr';
3225 $appli = constant(
'DOL_APPLICATION_TITLE');
3226 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
3227 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
3228 if (preg_match(
'/\d\.\d/', $appli)) {
3229 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3230 $appli .=
" (".DOL_VERSION.
")";
3233 $appli .=
" ".DOL_VERSION;
3236 $appli .=
" ".DOL_VERSION;
3238 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3240 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3242 print
'<span class="help">';
3250 print
'</div>'.
"\n";
3254 if (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3255 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3257 if ($conf->global->MAIN_BUGTRACK_ENABLELINK ==
'github') {
3258 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3259 $bugbaseurl .=
'&title=';
3260 $bugbaseurl .= urlencode(
"Bug: ");
3261 $bugbaseurl .=
'&body=';
3262 $bugbaseurl .= urlencode(
"# Instructions\n");
3263 $bugbaseurl .= urlencode(
"*This is a template to help you report good issues. You may use [Github Markdown](https://help.github.com/articles/getting-started-with-writing-and-formatting-on-github/) syntax to format your issue report.*\n");
3264 $bugbaseurl .= urlencode(
"*Please:*\n");
3265 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3266 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3267 $bugbaseurl .= urlencode(
"\n");
3268 $bugbaseurl .= urlencode(
"\n");
3269 $bugbaseurl .= urlencode(
"# Bug\n");
3270 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3271 $bugbaseurl .= urlencode(
"\n");
3272 $bugbaseurl .= urlencode(
"## Environment\n");
3273 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3274 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3275 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3276 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3277 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3278 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3279 $bugbaseurl .= urlencode(
"\n");
3280 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3281 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3282 $bugbaseurl .= urlencode(
"\n");
3283 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3284 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3285 $bugbaseurl .= urlencode(
"\n");
3286 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
3287 $bugbaseurl .= urlencode(
"[*Files*]\n");
3288 $bugbaseurl .= urlencode(
"\n");
3290 $bugbaseurl .= urlencode(
"\n");
3291 $bugbaseurl .= urlencode(
"## Report\n");
3292 } elseif (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3293 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
3299 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3300 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3301 if (empty($reshook)) {
3302 $bugbaseurl .= $hookmanager->resPrint;
3304 $bugbaseurl = $hookmanager->resPrint;
3307 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3308 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3313 print
"<!-- End Help Block-->\n";
3317 print
"<!-- End left menu -->\n";
3321 $parameters = array();
3322 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3323 print $hookmanager->resPrint;
3325 print
'</div></div> <!-- End side-nav id-left -->';
3329 print
'<!-- Begin right area -->'.
"\n";
3331 if (empty($leftmenuwithoutmainarea)) {
3345 global $conf, $langs, $hookmanager;
3347 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3348 print
'<div id="id-right">';
3353 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3355 $hookmanager->initHooks(array(
'main'));
3356 $parameters = array();
3357 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3358 print $hookmanager->resPrint;
3360 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
3361 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3365 if (!empty($conf->global->SHOW_SOCINFO_ON_PRINT) &&
GETPOST(
'optioncss',
'aZ09') ==
'print' && empty(
GETPOST(
'disable_show_socinfo_on_print',
'az09'))) {
3366 $parameters = array();
3367 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3368 if (empty($reshook)) {
3369 print
'<!-- Begin show mysoc info header -->'.
"\n";
3370 print
'<div id="mysoc-info-header">'.
"\n";
3371 print
'<table class="centpercent div-table-responsive">'.
"\n";
3373 print
'<tr><td rowspan="0" class="width20p">';
3374 if ($conf->global->MAIN_SHOW_LOGO && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($conf->global->MAIN_INFO_SOCIETE_LOGO)) {
3375 print
'<img id="mysoc-info-header-logo" style="max-width:100%" alt="" src="'.DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/'.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_LOGO)).
'">';
3377 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3378 print
'<tr><td class="titre bold">'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_NOM).
'</td></tr>'.
"\n";
3379 print
'<tr><td>'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_ADDRESS).
'<br>'.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_ZIP).
' '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TOWN).
'</td></tr>'.
"\n";
3380 if (!empty($conf->global->MAIN_INFO_SOCIETE_TEL)) {
3381 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Phone").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TEL).
'</td></tr>';
3383 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
3384 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Email").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL).
'</td></tr>';
3386 if (!empty($conf->global->MAIN_INFO_SOCIETE_WEB)) {
3387 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Web").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_WEB).
'</td></tr>';
3390 print
'</table>'.
"\n";
3391 print
'</div>'.
"\n";
3392 print
'<!-- End show mysoc info header -->'.
"\n";
3411 if (preg_match(
'/^http/i', $helppagename)) {
3413 $helpbaseurl =
'%s';
3414 $helppage = $helppagename;
3419 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3420 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3421 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3422 $helppage = $reg[1];
3425 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3426 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3427 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3428 $helppage = $reg[1];
3431 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3432 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3433 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3434 $helppage = $reg[1];
3437 if (empty($helppage)) {
3438 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3439 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3440 $helppage = $reg[1];
3445 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3465 function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3467 global $langs, $user;
3470 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3471 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3472 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3473 if ($showtitlebefore) {
3474 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3476 $ret .=
'<div class="tagtd">';
3477 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3478 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3479 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3480 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3481 $ret .=
' placeholder="'.strip_tags($title).
'"';
3482 $ret .= ($autofocus ?
' autofocus' :
'');
3483 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3484 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3485 $ret .=
'<span class="fa fa-search"></span>';
3486 $ret .=
'</button>';
3488 $ret .=
"</form>\n";
3493 if (!function_exists(
"llxFooter")) {
3504 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3506 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager;
3507 global $delayedhtmlcontent;
3508 global $contextpage, $page, $limit, $mode;
3509 global $dolibarr_distrib;
3511 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3515 $parameters = array();
3516 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters, $object, $action);
3517 if (empty($reshook)) {
3518 $llxfooter .= $hookmanager->resPrint;
3519 } elseif ($reshook > 0) {
3520 $llxfooter = $hookmanager->resPrint;
3531 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3533 foreach ($user->lastsearch_values_tmp as $key => $val) {
3534 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3535 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3536 if (empty($val[
'sortfield'])) {
3537 unset($val[
'sortfield']);
3539 if (empty($val[
'sortorder'])) {
3540 unset($val[
'sortorder']);
3542 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3543 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3544 unset($_SESSION[
'lastsearch_values_'.$key]);
3550 $relativepathstring = $_SERVER[
"PHP_SELF"];
3552 if (constant(
'DOL_URL_ROOT')) {
3553 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3555 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3556 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3557 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3558 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3559 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3560 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3561 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3563 if (!empty($contextpage)) {
3564 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3566 if (!empty($page) && $page > 0) {
3567 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3569 if (!empty($limit) && $limit != $conf->liste_limit) {
3570 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3572 if (!empty($mode)) {
3573 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3576 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3577 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3578 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3579 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3583 if (!empty($conf->global->MAIN_CORE_ERROR)) {
3585 if ($conf->use_javascript_ajax) {
3586 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3587 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3590 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3591 print
'<div class="error">'.$msg.
'</div>';
3599 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3601 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3602 print
'</div> <!-- End div id-right -->'.
"\n";
3605 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3606 print
'</div> <!-- End div id-container -->'.
"\n";
3611 print
'<!-- '.$comment.
' -->'.
"\n";
3616 if (!empty($delayedhtmlcontent)) {
3617 print $delayedhtmlcontent;
3620 if (!empty($conf->use_javascript_ajax)) {
3621 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3622 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3626 if (
isModEnabled(
'blockedlog') && is_object($object) && !empty($object->id) && $object->id > 0) {
3627 if (in_array($object->element, array(
'facture')) && $object->statut > 0) {
3628 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3631 jQuery(document).ready(
function () {
3632 $(
'a.documentpreview').click(
function() {
3633 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3635 id:<?php echo $object->id; ?>
3636 , element:
'<?php echo $object->element ?>'
3637 , action:
'DOC_PREVIEW'
3638 , token:
'<?php echo currentToken(); ?>'
3642 $(
'a.documentdownload').click(
function() {
3643 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3645 id:<?php echo $object->id; ?>
3646 , element:
'<?php echo $object->element ?>'
3647 , action:
'DOC_DOWNLOAD'
3648 , token:
'<?php echo currentToken(); ?>'
3659 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3660 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3664 $forceping =
GETPOST(
'forceping',
'alpha');
3665 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3667 $hash_unique_id = md5(
'dolibarr'.$conf->file->instance_unique_id);
3669 if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
3670 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && ($conf->global->MAIN_FIRST_PING_OK_ID !=
'disabled'))
3673 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3674 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3675 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3678 if (!empty($conf->global->MAIN_LAST_PING_KO_DATE) && substr($conf->global->MAIN_LAST_PING_KO_DATE, 0, 6) ==
dol_print_date(
dol_now(),
'%Y%m') && !$forceping) {
3679 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3681 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3683 print
"\n".
'<!-- Includes JS for Ping of Dolibarr forceping='.$forceping.
' MAIN_FIRST_PING_OK_DATE='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_DATE").
' MAIN_FIRST_PING_OK_ID='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_ID").
' MAIN_LAST_PING_KO_DATE='.
getDolGlobalString(
"MAIN_LAST_PING_KO_DATE").
' -->'.
"\n";
3684 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3685 $url_for_ping = (empty($conf->global->MAIN_URL_FOR_PING) ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3687 $distrib =
'standard';
3688 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3689 $distrib =
'doliwamp';
3691 if (!empty($dolibarr_distrib)) {
3692 $distrib = $dolibarr_distrib;
3696 jQuery(document).ready(
function (tmp) {
3697 console.log(
"Try Ping with hash_unique_id is md5('dolibarr'+instance_unique_id)");
3700 url:
"<?php echo $url_for_ping ?>",
3705 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3706 action:
'dolibarrping',
3707 version:
'<?php echo (float) DOL_VERSION; ?>',
3708 entity:
'<?php echo (int) $conf->entity; ?>',
3709 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3710 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3711 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3712 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3713 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3714 token:
'notrequired'
3716 success:
function (data, status, xhr) {
3717 console.log(
"Ping ok");
3720 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3723 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3726 error:
function (data,status,xhr) {
3727 console.log(
"Ping ko: " + data);
3730 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3733 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3743 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3744 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3746 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3751 $parameters = array();
3752 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
3754 print $hookmanager->resPrint;
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
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).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays).
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
isHTTPS()
Return if we are using a HTTPS connexion Check HTTPS (no way to be modified by user but may be empty ...
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1, $separ=' ')
Format profIDs according to country.
getBrowserInfo($user_agent)
Return information about user browser.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated 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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after='', $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
top_menu_quickadd()
Build the tooltip on top menu quick add.
analyseVarsForSqlAndScriptsInjection(&$var, $type)
Return true if security check on parameters are OK, false otherwise.
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...
if(!empty($_SERVER['MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
main_area($title='')
Begin main area.
if(!defined('NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Ouput html header of a page.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu_search()
Build the tooltip on top menu tsearch.
printDropdownQuickadd()
Generate list of quickadd items.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
div float
Buy price without taxes.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successfull.
dol_hash($chain, $type='0')
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.