48if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
49 [$usec, $sec] = explode(
" ", microtime());
50 $micro_start_time = ((float) $usec + (
float) $sec);
53 if (defined(
'XDEBUGCOVERAGE')) {
54 xdebug_start_code_coverage();
58require __DIR__.
'/waf.inc.php';
61if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
62 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
65if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
66 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
71if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
72 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
76require_once
'filefunc.inc.php';
91include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/securitycore.lib.php';
96if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
97 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
98 $tmplist = explode(
',', $tmpautoset[1]);
99 $cookiearrayvalue = array();
100 foreach ($tmplist as $tmpkey) {
101 $postkey = $tmpautoset[0].
'_'.$tmpkey;
104 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
107 $cookiename = $tmpautoset[0];
108 $cookievalue = json_encode($cookiearrayvalue);
115if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
116 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
122$prefix = dol_getprefix(
'');
123$sessionname =
'DOLSESSID_'.$prefix;
124$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
125if (!empty($_COOKIE[$sessiontimeout])) {
126 ini_set(
'session.gc_maxlifetime', max(120, min(3600 * 24, (
int) $_COOKIE[$sessiontimeout])));
131if (!defined(
'NOSESSION')) {
132 if (PHP_VERSION_ID < 70300) {
133 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
136 $sessioncookieparams = array(
140 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
144 session_set_cookie_params($sessioncookieparams);
146 session_name($sessionname);
153require_once
'master.inc.php';
166@phan-var-force Conf $conf
167@phan-var-force ?DoliDB $db
168@phan-var-force ?HookManager $hookmanager
169@phan-var-force ?Translate $langs
170@phan-var-force ?User $user
179 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
181 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
183 } elseif (defined(
'NOREQUIREDB')) {
185 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
187 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
191 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
192 print
'Sorry, your application is offline.'.
"\n";
193 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
194 $nexturl =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
195 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
197 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
199 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
207register_shutdown_function(
'dol_shutdown');
210if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
212 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
214 $renderer = $debugbar->getJavascriptRenderer();
216 $conf->global->MAIN_HTML_HEADER =
'';
218 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
220 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
221 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
225if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
227 $conf->browser->name = $tmp[
'browsername'];
228 $conf->browser->os = $tmp[
'browseros'];
229 $conf->browser->version = $tmp[
'browserversion'];
230 $conf->browser->ua = $tmp[
'browserua'];
231 $conf->browser->layout = $tmp[
'layout'];
234 if (
$conf->browser->layout ==
'phone') {
235 $conf->dol_no_mouse_hover = 1;
242 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
246if (
GETPOSTINT(
'textbrowser') || (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'textbrowser')) {
247 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
252if (!empty(
$conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
254 if (is_numeric(
$conf->file->main_force_https)) {
255 if (
$conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
256 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
257 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
262 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
266 $newurl =
$conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
271 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
272 header(
"Location: ".$newurl);
275 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);
279if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
280 $listofip = explode(
',', $dolibarr_main_restrict_ip);
282 $user_ip = $_SERVER[
'REMOTE_ADDR'];
283 foreach ($listofip as $ip) {
284 $authorized_ip = trim($ip);
285 if (strpos($authorized_ip,
'/')) {
290 } elseif ($user_ip == $authorized_ip) {
296 print
'Access refused by IP protection. Your detected IP is: '.dol_escape_htmltag($user_ip);
302if (!defined(
'NOREQUIREHTML')) {
303 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
305if (!defined(
'NOREQUIREAJAX')) {
306 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
311 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
312 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
316$checkifupgraderequired =
false;
318 $checkifupgraderequired =
true;
321 $checkifupgraderequired =
true;
323if ($checkifupgraderequired && !defined(
'MAIN_VERSION_DISABLE_DB_CHECK')) {
325 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
326 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
327 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
328 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
330 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
332 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
333 if (php_sapi_name() ===
"cli") {
334 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
336 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
344if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
346 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
348 if (isset($_SESSION[
'newtoken'])) {
349 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
352 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
356 $token = bin2hex(random_bytes(32));
357 $_SESSION[
'newtoken'] = $token;
358 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
366if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
367 $tmpaction =
GETPOST(
'action',
'aZ09');
369 $sensitiveget =
false;
370 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
373 $legitimate_actions = array(
389 'presend_addmessage',
395 'validatenewpassword',
398 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, $legitimate_actions))) {
401 $sensitiveget =
true;
405 $arrayofactiontoforcetokencheck = array(
407 'doprev',
'donext',
'dvprev',
'dvnext',
408 'freezone',
'install',
409 'reopen',
'swapstatut'
411 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
412 $sensitiveget =
true;
415 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
416 $sensitiveget =
true;
423 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
425 GETPOSTISSET(
'massaction') ||
426 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
429 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
432 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
433 $langs->loadLangs(array(
"errors",
"install"));
434 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
435 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
437 http_response_code(403);
438 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
439 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);
440 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";
442 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);
443 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";
444 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";
448 print
" into setup).\n";
455 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
457 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
458 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 - referrer=".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
461 if (!defined(
'NOTOKENRENEWAL')) {
463 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
466 if (isset($_POST[
'id'])) {
467 $savid = ((int) $_POST[
'id']);
470 unset($_GET[
'confirm']);
471 unset($_GET[
'action']);
472 unset($_GET[
'confirmmassaction']);
473 unset($_GET[
'massaction']);
474 unset($_GET[
'token']);
476 $_POST[
'id'] = ((int) $savid);
479 $_GET[
'errorcode'] =
'InvalidToken';
485if (!empty($dolibarr_main_demo)) {
487 if (GETPOSTISSET(
'disablemodules')) {
488 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
490 if (!empty($_SESSION[
"disablemodules"])) {
491 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
493 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
494 foreach ($disabled_modules as $module) {
496 if (empty(
$conf->$module)) {
500 $conf->$module->enabled =
false;
501 unset(
$conf->modules[$module]);
503 foreach ($modulepartkeys as $modulepartkey) {
504 unset(
$conf->modules_parts[$modulepartkey][$module]);
506 if ($module ==
'fournisseur') {
507 $conf->supplier_order->enabled = 0;
508 $conf->supplier_invoice->enabled = 0;
509 unset(
$conf->modules[
'supplier_order']);
510 unset(
$conf->modules[
'supplier_invoice']);
518$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
519if (is_array($modulepart) && count($modulepart) > 0) {
520 foreach (
$conf->modules as $module) {
521 if (in_array($module, $modulepart)) {
522 $modulepart = $module;
527if (is_array($modulepart)) {
538if (!defined(
'NOLOGIN')) {
542 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
543 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
546 if (empty($dolibarr_main_authentication)) {
547 $dolibarr_main_authentication =
'dolibarr';
550 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
551 $dolibarr_auto_user =
'auto';
555 $authmode = explode(
',', $dolibarr_main_authentication);
558 if (!count($authmode)) {
559 $langs->load(
'main');
560 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
567 $resultFetchUser =
'';
569 $dol_authmode =
null;
571 if (!isset($_SESSION[
"dol_login"])) {
573 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
575 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
577 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
578 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
579 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
580 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
581 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
582 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
583 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
584 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
587 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
588 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
589 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
591 if ($dol_hide_topmenu) {
592 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
594 if ($dol_hide_leftmenu) {
595 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
597 if ($dol_optimize_smallscreen) {
598 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
600 if ($dol_no_mouse_hover) {
601 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
603 if ($dol_use_jmobile) {
604 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
606 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
613 $hookmanager->initHooks(array(
'login'));
614 $parameters = array();
615 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
622 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
626 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
630 $dirModCaptcha = array_merge(array(
'main' =>
'/core/modules/security/captcha/'), isset(
$conf->modules_parts[
'captcha']) && is_array(
$conf->modules_parts[
'captcha']) ?
$conf->modules_parts[
'captcha'] : array());
631 $fullpathclassfile =
'';
632 foreach ($dirModCaptcha as $dir) {
633 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
634 if ($fullpathclassfile) {
640 if ($fullpathclassfile) {
641 include_once $fullpathclassfile;
645 $classname =
"modCaptcha".ucfirst($captcha);
646 if (class_exists($classname)) {
648 $captchaobj =
new $classname(
$db,
$conf, $langs, $user);
649 '@phan-var-force ModeleCaptcha $captchaobj';
651 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
652 $ok = $captchaobj->validateCodeAfterLoginSubmit();
654 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
659 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
664 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
671 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
673 $langs->loadLangs(array(
'main',
'errors'));
675 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
679 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
682 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
690 $hookmanager->initHooks(array(
'login'));
691 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
692 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
701 $allowedmethodtopostusername = 3;
702 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
703 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
707 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
708 if (!is_string($usertotest)) {
714 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
718 $goontestloop =
false;
719 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
720 $goontestloop =
true;
722 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
723 $goontestloop =
true;
725 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
726 $goontestloop =
true;
728 if (
GETPOST(
'openid_mode',
'alpha')) {
729 $goontestloop =
true;
731 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
732 $goontestloop =
true;
734 if (!empty($_COOKIE[
'login_dolibarr'])) {
735 $goontestloop =
true;
738 if (!is_object($langs)) {
739 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
742 if (defined(
'MAIN_LANG_DEFAULT')) {
743 $langcode = constant(
'MAIN_LANG_DEFAULT');
745 $langs->setDefaultLang($langcode);
749 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
752 dol_syslog(
'--- Security warning: credentials reported as leaked were used to try to login. HTTP_EXPOSED_CREDENTIAL_CHECK='.((
int) $_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK']), LOG_NOTICE);
760 if (
GETPOST(
'actionlogin',
'aZ09') ==
'login' && !
GETPOST(
'afteroauthloginreturn',
'alphanohtml', 1) &&
GETPOST(
'password',
'password', 1)) {
761 dol_syslog(
"--- Login submission with credentials in the query string refused for ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
762 $langs->loadLangs(array(
'main',
'errors'));
763 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginMustBePostMethod");
770 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
773 $oauthmodetotestarray = array(
'google');
774 foreach ($oauthmodetotestarray as $oauthmodetotest) {
775 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
777 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
780 dol_syslog(
"User did not click on link for OAuth mode ".$oauthmodetotest.
", param beforeoauthloginredirect is ".
GETPOST(
'beforeoauthloginredirect').
" and param afteroauthloginreturn is ".
GETPOST(
'afteroauthloginreturn').
" so we disable check of login for mode ".$oauthmodetotest);
781 foreach ($authmode as $tmpkey => $tmpval) {
782 if ($tmpval == $oauthmodetotest.
'oauth') {
783 unset($authmode[$tmpkey]);
792 if ($login ===
'--bad-login-validity--') {
797 $dol_authmode =
$conf->authmode;
799 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
800 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
801 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
802 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
803 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
806 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_GET[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : (int) $_GET[
"dst_first"]) : $_POST[
"dst_first"];
807 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_GET[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : (int) $_GET[
"dst_second"]) : $_POST[
"dst_second"];
808 if ($dol_dst_first && $dol_dst_second) {
809 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
813 if ($datenow >= $datefirst && $datenow < $datesecond) {
817 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
818 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
823 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
825 $langs->loadLangs(array(
'main',
'errors'));
829 if (empty($_SESSION[
"dol_loginmesg"])) {
830 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
834 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
837 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
845 $hookmanager->initHooks(array(
'login'));
846 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
847 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
857 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
859 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);
860 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
865 return 'ERROR_NOT_LOGGED';
867 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
868 http_response_code(401);
877 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
879 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
880 dol_syslog(
'User not found or not valid, connection refused');
882 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
883 session_name($sessionname);
886 if ($resultFetchUser == 0) {
888 $langs->loadLangs(array(
'main',
'errors'));
890 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
892 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
893 } elseif ($resultFetchUser < 0) {
894 $_SESSION[
"dol_loginmesg"] = $user->error;
896 $user->context[
'audit'] = $user->error;
899 $langs->loadLangs(array(
'main',
'errors'));
901 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
903 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
907 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
916 $hookmanager->initHooks(array(
'login'));
917 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
918 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
925 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
933 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
937 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
938 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
941 if ($entitytotest > 0 &&
$conf->entity != $entitytotest) {
945 $conf->entity = $entitytotest;
950 $login = $_SESSION[
"dol_login"];
951 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
952 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
954 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
958 if ($resultFetchUser <= 0
959 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
960 || ($user->status != $user::STATUS_ENABLED)
961 || ($user->isNotIntoValidityDateRange())) {
962 if ($resultFetchUser <= 0) {
964 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
965 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
967 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
968 } elseif ($user->status != $user::STATUS_ENABLED) {
973 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
976 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
977 session_name($sessionname);
980 if ($resultFetchUser == 0) {
981 $langs->loadLangs(array(
'main',
'errors'));
983 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
985 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
986 } elseif ($resultFetchUser < 0) {
987 $_SESSION[
"dol_loginmesg"] = $user->error;
989 $user->context[
'audit'] = $user->error;
991 $langs->loadLangs(array(
'main',
'errors'));
993 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
995 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
999 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1007 $hookmanager->initHooks(array(
'login'));
1008 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1009 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1014 $paramsurl = array();
1016 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1019 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1021 if (
GETPOST(
'lang',
'aZ09')) {
1022 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1025 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1029 $hookmanager->initHooks(array(
'main'));
1032 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1033 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1034 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1036 if (constant(
'DOL_URL_ROOT')) {
1037 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1039 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1040 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1044 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1045 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1046 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1048 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1049 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1050 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1052 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1053 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1054 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1056 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1057 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1058 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1060 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1061 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1062 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1065 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1066 if (empty($_SESSION[
'pageforbacktolist'])) {
1067 $pageforbacktolistarray = array();
1069 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1071 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1072 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1073 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1074 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1079 $parameters = array();
1080 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1089 if (!isset($_SESSION[
"dol_login"])) {
1094 $_SESSION[
"dol_login"] = $user->login;
1095 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1096 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1097 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1098 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1099 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1100 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1101 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1102 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1103 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1104 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1106 $_SESSION[
"dol_entity"] =
$conf->entity;
1111 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1112 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1114 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1115 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1117 if (!empty($dol_optimize_smallscreen)) {
1118 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1120 if (!empty($dol_no_mouse_hover)) {
1121 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1123 if (!empty($dol_use_jmobile)) {
1124 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1127 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1131 $user->update_last_login_date();
1133 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1134 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1137 $user->context[
'audit'] = $loginfo;
1138 $user->context[
'authentication_method'] = $dol_authmode;
1141 $result = $user->call_trigger(
'USER_LOGIN', $user);
1149 $hookmanager->initHooks(array(
'login'));
1150 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1151 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1159 dol_print_error(
$db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1167 if (!empty($landingpage)) {
1169 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1170 header(
'Location: '.$newpath);
1177 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1179 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1180 $currentpage = $_SERVER[
'PHP_SELF'];
1182 foreach ($allowedpages as $page) {
1183 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1189 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1196 $user->rights->user->user->lire = 1;
1197 $user->rights->user->user->creer = 1;
1198 $user->rights->user->user->password = 1;
1199 $user->rights->user->user->supprimer = 1;
1200 $user->rights->user->self->creer = 1;
1201 $user->rights->user->self->password = 1;
1205 if (!$user->hasRight(
'user',
'user_advance')) {
1206 $user->rights->user->user_advance =
new stdClass();
1208 if (!$user->hasRight(
'user',
'self_advance')) {
1209 $user->rights->user->self_advance =
new stdClass();
1211 if (!$user->hasRight(
'user',
'group_advance')) {
1212 $user->rights->user->group_advance =
new stdClass();
1215 $user->rights->user->user_advance->readperms = 1;
1216 $user->rights->user->user_advance->write = 1;
1217 $user->rights->user->self_advance->readperms = 1;
1218 $user->rights->user->self_advance->writeperms = 1;
1219 $user->rights->user->group_advance->read = 1;
1220 $user->rights->user->group_advance->readperms = 1;
1221 $user->rights->user->group_advance->write = 1;
1222 $user->rights->user->group_advance->delete = 1;
1231 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1234 if ((
int)
$conf->liste_limit <= 0) {
1239 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1246 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1250 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1251 $user->loadDefaultValues();
1257if (
GETPOST(
'theme',
'aZ09')) {
1259 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1264 $conf->use_javascript_ajax = 0;
1275 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1285if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1286 $conf->dol_hide_leftmenu = 1;
1288if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1289 $conf->dol_hide_topmenu = 1;
1291if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1292 $conf->dol_optimize_smallscreen = 1;
1294if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1295 $conf->dol_no_mouse_hover = 1;
1297if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1298 $conf->dol_use_jmobile = 1;
1301if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1302 $conf->dol_no_mouse_hover = 1;
1306if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1307 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1308 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1311 $conf->dol_optimize_smallscreen = 1;
1314 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1318if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1319 $conf->theme =
'eldy';
1320 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1323if (!defined(
'NOREQUIRETRAN')) {
1324 if (!
GETPOST(
'lang',
'aZ09')) {
1326 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1329 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1330 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1336if (!defined(
'NOLOGIN')) {
1339 if (!$user->login) {
1344 if ($user->status < 1) {
1346 $langs->loadLangs(array(
"errors",
"other"));
1347 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1352 $user->loadRights();
1355dol_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);
1360if (!defined(
'NOREQUIRETRAN')) {
1362 $langs->loadLangs(array(
'main',
'dict'));
1368 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1369 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1370 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1372 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1373 $conf->browser->stringforfirstkey .=
' ALT +';
1374 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1375 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1377 $conf->browser->stringforfirstkey .=
' CTL +';
1383$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1384$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1385$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1397if (empty(
$conf->browser->firefox)) {
1398 define(
'ROWS_1', 1);
1399 define(
'ROWS_2', 2);
1400 define(
'ROWS_3', 3);
1401 define(
'ROWS_4', 4);
1402 define(
'ROWS_5', 5);
1403 define(
'ROWS_6', 6);
1404 define(
'ROWS_7', 7);
1405 define(
'ROWS_8', 8);
1406 define(
'ROWS_9', 9);
1408 define(
'ROWS_1', 0);
1409 define(
'ROWS_2', 1);
1410 define(
'ROWS_3', 2);
1411 define(
'ROWS_4', 3);
1412 define(
'ROWS_5', 4);
1413 define(
'ROWS_6', 5);
1414 define(
'ROWS_7', 6);
1415 define(
'ROWS_8', 7);
1416 define(
'ROWS_9', 8);
1419$heightforframes = 52;
1422if (!defined(
'NOREQUIREMENU')) {
1423 if (empty($user->socid)) {
1431 $file_menu =
$conf->standard_menu;
1432 if (
GETPOST(
'menu',
'alpha')) {
1433 $file_menu =
GETPOST(
'menu',
'alpha');
1436 if (!class_exists(
'MenuManager')) {
1438 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1439 foreach ($dirmenus as $dirmenu) {
1441 if (class_exists(
'MenuManager')) {
1445 if (!class_exists(
'MenuManager')) {
1446 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1447 $file_menu =
'eldy_menu.php';
1448 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1452 $menumanager =
new MenuManager(
$db, empty($user->socid) ? 0 : 1);
1454 $menumanager->loadMenu();
1457if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1458 $message =
GETPOST(
'seteventmessages',
'alpha');
1459 $messages = explode(
',', $message);
1460 foreach ($messages as $key => $msg) {
1461 $tmp = explode(
':', $msg);
1468if (!function_exists(
"llxHeader")) {
1492 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1494 global
$conf, $hookmanager;
1496 $parameters = array(
1498 'title' => & $title,
1499 'help_url' => & $help_url,
1500 'target' => & $target,
1501 'disablejs' => & $disablejs,
1502 'disablehead' => & $disablehead,
1503 'arrayofjs' => & $arrayofjs,
1504 'arrayofcss' => & $arrayofcss,
1505 'morequerystring' => & $morequerystring,
1506 'morecssonbody' => & $morecssonbody,
1507 'replacemainareaby' => & $replacemainareaby,
1508 'disablenofollow' => & $disablenofollow,
1509 'disablenoindex' => & $disablenoindex
1512 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1514 print $hookmanager->resPrint;
1519 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1521 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1523 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1525 if ($mainmenu !=
'website') {
1526 $tmpcsstouse = $morecssonbody;
1531 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1534 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1535 $tmpcsstouse .=
' dol_openinpopup';
1538 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1541 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1542 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1545 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1546 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1550 if ($replacemainareaby) {
1551 print $replacemainareaby;
1571 if ($contenttype !=
'none') {
1572 if ($contenttype ==
'text/html') {
1573 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1575 header(
"Content-Type: ".$contenttype);
1582 header(
"X-Content-Type-Options: nosniff");
1585 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1586 header(
"X-Frame-Options: SAMEORIGIN");
1588 header(
"X-Frame-Options: ALLOWALL");
1592 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1593 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1594 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1595 header(
'Vary: Origin');
1602 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1617 if (!is_object($hookmanager)) {
1618 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1621 $hookmanager->initHooks(array(
"main"));
1623 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1624 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1626 $contentsecuritypolicy = $hookmanager->resPrint;
1628 $contentsecuritypolicy .= $hookmanager->resPrint;
1632 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1634 if (!empty($contentsecuritypolicy)) {
1635 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1638 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1642 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1657 if (!is_object($hookmanager)) {
1658 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1661 $hookmanager->initHooks(array(
"main"));
1663 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1664 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1666 $contentsecuritypolicy = $hookmanager->resPrint;
1668 $contentsecuritypolicy .= $hookmanager->resPrint;
1672 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1674 if (!empty($contentsecuritypolicy)) {
1675 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1678 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1685 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1687 if (!empty($referrerpolicy)) {
1688 header(
"Referrer-Policy: ".$referrerpolicy);
1691 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1695 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1698 header(
"Strict-Transport-Security: ".$sts);
1701 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1705 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1708 header(
"Permissions-Policy: ".$pp);
1711 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1715 if ($forcenocache) {
1716 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1738function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1744 if (empty(
$conf->css)) {
1745 $conf->css =
'/theme/eldy/style.css.php';
1748 print
'<!doctype html>'.
"\n";
1750 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1753 if (empty($disablehead)) {
1754 if (!is_object($hookmanager)) {
1755 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1758 $hookmanager->initHooks(array(
"main"));
1760 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1764 if (
GETPOST(
'dol_basehref',
'alpha')) {
1765 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1769 print
'<meta charset="utf-8">'.
"\n";
1770 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1771 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1772 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1773 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1774 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1776 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1779 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1780 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1781 if (!empty(
$mysoc->logo_squarred_mini)) {
1782 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1787 if (empty(
$conf->dol_use_jmobile)) {
1788 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1789 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1793 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1794 $parameters = array(
'manifest' => $manifest);
1795 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1797 $manifest = $hookmanager->resPrint;
1799 $manifest .= $hookmanager->resPrint;
1801 if (!empty($manifest)) {
1802 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1806 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1811 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1815 $appli = constant(
'DOL_APPLICATION_TITLE');
1818 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1831 $parameters = array(
'title' => $titletoshow);
1832 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1834 $titletoshow = $hookmanager->resPrint;
1836 $titletoshow .= $hookmanager->resPrint;
1845 $ext =
'version='.GETPOSTINT(
'version');
1848 if (
GETPOST(
'dol_resetcache')) {
1849 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1853 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1855 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1856 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1857 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1859 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1860 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1862 if (GETPOSTISSET(
'dol_openinpopup')) {
1863 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1865 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1866 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1868 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1869 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1871 if (GETPOSTISSET(
'dol_use_jmobile')) {
1872 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1875 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1876 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1878 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1879 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1890 'DOL_VERSION' => DOL_VERSION,
1891 'DOL_URL_ROOT' => DOL_URL_ROOT,
1894 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1896 'dolibarr-context.umd.js',
1897 'dolibarr-tool.seteventmessage.js'
1900 if (! defined(
'NOREQUIRETRAN')) {
1902 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1903 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1904 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1905 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1909 foreach ($jsContextFiles as $jsContextFile) {
1910 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1914 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1920 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1921 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1924 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1925 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1926 if (!defined(
'DISABLE_JQUERY_UI')) {
1927 $jquerytheme =
'base';
1931 if (constant(
'JS_JQUERY_UI')) {
1932 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1934 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1937 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1938 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1940 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1942 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1946 if (!defined(
'DISABLE_FONT_AWSOME')) {
1947 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1948 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1949 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1955 if (!empty(
$conf->modules_parts[
'theme'])) {
1956 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1959 $themesubdir = $reldir;
1965 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1966 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1967 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1979 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1980 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1984 if (!empty(
$conf->modules_parts[
'css'])) {
1985 $arraycss = (array)
$conf->modules_parts[
'css'];
1986 foreach ($arraycss as $modcss => $filescss) {
1987 $filescss = (array) $filescss;
1988 foreach ($filescss as $cssfile) {
1989 if (empty($cssfile)) {
1990 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1994 if ($urlforcss && $urlforcss !=
'/') {
1995 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1997 if (!preg_match(
'/\.css$/i', $cssfile)) {
2002 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
2008 if (is_array($arrayofcss)) {
2009 foreach ($arrayofcss as $cssfile) {
2010 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
2011 $urltofile = $cssfile;
2015 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2017 if (!preg_match(
'/\.css$/i', $cssfile)) {
2027 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2031 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
2033 print
'<!-- Includes JS for JQuery -->'.
"\n";
2034 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2035 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
2037 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
2039 if (!defined(
'DISABLE_JQUERY_UI')) {
2040 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2041 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2043 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2047 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2048 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
2051 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2052 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2056 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2078 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2081 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2083 if (!defined(
'DISABLE_MULTISELECT')) {
2084 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2088 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2091 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2092 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2093 $jsckeditor =
'ckeditor.js';
2094 if (constant(
'JS_CKEDITOR')) {
2096 $pathckeditor = constant(
'JS_CKEDITOR');
2098 print
'<script nonce="'.getNonce().
'">';
2099 print
'/* enable ckeditor by main.inc.php */';
2100 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2101 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2102 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2103 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";
2104 print
'</script>'.
"\n";
2105 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2107 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2108 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2110 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2112 print
'</script>'.
"\n";
2116 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2117 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2118 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2119 $jstinymce =
'tinymce.min.js';
2120 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2121 $pathtinymce = constant(
'JS_TINYMCE');
2123 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2124 print
'<script nonce="'.getNonce().
'">';
2125 print
'/* enable tinymce by main.inc.php */';
2126 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2127 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2128 print
'var tinymceFilebrowserImageBrowseUrl = \''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Type=Image&Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2129 print
'</script>'.
"\n";
2130 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2131 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2135 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2136 $enablebrowsernotif =
false;
2138 $enablebrowsernotif =
true;
2140 if (
$conf->browser->layout ==
'phone') {
2141 $enablebrowsernotif =
false;
2143 if ($enablebrowsernotif) {
2144 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2145 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2150 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2151 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2152 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2157 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2158 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2162 if (!empty(
$conf->modules_parts[
'js'])) {
2163 $arrayjs = (array)
$conf->modules_parts[
'js'];
2164 foreach ($arrayjs as $modjs => $filesjs) {
2165 $filesjs = (array) $filesjs;
2166 foreach ($filesjs as $jsfile) {
2169 if ($urlforjs && $urlforjs !=
'/') {
2170 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2171 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2173 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2179 if (is_array($arrayofjs)) {
2180 print
'<!-- Includes JS added by page -->'.
"\n";
2181 foreach ($arrayofjs as $jsfile) {
2182 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2183 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2185 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2194 if (file_exists($theme_js)) {
2195 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2199 if (!empty($head)) {
2206 $parameters = array();
2207 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2208 print $hookmanager->resPrint;
2210 print
"</head>\n\n";
2213 $conf->headerdone = 1;
2233function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2235 global $user,
$conf, $langs,
$db, $form;
2236 global $dolibarr_main_authentication, $dolibarr_main_demo;
2237 global $hookmanager, $menumanager;
2242 $hookmanager->initHooks(array(
'toprightmenu'));
2247 if (empty(
$conf->headerdone)) {
2248 $disablenofollow = 0;
2249 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2250 print
'<body id="mainbody">';
2256 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2257 if (!isset($form) || !is_object($form)) {
2258 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2262 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2264 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2267 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2269 $menumanager->atarget = $target;
2271 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2275 $appli = constant(
'DOL_APPLICATION_TITLE');
2278 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2280 $appli .=
" ".DOL_VERSION;
2284 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2288 $logouthtmltext =
'';
2290 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2291 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2292 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2293 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2294 $logouttext .=
'</a>';
2296 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2297 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2302 print
'<div class="login_block usedropdown">'.
"\n";
2306 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2309 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2332 $toprightmenu .=
'</div>';
2334 $toprightmenu .=
'</div>'.
"\n";
2338 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2341 $parameters = array();
2342 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2343 if (is_numeric($result)) {
2345 $toprightmenu .= $hookmanager->resPrint;
2347 $toprightmenu = $hookmanager->resPrint;
2350 $toprightmenu .= $result;
2355 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2357 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2360 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2367 if (isset($_POST) && is_array($_POST)) {
2368 foreach ($_POST as $key => $value) {
2369 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2370 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2373 if (!is_array($value)) {
2374 if ($value !==
'') {
2375 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2378 foreach ($value as $value2) {
2379 if (($value2 !==
'') && (!is_array($value2))) {
2380 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2386 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2387 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2389 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2392 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2397 $langs->load(
"help");
2404 if (empty($helppagename)) {
2405 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2407 $helppresent =
'helppresent';
2412 $helpbaseurl = $arrayres[
'helpbaseurl'];
2413 $helppage = $arrayres[
'helppage'];
2414 $mode = $arrayres[
'mode'];
2417 if ($helpbaseurl && $helppage) {
2419 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2420 if ($mode ==
'wiki') {
2421 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2423 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2425 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2428 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2429 if ($mode ==
'wiki') {
2431 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2434 $text .= sprintf($helpbaseurl, $helppage);
2437 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2438 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2441 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2446 $langs->load(
'admin');
2447 $appli .=
'<br>'.$langs->trans(
"Database").
': '.
$db->database_name;
2453 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2455 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2460 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2463 $toprightmenu .=
'</div>';
2467 $toprightmenu .=
'<div class="login_block_user">';
2470 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2475 $toprightmenu .=
'</div>';
2477 $toprightmenu .=
'</div>'.
"\n";
2480 print $toprightmenu;
2487 print
'<div style="clear: both;"></div>';
2488 print
"<!-- End top horizontal menu -->\n\n";
2491 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2492 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2507 global $dolibarr_main_authentication, $dolibarr_main_demo;
2508 global $menumanager, $form;
2511 if (
$conf->browser->name ==
'textbrowser') {
2515 $langs->load(
'companies');
2517 $userImage = $userDropDownImage =
'';
2518 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2519 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2520 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2522 $nophoto =
'/public/theme/common/user_anonymous.png';
2523 if ($user->gender ==
'man') {
2524 $nophoto =
'/public/theme/common/user_man.png';
2526 if ($user->gender ==
'woman') {
2527 $nophoto =
'/public/theme/common/user_woman.png';
2530 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2532 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2536 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2537 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2541 while ($idprofcursor < 10) {
2543 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2544 if ($idprofcursor == 1) {
2545 $constkeyforprofid =
'MAIN_INFO_SIREN';
2547 if ($idprofcursor == 2) {
2548 $constkeyforprofid =
'MAIN_INFO_SIRET';
2550 if ($idprofcursor == 3) {
2551 $constkeyforprofid =
'MAIN_INFO_APE';
2553 if ($idprofcursor == 4) {
2554 $constkeyforprofid =
'MAIN_INFO_RCS';
2556 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2566 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2568 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2570 $dropdownBody .=
'</div>';
2572 $dropdownBody .=
'<br>';
2573 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2574 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2577 if (!empty($user->admin)) {
2578 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2581 if (!empty($user->socid)) {
2583 $thirdpartystatic->fetch($user->socid);
2584 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2585 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2587 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2588 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2589 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2590 $dropdownBody .=
'<br>';
2592 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2593 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2595 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2597 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2598 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2599 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2600 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2602 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2604 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2606 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2607 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2608 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2613 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2614 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2615 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2616 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2617 if (!empty($_SESSION[
"disablemodules"])) {
2618 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2620 $dropdownBody .=
'</div>';
2623 $parameters = array(
'user' => $user,
'langs' => $langs);
2624 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2625 if (is_numeric($result)) {
2627 $dropdownBody .= $hookmanager->resPrint;
2629 $dropdownBody = $hookmanager->resPrint;
2633 if (empty($urllogout)) {
2634 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2638 $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").
' ('.
$conf->browser->stringforfirstkey.
' u)').
'"><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2639 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2640 $jsonopen =
"closeTopMenuLoginDropdown()";
2641 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.
$conf->browser->stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.
$conf->browser->stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover', $jsonopen,
'',
'v');
2642 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.
$conf->browser->stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt pictofixedwidth"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2644 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2645 if (!empty($user->admin)) {
2646 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2650 $appli = constant(
'DOL_APPLICATION_TITLE');
2653 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2655 $appli .=
" ".DOL_VERSION;
2659 $btnUser =
'<!-- div for user link -->
2660 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2661 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2662 '.$userImage.(empty($user->photo) ?
'<!-- no photo so show also the login --><span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft valignmiddle small">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2664 <div class="dropdown-menu">
2666 <div class="user-header">
2667 '.$userDropDownImage.
'
2669 '.$profilName.
'<br>';
2671 if ($user->datelastlogin) {
2672 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2673 if ($user->datepreviouslogin) {
2674 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2677 $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>';
2678 if ($user->datepreviouslogin) {
2679 $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>';
2687 <!-- Menu Body user-->
2688 <div class="user-body">'.$dropdownBody.
'</div>
2691 <div class="user-footer">
2692 <div class="pull-left">
2695 <div class="pull-left">
2696 '.$virtuelcardLink.
'
2698 <div class="pull-right">
2701 <div class="clearboth"></div>
2707 $btnUser =
'<!-- div for user link text browser -->
2708 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2709 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2710 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2715 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2717 <!-- Code to show/hide the user drop-down -->
2719 function closeTopMenuLoginDropdown() {
2720 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2722 jQuery("#topmenu-login-dropdown").removeClass("open");
2724 jQuery(document).ready(function() {
2725 jQuery(document).on("click", function(event) {
2726 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2727 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2728 console.log("click close login - we click outside");
2729 // Hide the dropdown.
2730 closeTopMenuLoginDropdown();
2738 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2739 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2740 event.preventDefault();
2741 jQuery("#topmenu-login-dropdown").toggleClass("open");
2744 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2745 console.log("Click on #topmenulogincompanyinfo-btn");
2746 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2747 jQuery("#topmenuloginmoreinfo").slideToggle();
2749 jQuery("#topmenulogincompanyinfo").slideToggle();
2752 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2753 console.log("Click on #topmenuloginmoreinfo-btn");
2754 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2755 jQuery("#topmenulogincompanyinfo").slideToggle();
2757 jQuery("#topmenuloginmoreinfo").slideToggle();
2779 global
$conf, $langs, $user;
2787 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2791 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2795 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css">';
2799 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2800 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2801 <a accesskey="a" href="#" id="topmenu-ai-toggle" class="login-dropdown-a nofocusvisible" title="'.dol_escape_htmltag($ailabel).
'"><i class="fa fa-magic"></i></a>
2807 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2808 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2814 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2815 $aijsver = @filemtime($aijsfile);
2816 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2818 $html .=
'<script nonce="'.getNonce().
'">
2819 jQuery(document).ready(function() {
2820 jQuery(document).on("click", function(event) {
2821 if (jQuery("#topmenu-ai-popover").hasClass("open")) {
2822 // A click on a node removed from the DOM while the event was bubbling
2823 // (e.g. a chat action button like "Yes, continue" that removes its own
2824 // message bubble) must not be mistaken for a click outside the popover:
2825 // .closest() cannot reach the popover from a detached node.
2826 if (event.target instanceof Element && !event.target.isConnected) {
2829 if (!$(event.target).closest("#topmenu-ai-toggle").length && !$(event.target).closest("#topmenu-ai-popover").length) {
2830 console.log("click close ai dropdown - we click outside");
2831 // Hide the dropdown.
2832 jQuery("#topmenu-ai-popover").removeClass("open");
2839 var toggle = document.getElementById("topmenu-ai-toggle");
2840 var popover = document.getElementById("topmenu-ai-popover");
2841 if (!toggle || !popover) { return; }
2842 var body = popover.querySelector(".ai-popover-body");
2844 var loading = false;
2846 function positionPopover() {
2847 var top = document.getElementById("id-top");
2848 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2849 popover.style.setProperty("--ai-popover-top", anchor + "px");
2852 function loadChat() {
2853 if (loaded || loading) { return; }
2855 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2856 .then(function (resp) {
2857 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2860 .then(function (htmlcontent) {
2861 body.innerHTML = htmlcontent;
2862 return import("'.
dol_escape_js($aijsurl).
'").then(function (mod) {
2863 mod.initAiAssistant(body.querySelector(".ai-chat-container"));
2870 .catch(function (e) {
2871 console.error("AI Assistant popover load failed", e);
2872 body.innerHTML = "<div class=\"ai-popover-loading\">'.
dol_escape_js($langs->trans(
'Error')).
'</div>";
2874 .finally(function () { loading = false; });
2877 function focusInput() {
2878 var input = body.querySelector("#user-input");
2879 if (input) { input.focus(); }
2882 toggle.addEventListener("click", function (event) {
2883 console.log("Click on #topmenu-ai-toggle");
2884 event.preventDefault();
2885 // position:fixed can be hijacked by a transformed ancestor: hosting the
2886 // panel directly under <body> guarantees viewport coordinates.
2887 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2889 var isOpen = popover.classList.toggle("open");
2892 if (loaded) { focusInput(); }
2896 popover.addEventListener("click", function (event) {
2897 console.log("Click on #topmenu-ai-popover");
2898 var closeBtn = event.target.closest("#ai-close-btn");
2899 var expandBtn = event.target.closest("#ai-expand-btn");
2901 popover.classList.remove("open");
2902 } else if (expandBtn) {
2903 var expanded = popover.classList.toggle("expanded");
2904 var icon = expandBtn.querySelector("i");
2905 if (icon) { icon.className = expanded ? "fa fa-compress-alt" : "fa fa-expand-alt"; }
2906 expandBtn.title = expanded ? (expandBtn.dataset.titleReduce || "") : (expandBtn.dataset.titleExpand || "");
2910 document.addEventListener("keydown", function (event) {
2911 if (event.key === "Escape" && popover.classList.contains("open")) {
2912 popover.classList.remove("open");
2929 global
$conf, $langs;
2938 if (!empty(
$conf->use_javascript_ajax)) {
2939 $html .=
'<!-- div for quick add link -->
2940 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2941 <a accesskey="c" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.
$conf->browser->stringforfirstkey.
' c)"><i class="fa fa-plus-circle"></i></a>
2944 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2946 <!-- Code to show/hide the user drop-down for the quick add -->
2947 <script nonce="'.getNonce().
'">
2948 jQuery(document).ready(function() {
2949 jQuery(document).on("click", function(event) {
2950 if (jQuery("#topmenu-quickadd-dropdown").hasClass("open")) {
2951 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2952 console.log("click close quick add - we click outside");
2953 // Hide the dropdown.
2954 $("#topmenu-quickadd-dropdown").removeClass("open");
2958 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2959 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2960 openQuickAddDropDown(event);
2964 $(document).keydown(function(event){
2966 if (ostype ===
"macintosh") {
2967 if ( event.which === 65 && event.ctrlKey ) {
2968 console.log(\
'control + a : trigger open quick add dropdown\');
2969 openQuickAddDropDown(event);
2972 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2973 console.log(\'control + shift + a : trigger open quick add dropdown\');
2974 openQuickAddDropDown(event);
2979 var openQuickAddDropDown = function(event) {
2980 event.preventDefault();
2981 $("#topmenu-quickadd-dropdown").toggleClass("open");
3001 global
$conf, $langs;
3010 if (!empty(
$conf->use_javascript_ajax)) {
3011 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
3016 $html .=
'<!-- div for link to upload file -->
3017 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
3018 <a accesskey="i" class="dropdown-togglex login-dropdown-a nofocusvisible" data-toggle="dropdown" href="'.$urlforuploadpage.
'" title="'.$langs->trans(
'UploadFile').
' ('.
$conf->browser->stringforfirstkey.
' i)"><i class="fa fa-upload"></i></a>
3034 global $user, $langs, $hookmanager;
3039 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
3040 "title" =>
"MenuNewMember@members",
3041 "name" =>
"Adherent@members",
3042 "picto" =>
"object_member",
3043 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3047 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3048 "title" =>
"MenuNewThirdParty@companies",
3049 "name" =>
"ThirdParty@companies",
3050 "picto" =>
"object_company",
3051 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3055 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3056 "title" =>
"NewContactAddress@companies",
3057 "name" =>
"Contact@companies",
3058 "picto" =>
"object_contact",
3059 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3063 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3064 "title" =>
"NewPropal@propal",
3065 "name" =>
"Proposal@propal",
3066 "picto" =>
"object_propal",
3067 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3072 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3073 "title" =>
"NewOrder@orders",
3074 "name" =>
"Order@orders",
3075 "picto" =>
"object_order",
3076 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3080 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3081 "title" =>
"NewBill@bills",
3082 "name" =>
"Bill@bills",
3083 "picto" =>
"object_bill",
3084 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3088 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3089 "title" =>
"NewContractSubscription@contracts",
3090 "name" =>
"Contract@contracts",
3091 "picto" =>
"object_contract",
3092 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3096 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3097 "title" =>
"SupplierProposalNew@supplier_proposal",
3098 "name" =>
"SupplierProposal@supplier_proposal",
3099 "picto" =>
"supplier_proposal",
3100 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3104 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3105 "title" =>
"NewSupplierOrderShort@orders",
3106 "name" =>
"SupplierOrder@orders",
3107 "picto" =>
"supplier_order",
3108 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3112 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3113 "title" =>
"NewBill@bills",
3114 "name" =>
"SupplierBill@bills",
3115 "picto" =>
"supplier_invoice",
3116 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3120 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3121 "title" =>
"NewTicket@ticket",
3122 "name" =>
"Ticket@ticket",
3123 "picto" =>
"ticket",
3124 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3128 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3129 "title" =>
"NewIntervention@interventions",
3130 "name" =>
"Intervention@interventions",
3131 "picto" =>
"intervention",
3132 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3136 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3137 "title" =>
"NewProduct@products",
3138 "name" =>
"Product@products",
3139 "picto" =>
"object_product",
3140 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3144 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3145 "title" =>
"NewService@products",
3146 "name" =>
"Service@products",
3147 "picto" =>
"object_service",
3148 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3152 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3153 "title" =>
"StockTransferNew@stocks",
3154 "name" =>
"StockTransfer@stocks",
3156 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3160 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3161 "title" =>
"AddUser@users",
3162 "name" =>
"User@users",
3164 "activation" => $user->hasRight(
"user",
"user",
"write"),
3170 $dropDownQuickAddHtml =
'';
3174 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3176 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3179 $parameters = array();
3180 $hook_items = $items;
3181 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3182 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3183 if ($reshook == 0) {
3184 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3186 $items = $hookmanager->resArray;
3190 $position = array();
3191 foreach ($items[
'items'] as $key => $row) {
3192 $position[$key] = $row[
'position'];
3194 $array1_sort_order = SORT_ASC;
3195 array_multisort($position, $array1_sort_order, $items[
'items']);
3198 foreach ($items[
'items'] as $item) {
3199 if (!$item[
'activation']) {
3202 $langs->load(explode(
'@', $item[
'title'])[1]);
3203 $langs->load(explode(
'@', $item[
'name'])[1]);
3204 $dropDownQuickAddHtml .=
'
3205 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3206 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3211 $dropDownQuickAddHtml .=
'</div>';
3213 $dropDownQuickAddHtml .=
'</div>';
3215 return $dropDownQuickAddHtml;
3225 global $langs,
$conf, $user;
3230 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3239 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3240 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3241 $langs->load(
"bookmarks");
3244 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3248 $html .=
'<!-- div for bookmark link -->
3249 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3250 <a accesskey="b" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.
$conf->browser->stringforfirstkey.
' b)"><i class="fa fa-star"></i></a>
3251 <div class="dropdown-menu">
3257 <!-- Code to show/hide the bookmark drop-down -->
3259 jQuery(document).ready(function() {
3260 jQuery(document).on("click", function(event) {
3261 if (jQuery("#topmenu-bookmark-dropdown").hasClass("open")) {
3262 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3263 console.log("close bookmark dropdown - we click outside");
3265 $("#topmenu-bookmark-dropdown").removeClass("open");
3270 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3271 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3272 openBookMarkDropDown(event);
3276 jQuery(document).keydown(function(event) {
3277 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3278 if (ostype ===
"macintosh") {
3279 if ( event.which === 66 && event.ctrlKey ) {
3280 console.log(
"Click on control + b : trigger open bookmark dropdown");
3281 openBookMarkDropDown(event);
3284 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3285 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3286 openBookMarkDropDown(event);
3291 var openBookMarkDropDown =
function(event) {
3292 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3293 event.preventDefault();
3294 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3295 jQuery(
"#top-bookmark-search-input").focus();
3311function top_menu_search()
3313 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3317 $usedbyinclude = 1; // Used by selectsearchbox.php
3318 $arrayresult = array();
3319 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3321 $searchInput = '<input
type=
"search" name=
"search_all" title=
"'.dol_escape_htmltag($conf->browser->stringforfirstkey.' s').'" id=
"top-global-search-input" class=
"dropdown-search-input search_component_input" placeholder=
"'.$langs->trans('Search').'" autocomplete=
"off">
';
3323 $defaultAction = '';
3324 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3325 // Menu with all searchable items
3326 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3327 foreach ($arrayresult as $keyItem => $item) {
3328 if (empty($defaultAction)) {
3329 $defaultAction = $item['url
'];
3331 $buttonList .= '<
button class=
"dropdown-item global-search-item '.(empty($conf->dol_optimize_smallscreen) ? 'tdoverflowmax400' : 'tdoverflowmax300').'" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3332 $buttonList .= $item['text
'];
3333 $buttonList .= '</
button>
';
3335 $buttonList .= '</div>
';
3337 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3340 <!-- search input -->
3341 <div
class=
"dropdown-header search-dropdown-header">
3347 <!--
Menu Body search -->
3348 <div
class=
"dropdown-body search-dropdown-body">
3353 $dropDownHtml .= '</form>
';
3355 $html .= '<!-- div
for Global Search -->
3356 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3357 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3358 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3360 <div
class=
"dropdown-menu dropdown-search">
3366 <!-- Code to show/hide the
user drop-down -->
3368 jQuery(document).ready(
function() {
3371 jQuery(
"#top-global-search-input").keydown(
function (e) {
3372 if (e.keyCode == 13 || e.keyCode == 40) {
3373 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3374 if (inputs[inputs.index(this) + 1] != null) {
3375 console.log(
"Force focus after keydow on #top-global-search-input");
3376 inputs[inputs.index(this) + 1].focus();
3377 if (e.keyCode == 13){
3378 inputs[inputs.index(this) + 1].trigger(
"click");
3388 jQuery(document).keydown(
function(e) {
3390 var $focused = $(
":focus");
3391 if($focused.length && $focused.hasClass(
"global-search-item")){
3394 if (e.keyCode == 38) {
3396 console.log(
"Force focus after keycode 38");
3397 $focused.prev().focus();
3401 if (e.keyCode == 40) {
3403 console.log(
"Force focus after keycode 40");
3404 $focused.next().focus();
3411 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3412 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3413 jQuery(
"#top-menu-action-search").submit();
3417 jQuery(document).on(
"click",
function(event) {
3418 if (jQuery(
"#topmenu-global-search-dropdown").hasClass(
"open")) {
3419 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3420 console.log(
"click close search - we click outside");
3422 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3428 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3429 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3430 openGlobalSearchDropDown();
3434 jQuery(document).keydown(
function(e){
3435 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3436 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3437 openGlobalSearchDropDown();
3439 if ( e.which === 70 && e.alKey ) {
3440 console.log(\'alt + f : trigger open global-search dropdown\');
3441 openGlobalSearchDropDown();
3445 var openGlobalSearchDropDown = function() {
3446 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3447 jQuery("#top-global-search-input").focus();
3471function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3473 global $user,
$conf, $langs,
$db, $form;
3474 global $hookmanager, $menumanager;
3478 if (!empty($menu_array_before)) {
3479 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);
3482 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3484 $hookmanager->initHooks(array(
'leftblock'));
3486 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3489 if (!is_object($form)) {
3495 if (
$conf->browser->layout ==
'phone') {
3496 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3500 $arrayresult = array();
3501 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3505 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3506 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, (
string) $selected,
'accesskey="s"', 1, 0, (
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 0 : 1),
'vmenusearchselectcombo', 1, $textsearch, 1,
$conf->browser->stringforfirstkey.
' s');
3508 if (is_array($arrayresult)) {
3510 foreach ($arrayresult as $key => $val) {
3511 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3517 $parameters = array(
'searchform' => $searchform);
3518 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3519 if (empty($reshook)) {
3520 $searchform .= $hookmanager->resPrint;
3522 $searchform = $hookmanager->resPrint;
3527 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3528 $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>';
3530 $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>';
3531 $searchform .=
'<script>
3532 jQuery(document).ready(function () {
3533 jQuery("#divsearchforms1").click(function(){
3534 jQuery("#divsearchforms2").toggle();
3538 $searchform .=
'</div>';
3542 $searchform .=
'<script>
3543 jQuery(document).keydown(function(e){
3544 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3545 console.log(\'control + shift + f : trigger open global-search dropdown\');
3546 openGlobalSearchDropDown();
3548 if( (e.which === 83 || e.which === 115) && e.altKey ){
3549 console.log(\'alt + s : trigger open global-search dropdown\');
3550 openGlobalSearchDropDown();
3554 var openGlobalSearchDropDown = function() {
3555 jQuery("#searchselectcombo").select2(\'open\');
3561 print
'<!-- Begin left menu -->'.
"\n";
3563 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3567 $menumanager->menu_array = $menu_array_before;
3569 $menumanager->menu_array_after = $menu_array_after;
3572 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3575 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3581 print
"<!-- Begin Help Block-->\n";
3582 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3586 $doliurl =
'https://www.dolibarr.org';
3588 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3589 $doliurl =
'https://www.dolibarr.fr';
3591 if (preg_match(
'/es/i', $langs->defaultlang)) {
3592 $doliurl =
'https://www.dolibarr.es';
3594 if (preg_match(
'/de/i', $langs->defaultlang)) {
3595 $doliurl =
'https://www.dolibarr.de';
3597 if (preg_match(
'/it/i', $langs->defaultlang)) {
3598 $doliurl =
'https://www.dolibarr.it';
3600 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3601 $doliurl =
'https://www.dolibarr.gr';
3604 $appli = constant(
'DOL_APPLICATION_TITLE');
3607 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3609 $appli .=
" ".DOL_VERSION;
3617 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3619 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3621 print
'<span class="help">';
3629 print
'</div>'.
"\n";
3634 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3637 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3638 $bugbaseurl .=
'&title=';
3639 $bugbaseurl .= urlencode(
"Bug: ");
3640 $bugbaseurl .=
'&body=';
3641 $bugbaseurl .= urlencode(
"# Instructions\n");
3642 $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");
3643 $bugbaseurl .= urlencode(
"*Please:*\n");
3644 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3645 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3646 $bugbaseurl .= urlencode(
"\n");
3647 $bugbaseurl .= urlencode(
"\n");
3648 $bugbaseurl .= urlencode(
"# Bug\n");
3649 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3650 $bugbaseurl .= urlencode(
"\n");
3651 $bugbaseurl .= urlencode(
"## Environment\n");
3652 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3653 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3654 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3655 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3656 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.
$db->getVersion().
"\n");
3657 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3658 $bugbaseurl .= urlencode(
"\n");
3659 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3660 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3661 $bugbaseurl .= urlencode(
"\n");
3662 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3663 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3664 $bugbaseurl .= urlencode(
"\n");
3665 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3666 $bugbaseurl .= urlencode(
"[*Files*]\n");
3667 $bugbaseurl .= urlencode(
"\n");
3669 $bugbaseurl .= urlencode(
"\n");
3670 $bugbaseurl .= urlencode(
"## Report\n");
3678 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3679 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3680 if (empty($reshook)) {
3681 $bugbaseurl .= $hookmanager->resPrint;
3683 $bugbaseurl = $hookmanager->resPrint;
3686 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3687 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3692 print
"<!-- End Help Block-->\n";
3697 print
"<!-- End left menu -->\n";
3701 $parameters = array();
3702 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3703 print $hookmanager->resPrint;
3705 print
'</div></div> <!-- End side-nav id-left -->';
3709 print
'<!-- Begin right area -->'.
"\n";
3711 if (empty($leftmenuwithoutmainarea)) {
3725 global
$conf, $langs, $hookmanager;
3727 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3728 print
'<div id="id-right">';
3733 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3735 $hookmanager->initHooks(array(
'main'));
3736 $parameters = array();
3737 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3738 print $hookmanager->resPrint;
3741 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3746 $parameters = array();
3747 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3748 if (empty($reshook)) {
3749 print
'<!-- Begin show mysoc info header -->'.
"\n";
3750 print
'<div id="mysoc-info-header">'.
"\n";
3751 print
'<table class="centpercent div-table-responsive">'.
"\n";
3753 print
'<tr><td rowspan="0" class="width20p">';
3755 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(
getDolGlobalString(
'MAIN_INFO_SOCIETE_LOGO'))).
'">';
3757 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3758 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3770 print
'</table>'.
"\n";
3771 print
'</div>'.
"\n";
3772 print
'<!-- End show mysoc info header -->'.
"\n";
3791 if (preg_match(
'/^http/i', $helppagename)) {
3793 $helpbaseurl =
'%s';
3794 $helppage = $helppagename;
3799 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3800 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3801 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3802 $helppage = $reg[1];
3805 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3806 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3807 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3808 $helppage = $reg[1];
3811 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3812 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3813 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3814 $helppage = $reg[1];
3817 if (empty($helppage)) {
3818 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3819 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3820 $helppage = $reg[1];
3825 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3845function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3847 global $langs, $user;
3850 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3851 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3852 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3853 if ($showtitlebefore) {
3854 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3856 $ret .=
'<div class="tagtd">';
3857 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3858 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3859 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3860 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3861 $ret .=
' placeholder="'.strip_tags($title).
'"';
3862 $ret .= ($autofocus ?
' autofocus' :
'');
3863 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3864 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3865 $ret .=
'<span class="fa fa-search"></span>';
3866 $ret .=
'</button>';
3868 $ret .=
"</form>\n";
3873if (!function_exists(
"llxFooter")) {
3887 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3890 global $delayedhtmlcontent;
3891 global $contextpage, $page, $limit, $mode;
3892 global $dolibarr_distrib;
3894 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3898 $parameters = array();
3899 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3900 if (empty($reshook)) {
3901 $llxfooter .= $hookmanager->resPrint;
3902 } elseif ($reshook > 0) {
3903 $llxfooter = $hookmanager->resPrint;
3914 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3916 foreach ($user->lastsearch_values_tmp as $key => $val) {
3917 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3918 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3919 if (empty($val[
'sortfield'])) {
3920 unset($val[
'sortfield']);
3922 if (empty($val[
'sortorder'])) {
3923 unset($val[
'sortorder']);
3925 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3926 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3927 unset($_SESSION[
'lastsearch_values_'.$key]);
3933 $relativepathstring = $_SERVER[
"PHP_SELF"];
3935 if (constant(
'DOL_URL_ROOT')) {
3936 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3938 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3939 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3940 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3941 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3942 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3943 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3944 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3946 if (!empty($contextpage)) {
3947 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3949 if (!empty($page) && $page > 0) {
3950 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3952 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3953 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3955 if (!empty($mode)) {
3956 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3959 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3960 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3961 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3962 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3968 if (
$conf->use_javascript_ajax) {
3969 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3970 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3973 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3974 print
'<div class="error">'.$msg.
'</div>';
3982 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3984 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3985 print
'</div> <!-- End div id-right -->'.
"\n";
3988 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3989 print
'</div> <!-- End div id-container -->'.
"\n";
3994 print
'<!-- '.$comment.
' -->'.
"\n";
3999 if (!empty($delayedhtmlcontent)) {
4000 print $delayedhtmlcontent;
4003 if (!empty(
$conf->use_javascript_ajax)) {
4004 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
4005 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
4050 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4051 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4054 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
4055 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
4062 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4063 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4066 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
4067 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
4068 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
4071 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4074 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4075 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4076 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
4078 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4080 $arrayofmoredata = array(
4081 'action' =>
'dolibarrping',
4084 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4086 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4089 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4090 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4095 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4101 $forceregistration =
GETPOSTINT(
'forceregistration');
4103 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4104 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4107 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4109 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4112 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4113 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4114 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4117 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4118 || $forceregistration) {
4120 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4121 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4122 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4124 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4126 $arrayofdata = array(
4127 'action' =>
'dolibarrregistration',
4138 'country_code' =>
$mysoc->country_code,
4151 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4154 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4155 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4160 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4204 $parameters = array();
4205 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4207 print $hookmanager->resPrint;
if(! $sortfield) if(! $sortorder) $object
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays), to know if a version (a,b,c) is lower than (x,...
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
isALNEQualifiedVersion($ignoredev=0, $ignoremodule=0)
Return if the version is a candidate version to get the LNE certification and if the prerequisites ar...
isRegistrationDataSaved()
Return if the KYC mandatory parameters are set Must be the same fields than the one defined as mandat...
getHashUniqueIdOfRegistration($algo='sha256')
Return a hash unique identifier of the registration (used to identify the registration of instance wi...
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata=array(), $forceping=0)
Function to output HTML to make an ajax call to make registration.
dol_now($mode='gmt')
Return date for now.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
getListLimitFromScreenHeight()
Get the limit of list to show according to the screen height.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getNonce()
Return a random string to be used as a nonce value for js.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
top_menu_importfile()
Build the tooltip on top menu quick add.
top_menu_quickadd()
Build the tooltip on top menu quick add.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
top_menu_ai()
Build the HTML for the AI Assistant entry of the top menu: a toggle icon and a floating popover panel...
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after=array(), $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
printDropdownQuickadd($mode=0)
Generate list of quickadd items.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
top_menu_search()
Build the tooltip on top menu search.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
$conf db name
Only used if Module[ID]Name translation string is not found.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successful.
checkIPInCidr($ip, $cidr)
Check if IP address is in CIDR range.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...