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[^&].*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|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $val);
174 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $val);
175 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\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)\s*=/i', $val);
177 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $val);
179 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\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|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $tmpval);
186 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $tmpval);
187 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\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)\s*=/i', $tmpval);
189 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $tmpval);
191 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\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->layout = $tmp[
'layout'];
416 if ($conf->browser->layout ==
'phone') {
417 $conf->dol_no_mouse_hover = 1;
422 if (
GETPOST(
'theme',
'aZ09')) {
423 $conf->theme =
GETPOST(
'theme',
'aZ09');
424 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
428 if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
429 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
434 if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on')) {
436 if (is_numeric($conf->file->main_force_https)) {
437 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
438 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
439 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
443 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
447 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
452 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
453 header(
"Location: ".$newurl);
456 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);
460 if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
461 $listofip = explode(
',', $dolibarr_main_restrict_ip);
463 foreach ($listofip as $ip) {
465 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
471 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
477 if (!defined(
'NOREQUIREHTML')) {
478 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
480 if (!defined(
'NOREQUIREAJAX')) {
481 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
485 if (!empty($conf->global->MAIN_NOT_INSTALLED) || !empty($conf->global->MAIN_NOT_UPGRADED)) {
486 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
487 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
491 if ((!empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
492 || (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && !empty($conf->global->MAIN_VERSION_LAST_INSTALL) && ($conf->global->MAIN_VERSION_LAST_INSTALL != DOL_VERSION))) {
493 $versiontocompare = empty($conf->global->MAIN_VERSION_LAST_UPGRADE) ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
494 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
495 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
496 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
497 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
499 if (empty($conf->global->MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE) || $rescomp < 3) {
501 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
502 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
509 if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
511 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
513 if (isset($_SESSION[
'newtoken'])) {
514 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
517 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
521 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
522 $_SESSION[
'newtoken'] = $token;
523 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
531 if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
533 $sensitiveget =
false;
536 if (
GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'specimen'))) {
537 $sensitiveget =
true;
541 $arrayofactiontoforcetokencheck = array(
543 'doprev',
'donext',
'dvprev',
'dvnext',
544 'freezone',
'install',
547 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
548 $sensitiveget =
true;
551 if (preg_match(
'/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
552 $sensitiveget =
true;
559 $_SERVER[
'REQUEST_METHOD'] ==
'POST' ||
565 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
567 if (
GETPOST(
'uploadform',
'int')) {
568 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
569 $langs->loadLangs(array(
"errors",
"install"));
570 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
571 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
573 http_response_code(403);
574 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
575 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);
576 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";
578 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);
579 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";
580 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";
581 if (!empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
582 print
" instead of ".$conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN;
584 print
" into setup).\n";
591 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
594 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);
597 if (!defined(
'NOTOKENRENEWAL')) {
599 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
602 if (isset($_POST[
'id'])) {
603 $savid = ((int) $_POST[
'id']);
606 unset($_GET[
'confirm']);
607 unset($_GET[
'action']);
608 unset($_GET[
'confirmmassaction']);
609 unset($_GET[
'massaction']);
610 unset($_GET[
'token']);
612 $_POST[
'id'] = ((int) $savid);
615 $_GET[
'errorcode'] =
'InvalidToken';
623 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
625 if (!empty($_SESSION[
"disablemodules"])) {
626 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal');
628 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
629 foreach ($disabled_modules as $module) {
631 if (empty($conf->$module)) {
632 $conf->$module =
new stdClass();
634 $conf->$module->enabled =
false;
635 foreach ($modulepartkeys as $modulepartkey) {
636 unset($conf->modules_parts[$modulepartkey][$module]);
638 if ($module ==
'fournisseur') {
639 $conf->supplier_order->enabled = 0;
640 $conf->supplier_invoice->enabled = 0;
647 $modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
648 if (is_array($modulepart) && count($modulepart) > 0) {
649 foreach ($conf->modules as $module) {
650 if (in_array($module, $modulepart)) {
651 $modulepart = $module;
656 if (is_array($modulepart)) {
665 if (!defined(
'NOLOGIN')) {
669 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
670 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
673 if (empty($dolibarr_main_authentication)) {
674 $dolibarr_main_authentication =
'dolibarr';
677 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
678 $dolibarr_auto_user =
'auto';
682 $authmode = explode(
',', $dolibarr_main_authentication);
685 if (!count($authmode)) {
686 $langs->load(
'main');
687 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
694 $resultFetchUser =
'';
696 if (!isset($_SESSION[
"dol_login"])) {
698 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
700 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
701 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
702 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
703 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
704 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
705 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
706 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
707 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
708 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
709 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
713 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
714 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
715 dol_syslog(
"Call index page from another url than demo page (call is done from page ".$_SERVER[
'HTTP_REFERER'].
")");
717 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
718 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
719 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
720 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
721 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
722 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
723 header(
"Location: ".$url);
730 $hookmanager->initHooks(array(
'login'));
731 $parameters = array();
732 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
739 if ($test &&
GETPOST(
"username",
"alpha", 2) && !empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA) && !isset($_SESSION[
'dol_bypass_antispam'])) {
740 $sessionkey =
'dol_antispam_value';
741 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
745 dol_syslog(
'Bad value for code, connexion refused');
747 $langs->loadLangs(array(
'main',
'errors'));
749 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
753 $user->trigger_mesg =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
756 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
764 $hookmanager->initHooks(array(
'login'));
765 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
766 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
775 $allowedmethodtopostusername = 3;
776 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
777 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
780 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
781 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
782 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
785 $goontestloop =
false;
786 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
787 $goontestloop =
true;
789 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
790 $goontestloop =
true;
792 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
793 $goontestloop =
true;
795 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
796 $goontestloop =
true;
798 if (
GETPOST(
'beforeoauthloginredirect',
'int') ||
GETPOST(
'afteroauthloginreturn')) {
799 $goontestloop =
true;
801 if (!empty($_COOKIE[
'login_dolibarr'])) {
802 $goontestloop =
true;
805 if (!is_object($langs)) {
806 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
808 $langcode = (
GETPOST(
'lang',
'aZ09', 1) ?
GETPOST(
'lang',
'aZ09', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ?
'auto' : $conf->global->MAIN_LANG_DEFAULT));
809 if (defined(
'MAIN_LANG_DEFAULT')) {
810 $langcode = constant(
'MAIN_LANG_DEFAULT');
812 $langs->setDefaultLang($langcode);
819 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
821 if ($login ===
'--bad-login-validity--') {
828 $dol_authmode = $conf->authmode;
829 $dol_tz = $_POST[
"tz"];
830 $dol_tz_string = $_POST[
"tz_string"];
831 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
832 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
833 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
836 if (isset($_POST[
"dst_first"]) && isset($_POST[
"dst_second"])) {
837 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
841 if ($datenow >= $datefirst && $datenow < $datesecond) {
849 dol_syslog(
'Bad password, connexion refused', LOG_DEBUG);
851 $langs->loadLangs(array(
'main',
'errors'));
855 if (empty($_SESSION[
"dol_loginmesg"])) {
856 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
860 $user->trigger_mesg = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
863 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
871 $hookmanager->initHooks(array(
'login'));
872 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
873 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
883 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
885 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);
886 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
891 return 'ERROR_NOT_LOGGED';
893 if ($_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
894 http_response_code(401);
896 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
901 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
902 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
903 dol_syslog(
'User not found or not valid, connexion refused');
905 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
906 session_name($sessionname);
909 if ($resultFetchUser == 0) {
911 $langs->loadLangs(array(
'main',
'errors'));
913 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
915 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
916 } elseif ($resultFetchUser < 0) {
917 $_SESSION[
"dol_loginmesg"] = $user->error;
919 $user->trigger_mesg = $user->error;
922 $langs->loadLangs(array(
'main',
'errors'));
924 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
926 $user->trigger_mesg = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
930 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
939 $hookmanager->initHooks(array(
'login'));
940 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
941 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
946 $paramsurl = array();
947 if (
GETPOST(
'textbrowser',
'int')) {
948 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
951 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
954 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
956 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
960 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
961 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
966 $login = $_SESSION[
"dol_login"];
967 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
968 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
970 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
974 if ($resultFetchUser <= 0
975 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
976 || ($user->status != $user::STATUS_ENABLED)
977 || ($user->isNotIntoValidityDateRange())) {
978 if ($resultFetchUser <= 0) {
980 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
981 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
983 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
984 } elseif ($user->status != $user::STATUS_ENABLED) {
989 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], curren date is ".
dol_now());
992 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
993 session_name($sessionname);
996 if ($resultFetchUser == 0) {
997 $langs->loadLangs(array(
'main',
'errors'));
999 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1001 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1002 } elseif ($resultFetchUser < 0) {
1003 $_SESSION[
"dol_loginmesg"] = $user->error;
1005 $user->trigger_mesg = $user->error;
1007 $langs->loadLangs(array(
'main',
'errors'));
1009 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1011 $user->trigger_mesg =
'ErrorUserSessionWasInvalidated - login='.$login;
1015 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1023 $hookmanager->initHooks(array(
'login'));
1024 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1025 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1030 $paramsurl = array();
1031 if (
GETPOST(
'textbrowser',
'int')) {
1032 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1035 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1037 if (
GETPOST(
'lang',
'aZ09')) {
1038 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1040 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1044 $hookmanager->initHooks(array(
'main'));
1047 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1048 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1049 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1051 if (constant(
'DOL_URL_ROOT')) {
1052 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1054 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1055 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1059 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1060 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1061 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1063 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1064 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1065 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1067 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1068 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1069 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1071 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1072 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1073 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1075 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1076 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1077 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1082 $reshook = $hookmanager->executeHooks(
'updateSession', array(), $user, $action);
1091 if (!isset($_SESSION[
"dol_login"])) {
1096 $_SESSION[
"dol_login"] = $user->login;
1097 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1098 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1099 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1100 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1101 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1102 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1103 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1104 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1105 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1106 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1108 $_SESSION[
"dol_entity"] = $conf->entity;
1110 if (!empty($dol_hide_topmenu)) {
1111 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1113 if (!empty($dol_hide_leftmenu)) {
1114 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1116 if (!empty($dol_optimize_smallscreen)) {
1117 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1119 if (!empty($dol_no_mouse_hover)) {
1120 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1122 if (!empty($dol_use_jmobile)) {
1123 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1126 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1130 $user->update_last_login_date();
1132 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1135 $user->trigger_mesg = $loginfo;
1138 $result = $user->call_trigger(
'USER_LOGIN', $user);
1146 $hookmanager->initHooks(array(
'login'));
1147 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1148 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1156 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1163 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (empty($conf->global->MAIN_LANDING_PAGE) ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->conf->MAIN_LANDING_PAGE);
1164 if (!empty($landingpage)) {
1166 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1167 header(
'Location: '.$newpath);
1176 $user->rights->user->user->lire = 1;
1177 $user->rights->user->user->creer = 1;
1178 $user->rights->user->user->password = 1;
1179 $user->rights->user->user->supprimer = 1;
1180 $user->rights->user->self->creer = 1;
1181 $user->rights->user->self->password = 1;
1184 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1185 if (empty($user->rights->user->user_advance)) {
1186 $user->rights->user->user_advance =
new stdClass();
1188 if (empty($user->rights->user->self_advance)) {
1189 $user->rights->user->self_advance =
new stdClass();
1191 if (empty($user->rights->user->group_advance)) {
1192 $user->rights->user->group_advance =
new stdClass();
1195 $user->rights->user->user_advance->readperms = 1;
1196 $user->rights->user->user_advance->write = 1;
1197 $user->rights->user->self_advance->readperms = 1;
1198 $user->rights->user->self_advance->writeperms = 1;
1199 $user->rights->user->group_advance->read = 1;
1200 $user->rights->user->group_advance->readperms = 1;
1201 $user->rights->user->group_advance->write = 1;
1202 $user->rights->user->group_advance->delete = 1;
1211 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1212 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1214 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1215 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1219 if (empty($conf->global->MAIN_FORCETHEME) && !empty($user->conf->MAIN_THEME)) {
1220 $conf->theme = $user->conf->MAIN_THEME;
1221 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1225 if (!empty($user) && method_exists($user,
'loadDefaultValues')) {
1226 $user->loadDefaultValues();
1232 if (
GETPOST(
'theme',
'aZ09')) {
1233 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1234 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1239 $conf->use_javascript_ajax = 0;
1241 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1242 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1247 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1248 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1252 $conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1255 if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1256 $conf->dol_hide_leftmenu = 1;
1258 if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1259 $conf->dol_hide_topmenu = 1;
1261 if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1262 $conf->dol_optimize_smallscreen = 1;
1264 if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1265 $conf->dol_no_mouse_hover = 1;
1267 if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1268 $conf->dol_use_jmobile = 1;
1271 if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1272 $conf->dol_no_mouse_hover = 1;
1276 if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1277 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1278 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1279 || !empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
1281 $conf->dol_optimize_smallscreen = 1;
1283 if (isset($conf->global->PRODUIT_DESC_IN_FORM) && $conf->global->PRODUIT_DESC_IN_FORM == 1) {
1284 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1288 if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1289 $conf->theme =
'eldy';
1290 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1293 if (!defined(
'NOREQUIRETRAN')) {
1294 if (!
GETPOST(
'lang',
'aZ09')) {
1296 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1299 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1300 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1306 if (!defined(
'NOLOGIN')) {
1309 if (!$user->login) {
1314 if ($user->statut < 1) {
1316 $langs->loadLangs(array(
"errors",
"other"));
1317 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1325 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);
1330 if (!defined(
'NOREQUIRETRAN')) {
1332 $langs->loadLangs(array(
'main',
'dict'));
1336 $bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1337 $bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1338 $bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1339 $bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1342 $mesg =
''; $warning =
''; $error = 0;
1344 $mesgs = array(); $warnings = array(); $errors = array();
1347 if (empty($conf->browser->firefox)) {
1348 define(
'ROWS_1', 1);
1349 define(
'ROWS_2', 2);
1350 define(
'ROWS_3', 3);
1351 define(
'ROWS_4', 4);
1352 define(
'ROWS_5', 5);
1353 define(
'ROWS_6', 6);
1354 define(
'ROWS_7', 7);
1355 define(
'ROWS_8', 8);
1356 define(
'ROWS_9', 9);
1358 define(
'ROWS_1', 0);
1359 define(
'ROWS_2', 1);
1360 define(
'ROWS_3', 2);
1361 define(
'ROWS_4', 3);
1362 define(
'ROWS_5', 4);
1363 define(
'ROWS_6', 5);
1364 define(
'ROWS_7', 6);
1365 define(
'ROWS_8', 7);
1366 define(
'ROWS_9', 8);
1369 $heightforframes = 50;
1372 if (!defined(
'NOREQUIREMENU')) {
1373 if (empty($user->socid)) {
1374 $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);
1377 $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);
1381 $file_menu = $conf->standard_menu;
1382 if (
GETPOST(
'menu',
'alpha')) {
1383 $file_menu =
GETPOST(
'menu',
'alpha');
1385 if (!class_exists(
'MenuManager')) {
1387 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1388 foreach ($dirmenus as $dirmenu) {
1390 if (class_exists(
'MenuManager')) {
1394 if (!class_exists(
'MenuManager')) {
1395 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1396 $file_menu =
'eldy_menu.php';
1397 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1400 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1401 $menumanager->loadMenu();
1404 if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1405 $message =
GETPOST(
'seteventmessages',
'alpha');
1406 $messages = explode(
',', $message);
1407 foreach ($messages as $key => $msg) {
1408 $tmp = explode(
':', $msg);
1415 if (!function_exists(
"llxHeader")) {
1436 function llxHeader($head =
'', $title =
'',
$help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1438 global $conf, $hookmanager;
1441 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1443 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1445 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1447 if ($mainmenu !=
'website') {
1448 $tmpcsstouse = $morecssonbody;
1452 if (!empty($conf->global->MAIN_OPTIMIZEFORCOLORBLIND)) {
1453 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1456 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1458 $parameters = array(
'help_url' =>
$help_url);
1459 $reshook = $hookmanager->executeHooks(
'changeHelpURL', $parameters);
1465 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1466 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring,
$help_url);
1469 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1474 if ($replacemainareaby) {
1475 print $replacemainareaby;
1492 global $db, $conf, $hookmanager;
1494 if ($contenttype ==
'text/html') {
1495 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1497 header(
"Content-Type: ".$contenttype);
1503 header(
"X-Content-Type-Options: nosniff");
1506 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1507 header(
"X-Frame-Options: SAMEORIGIN");
1509 header(
"X-Frame-Options: ALLOWALL");
1516 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1531 if (!is_object($hookmanager)) {
1532 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1535 $hookmanager->initHooks(array(
"main"));
1537 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'reportonly');
1538 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1540 $contentsecuritypolicy = $hookmanager->resPrint;
1542 $contentsecuritypolicy .= $hookmanager->resPrint;
1545 if (!empty($contentsecuritypolicy)) {
1546 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1549 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1553 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1568 if (!is_object($hookmanager)) {
1569 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1572 $hookmanager->initHooks(array(
"main"));
1574 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'active');
1575 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1577 $contentsecuritypolicy = $hookmanager->resPrint;
1579 $contentsecuritypolicy .= $hookmanager->resPrint;
1582 if (!empty($contentsecuritypolicy)) {
1583 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1586 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1592 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1595 header(
"Referrer-Policy: ".$referrerpolicy);
1598 if ($forcenocache) {
1599 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1621 function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1623 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1627 if (empty($conf->css)) {
1628 $conf->css =
'/theme/eldy/style.css.php';
1631 print
'<!doctype html>'.
"\n";
1633 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1636 if (empty($disablehead)) {
1637 if (!is_object($hookmanager)) {
1638 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1641 $hookmanager->initHooks(array(
"main"));
1643 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
1647 if (
GETPOST(
'dol_basehref',
'alpha')) {
1648 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1652 print
'<meta charset="utf-8">'.
"\n";
1653 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1654 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1655 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1656 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1657 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1659 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1662 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1663 if (!empty($mysoc->logo_squarred_mini)) {
1664 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1669 if (empty($conf->dol_use_jmobile)) {
1670 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1678 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1679 if (!empty($manifest)) {
1680 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1683 if (!empty($conf->global->THEME_ELDY_TOPMENU_BACK1)) {
1685 print
'<meta name="theme-color" content="rgb('.$conf->global->THEME_ELDY_TOPMENU_BACK1.
')">'.
"\n";
1689 if (
GETPOST(
'autorefresh',
'int') > 0) {
1690 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1694 $appli = constant(
'DOL_APPLICATION_TITLE');
1695 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1696 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1701 if ($title && !empty($conf->global->MAIN_HTML_TITLE) && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1709 $parameters = array(
'title'=>$titletoshow);
1710 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1712 $titletoshow = $hookmanager->resPrint;
1714 $titletoshow .= $hookmanager->resPrint;
1722 if (
GETPOST(
'version',
'int')) {
1723 $ext =
'version='.GETPOST(
'version',
'int');
1726 if (
GETPOST(
'dol_resetcache')) {
1727 dolibarr_set_const($db,
"MAIN_IHM_PARAMS_REV", ((
int) $conf->global->MAIN_IHM_PARAMS_REV) + 1,
'chaine', 0,
'', $conf->entity);
1730 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1732 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1734 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1737 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1740 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1743 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1746 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1749 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1752 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1755 if (!empty($conf->global->MAIN_ENABLE_FONT_ROBOTO)) {
1756 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1757 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1760 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1761 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1762 $jquerytheme =
'base';
1763 if (!empty($conf->global->MAIN_USE_JQUERY_THEME)) {
1764 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1766 if (constant(
'JS_JQUERY_UI')) {
1767 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1769 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1771 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1772 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1774 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1775 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1776 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1780 if (!defined(
'DISABLE_FONT_AWSOME')) {
1781 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1782 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1783 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/v4-shims.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1786 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1790 if (!empty($conf->modules_parts[
'theme'])) {
1791 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1794 $themesubdir = $reldir;
1801 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1802 if (!empty($conf->global->MAIN_FIX_FLASH_ON_CHROME)) {
1803 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";
1807 if (!empty($conf->modules_parts[
'css'])) {
1808 $arraycss = (array) $conf->modules_parts[
'css'];
1809 foreach ($arraycss as $modcss => $filescss) {
1810 $filescss = (array) $filescss;
1811 foreach ($filescss as $cssfile) {
1812 if (empty($cssfile)) {
1813 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1817 if ($urlforcss && $urlforcss !=
'/') {
1818 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1820 if (!preg_match(
'/\.css$/i', $cssfile)) {
1825 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1831 if (is_array($arrayofcss)) {
1832 foreach ($arrayofcss as $cssfile) {
1833 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1834 $urltofile = $cssfile;
1838 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1840 if (!preg_match(
'/\.css$/i', $cssfile)) {
1850 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php">'.
"\n";
1854 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1856 print
'<!-- Includes JS for JQuery -->'.
"\n";
1857 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1858 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1860 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1862 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1863 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1865 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1868 if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1869 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1872 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1873 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1876 if (empty($disableforlogin) && (empty($conf->global->MAIN_JS_GRAPH) || $conf->global->MAIN_JS_GRAPH ==
'chart') && !defined(
'DISABLE_JS_GRAPH')) {
1877 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1881 if (!empty($conf->global->MAIN_USE_JQUERY_JEDITABLE) && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1882 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1883 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1884 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1885 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1886 print
'<script>'.
"\n";
1887 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1888 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1889 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1890 print 'var placeholderInPlace = \
' \';'.
"\n";
1891 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1892 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1893 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1894 print
'var withInPlace = 300;';
1895 print
'</script>'.
"\n";
1896 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1897 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1900 if (!empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1901 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1902 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1904 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1906 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1907 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1909 if (!defined(
'DISABLE_MULTISELECT')) {
1910 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1914 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1916 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') && (empty($conf->global->FCKEDITOR_EDITORNAME) || $conf->global->FCKEDITOR_EDITORNAME ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1917 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1918 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1919 $jsckeditor =
'ckeditor.js';
1920 if (constant(
'JS_CKEDITOR')) {
1922 $pathckeditor = constant(
'JS_CKEDITOR');
1924 print
'<script nonce="'.getNonce().
'">';
1925 print
'/* enable ckeditor by main.inc.php */';
1926 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1927 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1928 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1929 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";
1930 print
'</script>'.
"\n";
1931 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1933 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1934 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1936 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1938 print
'</script>'.
"\n";
1942 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1943 $enablebrowsernotif =
false;
1944 if (
isModEnabled(
'agenda') && !empty($conf->global->AGENDA_REMINDER_BROWSER)) {
1945 $enablebrowsernotif =
true;
1947 if ($conf->browser->layout ==
'phone') {
1948 $enablebrowsernotif =
false;
1950 if ($enablebrowsernotif) {
1951 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1952 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1957 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1958 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1961 if (!empty($conf->modules_parts[
'js'])) {
1962 $arrayjs = (array) $conf->modules_parts[
'js'];
1963 foreach ($arrayjs as $modjs => $filesjs) {
1964 $filesjs = (array) $filesjs;
1965 foreach ($filesjs as $jsfile) {
1968 if ($urlforjs && $urlforjs !=
'/') {
1969 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1970 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1972 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1978 if (is_array($arrayofjs)) {
1979 print
'<!-- Includes JS added by page -->'.
"\n";
1980 foreach ($arrayofjs as $jsfile) {
1981 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1982 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1984 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1991 if (!empty($conf->global->ALLOW_THEME_JS)) {
1992 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
1993 if (file_exists($theme_js)) {
1994 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1998 if (!empty($head)) {
2001 if (!empty($conf->global->MAIN_HTML_HEADER)) {
2002 print $conf->global->MAIN_HTML_HEADER.
"\n";
2005 $parameters = array();
2006 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2007 print $hookmanager->resPrint;
2009 print
"</head>\n\n";
2012 $conf->headerdone = 1;
2032 function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $helppagename =
'')
2034 global $user, $conf, $langs, $db;
2035 global $dolibarr_main_authentication, $dolibarr_main_demo;
2036 global $hookmanager, $menumanager;
2041 $hookmanager->initHooks(array(
'toprightmenu'));
2046 if (empty($conf->headerdone)) {
2047 $disablenofollow = 0;
2048 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2049 print
'<body id="mainbody">';
2055 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2057 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2061 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2063 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
2066 print
'<div id="tmenu_tooltip'.(empty($conf->global->MAIN_MENU_INVERT) ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2067 $menumanager->atarget = $target;
2068 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
2072 $appli = constant(
'DOL_APPLICATION_TITLE');
2073 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2074 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2075 if (preg_match(
'/\d\.\d/', $appli)) {
2076 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2077 $appli .=
" (".DOL_VERSION.
")";
2080 $appli .=
" ".DOL_VERSION;
2083 $appli .=
" ".DOL_VERSION;
2087 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2091 $logouthtmltext =
'';
2092 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2094 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2095 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2097 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2098 if ($conf->browser->name ==
'chrome') {
2099 $stringforfirstkey .=
' ALT +';
2100 } elseif ($conf->browser->name ==
'firefox') {
2101 $stringforfirstkey .=
' ALT + SHIFT +';
2103 $stringforfirstkey .=
' CTL +';
2106 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2107 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle');
2108 $logouttext .=
'</a>';
2110 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2111 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2115 print
'<div class="login_block usedropdown">'.
"\n";
2117 $toprightmenu .=
'<div class="login_block_other">';
2120 $parameters = array();
2121 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2122 if (is_numeric($result)) {
2124 $toprightmenu .= $hookmanager->resPrint;
2126 $toprightmenu = $hookmanager->resPrint;
2129 $toprightmenu .= $result;
2134 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2136 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2138 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2142 if (empty($conf->global->MAIN_PRINT_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2145 if (isset($_POST) && is_array($_POST)) {
2146 foreach ($_POST as $key => $value) {
2147 if ($key !==
'action' && $key !==
'password' && !is_array($value)) {
2148 $qs .=
'&'.$key.
'='.urlencode($value);
2152 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2153 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2155 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2157 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2161 if (empty($conf->global->MAIN_HELP_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2162 $langs->load(
"help");
2169 if (empty($helppagename)) {
2170 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2172 $helppresent =
'helppresent';
2177 $helpbaseurl = $arrayres[
'helpbaseurl'];
2178 $helppage = $arrayres[
'helppage'];
2179 $mode = $arrayres[
'mode'];
2182 if ($helpbaseurl && $helppage) {
2184 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2185 if ($mode ==
'wiki') {
2186 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2188 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2190 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2193 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2194 if ($mode ==
'wiki') {
2195 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2197 $text .= sprintf($helpbaseurl, $helppage);
2200 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2201 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2203 $toprightmenu .=
$form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2207 if (!empty($conf->global->MAIN_SHOWDATABASENAMEINHELPPAGESLINK)) {
2208 $langs->load(
'admin');
2209 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2213 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2214 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2215 $toprightmenu .=
$form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2219 $toprightmenu .=
$form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2221 $toprightmenu .=
'</div>';
2225 $toprightmenu .=
'<div class="login_block_user">';
2229 $toprightmenu .=
'<div class="inline-block nowrap"><div class="inline-block login_block_elem login_block_elem_name" style="padding: 0px;">';
2231 if (!empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2236 if (!empty($conf->global->MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN)) {
2247 $toprightmenu .=
'</div></div>';
2249 $toprightmenu .=
'</div>'.
"\n";
2252 print $toprightmenu;
2259 print
'<div style="clear: both;"></div>';
2260 print
"<!-- End top horizontal menu -->\n\n";
2263 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2264 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2278 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2279 global $dolibarr_main_authentication, $dolibarr_main_demo;
2280 global $menumanager;
2282 $langs->load(
'companies');
2284 $userImage = $userDropDownImage =
'';
2285 if (!empty($user->photo)) {
2286 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2287 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2289 $nophoto =
'/public/theme/common/user_anonymous.png';
2290 if ($user->gender ==
'man') {
2291 $nophoto =
'/public/theme/common/user_man.png';
2293 if ($user->gender ==
'woman') {
2294 $nophoto =
'/public/theme/common/user_woman.png';
2297 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2298 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2302 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2303 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2305 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2306 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2309 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2312 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2315 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2318 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2321 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2325 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2327 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2329 $dropdownBody .=
'</div>';
2331 $dropdownBody .=
'<br>';
2332 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2333 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2336 if (!empty($user->admin)) {
2337 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2339 if (!empty($user->socid)) {
2340 $thirdpartystatic =
new Societe($db);
2341 $thirdpartystatic->fetch($user->socid);
2342 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2343 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2345 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2346 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2347 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2348 $dropdownBody .=
'<br>';
2350 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2351 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2352 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2353 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2355 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2356 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2357 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2358 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2359 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2361 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2363 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2364 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2365 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2370 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')';
2371 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2372 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2373 if ($conf->browser->layout ==
'phone') {
2374 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2376 if (!empty($_SESSION[
"disablemodules"])) {
2377 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2379 $dropdownBody .=
'</div>';
2382 $parameters = array(
'user'=>$user,
'langs' => $langs);
2383 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2384 if (is_numeric($result)) {
2386 $dropdownBody .= $hookmanager->resPrint;
2388 $dropdownBody = $hookmanager->resPrint;
2392 if (empty($urllogout)) {
2393 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2398 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2399 if ($conf->browser->name ==
'chrome') {
2400 $stringforfirstkey .=
' ALT +';
2401 } elseif ($conf->browser->name ==
'firefox') {
2402 $stringforfirstkey .=
' ALT + SHIFT +';
2404 $stringforfirstkey .=
' CTL +';
2408 $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>';
2409 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2410 $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');
2411 $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>';
2413 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2414 if (!empty($user->admin)) {
2415 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2419 $appli = constant(
'DOL_APPLICATION_TITLE');
2420 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2421 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2422 if (preg_match(
'/\d\.\d/', $appli)) {
2423 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2424 $appli .=
" (".DOL_VERSION.
")";
2427 $appli .=
" ".DOL_VERSION;
2430 $appli .=
" ".DOL_VERSION;
2433 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2434 $btnUser =
'<!-- div for user link -->
2435 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2436 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a" data-toggle="dropdown">
2437 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2439 <div class="dropdown-menu">
2441 <div class="user-header">
2442 '.$userDropDownImage.
'
2444 '.$profilName.
'<br>';
2445 if ($user->datelastlogin) {
2446 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2447 if ($user->datepreviouslogin) {
2448 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2451 $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>';
2452 if ($user->datepreviouslogin) {
2453 $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>';
2461 <!-- Menu Body user-->
2462 <div class="user-body">'.$dropdownBody.
'</div>
2465 <div class="user-footer">
2466 <div class="pull-left">
2469 <div class="pull-left">
2470 '.$virtuelcardLink.
'
2472 <div class="pull-right">
2475 <div class="clearboth"></div>
2481 $btnUser =
'<!-- div for user link -->
2482 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2483 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'">
2485 <span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone">'.
dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>
2490 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2492 <!-- Code to show/hide the user drop-down -->
2494 function closeTopMenuLoginDropdown() {
2495 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2497 jQuery("#topmenu-login-dropdown").removeClass("open");
2499 jQuery(document).ready(function() {
2500 jQuery(document).on("click", function(event) {
2501 // console.log("Click somewhere on screen");
2502 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2503 closeTopMenuLoginDropdown();
2507 jQuery(".butAction.dropdown-toggle").on("click", function(event) {
2508 console.log("Click on .butAction.dropdown-toggle");
2509 var parentholder = jQuery(".butAction.dropdown-toggle").closest(".dropdown");
2510 var offset = parentholder.offset();
2511 var widthdocument = $(document).width();
2512 var left = offset.left;
2513 var right = widthdocument - offset.left - parentholder.width();
2514 var widthpopup = parentholder.children(".dropdown-content").width();
2515 console.log("left="+left+" right="+right+" width="+widthpopup+" widthdocument="+widthdocument);
2516 if (widthpopup + right >= widthdocument) {
2519 parentholder.toggleClass("open");
2520 parentholder.children(".dropdown-content").css({"right": right+"px", "left": "auto"});
2525 if ($conf->theme !=
'md') {
2527 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2528 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2529 event.preventDefault();
2530 jQuery("#topmenu-login-dropdown").toggleClass("open");
2533 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2534 console.log("Clik on #topmenulogincompanyinfo-btn");
2535 jQuery("#topmenulogincompanyinfo").slideToggle();
2538 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2539 console.log("Clik on #topmenuloginmoreinfo-btn");
2540 jQuery("#topmenuloginmoreinfo").slideToggle();
2560 global $conf, $langs;
2566 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2567 if ($conf->browser->name ==
'chrome') {
2568 $stringforfirstkey .=
' ALT +';
2569 } elseif ($conf->browser->name ==
'firefox') {
2570 $stringforfirstkey .=
' ALT + SHIFT +';
2572 $stringforfirstkey .=
' CTL +';
2575 $html .=
'<!-- div for quick add link -->
2576 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2577 <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>
2581 <!-- Code to show/hide the user drop-down -->
2583 jQuery(document).ready(function() {
2584 jQuery(document).on("click", function(event) {
2585 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2587 $("#topmenu-quickadd-dropdown").removeClass("open");
2590 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2591 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2592 openQuickAddDropDown(event);
2596 $(document).keydown(function(event){
2597 if ( event.which === 76 && event.ctrlKey && event.shiftKey ){
2598 console.log(\'control + shift + l : trigger open quick add dropdown\');
2599 openQuickAddDropDown(event);
2603 var openQuickAddDropDown = function(event) {
2604 event.preventDefault();
2605 $("#topmenu-quickadd-dropdown").toggleClass("open");
2606 //$("#top-quickadd-search-input").focus();
2621 global $conf, $user, $langs, $hookmanager;
2626 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2627 "title" =>
"MenuNewMember@members",
2628 "name" =>
"Adherent@members",
2629 "picto" =>
"object_member",
2630 "activation" =>
isModEnabled(
'adherent') && $user->hasRight(
"adherent",
"write"),
2634 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2635 "title" =>
"MenuNewThirdParty@companies",
2636 "name" =>
"ThirdParty@companies",
2637 "picto" =>
"object_company",
2638 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2642 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2643 "title" =>
"NewContactAddress@companies",
2644 "name" =>
"Contact@companies",
2645 "picto" =>
"object_contact",
2646 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2650 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2651 "title" =>
"NewPropal@propal",
2652 "name" =>
"Proposal@propal",
2653 "picto" =>
"object_propal",
2654 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2659 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2660 "title" =>
"NewOrder@orders",
2661 "name" =>
"Order@orders",
2662 "picto" =>
"object_order",
2663 "activation" =>
isModEnabled(
'commande') && $user->hasRight(
"commande",
"write"),
2667 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2668 "title" =>
"NewBill@bills",
2669 "name" =>
"Bill@bills",
2670 "picto" =>
"object_bill",
2671 "activation" =>
isModEnabled(
'facture') && $user->hasRight(
"facture",
"write"),
2675 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2676 "title" =>
"NewContractSubscription@contracts",
2677 "name" =>
"Contract@contracts",
2678 "picto" =>
"object_contract",
2679 "activation" =>
isModEnabled(
'contrat') && $user->hasRight(
"contrat",
"write"),
2683 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2684 "title" =>
"SupplierProposalNew@supplier_proposal",
2685 "name" =>
"SupplierProposal@supplier_proposal",
2686 "picto" =>
"supplier_proposal",
2687 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2691 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2692 "title" =>
"NewSupplierOrderShort@orders",
2693 "name" =>
"SupplierOrder@orders",
2694 "picto" =>
"supplier_order",
2695 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2699 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2700 "title" =>
"NewBill@bills",
2701 "name" =>
"SupplierBill@bills",
2702 "picto" =>
"supplier_invoice",
2703 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2707 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2708 "title" =>
"NewTicket@ticket",
2709 "name" =>
"Ticket@ticket",
2710 "picto" =>
"ticket",
2711 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2715 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2716 "title" =>
"NewIntervention@interventions",
2717 "name" =>
"Intervention@interventions",
2718 "picto" =>
"intervention",
2719 "activation" =>
isModEnabled(
'ficheinter') && $user->hasRight(
"ficheinter",
"creer"),
2723 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2724 "title" =>
"NewProduct@products",
2725 "name" =>
"Product@products",
2726 "picto" =>
"object_product",
2727 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2731 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2732 "title" =>
"NewService@products",
2733 "name" =>
"Service@products",
2734 "picto" =>
"object_service",
2735 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2739 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2740 "title" =>
"AddUser@users",
2741 "name" =>
"User@users",
2743 "activation" => $user->hasRight(
"user",
"user",
"write"),
2749 $dropDownQuickAddHtml =
'';
2752 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2753 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2756 $parameters = array();
2757 $hook_items = $items;
2758 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2759 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2760 if ($reshook == 0) {
2761 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2763 $items = $hookmanager->resArray;
2767 $position = array();
2768 foreach ($items[
'items'] as $key => $row) {
2769 $position[$key] = $row[
'position'];
2771 $array1_sort_order = SORT_ASC;
2772 array_multisort($position, $array1_sort_order, $items[
'items']);
2775 foreach ($items[
'items'] as $item) {
2776 if (!$item[
'activation']) {
2779 $langs->load(explode(
'@', $item[
'title'])[1]);
2780 $langs->load(explode(
'@', $item[
'name'])[1]);
2781 $dropDownQuickAddHtml .=
'
2782 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2783 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2787 $dropDownQuickAddHtml .=
'</div>';
2788 $dropDownQuickAddHtml .=
'</div>';
2790 return $dropDownQuickAddHtml;
2800 global $langs, $conf, $db, $user;
2805 if (!
isModEnabled(
'bookmark') || empty($user->rights->bookmark->lire)) {
2811 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2812 if ($conf->browser->name ==
'chrome') {
2813 $stringforfirstkey .=
' ALT +';
2814 } elseif ($conf->browser->name ==
'firefox') {
2815 $stringforfirstkey .=
' ALT + SHIFT +';
2817 $stringforfirstkey .=
' CTL +';
2820 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2821 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2822 $langs->load(
"bookmarks");
2824 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2825 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2829 $html .=
'<!-- div for bookmark link -->
2830 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2831 <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>
2832 <div class="dropdown-menu">
2838 <!-- Code to show/hide the bookmark drop-down -->
2840 jQuery(document).ready(function() {
2841 jQuery(document).on("click", function(event) {
2842 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2843 //console.log("close bookmark dropdown - we click outside");
2845 $("#topmenu-bookmark-dropdown").removeClass("open");
2849 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2850 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2851 openBookMarkDropDown(event);
2855 jQuery(document).keydown(function(event){
2856 if( event.which === 77 && event.ctrlKey && event.shiftKey ){
2857 console.log("Click on control + shift + m : trigger open bookmark dropdown");
2858 openBookMarkDropDown(event);
2862 var openBookMarkDropDown = function(event) {
2863 event.preventDefault();
2864 jQuery("#topmenu-bookmark-dropdown").toggleClass("open");
2865 jQuery("#top-bookmark-search-input").focus();
2883 global $langs, $conf, $db, $user, $hookmanager;
2888 $arrayresult =
null;
2889 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2893 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2894 if ($conf->browser->name ==
'chrome') {
2895 $stringforfirstkey .=
' ALT +';
2896 } elseif ($conf->browser->name ==
'firefox') {
2897 $stringforfirstkey .=
' ALT + SHIFT +';
2899 $stringforfirstkey .=
' CTL +';
2902 $searchInput =
'<input name="search_all"'.($stringforfirstkey ?
' title="'.dol_escape_htmltag($stringforfirstkey.
' s').
'"' :
'').
' accesskey="s" id="top-global-search-input" class="dropdown-search-input search_component_input" placeholder="'.$langs->trans(
'Search').
'" autocomplete="off">';
2904 $defaultAction =
'';
2905 $buttonList =
'<div class="dropdown-global-search-button-list" >';
2907 foreach ($arrayresult as $keyItem => $item) {
2908 if (empty($defaultAction)) {
2909 $defaultAction = $item[
'url'];
2911 $buttonList .=
'<button class="dropdown-item global-search-item tdoverflowmax300" data-target="'.dol_escape_htmltag($item[
'url']).
'" >';
2912 $buttonList .= $item[
'text'];
2913 $buttonList .=
'</button>';
2915 $buttonList .=
'</div>';
2917 $dropDownHtml =
'<form id="top-menu-action-search" name="actionsearch" method="GET" action="'.$defaultAction.
'">';
2920 <!-- search input -->
2921 <div class="dropdown-header search-dropdown-header">
2927 <!-- Menu Body search -->
2928 <div class="dropdown-body search-dropdown-body">
2933 $dropDownHtml .=
'</form>';
2937 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2938 if ($conf->browser->name ==
'chrome') {
2939 $stringforfirstkey .=
' ALT +';
2940 } elseif ($conf->browser->name ==
'firefox') {
2941 $stringforfirstkey .=
' ALT + SHIFT +';
2943 $stringforfirstkey .=
' CTL +';
2946 $html .=
'<!-- div for Global Search -->
2947 <div id="topmenu-global-search-dropdown" class="atoplogin dropdown inline-block">
2948 <a accesskey="s" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Search').
' ('.$stringforfirstkey.
' s)">
2949 <i class="fa fa-search" ></i>
2951 <div class="dropdown-menu dropdown-search">
2957 <!-- Code to show/hide the user drop-down -->
2959 jQuery(document).ready(function() {
2961 // prevent submiting form on press ENTER
2962 jQuery("#top-global-search-input").keydown(function (e) {
2963 if (e.keyCode == 13) {
2964 var inputs = $(this).parents("form").eq(0).find(":button");
2965 if (inputs[inputs.index(this) + 1] != null) {
2966 inputs[inputs.index(this) + 1].focus();
2974 jQuery(document).keydown(function(e) {
2975 // Get the focused element:
2976 var $focused = $(":focus");
2977 if($focused.length && $focused.hasClass("global-search-item")){
2979 // UP - move to the previous line
2980 if (e.keyCode == 38) {
2982 $focused.prev().focus();
2985 // DOWN - move to the next line
2986 if (e.keyCode == 40) {
2988 $focused.next().focus();
2994 // submit form action
2995 jQuery(".dropdown-global-search-button-list .global-search-item").on("click", function(event) {
2996 jQuery("#top-menu-action-search").attr("action", $(this).data("target"));
2997 jQuery("#top-menu-action-search").submit();
3001 jQuery(document).on("click", function(event) {
3002 if (!$(event.target).closest("#topmenu-global-search-dropdown").length) {
3003 console.log("click close search - we click outside");
3005 jQuery("#topmenu-global-search-dropdown").removeClass("open");
3010 jQuery("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) {
3011 console.log("click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3012 openGlobalSearchDropDown();
3016 jQuery(document).keydown(function(e){
3017 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3018 console.log(\'control + shift + f : trigger open global-search dropdown\');
3019 openGlobalSearchDropDown();
3021 if ( e.which === 70 && e.alKey ) {
3022 console.log(\'alt + f : trigger open global-search dropdown\');
3023 openGlobalSearchDropDown();
3027 var openGlobalSearchDropDown = function() {
3028 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3029 jQuery("#top-global-search-input").focus();
3053 function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after =
'', $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3055 global $user, $conf, $langs, $db,
$form;
3056 global $hookmanager, $menumanager;
3060 if (!empty($menu_array_before)) {
3061 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);
3064 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3066 $hookmanager->initHooks(array(
'leftblock'));
3068 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3071 if (!is_object(
$form)) {
3075 if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
3077 if ($conf->browser->layout ==
'phone') {
3078 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3082 $arrayresult = array();
3083 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3085 if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3088 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3089 if ($conf->browser->name ==
'chrome') {
3090 $stringforfirstkey .=
' ALT +';
3091 } elseif ($conf->browser->name ==
'firefox') {
3092 $stringforfirstkey .=
' ALT + SHIFT +';
3094 $stringforfirstkey .=
' CTL +';
3097 $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');
3099 if (is_array($arrayresult)) {
3100 foreach ($arrayresult as $key => $val) {
3101 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3107 $parameters = array(
'searchform' => $searchform);
3108 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3109 if (empty($reshook)) {
3110 $searchform .= $hookmanager->resPrint;
3112 $searchform = $hookmanager->resPrint;
3116 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) || empty($conf->use_javascript_ajax)) {
3117 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3118 $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>';
3119 } elseif ($conf->use_javascript_ajax && !empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3120 $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>';
3121 $searchform .=
'<script>
3122 jQuery(document).ready(function () {
3123 jQuery("#divsearchforms1").click(function(){
3124 jQuery("#divsearchforms2").toggle();
3128 $searchform .=
'</div>';
3132 $searchform .=
'<script>
3133 jQuery(document).keydown(function(e){
3134 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3135 console.log(\'control + shift + f : trigger open global-search dropdown\');
3136 openGlobalSearchDropDown();
3138 if( (e.which === 83 || e.which === 115) && e.altKey ){
3139 console.log(\'alt + s : trigger open global-search dropdown\');
3140 openGlobalSearchDropDown();
3144 var openGlobalSearchDropDown = function() {
3145 jQuery("#searchselectcombo").select2(\'open\');
3151 print
'<!-- Begin left menu -->'.
"\n";
3153 print
'<div class="vmenu"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ?
'' :
' title="Left menu"').
'>'.
"\n\n";
3156 $menumanager->menu_array = $menu_array_before;
3157 $menumanager->menu_array_after = $menu_array_after;
3158 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
3162 print
"<!-- Begin Help Block-->\n";
3163 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3166 if (!empty($conf->global->MAIN_SHOW_VERSION)) {
3167 $doliurl =
'https://www.dolibarr.org';
3169 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3170 $doliurl =
'https://www.dolibarr.fr';
3172 if (preg_match(
'/es/i', $langs->defaultlang)) {
3173 $doliurl =
'https://www.dolibarr.es';
3175 if (preg_match(
'/de/i', $langs->defaultlang)) {
3176 $doliurl =
'https://www.dolibarr.de';
3178 if (preg_match(
'/it/i', $langs->defaultlang)) {
3179 $doliurl =
'https://www.dolibarr.it';
3181 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3182 $doliurl =
'https://www.dolibarr.gr';
3185 $appli = constant(
'DOL_APPLICATION_TITLE');
3186 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
3187 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
3188 if (preg_match(
'/\d\.\d/', $appli)) {
3189 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3190 $appli .=
" (".DOL_VERSION.
")";
3193 $appli .=
" ".DOL_VERSION;
3196 $appli .=
" ".DOL_VERSION;
3198 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3200 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3202 print
'<span class="help">';
3210 print
'</div>'.
"\n";
3214 if (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3215 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3217 if ($conf->global->MAIN_BUGTRACK_ENABLELINK ==
'github') {
3218 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3219 $bugbaseurl .=
'&title=';
3220 $bugbaseurl .= urlencode(
"Bug: ");
3221 $bugbaseurl .=
'&body=';
3222 $bugbaseurl .= urlencode(
"# Instructions\n");
3223 $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");
3224 $bugbaseurl .= urlencode(
"*Please:*\n");
3225 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3226 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3227 $bugbaseurl .= urlencode(
"\n");
3228 $bugbaseurl .= urlencode(
"\n");
3229 $bugbaseurl .= urlencode(
"# Bug\n");
3230 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3231 $bugbaseurl .= urlencode(
"\n");
3232 $bugbaseurl .= urlencode(
"## Environment\n");
3233 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3234 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3235 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3236 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3237 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3238 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3239 $bugbaseurl .= urlencode(
"\n");
3240 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3241 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3242 $bugbaseurl .= urlencode(
"\n");
3243 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3244 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3245 $bugbaseurl .= urlencode(
"\n");
3246 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
3247 $bugbaseurl .= urlencode(
"[*Files*]\n");
3248 $bugbaseurl .= urlencode(
"\n");
3250 $bugbaseurl .= urlencode(
"\n");
3251 $bugbaseurl .= urlencode(
"## Report\n");
3252 } elseif (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3253 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
3259 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3260 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3261 if (empty($reshook)) {
3262 $bugbaseurl .= $hookmanager->resPrint;
3264 $bugbaseurl = $hookmanager->resPrint;
3267 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3268 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3273 print
"<!-- End Help Block-->\n";
3277 print
"<!-- End left menu -->\n";
3281 $parameters = array();
3282 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3283 print $hookmanager->resPrint;
3285 print
'</div></div> <!-- End side-nav id-left -->';
3289 print
'<!-- Begin right area -->'.
"\n";
3291 if (empty($leftmenuwithoutmainarea)) {
3305 global $conf, $langs, $hookmanager;
3307 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3308 print
'<div id="id-right">';
3313 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3315 $hookmanager->initHooks(array(
'main'));
3316 $parameters = array();
3317 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3318 print $hookmanager->resPrint;
3320 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
3321 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3325 if (!empty($conf->global->SHOW_SOCINFO_ON_PRINT) &&
GETPOST(
'optioncss',
'aZ09') ==
'print' && empty(
GETPOST(
'disable_show_socinfo_on_print',
'az09'))) {
3326 $parameters = array();
3327 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3328 if (empty($reshook)) {
3329 print
'<!-- Begin show mysoc info header -->'.
"\n";
3330 print
'<div id="mysoc-info-header">'.
"\n";
3331 print
'<table class="centpercent div-table-responsive">'.
"\n";
3333 print
'<tr><td rowspan="0" class="width20p">';
3334 if ($conf->global->MAIN_SHOW_LOGO && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($conf->global->MAIN_INFO_SOCIETE_LOGO)) {
3335 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)).
'">';
3337 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3338 print
'<tr><td class="titre bold">'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_NOM).
'</td></tr>'.
"\n";
3339 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";
3340 if (!empty($conf->global->MAIN_INFO_SOCIETE_TEL)) {
3341 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Phone").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TEL).
'</td></tr>';
3343 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
3344 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Email").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL).
'</td></tr>';
3346 if (!empty($conf->global->MAIN_INFO_SOCIETE_WEB)) {
3347 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Web").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_WEB).
'</td></tr>';
3350 print
'</table>'.
"\n";
3351 print
'</div>'.
"\n";
3352 print
'<!-- End show mysoc info header -->'.
"\n";
3371 if (preg_match(
'/^http/i', $helppagename)) {
3373 $helpbaseurl =
'%s';
3374 $helppage = $helppagename;
3379 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3380 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3381 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3382 $helppage = $reg[1];
3385 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3386 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3387 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3388 $helppage = $reg[1];
3391 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3392 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3393 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3394 $helppage = $reg[1];
3397 if (empty($helppage)) {
3398 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3399 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3400 $helppage = $reg[1];
3405 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3425 function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3427 global $conf, $langs, $user;
3430 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3431 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3432 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3433 if ($showtitlebefore) {
3434 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3436 $ret .=
'<div class="tagtd">';
3437 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3438 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3439 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3440 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3441 $ret .=
' placeholder="'.strip_tags($title).
'"';
3442 $ret .= ($autofocus ?
' autofocus' :
'');
3443 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3444 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3445 $ret .=
'<span class="fa fa-search"></span>';
3446 $ret .=
'</button>';
3448 $ret .=
"</form>\n";
3453 if (!function_exists(
"llxFooter")) {
3464 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3466 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager;
3467 global $delayedhtmlcontent;
3468 global $contextpage, $page, $limit, $mode;
3469 global $dolibarr_distrib;
3471 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3475 $parameters = array();
3476 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters, $object, $action);
3477 if (empty($reshook)) {
3478 $llxfooter .= $hookmanager->resPrint;
3479 } elseif ($reshook > 0) {
3480 $llxfooter = $hookmanager->resPrint;
3491 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3493 foreach ($user->lastsearch_values_tmp as $key => $val) {
3494 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3495 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3496 if (empty($val[
'sortfield'])) {
3497 unset($val[
'sortfield']);
3499 if (empty($val[
'sortorder'])) {
3500 unset($val[
'sortorder']);
3502 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3503 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3504 unset($_SESSION[
'lastsearch_values_'.$key]);
3510 $relativepathstring = $_SERVER[
"PHP_SELF"];
3512 if (constant(
'DOL_URL_ROOT')) {
3513 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3515 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3516 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3517 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3518 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3519 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3520 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3521 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3523 if (!empty($contextpage)) {
3524 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3526 if (!empty($page) && $page > 0) {
3527 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3529 if (!empty($limit) && $limit != $conf->liste_limit) {
3530 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3532 if (!empty($mode)) {
3533 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3536 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3537 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3538 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3539 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3543 if (!empty($conf->global->MAIN_CORE_ERROR)) {
3545 if ($conf->use_javascript_ajax) {
3546 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3547 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3550 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3551 print
'<div class="error">'.$msg.
'</div>';
3559 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3561 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3562 print
'</div> <!-- End div id-right -->'.
"\n";
3565 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3566 print
'</div> <!-- End div id-container -->'.
"\n";
3571 print
'<!-- '.$comment.
' -->'.
"\n";
3576 if (!empty($delayedhtmlcontent)) {
3577 print $delayedhtmlcontent;
3580 if (!empty($conf->use_javascript_ajax)) {
3581 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3582 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3586 if (
isModEnabled(
'blockedlog') && is_object($object) && !empty($object->id) && $object->id > 0) {
3587 if (in_array($object->element, array(
'facture')) && $object->statut > 0) {
3588 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3591 jQuery(document).ready(
function () {
3592 $(
'a.documentpreview').click(
function() {
3593 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3595 id:<?php echo $object->id; ?>
3596 , element:
'<?php echo $object->element ?>'
3597 , action:
'DOC_PREVIEW'
3598 , token:
'<?php echo currentToken(); ?>'
3602 $(
'a.documentdownload').click(
function() {
3603 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3605 id:<?php echo $object->id; ?>
3606 , element:
'<?php echo $object->element ?>'
3607 , action:
'DOC_DOWNLOAD'
3608 , token:
'<?php echo currentToken(); ?>'
3619 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3620 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3624 $forceping =
GETPOST(
'forceping',
'alpha');
3625 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3627 $hash_unique_id = md5(
'dolibarr'.$conf->file->instance_unique_id);
3629 if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
3630 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && ($conf->global->MAIN_FIRST_PING_OK_ID !=
'disabled'))
3633 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3634 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3635 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3638 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) {
3639 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3641 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3643 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";
3644 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3645 $url_for_ping = (empty($conf->global->MAIN_URL_FOR_PING) ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3647 $distrib =
'standard';
3648 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3649 $distrib =
'doliwamp';
3651 if (!empty($dolibarr_distrib)) {
3652 $distrib = $dolibarr_distrib;
3656 jQuery(document).ready(
function (tmp) {
3657 console.log(
"Try Ping with hash_unique_id is md5('dolibarr'+instance_unique_id)");
3660 url:
"<?php echo $url_for_ping ?>",
3665 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3666 action:
'dolibarrping',
3667 version:
'<?php echo (float) DOL_VERSION; ?>',
3668 entity:
'<?php echo (int) $conf->entity; ?>',
3669 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3670 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3671 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3672 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3673 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3674 token:
'notrequired'
3676 success:
function (data, status, xhr) {
3677 console.log(
"Ping ok");
3680 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3683 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3686 error:
function (data,status,xhr) {
3687 console.log(
"Ping ko: " + data);
3690 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3693 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3703 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3704 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3706 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3711 $reshook = $hookmanager->executeHooks(
'beforeBodyClose');
3713 print $hookmanager->resPrint;