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;
373 $legitimate_actions = array(
387 'presend_addmessage',
393 'validatenewpassword',
396 if (
GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, $legitimate_actions))) {
399 $sensitiveget =
true;
403 $arrayofactiontoforcetokencheck = array(
405 'doprev',
'donext',
'dvprev',
'dvnext',
406 'freezone',
'install',
409 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
410 $sensitiveget =
true;
413 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
414 $sensitiveget =
true;
421 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
427 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
430 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
431 $langs->loadLangs(array(
"errors",
"install"));
432 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
433 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
435 http_response_code(403);
436 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
437 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);
438 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";
440 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);
441 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";
442 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";
446 print
" into setup).\n";
453 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
456 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);
459 if (!defined(
'NOTOKENRENEWAL')) {
461 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
464 if (isset($_POST[
'id'])) {
465 $savid = ((int) $_POST[
'id']);
468 unset($_GET[
'confirm']);
469 unset($_GET[
'action']);
470 unset($_GET[
'confirmmassaction']);
471 unset($_GET[
'massaction']);
472 unset($_GET[
'token']);
474 $_POST[
'id'] = ((int) $savid);
477 $_GET[
'errorcode'] =
'InvalidToken';
483if (!empty($dolibarr_main_demo)) {
486 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
488 if (!empty($_SESSION[
"disablemodules"])) {
489 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
491 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
492 foreach ($disabled_modules as $module) {
494 if (empty(
$conf->$module)) {
498 $conf->$module->enabled =
false;
499 unset(
$conf->modules[$module]);
501 foreach ($modulepartkeys as $modulepartkey) {
502 unset(
$conf->modules_parts[$modulepartkey][$module]);
504 if ($module ==
'fournisseur') {
505 $conf->supplier_order->enabled = 0;
506 $conf->supplier_invoice->enabled = 0;
507 unset(
$conf->modules[
'supplier_order']);
508 unset(
$conf->modules[
'supplier_invoice']);
516$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
517if (is_array($modulepart) && count($modulepart) > 0) {
518 foreach (
$conf->modules as $module) {
519 if (in_array($module, $modulepart)) {
520 $modulepart = $module;
525if (is_array($modulepart)) {
536if (!defined(
'NOLOGIN')) {
540 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
541 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
544 if (empty($dolibarr_main_authentication)) {
545 $dolibarr_main_authentication =
'dolibarr';
548 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
549 $dolibarr_auto_user =
'auto';
553 $authmode = explode(
',', $dolibarr_main_authentication);
556 if (!count($authmode)) {
557 $langs->load(
'main');
558 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
565 $resultFetchUser =
'';
567 $dol_authmode =
null;
569 if (!isset($_SESSION[
"dol_login"])) {
571 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
573 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
575 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
576 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
577 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
578 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
579 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
580 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
581 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
582 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
585 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
586 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
587 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
589 if ($dol_hide_topmenu) {
590 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
592 if ($dol_hide_leftmenu) {
593 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
595 if ($dol_optimize_smallscreen) {
596 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
598 if ($dol_no_mouse_hover) {
599 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
601 if ($dol_use_jmobile) {
602 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
604 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
611 $hookmanager->initHooks(array(
'login'));
612 $parameters = array();
613 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
620 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
624 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
628 $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());
629 $fullpathclassfile =
'';
630 foreach ($dirModCaptcha as $dir) {
631 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
632 if ($fullpathclassfile) {
638 if ($fullpathclassfile) {
639 include_once $fullpathclassfile;
643 $classname =
"modCaptcha".ucfirst($captcha);
644 if (class_exists($classname)) {
646 $captchaobj =
new $classname(
$db,
$conf, $langs, $user);
647 '@phan-var-force ModeleCaptcha $captchaobj';
649 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
650 $ok = $captchaobj->validateCodeAfterLoginSubmit();
652 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
657 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
662 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
669 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
671 $langs->loadLangs(array(
'main',
'errors'));
673 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
677 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
680 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
688 $hookmanager->initHooks(array(
'login'));
689 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
690 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
699 $allowedmethodtopostusername = 3;
700 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
701 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
705 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
706 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
710 $goontestloop =
false;
711 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
712 $goontestloop =
true;
714 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
715 $goontestloop =
true;
717 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
718 $goontestloop =
true;
720 if (
GETPOST(
'openid_mode',
'alpha')) {
721 $goontestloop =
true;
723 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
724 $goontestloop =
true;
726 if (!empty($_COOKIE[
'login_dolibarr'])) {
727 $goontestloop =
true;
730 if (!is_object($langs)) {
731 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
734 if (defined(
'MAIN_LANG_DEFAULT')) {
735 $langcode = constant(
'MAIN_LANG_DEFAULT');
737 $langs->setDefaultLang($langcode);
741 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
744 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);
750 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
753 $oauthmodetotestarray = array(
'google');
754 foreach ($oauthmodetotestarray as $oauthmodetotest) {
755 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
757 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
760 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);
761 foreach ($authmode as $tmpkey => $tmpval) {
762 if ($tmpval == $oauthmodetotest.
'oauth') {
763 unset($authmode[$tmpkey]);
772 if ($login ===
'--bad-login-validity--') {
777 $dol_authmode =
$conf->authmode;
779 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
780 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
781 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
782 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
783 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
786 $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"];
787 $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"];
788 if ($dol_dst_first && $dol_dst_second) {
789 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
793 if ($datenow >= $datefirst && $datenow < $datesecond) {
797 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
798 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
803 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
805 $langs->loadLangs(array(
'main',
'errors'));
809 if (empty($_SESSION[
"dol_loginmesg"])) {
810 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
814 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
817 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
825 $hookmanager->initHooks(array(
'login'));
826 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
827 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
837 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
839 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);
840 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
845 return 'ERROR_NOT_LOGGED';
847 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
848 http_response_code(401);
857 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
859 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
860 dol_syslog(
'User not found or not valid, connection refused');
862 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
863 session_name($sessionname);
866 if ($resultFetchUser == 0) {
868 $langs->loadLangs(array(
'main',
'errors'));
870 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
872 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
873 } elseif ($resultFetchUser < 0) {
874 $_SESSION[
"dol_loginmesg"] = $user->error;
876 $user->context[
'audit'] = $user->error;
879 $langs->loadLangs(array(
'main',
'errors'));
881 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
883 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
887 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
896 $hookmanager->initHooks(array(
'login'));
897 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
898 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
905 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
913 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
917 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
918 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
921 if ($entitytotest > 0 &&
$conf->entity != $entitytotest) {
925 $conf->entity = $entitytotest;
930 $login = $_SESSION[
"dol_login"];
931 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
932 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
934 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
938 if ($resultFetchUser <= 0
939 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
940 || ($user->status != $user::STATUS_ENABLED)
941 || ($user->isNotIntoValidityDateRange())) {
942 if ($resultFetchUser <= 0) {
944 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
945 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
947 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
948 } elseif ($user->status != $user::STATUS_ENABLED) {
953 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
956 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
957 session_name($sessionname);
960 if ($resultFetchUser == 0) {
961 $langs->loadLangs(array(
'main',
'errors'));
963 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
965 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
966 } elseif ($resultFetchUser < 0) {
967 $_SESSION[
"dol_loginmesg"] = $user->error;
969 $user->context[
'audit'] = $user->error;
971 $langs->loadLangs(array(
'main',
'errors'));
973 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
975 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
979 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
987 $hookmanager->initHooks(array(
'login'));
988 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
989 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
994 $paramsurl = array();
996 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
999 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1001 if (
GETPOST(
'lang',
'aZ09')) {
1002 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1005 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1009 $hookmanager->initHooks(array(
'main'));
1012 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1013 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1014 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1016 if (constant(
'DOL_URL_ROOT')) {
1017 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1019 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1020 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1024 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1025 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1026 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1028 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1029 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1030 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1032 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1033 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1034 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1036 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1037 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1038 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1040 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1041 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1042 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1045 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1046 if (empty($_SESSION[
'pageforbacktolist'])) {
1047 $pageforbacktolistarray = array();
1049 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1051 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1052 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1053 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1054 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1059 $parameters = array();
1060 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1069 if (!isset($_SESSION[
"dol_login"])) {
1074 $_SESSION[
"dol_login"] = $user->login;
1075 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1076 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1077 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1078 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1079 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1080 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1081 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1082 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1083 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1084 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1086 $_SESSION[
"dol_entity"] =
$conf->entity;
1091 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1092 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1094 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1095 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1097 if (!empty($dol_optimize_smallscreen)) {
1098 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1100 if (!empty($dol_no_mouse_hover)) {
1101 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1103 if (!empty($dol_use_jmobile)) {
1104 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1107 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1111 $user->update_last_login_date();
1113 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1114 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1117 $user->context[
'audit'] = $loginfo;
1118 $user->context[
'authentication_method'] = $dol_authmode;
1121 $result = $user->call_trigger(
'USER_LOGIN', $user);
1129 $hookmanager->initHooks(array(
'login'));
1130 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1131 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1139 dol_print_error(
$db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1147 if (!empty($landingpage)) {
1149 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1150 header(
'Location: '.$newpath);
1157 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1159 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1160 $currentpage = $_SERVER[
'PHP_SELF'];
1162 foreach ($allowedpages as $page) {
1163 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1169 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1176 $user->rights->user->user->lire = 1;
1177 $user->rights->user->user->creer = 1;
1178 $user->rights->user->user->password = 1;
1179 $user->rights->user->user->supprimer = 1;
1180 $user->rights->user->self->creer = 1;
1181 $user->rights->user->self->password = 1;
1185 if (!$user->hasRight(
'user',
'user_advance')) {
1186 $user->rights->user->user_advance =
new stdClass();
1188 if (!$user->hasRight(
'user',
'self_advance')) {
1189 $user->rights->user->self_advance =
new stdClass();
1191 if (!$user->hasRight(
'user',
'group_advance')) {
1192 $user->rights->user->group_advance =
new stdClass();
1195 $user->rights->user->user_advance->readperms = 1;
1196 $user->rights->user->user_advance->write = 1;
1197 $user->rights->user->self_advance->readperms = 1;
1198 $user->rights->user->self_advance->writeperms = 1;
1199 $user->rights->user->group_advance->read = 1;
1200 $user->rights->user->group_advance->readperms = 1;
1201 $user->rights->user->group_advance->write = 1;
1202 $user->rights->user->group_advance->delete = 1;
1211 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1214 if ((
int)
$conf->liste_limit <= 0) {
1219 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1226 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1230 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1231 $user->loadDefaultValues();
1237if (
GETPOST(
'theme',
'aZ09')) {
1239 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1244 $conf->use_javascript_ajax = 0;
1255 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1265if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1266 $conf->dol_hide_leftmenu = 1;
1268if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1269 $conf->dol_hide_topmenu = 1;
1271if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1272 $conf->dol_optimize_smallscreen = 1;
1274if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1275 $conf->dol_no_mouse_hover = 1;
1277if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1278 $conf->dol_use_jmobile = 1;
1281if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1282 $conf->dol_no_mouse_hover = 1;
1286if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1287 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1288 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1291 $conf->dol_optimize_smallscreen = 1;
1294 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1298if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1299 $conf->theme =
'eldy';
1300 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1303if (!defined(
'NOREQUIRETRAN')) {
1304 if (!
GETPOST(
'lang',
'aZ09')) {
1306 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1309 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1310 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1316if (!defined(
'NOLOGIN')) {
1319 if (!$user->login) {
1324 if ($user->status < 1) {
1326 $langs->loadLangs(array(
"errors",
"other"));
1327 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1332 $user->loadRights();
1335dol_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);
1340if (!defined(
'NOREQUIRETRAN')) {
1342 $langs->loadLangs(array(
'main',
'dict'));
1348 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1349 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1350 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1352 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1353 $conf->browser->stringforfirstkey .=
' ALT +';
1354 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1355 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1357 $conf->browser->stringforfirstkey .=
' CTL +';
1363$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1364$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1365$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1377if (empty(
$conf->browser->firefox)) {
1378 define(
'ROWS_1', 1);
1379 define(
'ROWS_2', 2);
1380 define(
'ROWS_3', 3);
1381 define(
'ROWS_4', 4);
1382 define(
'ROWS_5', 5);
1383 define(
'ROWS_6', 6);
1384 define(
'ROWS_7', 7);
1385 define(
'ROWS_8', 8);
1386 define(
'ROWS_9', 9);
1388 define(
'ROWS_1', 0);
1389 define(
'ROWS_2', 1);
1390 define(
'ROWS_3', 2);
1391 define(
'ROWS_4', 3);
1392 define(
'ROWS_5', 4);
1393 define(
'ROWS_6', 5);
1394 define(
'ROWS_7', 6);
1395 define(
'ROWS_8', 7);
1396 define(
'ROWS_9', 8);
1399$heightforframes = 52;
1402if (!defined(
'NOREQUIREMENU')) {
1403 if (empty($user->socid)) {
1411 $file_menu =
$conf->standard_menu;
1412 if (
GETPOST(
'menu',
'alpha')) {
1413 $file_menu =
GETPOST(
'menu',
'alpha');
1416 if (!class_exists(
'MenuManager')) {
1418 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1419 foreach ($dirmenus as $dirmenu) {
1421 if (class_exists(
'MenuManager')) {
1425 if (!class_exists(
'MenuManager')) {
1426 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1427 $file_menu =
'eldy_menu.php';
1428 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1432 $menumanager =
new MenuManager(
$db, empty($user->socid) ? 0 : 1);
1434 $menumanager->loadMenu();
1437if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1438 $message =
GETPOST(
'seteventmessages',
'alpha');
1439 $messages = explode(
',', $message);
1440 foreach ($messages as $key => $msg) {
1441 $tmp = explode(
':', $msg);
1448if (!function_exists(
"llxHeader")) {
1472 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1474 global
$conf, $hookmanager;
1476 $parameters = array(
1478 'title' => & $title,
1479 'help_url' => & $help_url,
1480 'target' => & $target,
1481 'disablejs' => & $disablejs,
1482 'disablehead' => & $disablehead,
1483 'arrayofjs' => & $arrayofjs,
1484 'arrayofcss' => & $arrayofcss,
1485 'morequerystring' => & $morequerystring,
1486 'morecssonbody' => & $morecssonbody,
1487 'replacemainareaby' => & $replacemainareaby,
1488 'disablenofollow' => & $disablenofollow,
1489 'disablenoindex' => & $disablenoindex
1492 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1494 print $hookmanager->resPrint;
1499 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1501 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1503 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1505 if ($mainmenu !=
'website') {
1506 $tmpcsstouse = $morecssonbody;
1511 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1514 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1515 $tmpcsstouse .=
' dol_openinpopup';
1518 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1521 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1522 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1525 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1526 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1530 if ($replacemainareaby) {
1531 print $replacemainareaby;
1551 if ($contenttype !=
'none') {
1552 if ($contenttype ==
'text/html') {
1553 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1555 header(
"Content-Type: ".$contenttype);
1562 header(
"X-Content-Type-Options: nosniff");
1565 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1566 header(
"X-Frame-Options: SAMEORIGIN");
1568 header(
"X-Frame-Options: ALLOWALL");
1572 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1573 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1574 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1575 header(
'Vary: Origin');
1582 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1597 if (!is_object($hookmanager)) {
1598 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1601 $hookmanager->initHooks(array(
"main"));
1603 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1604 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1606 $contentsecuritypolicy = $hookmanager->resPrint;
1608 $contentsecuritypolicy .= $hookmanager->resPrint;
1612 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1614 if (!empty($contentsecuritypolicy)) {
1615 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1618 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1622 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1637 if (!is_object($hookmanager)) {
1638 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1641 $hookmanager->initHooks(array(
"main"));
1643 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1644 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1646 $contentsecuritypolicy = $hookmanager->resPrint;
1648 $contentsecuritypolicy .= $hookmanager->resPrint;
1652 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1654 if (!empty($contentsecuritypolicy)) {
1655 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1658 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1665 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1667 if (!empty($referrerpolicy)) {
1668 header(
"Referrer-Policy: ".$referrerpolicy);
1671 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1675 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1678 header(
"Strict-Transport-Security: ".$sts);
1681 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1685 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1688 header(
"Permissions-Policy: ".$pp);
1691 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1695 if ($forcenocache) {
1696 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1718function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1724 if (empty(
$conf->css)) {
1725 $conf->css =
'/theme/eldy/style.css.php';
1728 print
'<!doctype html>'.
"\n";
1730 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1733 if (empty($disablehead)) {
1734 if (!is_object($hookmanager)) {
1735 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1738 $hookmanager->initHooks(array(
"main"));
1740 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1744 if (
GETPOST(
'dol_basehref',
'alpha')) {
1745 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1749 print
'<meta charset="utf-8">'.
"\n";
1750 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1751 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1752 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1753 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1754 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1756 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1759 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1760 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1761 if (!empty(
$mysoc->logo_squarred_mini)) {
1762 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1767 if (empty(
$conf->dol_use_jmobile)) {
1768 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1769 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1773 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1774 $parameters = array(
'manifest' => $manifest);
1775 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1777 $manifest = $hookmanager->resPrint;
1779 $manifest .= $hookmanager->resPrint;
1781 if (!empty($manifest)) {
1782 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1786 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1791 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1795 $appli = constant(
'DOL_APPLICATION_TITLE');
1798 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1811 $parameters = array(
'title' => $titletoshow);
1812 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1814 $titletoshow = $hookmanager->resPrint;
1816 $titletoshow .= $hookmanager->resPrint;
1825 $ext =
'version='.GETPOSTINT(
'version');
1828 if (
GETPOST(
'dol_resetcache')) {
1829 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1833 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1835 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1837 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1840 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1843 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1846 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1849 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1852 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1856 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1859 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1870 'DOL_VERSION' => DOL_VERSION,
1871 'DOL_URL_ROOT' => DOL_URL_ROOT,
1874 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1876 'dolibarr-context.umd.js',
1877 'dolibarr-tool.seteventmessage.js'
1880 if (! defined(
'NOREQUIRETRAN')) {
1882 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1883 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1884 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1885 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1889 foreach ($jsContextFiles as $jsContextFile) {
1890 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1894 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1900 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1901 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1904 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1905 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1906 if (!defined(
'DISABLE_JQUERY_UI')) {
1907 $jquerytheme =
'base';
1911 if (constant(
'JS_JQUERY_UI')) {
1912 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1914 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1917 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1918 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1920 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1922 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1926 if (!defined(
'DISABLE_FONT_AWSOME')) {
1927 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1928 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1929 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1935 if (!empty(
$conf->modules_parts[
'theme'])) {
1936 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1939 $themesubdir = $reldir;
1945 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1946 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1947 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1959 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1960 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1964 if (!empty(
$conf->modules_parts[
'css'])) {
1965 $arraycss = (array)
$conf->modules_parts[
'css'];
1966 foreach ($arraycss as $modcss => $filescss) {
1967 $filescss = (array) $filescss;
1968 foreach ($filescss as $cssfile) {
1969 if (empty($cssfile)) {
1970 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1974 if ($urlforcss && $urlforcss !=
'/') {
1975 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1977 if (!preg_match(
'/\.css$/i', $cssfile)) {
1982 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1988 if (is_array($arrayofcss)) {
1989 foreach ($arrayofcss as $cssfile) {
1990 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1991 $urltofile = $cssfile;
1995 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1997 if (!preg_match(
'/\.css$/i', $cssfile)) {
2007 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2011 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
2013 print
'<!-- Includes JS for JQuery -->'.
"\n";
2014 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2015 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
2017 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
2019 if (!defined(
'DISABLE_JQUERY_UI')) {
2020 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2021 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2023 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2027 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2028 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
2031 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2032 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2036 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2058 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2061 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2063 if (!defined(
'DISABLE_MULTISELECT')) {
2064 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2068 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2071 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2072 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2073 $jsckeditor =
'ckeditor.js';
2074 if (constant(
'JS_CKEDITOR')) {
2076 $pathckeditor = constant(
'JS_CKEDITOR');
2078 print
'<script nonce="'.getNonce().
'">';
2079 print
'/* enable ckeditor by main.inc.php */';
2080 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2081 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2082 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2083 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";
2084 print
'</script>'.
"\n";
2085 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2087 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2088 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2090 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2092 print
'</script>'.
"\n";
2096 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2097 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2098 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2099 $jstinymce =
'tinymce.min.js';
2100 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2101 $pathtinymce = constant(
'JS_TINYMCE');
2103 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2104 print
'<script nonce="'.getNonce().
'">';
2105 print
'/* enable tinymce by main.inc.php */';
2106 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2107 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2108 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";
2109 print
'</script>'.
"\n";
2110 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2111 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2115 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2116 $enablebrowsernotif =
false;
2118 $enablebrowsernotif =
true;
2120 if (
$conf->browser->layout ==
'phone') {
2121 $enablebrowsernotif =
false;
2123 if ($enablebrowsernotif) {
2124 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2125 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2130 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2131 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2132 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2137 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2138 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2142 if (!empty(
$conf->modules_parts[
'js'])) {
2143 $arrayjs = (array)
$conf->modules_parts[
'js'];
2144 foreach ($arrayjs as $modjs => $filesjs) {
2145 $filesjs = (array) $filesjs;
2146 foreach ($filesjs as $jsfile) {
2149 if ($urlforjs && $urlforjs !=
'/') {
2150 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2151 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2153 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2159 if (is_array($arrayofjs)) {
2160 print
'<!-- Includes JS added by page -->'.
"\n";
2161 foreach ($arrayofjs as $jsfile) {
2162 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2163 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2165 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2174 if (file_exists($theme_js)) {
2175 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2179 if (!empty($head)) {
2186 $parameters = array();
2187 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2188 print $hookmanager->resPrint;
2190 print
"</head>\n\n";
2193 $conf->headerdone = 1;
2213function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2215 global $user,
$conf, $langs,
$db, $form;
2216 global $dolibarr_main_authentication, $dolibarr_main_demo;
2217 global $hookmanager, $menumanager;
2222 $hookmanager->initHooks(array(
'toprightmenu'));
2227 if (empty(
$conf->headerdone)) {
2228 $disablenofollow = 0;
2229 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2230 print
'<body id="mainbody">';
2236 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2237 if (!isset($form) || !is_object($form)) {
2238 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2242 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2244 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2247 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2249 $menumanager->atarget = $target;
2251 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2255 $appli = constant(
'DOL_APPLICATION_TITLE');
2258 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2260 $appli .=
" ".DOL_VERSION;
2264 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2268 $logouthtmltext =
'';
2270 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2271 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2272 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2273 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2274 $logouttext .=
'</a>';
2276 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2277 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2282 print
'<div class="login_block usedropdown">'.
"\n";
2286 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2289 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2312 $toprightmenu .=
'</div>';
2314 $toprightmenu .=
'</div>'.
"\n";
2318 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2321 $parameters = array();
2322 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2323 if (is_numeric($result)) {
2325 $toprightmenu .= $hookmanager->resPrint;
2327 $toprightmenu = $hookmanager->resPrint;
2330 $toprightmenu .= $result;
2335 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2337 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2340 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2347 if (isset($_POST) && is_array($_POST)) {
2348 foreach ($_POST as $key => $value) {
2349 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2350 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2353 if (!is_array($value)) {
2354 if ($value !==
'') {
2355 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2358 foreach ($value as $value2) {
2359 if (($value2 !==
'') && (!is_array($value2))) {
2360 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2366 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2367 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2369 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2372 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2377 $langs->load(
"help");
2384 if (empty($helppagename)) {
2385 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2387 $helppresent =
'helppresent';
2392 $helpbaseurl = $arrayres[
'helpbaseurl'];
2393 $helppage = $arrayres[
'helppage'];
2394 $mode = $arrayres[
'mode'];
2397 if ($helpbaseurl && $helppage) {
2399 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2400 if ($mode ==
'wiki') {
2401 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2403 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2405 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2408 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2409 if ($mode ==
'wiki') {
2411 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2414 $text .= sprintf($helpbaseurl, $helppage);
2417 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2418 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2421 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2426 $langs->load(
'admin');
2427 $appli .=
'<br>'.$langs->trans(
"Database").
': '.
$db->database_name;
2433 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2435 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2440 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2443 $toprightmenu .=
'</div>';
2447 $toprightmenu .=
'<div class="login_block_user">';
2450 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2455 $toprightmenu .=
'</div>';
2457 $toprightmenu .=
'</div>'.
"\n";
2460 print $toprightmenu;
2467 print
'<div style="clear: both;"></div>';
2468 print
"<!-- End top horizontal menu -->\n\n";
2471 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2472 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2487 global $dolibarr_main_authentication, $dolibarr_main_demo;
2488 global $menumanager, $form;
2491 if (
$conf->browser->name ==
'textbrowser') {
2495 $langs->load(
'companies');
2497 $userImage = $userDropDownImage =
'';
2498 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2499 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2500 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2502 $nophoto =
'/public/theme/common/user_anonymous.png';
2503 if ($user->gender ==
'man') {
2504 $nophoto =
'/public/theme/common/user_man.png';
2506 if ($user->gender ==
'woman') {
2507 $nophoto =
'/public/theme/common/user_woman.png';
2510 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2512 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2516 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2517 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2521 while ($idprofcursor < 10) {
2523 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2524 if ($idprofcursor == 1) {
2525 $constkeyforprofid =
'MAIN_INFO_SIREN';
2527 if ($idprofcursor == 2) {
2528 $constkeyforprofid =
'MAIN_INFO_SIRET';
2530 if ($idprofcursor == 3) {
2531 $constkeyforprofid =
'MAIN_INFO_APE';
2533 if ($idprofcursor == 4) {
2534 $constkeyforprofid =
'MAIN_INFO_RCS';
2536 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2546 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2548 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2550 $dropdownBody .=
'</div>';
2552 $dropdownBody .=
'<br>';
2553 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2554 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2557 if (!empty($user->admin)) {
2558 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2561 if (!empty($user->socid)) {
2563 $thirdpartystatic->fetch($user->socid);
2564 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2565 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2567 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2568 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2569 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2570 $dropdownBody .=
'<br>';
2572 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2573 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2575 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2577 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2578 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2579 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2580 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2582 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2584 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2586 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2587 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2588 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2593 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2594 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2595 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2596 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2597 if (!empty($_SESSION[
"disablemodules"])) {
2598 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2600 $dropdownBody .=
'</div>';
2603 $parameters = array(
'user' => $user,
'langs' => $langs);
2604 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2605 if (is_numeric($result)) {
2607 $dropdownBody .= $hookmanager->resPrint;
2609 $dropdownBody = $hookmanager->resPrint;
2613 if (empty($urllogout)) {
2614 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2618 $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>';
2619 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2620 $jsonopen =
"closeTopMenuLoginDropdown()";
2621 $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');
2622 $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>';
2624 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2625 if (!empty($user->admin)) {
2626 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2630 $appli = constant(
'DOL_APPLICATION_TITLE');
2633 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2635 $appli .=
" ".DOL_VERSION;
2639 $btnUser =
'<!-- div for user link -->
2640 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2641 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2642 '.$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>' :
'').
'
2644 <div class="dropdown-menu">
2646 <div class="user-header">
2647 '.$userDropDownImage.
'
2649 '.$profilName.
'<br>';
2651 if ($user->datelastlogin) {
2652 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2653 if ($user->datepreviouslogin) {
2654 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2657 $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>';
2658 if ($user->datepreviouslogin) {
2659 $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>';
2667 <!-- Menu Body user-->
2668 <div class="user-body">'.$dropdownBody.
'</div>
2671 <div class="user-footer">
2672 <div class="pull-left">
2675 <div class="pull-left">
2676 '.$virtuelcardLink.
'
2678 <div class="pull-right">
2681 <div class="clearboth"></div>
2687 $btnUser =
'<!-- div for user link text browser -->
2688 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2689 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2690 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2695 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2697 <!-- Code to show/hide the user drop-down -->
2699 function closeTopMenuLoginDropdown() {
2700 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2702 jQuery("#topmenu-login-dropdown").removeClass("open");
2704 jQuery(document).ready(function() {
2705 jQuery(document).on("click", function(event) {
2706 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2707 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2708 console.log("click close login - we click outside");
2709 // Hide the dropdown.
2710 closeTopMenuLoginDropdown();
2718 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2719 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2720 event.preventDefault();
2721 jQuery("#topmenu-login-dropdown").toggleClass("open");
2724 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2725 console.log("Click on #topmenulogincompanyinfo-btn");
2726 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2727 jQuery("#topmenuloginmoreinfo").slideToggle();
2729 jQuery("#topmenulogincompanyinfo").slideToggle();
2732 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2733 console.log("Click on #topmenuloginmoreinfo-btn");
2734 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2735 jQuery("#topmenulogincompanyinfo").slideToggle();
2737 jQuery("#topmenuloginmoreinfo").slideToggle();
2759 global
$conf, $langs, $user;
2767 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2771 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2775 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css">';
2779 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2780 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2781 <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>
2787 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2788 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2794 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2795 $aijsver = @filemtime($aijsfile);
2796 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2798 $html .=
'<script nonce="'.getNonce().
'">
2799 jQuery(document).ready(function() {
2800 jQuery(document).on("click", function(event) {
2801 if (jQuery("#topmenu-ai-popover").hasClass("open")) {
2802 if (!$(event.target).closest("#topmenu-ai-toggle").length && !$(event.target).closest("#topmenu-ai-popover").length) {
2803 console.log("click close ai dropdown - we click outside");
2804 // Hide the dropdown.
2805 jQuery("#topmenu-ai-popover").removeClass("open");
2812 var toggle = document.getElementById("topmenu-ai-toggle");
2813 var popover = document.getElementById("topmenu-ai-popover");
2814 if (!toggle || !popover) { return; }
2815 var body = popover.querySelector(".ai-popover-body");
2817 var loading = false;
2819 function positionPopover() {
2820 var top = document.getElementById("id-top");
2821 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2822 popover.style.setProperty("--ai-popover-top", anchor + "px");
2825 function loadChat() {
2826 if (loaded || loading) { return; }
2828 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2829 .then(function (resp) {
2830 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2833 .then(function (htmlcontent) {
2834 body.innerHTML = htmlcontent;
2835 return import("'.
dol_escape_js($aijsurl).
'").then(function (mod) {
2836 mod.initAiAssistant(body.querySelector(".ai-chat-container"));
2843 .catch(function (e) {
2844 console.error("AI Assistant popover load failed", e);
2845 body.innerHTML = "<div class=\"ai-popover-loading\">'.
dol_escape_js($langs->trans(
'Error')).
'</div>";
2847 .finally(function () { loading = false; });
2850 function focusInput() {
2851 var input = body.querySelector("#user-input");
2852 if (input) { input.focus(); }
2855 toggle.addEventListener("click", function (event) {
2856 console.log("Click on #topmenu-ai-toggle");
2857 event.preventDefault();
2858 // position:fixed can be hijacked by a transformed ancestor: hosting the
2859 // panel directly under <body> guarantees viewport coordinates.
2860 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2862 var isOpen = popover.classList.toggle("open");
2865 if (loaded) { focusInput(); }
2869 popover.addEventListener("click", function (event) {
2870 console.log("Click on #topmenu-ai-popover");
2871 var closeBtn = event.target.closest("#ai-close-btn");
2872 var expandBtn = event.target.closest("#ai-expand-btn");
2874 popover.classList.remove("open");
2875 } else if (expandBtn) {
2876 var expanded = popover.classList.toggle("expanded");
2877 var icon = expandBtn.querySelector("i");
2878 if (icon) { icon.className = expanded ? "fa fa-compress-alt" : "fa fa-expand-alt"; }
2879 expandBtn.title = expanded ? (expandBtn.dataset.titleReduce || "") : (expandBtn.dataset.titleExpand || "");
2883 document.addEventListener("keydown", function (event) {
2884 if (event.key === "Escape" && popover.classList.contains("open")) {
2885 popover.classList.remove("open");
2902 global
$conf, $langs;
2911 if (!empty(
$conf->use_javascript_ajax)) {
2912 $html .=
'<!-- div for quick add link -->
2913 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2914 <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>
2917 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2919 <!-- Code to show/hide the user drop-down for the quick add -->
2920 <script nonce="'.getNonce().
'">
2921 jQuery(document).ready(function() {
2922 jQuery(document).on("click", function(event) {
2923 if (jQuery("#topmenu-quickadd-dropdown").hasClass("open")) {
2924 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2925 console.log("click close quick add - we click outside");
2926 // Hide the dropdown.
2927 $("#topmenu-quickadd-dropdown").removeClass("open");
2931 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2932 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2933 openQuickAddDropDown(event);
2937 $(document).keydown(function(event){
2939 if (ostype ===
"macintosh") {
2940 if ( event.which === 65 && event.ctrlKey ) {
2941 console.log(\
'control + a : trigger open quick add dropdown\');
2942 openQuickAddDropDown(event);
2945 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2946 console.log(\'control + shift + a : trigger open quick add dropdown\');
2947 openQuickAddDropDown(event);
2952 var openQuickAddDropDown = function(event) {
2953 event.preventDefault();
2954 $("#topmenu-quickadd-dropdown").toggleClass("open");
2974 global
$conf, $langs;
2983 if (!empty(
$conf->use_javascript_ajax)) {
2984 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2989 $html .=
'<!-- div for link to upload file -->
2990 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2991 <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>
3007 global $user, $langs, $hookmanager;
3012 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
3013 "title" =>
"MenuNewMember@members",
3014 "name" =>
"Adherent@members",
3015 "picto" =>
"object_member",
3016 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3020 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3021 "title" =>
"MenuNewThirdParty@companies",
3022 "name" =>
"ThirdParty@companies",
3023 "picto" =>
"object_company",
3024 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3028 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3029 "title" =>
"NewContactAddress@companies",
3030 "name" =>
"Contact@companies",
3031 "picto" =>
"object_contact",
3032 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3036 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3037 "title" =>
"NewPropal@propal",
3038 "name" =>
"Proposal@propal",
3039 "picto" =>
"object_propal",
3040 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3045 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3046 "title" =>
"NewOrder@orders",
3047 "name" =>
"Order@orders",
3048 "picto" =>
"object_order",
3049 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3053 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3054 "title" =>
"NewBill@bills",
3055 "name" =>
"Bill@bills",
3056 "picto" =>
"object_bill",
3057 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3061 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3062 "title" =>
"NewContractSubscription@contracts",
3063 "name" =>
"Contract@contracts",
3064 "picto" =>
"object_contract",
3065 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3069 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3070 "title" =>
"SupplierProposalNew@supplier_proposal",
3071 "name" =>
"SupplierProposal@supplier_proposal",
3072 "picto" =>
"supplier_proposal",
3073 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3077 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3078 "title" =>
"NewSupplierOrderShort@orders",
3079 "name" =>
"SupplierOrder@orders",
3080 "picto" =>
"supplier_order",
3081 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3085 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3086 "title" =>
"NewBill@bills",
3087 "name" =>
"SupplierBill@bills",
3088 "picto" =>
"supplier_invoice",
3089 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3093 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3094 "title" =>
"NewTicket@ticket",
3095 "name" =>
"Ticket@ticket",
3096 "picto" =>
"ticket",
3097 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3101 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3102 "title" =>
"NewIntervention@interventions",
3103 "name" =>
"Intervention@interventions",
3104 "picto" =>
"intervention",
3105 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3109 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3110 "title" =>
"NewProduct@products",
3111 "name" =>
"Product@products",
3112 "picto" =>
"object_product",
3113 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3117 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3118 "title" =>
"NewService@products",
3119 "name" =>
"Service@products",
3120 "picto" =>
"object_service",
3121 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3125 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3126 "title" =>
"StockTransferNew@stocks",
3127 "name" =>
"StockTransfer@stocks",
3129 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3133 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3134 "title" =>
"AddUser@users",
3135 "name" =>
"User@users",
3137 "activation" => $user->hasRight(
"user",
"user",
"write"),
3143 $dropDownQuickAddHtml =
'';
3147 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3149 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3152 $parameters = array();
3153 $hook_items = $items;
3154 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3155 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3156 if ($reshook == 0) {
3157 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3159 $items = $hookmanager->resArray;
3163 $position = array();
3164 foreach ($items[
'items'] as $key => $row) {
3165 $position[$key] = $row[
'position'];
3167 $array1_sort_order = SORT_ASC;
3168 array_multisort($position, $array1_sort_order, $items[
'items']);
3171 foreach ($items[
'items'] as $item) {
3172 if (!$item[
'activation']) {
3175 $langs->load(explode(
'@', $item[
'title'])[1]);
3176 $langs->load(explode(
'@', $item[
'name'])[1]);
3177 $dropDownQuickAddHtml .=
'
3178 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3179 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3184 $dropDownQuickAddHtml .=
'</div>';
3186 $dropDownQuickAddHtml .=
'</div>';
3188 return $dropDownQuickAddHtml;
3198 global $langs,
$conf, $user;
3203 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3212 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3213 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3214 $langs->load(
"bookmarks");
3217 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3221 $html .=
'<!-- div for bookmark link -->
3222 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3223 <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>
3224 <div class="dropdown-menu">
3230 <!-- Code to show/hide the bookmark drop-down -->
3232 jQuery(document).ready(function() {
3233 jQuery(document).on("click", function(event) {
3234 if (jQuery("#topmenu-bookmark-dropdown").hasClass("open")) {
3235 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3236 console.log("close bookmark dropdown - we click outside");
3238 $("#topmenu-bookmark-dropdown").removeClass("open");
3243 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3244 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3245 openBookMarkDropDown(event);
3249 jQuery(document).keydown(function(event) {
3250 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3251 if (ostype ===
"macintosh") {
3252 if ( event.which === 66 && event.ctrlKey ) {
3253 console.log(
"Click on control + b : trigger open bookmark dropdown");
3254 openBookMarkDropDown(event);
3257 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3258 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3259 openBookMarkDropDown(event);
3264 var openBookMarkDropDown =
function(event) {
3265 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3266 event.preventDefault();
3267 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3268 jQuery(
"#top-bookmark-search-input").focus();
3284function top_menu_search()
3286 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3290 $usedbyinclude = 1; // Used by selectsearchbox.php
3291 $arrayresult = array();
3292 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3294 $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">
';
3296 $defaultAction = '';
3297 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3298 // Menu with all searchable items
3299 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3300 foreach ($arrayresult as $keyItem => $item) {
3301 if (empty($defaultAction)) {
3302 $defaultAction = $item['url
'];
3304 $buttonList .= '<
button class=
"dropdown-item global-search-item '.(empty($conf->dol_optimize_smallscreen) ? 'tdoverflowmax400' : 'tdoverflowmax300').'" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3305 $buttonList .= $item['text
'];
3306 $buttonList .= '</
button>
';
3308 $buttonList .= '</div>
';
3310 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3313 <!-- search input -->
3314 <div
class=
"dropdown-header search-dropdown-header">
3320 <!--
Menu Body search -->
3321 <div
class=
"dropdown-body search-dropdown-body">
3326 $dropDownHtml .= '</form>
';
3328 $html .= '<!-- div
for Global Search -->
3329 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3330 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3331 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3333 <div
class=
"dropdown-menu dropdown-search">
3339 <!-- Code to show/hide the
user drop-down -->
3341 jQuery(document).ready(
function() {
3344 jQuery(
"#top-global-search-input").keydown(
function (e) {
3345 if (e.keyCode == 13 || e.keyCode == 40) {
3346 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3347 if (inputs[inputs.index(this) + 1] != null) {
3348 console.log(
"Force focus after keydow on #top-global-search-input");
3349 inputs[inputs.index(this) + 1].focus();
3350 if (e.keyCode == 13){
3351 inputs[inputs.index(this) + 1].trigger(
"click");
3361 jQuery(document).keydown(
function(e) {
3363 var $focused = $(
":focus");
3364 if($focused.length && $focused.hasClass(
"global-search-item")){
3367 if (e.keyCode == 38) {
3369 console.log(
"Force focus after keycode 38");
3370 $focused.prev().focus();
3374 if (e.keyCode == 40) {
3376 console.log(
"Force focus after keycode 40");
3377 $focused.next().focus();
3384 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3385 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3386 jQuery(
"#top-menu-action-search").submit();
3390 jQuery(document).on(
"click",
function(event) {
3391 if (jQuery(
"#topmenu-global-search-dropdown").hasClass(
"open")) {
3392 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3393 console.log(
"click close search - we click outside");
3395 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3401 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3402 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3403 openGlobalSearchDropDown();
3407 jQuery(document).keydown(
function(e){
3408 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3409 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3410 openGlobalSearchDropDown();
3412 if ( e.which === 70 && e.alKey ) {
3413 console.log(\'alt + f : trigger open global-search dropdown\');
3414 openGlobalSearchDropDown();
3418 var openGlobalSearchDropDown = function() {
3419 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3420 jQuery("#top-global-search-input").focus();
3444function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3446 global $user,
$conf, $langs,
$db, $form;
3447 global $hookmanager, $menumanager;
3451 if (!empty($menu_array_before)) {
3452 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);
3455 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3457 $hookmanager->initHooks(array(
'leftblock'));
3459 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3462 if (!is_object($form)) {
3468 if (
$conf->browser->layout ==
'phone') {
3469 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3473 $arrayresult = array();
3474 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3478 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3479 $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');
3481 if (is_array($arrayresult)) {
3483 foreach ($arrayresult as $key => $val) {
3484 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3490 $parameters = array(
'searchform' => $searchform);
3491 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3492 if (empty($reshook)) {
3493 $searchform .= $hookmanager->resPrint;
3495 $searchform = $hookmanager->resPrint;
3500 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3501 $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>';
3503 $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>';
3504 $searchform .=
'<script>
3505 jQuery(document).ready(function () {
3506 jQuery("#divsearchforms1").click(function(){
3507 jQuery("#divsearchforms2").toggle();
3511 $searchform .=
'</div>';
3515 $searchform .=
'<script>
3516 jQuery(document).keydown(function(e){
3517 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3518 console.log(\'control + shift + f : trigger open global-search dropdown\');
3519 openGlobalSearchDropDown();
3521 if( (e.which === 83 || e.which === 115) && e.altKey ){
3522 console.log(\'alt + s : trigger open global-search dropdown\');
3523 openGlobalSearchDropDown();
3527 var openGlobalSearchDropDown = function() {
3528 jQuery("#searchselectcombo").select2(\'open\');
3534 print
'<!-- Begin left menu -->'.
"\n";
3536 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3540 $menumanager->menu_array = $menu_array_before;
3542 $menumanager->menu_array_after = $menu_array_after;
3545 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3548 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3554 print
"<!-- Begin Help Block-->\n";
3555 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3559 $doliurl =
'https://www.dolibarr.org';
3561 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3562 $doliurl =
'https://www.dolibarr.fr';
3564 if (preg_match(
'/es/i', $langs->defaultlang)) {
3565 $doliurl =
'https://www.dolibarr.es';
3567 if (preg_match(
'/de/i', $langs->defaultlang)) {
3568 $doliurl =
'https://www.dolibarr.de';
3570 if (preg_match(
'/it/i', $langs->defaultlang)) {
3571 $doliurl =
'https://www.dolibarr.it';
3573 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3574 $doliurl =
'https://www.dolibarr.gr';
3577 $appli = constant(
'DOL_APPLICATION_TITLE');
3580 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3582 $appli .=
" ".DOL_VERSION;
3590 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3592 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3594 print
'<span class="help">';
3602 print
'</div>'.
"\n";
3607 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3610 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3611 $bugbaseurl .=
'&title=';
3612 $bugbaseurl .= urlencode(
"Bug: ");
3613 $bugbaseurl .=
'&body=';
3614 $bugbaseurl .= urlencode(
"# Instructions\n");
3615 $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");
3616 $bugbaseurl .= urlencode(
"*Please:*\n");
3617 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3618 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3619 $bugbaseurl .= urlencode(
"\n");
3620 $bugbaseurl .= urlencode(
"\n");
3621 $bugbaseurl .= urlencode(
"# Bug\n");
3622 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3623 $bugbaseurl .= urlencode(
"\n");
3624 $bugbaseurl .= urlencode(
"## Environment\n");
3625 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3626 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3627 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3628 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3629 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.
$db->getVersion().
"\n");
3630 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3631 $bugbaseurl .= urlencode(
"\n");
3632 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3633 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3634 $bugbaseurl .= urlencode(
"\n");
3635 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3636 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3637 $bugbaseurl .= urlencode(
"\n");
3638 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3639 $bugbaseurl .= urlencode(
"[*Files*]\n");
3640 $bugbaseurl .= urlencode(
"\n");
3642 $bugbaseurl .= urlencode(
"\n");
3643 $bugbaseurl .= urlencode(
"## Report\n");
3651 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3652 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3653 if (empty($reshook)) {
3654 $bugbaseurl .= $hookmanager->resPrint;
3656 $bugbaseurl = $hookmanager->resPrint;
3659 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3660 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3665 print
"<!-- End Help Block-->\n";
3670 print
"<!-- End left menu -->\n";
3674 $parameters = array();
3675 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3676 print $hookmanager->resPrint;
3678 print
'</div></div> <!-- End side-nav id-left -->';
3682 print
'<!-- Begin right area -->'.
"\n";
3684 if (empty($leftmenuwithoutmainarea)) {
3698 global
$conf, $langs, $hookmanager;
3700 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3701 print
'<div id="id-right">';
3706 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3708 $hookmanager->initHooks(array(
'main'));
3709 $parameters = array();
3710 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3711 print $hookmanager->resPrint;
3714 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3719 $parameters = array();
3720 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3721 if (empty($reshook)) {
3722 print
'<!-- Begin show mysoc info header -->'.
"\n";
3723 print
'<div id="mysoc-info-header">'.
"\n";
3724 print
'<table class="centpercent div-table-responsive">'.
"\n";
3726 print
'<tr><td rowspan="0" class="width20p">';
3728 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'))).
'">';
3730 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3731 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3743 print
'</table>'.
"\n";
3744 print
'</div>'.
"\n";
3745 print
'<!-- End show mysoc info header -->'.
"\n";
3764 if (preg_match(
'/^http/i', $helppagename)) {
3766 $helpbaseurl =
'%s';
3767 $helppage = $helppagename;
3772 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3773 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3774 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3775 $helppage = $reg[1];
3778 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3779 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3780 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3781 $helppage = $reg[1];
3784 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3785 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3786 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3787 $helppage = $reg[1];
3790 if (empty($helppage)) {
3791 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3792 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3793 $helppage = $reg[1];
3798 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3818function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3820 global $langs, $user;
3823 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3824 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3825 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3826 if ($showtitlebefore) {
3827 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3829 $ret .=
'<div class="tagtd">';
3830 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3831 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3832 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3833 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3834 $ret .=
' placeholder="'.strip_tags($title).
'"';
3835 $ret .= ($autofocus ?
' autofocus' :
'');
3836 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3837 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3838 $ret .=
'<span class="fa fa-search"></span>';
3839 $ret .=
'</button>';
3841 $ret .=
"</form>\n";
3846if (!function_exists(
"llxFooter")) {
3860 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3863 global $delayedhtmlcontent;
3864 global $contextpage, $page, $limit, $mode;
3865 global $dolibarr_distrib;
3867 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3871 $parameters = array();
3872 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3873 if (empty($reshook)) {
3874 $llxfooter .= $hookmanager->resPrint;
3875 } elseif ($reshook > 0) {
3876 $llxfooter = $hookmanager->resPrint;
3887 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3889 foreach ($user->lastsearch_values_tmp as $key => $val) {
3890 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3891 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3892 if (empty($val[
'sortfield'])) {
3893 unset($val[
'sortfield']);
3895 if (empty($val[
'sortorder'])) {
3896 unset($val[
'sortorder']);
3898 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3899 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3900 unset($_SESSION[
'lastsearch_values_'.$key]);
3906 $relativepathstring = $_SERVER[
"PHP_SELF"];
3908 if (constant(
'DOL_URL_ROOT')) {
3909 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3911 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3912 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3913 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3914 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3915 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3916 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3917 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3919 if (!empty($contextpage)) {
3920 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3922 if (!empty($page) && $page > 0) {
3923 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3925 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3926 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3928 if (!empty($mode)) {
3929 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3932 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3933 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3934 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3935 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3941 if (
$conf->use_javascript_ajax) {
3942 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3943 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3946 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3947 print
'<div class="error">'.$msg.
'</div>';
3955 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3957 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3958 print
'</div> <!-- End div id-right -->'.
"\n";
3961 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3962 print
'</div> <!-- End div id-container -->'.
"\n";
3967 print
'<!-- '.$comment.
' -->'.
"\n";
3972 if (!empty($delayedhtmlcontent)) {
3973 print $delayedhtmlcontent;
3976 if (!empty(
$conf->use_javascript_ajax)) {
3977 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3978 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
4023 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4024 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4027 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
4028 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
4035 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4036 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4039 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
4040 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
4041 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
4044 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4047 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4048 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4049 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
4051 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4053 $arrayofmoredata = array(
4054 'action' =>
'dolibarrping',
4057 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4059 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4062 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4063 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4068 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4074 $forceregistration =
GETPOSTINT(
'forceregistration');
4076 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4077 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4080 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4082 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4085 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4086 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4087 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4090 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4091 || $forceregistration) {
4093 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4094 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4095 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4097 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4099 $arrayofdata = array(
4100 'action' =>
'dolibarrregistration',
4111 'country_code' =>
$mysoc->country_code,
4124 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4127 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4128 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4133 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4177 $parameters = array();
4178 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4180 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.
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.
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.
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.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
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', ...)
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).
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).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getNonce()
Return a random string to be used as a nonce value for js.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
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
buildzip.php
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...