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(
389 'presend_addmessage',
395 'validatenewpassword',
398 if (
GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, $legitimate_actions))) {
401 $sensitiveget =
true;
405 $arrayofactiontoforcetokencheck = array(
407 'doprev',
'donext',
'dvprev',
'dvnext',
408 'freezone',
'install',
409 'reopen',
'swapstatut'
411 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
412 $sensitiveget =
true;
415 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
416 $sensitiveget =
true;
423 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
429 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
432 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
433 $langs->loadLangs(array(
"errors",
"install"));
434 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
435 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
437 http_response_code(403);
438 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
439 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (CSRFCHECK_WITH_TOKEN protection) in main.inc.php. Token not provided.", LOG_WARNING);
440 print
"Access to a page that needs a token (constant CSRFCHECK_WITH_TOKEN is defined) is refused by CSRF protection in main.inc.php. Token not provided.\n";
442 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (POST method or GET with a sensible value for 'action' parameter) in main.inc.php. Token not provided.", LOG_WARNING);
443 print
"Access to this page this way (POST method or GET with a sensible value for 'action' parameter) is refused by CSRF protection in main.inc.php. Token not provided.\n";
444 print
"If you access your server behind a proxy using url rewriting and the parameter is provided by caller, you might check that all HTTP header are propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file or MAIN_SECURITY_CSRF_WITH_TOKEN to 0";
448 print
" into setup).\n";
455 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
458 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (invalid token), so we disable POST and some GET parameters - referrer=".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
461 if (!defined(
'NOTOKENRENEWAL')) {
463 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
466 if (isset($_POST[
'id'])) {
467 $savid = ((int) $_POST[
'id']);
470 unset($_GET[
'confirm']);
471 unset($_GET[
'action']);
472 unset($_GET[
'confirmmassaction']);
473 unset($_GET[
'massaction']);
474 unset($_GET[
'token']);
476 $_POST[
'id'] = ((int) $savid);
479 $_GET[
'errorcode'] =
'InvalidToken';
485if (!empty($dolibarr_main_demo)) {
488 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
490 if (!empty($_SESSION[
"disablemodules"])) {
491 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
493 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
494 foreach ($disabled_modules as $module) {
496 if (empty(
$conf->$module)) {
500 $conf->$module->enabled =
false;
501 unset(
$conf->modules[$module]);
503 foreach ($modulepartkeys as $modulepartkey) {
504 unset(
$conf->modules_parts[$modulepartkey][$module]);
506 if ($module ==
'fournisseur') {
507 $conf->supplier_order->enabled = 0;
508 $conf->supplier_invoice->enabled = 0;
509 unset(
$conf->modules[
'supplier_order']);
510 unset(
$conf->modules[
'supplier_invoice']);
518$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
519if (is_array($modulepart) && count($modulepart) > 0) {
520 foreach (
$conf->modules as $module) {
521 if (in_array($module, $modulepart)) {
522 $modulepart = $module;
527if (is_array($modulepart)) {
538if (!defined(
'NOLOGIN')) {
542 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
543 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
546 if (empty($dolibarr_main_authentication)) {
547 $dolibarr_main_authentication =
'dolibarr';
550 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
551 $dolibarr_auto_user =
'auto';
555 $authmode = explode(
',', $dolibarr_main_authentication);
558 if (!count($authmode)) {
559 $langs->load(
'main');
560 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
567 $resultFetchUser =
'';
569 $dol_authmode =
null;
571 if (!isset($_SESSION[
"dol_login"])) {
573 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
575 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
577 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
578 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
579 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
580 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
581 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
582 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
583 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
584 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
587 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
588 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
589 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
591 if ($dol_hide_topmenu) {
592 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
594 if ($dol_hide_leftmenu) {
595 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
597 if ($dol_optimize_smallscreen) {
598 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
600 if ($dol_no_mouse_hover) {
601 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
603 if ($dol_use_jmobile) {
604 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
606 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
613 $hookmanager->initHooks(array(
'login'));
614 $parameters = array();
615 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
622 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
626 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
630 $dirModCaptcha = array_merge(array(
'main' =>
'/core/modules/security/captcha/'), isset(
$conf->modules_parts[
'captcha']) && is_array(
$conf->modules_parts[
'captcha']) ?
$conf->modules_parts[
'captcha'] : array());
631 $fullpathclassfile =
'';
632 foreach ($dirModCaptcha as $dir) {
633 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
634 if ($fullpathclassfile) {
640 if ($fullpathclassfile) {
641 include_once $fullpathclassfile;
645 $classname =
"modCaptcha".ucfirst($captcha);
646 if (class_exists($classname)) {
648 $captchaobj =
new $classname(
$db,
$conf, $langs, $user);
649 '@phan-var-force ModeleCaptcha $captchaobj';
651 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
652 $ok = $captchaobj->validateCodeAfterLoginSubmit();
654 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
659 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
664 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
671 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
673 $langs->loadLangs(array(
'main',
'errors'));
675 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
679 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
682 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
690 $hookmanager->initHooks(array(
'login'));
691 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
692 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
701 $allowedmethodtopostusername = 3;
702 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
703 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
707 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
708 if (!is_string($usertotest)) {
714 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
718 $goontestloop =
false;
719 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
720 $goontestloop =
true;
722 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
723 $goontestloop =
true;
725 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
726 $goontestloop =
true;
728 if (
GETPOST(
'openid_mode',
'alpha')) {
729 $goontestloop =
true;
731 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
732 $goontestloop =
true;
734 if (!empty($_COOKIE[
'login_dolibarr'])) {
735 $goontestloop =
true;
738 if (!is_object($langs)) {
739 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
742 if (defined(
'MAIN_LANG_DEFAULT')) {
743 $langcode = constant(
'MAIN_LANG_DEFAULT');
745 $langs->setDefaultLang($langcode);
749 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
752 dol_syslog(
'--- Security warning: credentials reported as leaked were used to try to login. HTTP_EXPOSED_CREDENTIAL_CHECK='.((
int) $_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK']), LOG_NOTICE);
758 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
761 $oauthmodetotestarray = array(
'google');
762 foreach ($oauthmodetotestarray as $oauthmodetotest) {
763 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
765 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
768 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);
769 foreach ($authmode as $tmpkey => $tmpval) {
770 if ($tmpval == $oauthmodetotest.
'oauth') {
771 unset($authmode[$tmpkey]);
780 if ($login ===
'--bad-login-validity--') {
785 $dol_authmode =
$conf->authmode;
787 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
788 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
789 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
790 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
791 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
794 $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"];
795 $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"];
796 if ($dol_dst_first && $dol_dst_second) {
797 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
801 if ($datenow >= $datefirst && $datenow < $datesecond) {
805 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
806 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
811 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
813 $langs->loadLangs(array(
'main',
'errors'));
817 if (empty($_SESSION[
"dol_loginmesg"])) {
818 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
822 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
825 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
833 $hookmanager->initHooks(array(
'login'));
834 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
835 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
845 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
847 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);
848 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
853 return 'ERROR_NOT_LOGGED';
855 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
856 http_response_code(401);
865 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
867 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
868 dol_syslog(
'User not found or not valid, connection refused');
870 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
871 session_name($sessionname);
874 if ($resultFetchUser == 0) {
876 $langs->loadLangs(array(
'main',
'errors'));
878 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
880 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
881 } elseif ($resultFetchUser < 0) {
882 $_SESSION[
"dol_loginmesg"] = $user->error;
884 $user->context[
'audit'] = $user->error;
887 $langs->loadLangs(array(
'main',
'errors'));
889 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
891 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
895 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
904 $hookmanager->initHooks(array(
'login'));
905 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
906 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
913 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
921 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
925 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
926 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
929 if ($entitytotest > 0 &&
$conf->entity != $entitytotest) {
933 $conf->entity = $entitytotest;
938 $login = $_SESSION[
"dol_login"];
939 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
940 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
942 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
946 if ($resultFetchUser <= 0
947 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
948 || ($user->status != $user::STATUS_ENABLED)
949 || ($user->isNotIntoValidityDateRange())) {
950 if ($resultFetchUser <= 0) {
952 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
953 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
955 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
956 } elseif ($user->status != $user::STATUS_ENABLED) {
961 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
964 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
965 session_name($sessionname);
968 if ($resultFetchUser == 0) {
969 $langs->loadLangs(array(
'main',
'errors'));
971 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
973 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
974 } elseif ($resultFetchUser < 0) {
975 $_SESSION[
"dol_loginmesg"] = $user->error;
977 $user->context[
'audit'] = $user->error;
979 $langs->loadLangs(array(
'main',
'errors'));
981 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
983 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
987 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
995 $hookmanager->initHooks(array(
'login'));
996 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
997 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1002 $paramsurl = array();
1004 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1007 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1009 if (
GETPOST(
'lang',
'aZ09')) {
1010 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1013 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1017 $hookmanager->initHooks(array(
'main'));
1020 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1021 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1022 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1024 if (constant(
'DOL_URL_ROOT')) {
1025 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1027 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1028 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1032 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1033 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1034 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1036 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1037 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1038 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1040 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1041 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1042 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1044 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1045 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1046 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1048 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1049 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1050 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1053 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1054 if (empty($_SESSION[
'pageforbacktolist'])) {
1055 $pageforbacktolistarray = array();
1057 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1059 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1060 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1061 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1062 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1067 $parameters = array();
1068 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1077 if (!isset($_SESSION[
"dol_login"])) {
1082 $_SESSION[
"dol_login"] = $user->login;
1083 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1084 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1085 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1086 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1087 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1088 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1089 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1090 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1091 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1092 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1094 $_SESSION[
"dol_entity"] =
$conf->entity;
1099 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1100 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1102 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1103 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1105 if (!empty($dol_optimize_smallscreen)) {
1106 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1108 if (!empty($dol_no_mouse_hover)) {
1109 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1111 if (!empty($dol_use_jmobile)) {
1112 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1115 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1119 $user->update_last_login_date();
1121 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1122 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1125 $user->context[
'audit'] = $loginfo;
1126 $user->context[
'authentication_method'] = $dol_authmode;
1129 $result = $user->call_trigger(
'USER_LOGIN', $user);
1137 $hookmanager->initHooks(array(
'login'));
1138 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1139 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1147 dol_print_error(
$db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1155 if (!empty($landingpage)) {
1157 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1158 header(
'Location: '.$newpath);
1165 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1167 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1168 $currentpage = $_SERVER[
'PHP_SELF'];
1170 foreach ($allowedpages as $page) {
1171 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1177 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1184 $user->rights->user->user->lire = 1;
1185 $user->rights->user->user->creer = 1;
1186 $user->rights->user->user->password = 1;
1187 $user->rights->user->user->supprimer = 1;
1188 $user->rights->user->self->creer = 1;
1189 $user->rights->user->self->password = 1;
1193 if (!$user->hasRight(
'user',
'user_advance')) {
1194 $user->rights->user->user_advance =
new stdClass();
1196 if (!$user->hasRight(
'user',
'self_advance')) {
1197 $user->rights->user->self_advance =
new stdClass();
1199 if (!$user->hasRight(
'user',
'group_advance')) {
1200 $user->rights->user->group_advance =
new stdClass();
1203 $user->rights->user->user_advance->readperms = 1;
1204 $user->rights->user->user_advance->write = 1;
1205 $user->rights->user->self_advance->readperms = 1;
1206 $user->rights->user->self_advance->writeperms = 1;
1207 $user->rights->user->group_advance->read = 1;
1208 $user->rights->user->group_advance->readperms = 1;
1209 $user->rights->user->group_advance->write = 1;
1210 $user->rights->user->group_advance->delete = 1;
1219 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1222 if ((
int)
$conf->liste_limit <= 0) {
1227 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1234 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1238 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1239 $user->loadDefaultValues();
1245if (
GETPOST(
'theme',
'aZ09')) {
1247 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1252 $conf->use_javascript_ajax = 0;
1263 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1273if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1274 $conf->dol_hide_leftmenu = 1;
1276if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1277 $conf->dol_hide_topmenu = 1;
1279if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1280 $conf->dol_optimize_smallscreen = 1;
1282if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1283 $conf->dol_no_mouse_hover = 1;
1285if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1286 $conf->dol_use_jmobile = 1;
1289if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1290 $conf->dol_no_mouse_hover = 1;
1294if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1295 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1296 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1299 $conf->dol_optimize_smallscreen = 1;
1302 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1306if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1307 $conf->theme =
'eldy';
1308 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1311if (!defined(
'NOREQUIRETRAN')) {
1312 if (!
GETPOST(
'lang',
'aZ09')) {
1314 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1317 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1318 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1324if (!defined(
'NOLOGIN')) {
1327 if (!$user->login) {
1332 if ($user->status < 1) {
1334 $langs->loadLangs(array(
"errors",
"other"));
1335 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1340 $user->loadRights();
1343dol_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);
1348if (!defined(
'NOREQUIRETRAN')) {
1350 $langs->loadLangs(array(
'main',
'dict'));
1356 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1357 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1358 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1360 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1361 $conf->browser->stringforfirstkey .=
' ALT +';
1362 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1363 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1365 $conf->browser->stringforfirstkey .=
' CTL +';
1371$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1372$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1373$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1385if (empty(
$conf->browser->firefox)) {
1386 define(
'ROWS_1', 1);
1387 define(
'ROWS_2', 2);
1388 define(
'ROWS_3', 3);
1389 define(
'ROWS_4', 4);
1390 define(
'ROWS_5', 5);
1391 define(
'ROWS_6', 6);
1392 define(
'ROWS_7', 7);
1393 define(
'ROWS_8', 8);
1394 define(
'ROWS_9', 9);
1396 define(
'ROWS_1', 0);
1397 define(
'ROWS_2', 1);
1398 define(
'ROWS_3', 2);
1399 define(
'ROWS_4', 3);
1400 define(
'ROWS_5', 4);
1401 define(
'ROWS_6', 5);
1402 define(
'ROWS_7', 6);
1403 define(
'ROWS_8', 7);
1404 define(
'ROWS_9', 8);
1407$heightforframes = 52;
1410if (!defined(
'NOREQUIREMENU')) {
1411 if (empty($user->socid)) {
1419 $file_menu =
$conf->standard_menu;
1420 if (
GETPOST(
'menu',
'alpha')) {
1421 $file_menu =
GETPOST(
'menu',
'alpha');
1424 if (!class_exists(
'MenuManager')) {
1426 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1427 foreach ($dirmenus as $dirmenu) {
1429 if (class_exists(
'MenuManager')) {
1433 if (!class_exists(
'MenuManager')) {
1434 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1435 $file_menu =
'eldy_menu.php';
1436 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1440 $menumanager =
new MenuManager(
$db, empty($user->socid) ? 0 : 1);
1442 $menumanager->loadMenu();
1445if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1446 $message =
GETPOST(
'seteventmessages',
'alpha');
1447 $messages = explode(
',', $message);
1448 foreach ($messages as $key => $msg) {
1449 $tmp = explode(
':', $msg);
1456if (!function_exists(
"llxHeader")) {
1480 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1482 global
$conf, $hookmanager;
1484 $parameters = array(
1486 'title' => & $title,
1487 'help_url' => & $help_url,
1488 'target' => & $target,
1489 'disablejs' => & $disablejs,
1490 'disablehead' => & $disablehead,
1491 'arrayofjs' => & $arrayofjs,
1492 'arrayofcss' => & $arrayofcss,
1493 'morequerystring' => & $morequerystring,
1494 'morecssonbody' => & $morecssonbody,
1495 'replacemainareaby' => & $replacemainareaby,
1496 'disablenofollow' => & $disablenofollow,
1497 'disablenoindex' => & $disablenoindex
1500 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1502 print $hookmanager->resPrint;
1507 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1509 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1511 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1513 if ($mainmenu !=
'website') {
1514 $tmpcsstouse = $morecssonbody;
1519 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1522 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1523 $tmpcsstouse .=
' dol_openinpopup';
1526 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1529 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1530 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1533 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1534 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1538 if ($replacemainareaby) {
1539 print $replacemainareaby;
1559 if ($contenttype !=
'none') {
1560 if ($contenttype ==
'text/html') {
1561 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1563 header(
"Content-Type: ".$contenttype);
1570 header(
"X-Content-Type-Options: nosniff");
1573 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1574 header(
"X-Frame-Options: SAMEORIGIN");
1576 header(
"X-Frame-Options: ALLOWALL");
1580 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1581 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1582 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1583 header(
'Vary: Origin');
1590 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1605 if (!is_object($hookmanager)) {
1606 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1609 $hookmanager->initHooks(array(
"main"));
1611 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1612 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1614 $contentsecuritypolicy = $hookmanager->resPrint;
1616 $contentsecuritypolicy .= $hookmanager->resPrint;
1620 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1622 if (!empty($contentsecuritypolicy)) {
1623 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1626 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1630 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1645 if (!is_object($hookmanager)) {
1646 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1649 $hookmanager->initHooks(array(
"main"));
1651 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1652 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1654 $contentsecuritypolicy = $hookmanager->resPrint;
1656 $contentsecuritypolicy .= $hookmanager->resPrint;
1660 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1662 if (!empty($contentsecuritypolicy)) {
1663 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1666 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1673 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1675 if (!empty($referrerpolicy)) {
1676 header(
"Referrer-Policy: ".$referrerpolicy);
1679 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1683 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1686 header(
"Strict-Transport-Security: ".$sts);
1689 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1693 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1696 header(
"Permissions-Policy: ".$pp);
1699 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1703 if ($forcenocache) {
1704 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1726function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1732 if (empty(
$conf->css)) {
1733 $conf->css =
'/theme/eldy/style.css.php';
1736 print
'<!doctype html>'.
"\n";
1738 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1741 if (empty($disablehead)) {
1742 if (!is_object($hookmanager)) {
1743 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1746 $hookmanager->initHooks(array(
"main"));
1748 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1752 if (
GETPOST(
'dol_basehref',
'alpha')) {
1753 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1757 print
'<meta charset="utf-8">'.
"\n";
1758 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1759 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1760 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1761 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1762 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1764 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1767 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1768 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1769 if (!empty(
$mysoc->logo_squarred_mini)) {
1770 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1775 if (empty(
$conf->dol_use_jmobile)) {
1776 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1777 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1781 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1782 $parameters = array(
'manifest' => $manifest);
1783 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1785 $manifest = $hookmanager->resPrint;
1787 $manifest .= $hookmanager->resPrint;
1789 if (!empty($manifest)) {
1790 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1794 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1799 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1803 $appli = constant(
'DOL_APPLICATION_TITLE');
1806 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1819 $parameters = array(
'title' => $titletoshow);
1820 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1822 $titletoshow = $hookmanager->resPrint;
1824 $titletoshow .= $hookmanager->resPrint;
1833 $ext =
'version='.GETPOSTINT(
'version');
1836 if (
GETPOST(
'dol_resetcache')) {
1837 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1841 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1843 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1845 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1848 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1851 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1854 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1857 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1860 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1864 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1867 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1878 'DOL_VERSION' => DOL_VERSION,
1879 'DOL_URL_ROOT' => DOL_URL_ROOT,
1882 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1884 'dolibarr-context.umd.js',
1885 'dolibarr-tool.seteventmessage.js'
1888 if (! defined(
'NOREQUIRETRAN')) {
1890 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1891 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1892 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1893 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1897 foreach ($jsContextFiles as $jsContextFile) {
1898 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1902 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1908 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1909 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1912 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1913 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1914 if (!defined(
'DISABLE_JQUERY_UI')) {
1915 $jquerytheme =
'base';
1919 if (constant(
'JS_JQUERY_UI')) {
1920 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1922 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1925 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1926 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1928 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1930 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1934 if (!defined(
'DISABLE_FONT_AWSOME')) {
1935 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1936 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1937 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1943 if (!empty(
$conf->modules_parts[
'theme'])) {
1944 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1947 $themesubdir = $reldir;
1953 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1954 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1955 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1967 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1968 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1972 if (!empty(
$conf->modules_parts[
'css'])) {
1973 $arraycss = (array)
$conf->modules_parts[
'css'];
1974 foreach ($arraycss as $modcss => $filescss) {
1975 $filescss = (array) $filescss;
1976 foreach ($filescss as $cssfile) {
1977 if (empty($cssfile)) {
1978 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1982 if ($urlforcss && $urlforcss !=
'/') {
1983 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1985 if (!preg_match(
'/\.css$/i', $cssfile)) {
1990 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1996 if (is_array($arrayofcss)) {
1997 foreach ($arrayofcss as $cssfile) {
1998 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1999 $urltofile = $cssfile;
2003 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2005 if (!preg_match(
'/\.css$/i', $cssfile)) {
2015 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2019 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
2021 print
'<!-- Includes JS for JQuery -->'.
"\n";
2022 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2023 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
2025 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
2027 if (!defined(
'DISABLE_JQUERY_UI')) {
2028 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2029 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2031 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2035 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2036 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
2039 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2040 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2044 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2066 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2069 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2071 if (!defined(
'DISABLE_MULTISELECT')) {
2072 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2076 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2079 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2080 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2081 $jsckeditor =
'ckeditor.js';
2082 if (constant(
'JS_CKEDITOR')) {
2084 $pathckeditor = constant(
'JS_CKEDITOR');
2086 print
'<script nonce="'.getNonce().
'">';
2087 print
'/* enable ckeditor by main.inc.php */';
2088 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2089 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2090 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2091 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";
2092 print
'</script>'.
"\n";
2093 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2095 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2096 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2098 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2100 print
'</script>'.
"\n";
2104 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2105 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2106 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2107 $jstinymce =
'tinymce.min.js';
2108 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2109 $pathtinymce = constant(
'JS_TINYMCE');
2111 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2112 print
'<script nonce="'.getNonce().
'">';
2113 print
'/* enable tinymce by main.inc.php */';
2114 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2115 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2116 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";
2117 print
'</script>'.
"\n";
2118 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2119 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2123 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2124 $enablebrowsernotif =
false;
2126 $enablebrowsernotif =
true;
2128 if (
$conf->browser->layout ==
'phone') {
2129 $enablebrowsernotif =
false;
2131 if ($enablebrowsernotif) {
2132 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2133 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2138 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2139 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2140 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2145 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2146 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2150 if (!empty(
$conf->modules_parts[
'js'])) {
2151 $arrayjs = (array)
$conf->modules_parts[
'js'];
2152 foreach ($arrayjs as $modjs => $filesjs) {
2153 $filesjs = (array) $filesjs;
2154 foreach ($filesjs as $jsfile) {
2157 if ($urlforjs && $urlforjs !=
'/') {
2158 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2159 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2161 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2167 if (is_array($arrayofjs)) {
2168 print
'<!-- Includes JS added by page -->'.
"\n";
2169 foreach ($arrayofjs as $jsfile) {
2170 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2171 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2173 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2182 if (file_exists($theme_js)) {
2183 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2187 if (!empty($head)) {
2194 $parameters = array();
2195 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2196 print $hookmanager->resPrint;
2198 print
"</head>\n\n";
2201 $conf->headerdone = 1;
2221function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2223 global $user,
$conf, $langs,
$db, $form;
2224 global $dolibarr_main_authentication, $dolibarr_main_demo;
2225 global $hookmanager, $menumanager;
2230 $hookmanager->initHooks(array(
'toprightmenu'));
2235 if (empty(
$conf->headerdone)) {
2236 $disablenofollow = 0;
2237 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2238 print
'<body id="mainbody">';
2244 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2245 if (!isset($form) || !is_object($form)) {
2246 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2250 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2252 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2255 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2257 $menumanager->atarget = $target;
2259 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2263 $appli = constant(
'DOL_APPLICATION_TITLE');
2266 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2268 $appli .=
" ".DOL_VERSION;
2272 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2276 $logouthtmltext =
'';
2278 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2279 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2280 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2281 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2282 $logouttext .=
'</a>';
2284 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2285 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2290 print
'<div class="login_block usedropdown">'.
"\n";
2294 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2297 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2320 $toprightmenu .=
'</div>';
2322 $toprightmenu .=
'</div>'.
"\n";
2326 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2329 $parameters = array();
2330 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2331 if (is_numeric($result)) {
2333 $toprightmenu .= $hookmanager->resPrint;
2335 $toprightmenu = $hookmanager->resPrint;
2338 $toprightmenu .= $result;
2343 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2345 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2348 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2355 if (isset($_POST) && is_array($_POST)) {
2356 foreach ($_POST as $key => $value) {
2357 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2358 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2361 if (!is_array($value)) {
2362 if ($value !==
'') {
2363 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2366 foreach ($value as $value2) {
2367 if (($value2 !==
'') && (!is_array($value2))) {
2368 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2374 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2375 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2377 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2380 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2385 $langs->load(
"help");
2392 if (empty($helppagename)) {
2393 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2395 $helppresent =
'helppresent';
2400 $helpbaseurl = $arrayres[
'helpbaseurl'];
2401 $helppage = $arrayres[
'helppage'];
2402 $mode = $arrayres[
'mode'];
2405 if ($helpbaseurl && $helppage) {
2407 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2408 if ($mode ==
'wiki') {
2409 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2411 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2413 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2416 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2417 if ($mode ==
'wiki') {
2419 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2422 $text .= sprintf($helpbaseurl, $helppage);
2425 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2426 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2429 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2434 $langs->load(
'admin');
2435 $appli .=
'<br>'.$langs->trans(
"Database").
': '.
$db->database_name;
2441 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2443 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2448 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2451 $toprightmenu .=
'</div>';
2455 $toprightmenu .=
'<div class="login_block_user">';
2458 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2463 $toprightmenu .=
'</div>';
2465 $toprightmenu .=
'</div>'.
"\n";
2468 print $toprightmenu;
2475 print
'<div style="clear: both;"></div>';
2476 print
"<!-- End top horizontal menu -->\n\n";
2479 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2480 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2495 global $dolibarr_main_authentication, $dolibarr_main_demo;
2496 global $menumanager, $form;
2499 if (
$conf->browser->name ==
'textbrowser') {
2503 $langs->load(
'companies');
2505 $userImage = $userDropDownImage =
'';
2506 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2507 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2508 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2510 $nophoto =
'/public/theme/common/user_anonymous.png';
2511 if ($user->gender ==
'man') {
2512 $nophoto =
'/public/theme/common/user_man.png';
2514 if ($user->gender ==
'woman') {
2515 $nophoto =
'/public/theme/common/user_woman.png';
2518 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2520 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2524 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2525 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2529 while ($idprofcursor < 10) {
2531 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2532 if ($idprofcursor == 1) {
2533 $constkeyforprofid =
'MAIN_INFO_SIREN';
2535 if ($idprofcursor == 2) {
2536 $constkeyforprofid =
'MAIN_INFO_SIRET';
2538 if ($idprofcursor == 3) {
2539 $constkeyforprofid =
'MAIN_INFO_APE';
2541 if ($idprofcursor == 4) {
2542 $constkeyforprofid =
'MAIN_INFO_RCS';
2544 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2554 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2556 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2558 $dropdownBody .=
'</div>';
2560 $dropdownBody .=
'<br>';
2561 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2562 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2565 if (!empty($user->admin)) {
2566 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2569 if (!empty($user->socid)) {
2571 $thirdpartystatic->fetch($user->socid);
2572 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2573 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2575 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2576 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2577 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2578 $dropdownBody .=
'<br>';
2580 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2581 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2583 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2585 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2586 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2587 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2588 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2590 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2592 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2594 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2595 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2596 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2601 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2602 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2603 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2604 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2605 if (!empty($_SESSION[
"disablemodules"])) {
2606 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2608 $dropdownBody .=
'</div>';
2611 $parameters = array(
'user' => $user,
'langs' => $langs);
2612 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2613 if (is_numeric($result)) {
2615 $dropdownBody .= $hookmanager->resPrint;
2617 $dropdownBody = $hookmanager->resPrint;
2621 if (empty($urllogout)) {
2622 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2626 $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>';
2627 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2628 $jsonopen =
"closeTopMenuLoginDropdown()";
2629 $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');
2630 $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>';
2632 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2633 if (!empty($user->admin)) {
2634 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2638 $appli = constant(
'DOL_APPLICATION_TITLE');
2641 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2643 $appli .=
" ".DOL_VERSION;
2647 $btnUser =
'<!-- div for user link -->
2648 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2649 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2650 '.$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>' :
'').
'
2652 <div class="dropdown-menu">
2654 <div class="user-header">
2655 '.$userDropDownImage.
'
2657 '.$profilName.
'<br>';
2659 if ($user->datelastlogin) {
2660 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2661 if ($user->datepreviouslogin) {
2662 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2665 $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>';
2666 if ($user->datepreviouslogin) {
2667 $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>';
2675 <!-- Menu Body user-->
2676 <div class="user-body">'.$dropdownBody.
'</div>
2679 <div class="user-footer">
2680 <div class="pull-left">
2683 <div class="pull-left">
2684 '.$virtuelcardLink.
'
2686 <div class="pull-right">
2689 <div class="clearboth"></div>
2695 $btnUser =
'<!-- div for user link text browser -->
2696 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2697 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2698 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2703 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2705 <!-- Code to show/hide the user drop-down -->
2707 function closeTopMenuLoginDropdown() {
2708 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2710 jQuery("#topmenu-login-dropdown").removeClass("open");
2712 jQuery(document).ready(function() {
2713 jQuery(document).on("click", function(event) {
2714 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2715 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2716 console.log("click close login - we click outside");
2717 // Hide the dropdown.
2718 closeTopMenuLoginDropdown();
2726 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2727 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2728 event.preventDefault();
2729 jQuery("#topmenu-login-dropdown").toggleClass("open");
2732 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2733 console.log("Click on #topmenulogincompanyinfo-btn");
2734 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2735 jQuery("#topmenuloginmoreinfo").slideToggle();
2737 jQuery("#topmenulogincompanyinfo").slideToggle();
2740 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2741 console.log("Click on #topmenuloginmoreinfo-btn");
2742 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2743 jQuery("#topmenulogincompanyinfo").slideToggle();
2745 jQuery("#topmenuloginmoreinfo").slideToggle();
2767 global
$conf, $langs, $user;
2775 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2779 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2783 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css">';
2787 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2788 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2789 <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>
2795 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2796 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2802 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2803 $aijsver = @filemtime($aijsfile);
2804 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2806 $html .=
'<script nonce="'.getNonce().
'">
2807 jQuery(document).ready(function() {
2808 jQuery(document).on("click", function(event) {
2809 if (jQuery("#topmenu-ai-popover").hasClass("open")) {
2810 if (!$(event.target).closest("#topmenu-ai-toggle").length && !$(event.target).closest("#topmenu-ai-popover").length) {
2811 console.log("click close ai dropdown - we click outside");
2812 // Hide the dropdown.
2813 jQuery("#topmenu-ai-popover").removeClass("open");
2820 var toggle = document.getElementById("topmenu-ai-toggle");
2821 var popover = document.getElementById("topmenu-ai-popover");
2822 if (!toggle || !popover) { return; }
2823 var body = popover.querySelector(".ai-popover-body");
2825 var loading = false;
2827 function positionPopover() {
2828 var top = document.getElementById("id-top");
2829 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2830 popover.style.setProperty("--ai-popover-top", anchor + "px");
2833 function loadChat() {
2834 if (loaded || loading) { return; }
2836 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2837 .then(function (resp) {
2838 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2841 .then(function (htmlcontent) {
2842 body.innerHTML = htmlcontent;
2843 return import("'.
dol_escape_js($aijsurl).
'").then(function (mod) {
2844 mod.initAiAssistant(body.querySelector(".ai-chat-container"));
2851 .catch(function (e) {
2852 console.error("AI Assistant popover load failed", e);
2853 body.innerHTML = "<div class=\"ai-popover-loading\">'.
dol_escape_js($langs->trans(
'Error')).
'</div>";
2855 .finally(function () { loading = false; });
2858 function focusInput() {
2859 var input = body.querySelector("#user-input");
2860 if (input) { input.focus(); }
2863 toggle.addEventListener("click", function (event) {
2864 console.log("Click on #topmenu-ai-toggle");
2865 event.preventDefault();
2866 // position:fixed can be hijacked by a transformed ancestor: hosting the
2867 // panel directly under <body> guarantees viewport coordinates.
2868 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2870 var isOpen = popover.classList.toggle("open");
2873 if (loaded) { focusInput(); }
2877 popover.addEventListener("click", function (event) {
2878 console.log("Click on #topmenu-ai-popover");
2879 var closeBtn = event.target.closest("#ai-close-btn");
2880 var expandBtn = event.target.closest("#ai-expand-btn");
2882 popover.classList.remove("open");
2883 } else if (expandBtn) {
2884 var expanded = popover.classList.toggle("expanded");
2885 var icon = expandBtn.querySelector("i");
2886 if (icon) { icon.className = expanded ? "fa fa-compress-alt" : "fa fa-expand-alt"; }
2887 expandBtn.title = expanded ? (expandBtn.dataset.titleReduce || "") : (expandBtn.dataset.titleExpand || "");
2891 document.addEventListener("keydown", function (event) {
2892 if (event.key === "Escape" && popover.classList.contains("open")) {
2893 popover.classList.remove("open");
2910 global
$conf, $langs;
2919 if (!empty(
$conf->use_javascript_ajax)) {
2920 $html .=
'<!-- div for quick add link -->
2921 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2922 <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>
2925 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2927 <!-- Code to show/hide the user drop-down for the quick add -->
2928 <script nonce="'.getNonce().
'">
2929 jQuery(document).ready(function() {
2930 jQuery(document).on("click", function(event) {
2931 if (jQuery("#topmenu-quickadd-dropdown").hasClass("open")) {
2932 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2933 console.log("click close quick add - we click outside");
2934 // Hide the dropdown.
2935 $("#topmenu-quickadd-dropdown").removeClass("open");
2939 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2940 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2941 openQuickAddDropDown(event);
2945 $(document).keydown(function(event){
2947 if (ostype ===
"macintosh") {
2948 if ( event.which === 65 && event.ctrlKey ) {
2949 console.log(\
'control + a : trigger open quick add dropdown\');
2950 openQuickAddDropDown(event);
2953 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2954 console.log(\'control + shift + a : trigger open quick add dropdown\');
2955 openQuickAddDropDown(event);
2960 var openQuickAddDropDown = function(event) {
2961 event.preventDefault();
2962 $("#topmenu-quickadd-dropdown").toggleClass("open");
2982 global
$conf, $langs;
2991 if (!empty(
$conf->use_javascript_ajax)) {
2992 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2997 $html .=
'<!-- div for link to upload file -->
2998 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2999 <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>
3015 global $user, $langs, $hookmanager;
3020 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
3021 "title" =>
"MenuNewMember@members",
3022 "name" =>
"Adherent@members",
3023 "picto" =>
"object_member",
3024 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3028 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3029 "title" =>
"MenuNewThirdParty@companies",
3030 "name" =>
"ThirdParty@companies",
3031 "picto" =>
"object_company",
3032 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3036 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3037 "title" =>
"NewContactAddress@companies",
3038 "name" =>
"Contact@companies",
3039 "picto" =>
"object_contact",
3040 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3044 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3045 "title" =>
"NewPropal@propal",
3046 "name" =>
"Proposal@propal",
3047 "picto" =>
"object_propal",
3048 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3053 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3054 "title" =>
"NewOrder@orders",
3055 "name" =>
"Order@orders",
3056 "picto" =>
"object_order",
3057 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3061 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3062 "title" =>
"NewBill@bills",
3063 "name" =>
"Bill@bills",
3064 "picto" =>
"object_bill",
3065 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3069 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3070 "title" =>
"NewContractSubscription@contracts",
3071 "name" =>
"Contract@contracts",
3072 "picto" =>
"object_contract",
3073 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3077 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3078 "title" =>
"SupplierProposalNew@supplier_proposal",
3079 "name" =>
"SupplierProposal@supplier_proposal",
3080 "picto" =>
"supplier_proposal",
3081 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3085 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3086 "title" =>
"NewSupplierOrderShort@orders",
3087 "name" =>
"SupplierOrder@orders",
3088 "picto" =>
"supplier_order",
3089 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3093 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3094 "title" =>
"NewBill@bills",
3095 "name" =>
"SupplierBill@bills",
3096 "picto" =>
"supplier_invoice",
3097 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3101 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3102 "title" =>
"NewTicket@ticket",
3103 "name" =>
"Ticket@ticket",
3104 "picto" =>
"ticket",
3105 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3109 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3110 "title" =>
"NewIntervention@interventions",
3111 "name" =>
"Intervention@interventions",
3112 "picto" =>
"intervention",
3113 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3117 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3118 "title" =>
"NewProduct@products",
3119 "name" =>
"Product@products",
3120 "picto" =>
"object_product",
3121 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3125 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3126 "title" =>
"NewService@products",
3127 "name" =>
"Service@products",
3128 "picto" =>
"object_service",
3129 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3133 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3134 "title" =>
"StockTransferNew@stocks",
3135 "name" =>
"StockTransfer@stocks",
3137 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3141 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3142 "title" =>
"AddUser@users",
3143 "name" =>
"User@users",
3145 "activation" => $user->hasRight(
"user",
"user",
"write"),
3151 $dropDownQuickAddHtml =
'';
3155 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3157 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3160 $parameters = array();
3161 $hook_items = $items;
3162 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3163 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3164 if ($reshook == 0) {
3165 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3167 $items = $hookmanager->resArray;
3171 $position = array();
3172 foreach ($items[
'items'] as $key => $row) {
3173 $position[$key] = $row[
'position'];
3175 $array1_sort_order = SORT_ASC;
3176 array_multisort($position, $array1_sort_order, $items[
'items']);
3179 foreach ($items[
'items'] as $item) {
3180 if (!$item[
'activation']) {
3183 $langs->load(explode(
'@', $item[
'title'])[1]);
3184 $langs->load(explode(
'@', $item[
'name'])[1]);
3185 $dropDownQuickAddHtml .=
'
3186 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3187 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3192 $dropDownQuickAddHtml .=
'</div>';
3194 $dropDownQuickAddHtml .=
'</div>';
3196 return $dropDownQuickAddHtml;
3206 global $langs,
$conf, $user;
3211 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3220 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3221 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3222 $langs->load(
"bookmarks");
3225 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3229 $html .=
'<!-- div for bookmark link -->
3230 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3231 <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>
3232 <div class="dropdown-menu">
3238 <!-- Code to show/hide the bookmark drop-down -->
3240 jQuery(document).ready(function() {
3241 jQuery(document).on("click", function(event) {
3242 if (jQuery("#topmenu-bookmark-dropdown").hasClass("open")) {
3243 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3244 console.log("close bookmark dropdown - we click outside");
3246 $("#topmenu-bookmark-dropdown").removeClass("open");
3251 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3252 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3253 openBookMarkDropDown(event);
3257 jQuery(document).keydown(function(event) {
3258 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3259 if (ostype ===
"macintosh") {
3260 if ( event.which === 66 && event.ctrlKey ) {
3261 console.log(
"Click on control + b : trigger open bookmark dropdown");
3262 openBookMarkDropDown(event);
3265 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3266 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3267 openBookMarkDropDown(event);
3272 var openBookMarkDropDown =
function(event) {
3273 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3274 event.preventDefault();
3275 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3276 jQuery(
"#top-bookmark-search-input").focus();
3292function top_menu_search()
3294 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3298 $usedbyinclude = 1; // Used by selectsearchbox.php
3299 $arrayresult = array();
3300 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3302 $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">
';
3304 $defaultAction = '';
3305 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3306 // Menu with all searchable items
3307 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3308 foreach ($arrayresult as $keyItem => $item) {
3309 if (empty($defaultAction)) {
3310 $defaultAction = $item['url
'];
3312 $buttonList .= '<
button class=
"dropdown-item global-search-item '.(empty($conf->dol_optimize_smallscreen) ? 'tdoverflowmax400' : 'tdoverflowmax300').'" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3313 $buttonList .= $item['text
'];
3314 $buttonList .= '</
button>
';
3316 $buttonList .= '</div>
';
3318 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3321 <!-- search input -->
3322 <div
class=
"dropdown-header search-dropdown-header">
3328 <!--
Menu Body search -->
3329 <div
class=
"dropdown-body search-dropdown-body">
3334 $dropDownHtml .= '</form>
';
3336 $html .= '<!-- div
for Global Search -->
3337 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3338 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3339 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3341 <div
class=
"dropdown-menu dropdown-search">
3347 <!-- Code to show/hide the
user drop-down -->
3349 jQuery(document).ready(
function() {
3352 jQuery(
"#top-global-search-input").keydown(
function (e) {
3353 if (e.keyCode == 13 || e.keyCode == 40) {
3354 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3355 if (inputs[inputs.index(this) + 1] != null) {
3356 console.log(
"Force focus after keydow on #top-global-search-input");
3357 inputs[inputs.index(this) + 1].focus();
3358 if (e.keyCode == 13){
3359 inputs[inputs.index(this) + 1].trigger(
"click");
3369 jQuery(document).keydown(
function(e) {
3371 var $focused = $(
":focus");
3372 if($focused.length && $focused.hasClass(
"global-search-item")){
3375 if (e.keyCode == 38) {
3377 console.log(
"Force focus after keycode 38");
3378 $focused.prev().focus();
3382 if (e.keyCode == 40) {
3384 console.log(
"Force focus after keycode 40");
3385 $focused.next().focus();
3392 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3393 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3394 jQuery(
"#top-menu-action-search").submit();
3398 jQuery(document).on(
"click",
function(event) {
3399 if (jQuery(
"#topmenu-global-search-dropdown").hasClass(
"open")) {
3400 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3401 console.log(
"click close search - we click outside");
3403 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3409 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3410 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3411 openGlobalSearchDropDown();
3415 jQuery(document).keydown(
function(e){
3416 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3417 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3418 openGlobalSearchDropDown();
3420 if ( e.which === 70 && e.alKey ) {
3421 console.log(\'alt + f : trigger open global-search dropdown\');
3422 openGlobalSearchDropDown();
3426 var openGlobalSearchDropDown = function() {
3427 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3428 jQuery("#top-global-search-input").focus();
3452function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3454 global $user,
$conf, $langs,
$db, $form;
3455 global $hookmanager, $menumanager;
3459 if (!empty($menu_array_before)) {
3460 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);
3463 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3465 $hookmanager->initHooks(array(
'leftblock'));
3467 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3470 if (!is_object($form)) {
3476 if (
$conf->browser->layout ==
'phone') {
3477 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3481 $arrayresult = array();
3482 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3486 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3487 $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');
3489 if (is_array($arrayresult)) {
3491 foreach ($arrayresult as $key => $val) {
3492 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3498 $parameters = array(
'searchform' => $searchform);
3499 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3500 if (empty($reshook)) {
3501 $searchform .= $hookmanager->resPrint;
3503 $searchform = $hookmanager->resPrint;
3508 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3509 $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>';
3511 $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>';
3512 $searchform .=
'<script>
3513 jQuery(document).ready(function () {
3514 jQuery("#divsearchforms1").click(function(){
3515 jQuery("#divsearchforms2").toggle();
3519 $searchform .=
'</div>';
3523 $searchform .=
'<script>
3524 jQuery(document).keydown(function(e){
3525 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3526 console.log(\'control + shift + f : trigger open global-search dropdown\');
3527 openGlobalSearchDropDown();
3529 if( (e.which === 83 || e.which === 115) && e.altKey ){
3530 console.log(\'alt + s : trigger open global-search dropdown\');
3531 openGlobalSearchDropDown();
3535 var openGlobalSearchDropDown = function() {
3536 jQuery("#searchselectcombo").select2(\'open\');
3542 print
'<!-- Begin left menu -->'.
"\n";
3544 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3548 $menumanager->menu_array = $menu_array_before;
3550 $menumanager->menu_array_after = $menu_array_after;
3553 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3556 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3562 print
"<!-- Begin Help Block-->\n";
3563 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3567 $doliurl =
'https://www.dolibarr.org';
3569 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3570 $doliurl =
'https://www.dolibarr.fr';
3572 if (preg_match(
'/es/i', $langs->defaultlang)) {
3573 $doliurl =
'https://www.dolibarr.es';
3575 if (preg_match(
'/de/i', $langs->defaultlang)) {
3576 $doliurl =
'https://www.dolibarr.de';
3578 if (preg_match(
'/it/i', $langs->defaultlang)) {
3579 $doliurl =
'https://www.dolibarr.it';
3581 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3582 $doliurl =
'https://www.dolibarr.gr';
3585 $appli = constant(
'DOL_APPLICATION_TITLE');
3588 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3590 $appli .=
" ".DOL_VERSION;
3598 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3600 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3602 print
'<span class="help">';
3610 print
'</div>'.
"\n";
3615 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3618 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3619 $bugbaseurl .=
'&title=';
3620 $bugbaseurl .= urlencode(
"Bug: ");
3621 $bugbaseurl .=
'&body=';
3622 $bugbaseurl .= urlencode(
"# Instructions\n");
3623 $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");
3624 $bugbaseurl .= urlencode(
"*Please:*\n");
3625 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3626 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3627 $bugbaseurl .= urlencode(
"\n");
3628 $bugbaseurl .= urlencode(
"\n");
3629 $bugbaseurl .= urlencode(
"# Bug\n");
3630 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3631 $bugbaseurl .= urlencode(
"\n");
3632 $bugbaseurl .= urlencode(
"## Environment\n");
3633 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3634 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3635 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3636 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3637 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.
$db->getVersion().
"\n");
3638 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3639 $bugbaseurl .= urlencode(
"\n");
3640 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3641 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3642 $bugbaseurl .= urlencode(
"\n");
3643 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3644 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3645 $bugbaseurl .= urlencode(
"\n");
3646 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3647 $bugbaseurl .= urlencode(
"[*Files*]\n");
3648 $bugbaseurl .= urlencode(
"\n");
3650 $bugbaseurl .= urlencode(
"\n");
3651 $bugbaseurl .= urlencode(
"## Report\n");
3659 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3660 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3661 if (empty($reshook)) {
3662 $bugbaseurl .= $hookmanager->resPrint;
3664 $bugbaseurl = $hookmanager->resPrint;
3667 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3668 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3673 print
"<!-- End Help Block-->\n";
3678 print
"<!-- End left menu -->\n";
3682 $parameters = array();
3683 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3684 print $hookmanager->resPrint;
3686 print
'</div></div> <!-- End side-nav id-left -->';
3690 print
'<!-- Begin right area -->'.
"\n";
3692 if (empty($leftmenuwithoutmainarea)) {
3706 global
$conf, $langs, $hookmanager;
3708 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3709 print
'<div id="id-right">';
3714 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3716 $hookmanager->initHooks(array(
'main'));
3717 $parameters = array();
3718 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3719 print $hookmanager->resPrint;
3722 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3727 $parameters = array();
3728 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3729 if (empty($reshook)) {
3730 print
'<!-- Begin show mysoc info header -->'.
"\n";
3731 print
'<div id="mysoc-info-header">'.
"\n";
3732 print
'<table class="centpercent div-table-responsive">'.
"\n";
3734 print
'<tr><td rowspan="0" class="width20p">';
3736 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'))).
'">';
3738 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3739 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3751 print
'</table>'.
"\n";
3752 print
'</div>'.
"\n";
3753 print
'<!-- End show mysoc info header -->'.
"\n";
3772 if (preg_match(
'/^http/i', $helppagename)) {
3774 $helpbaseurl =
'%s';
3775 $helppage = $helppagename;
3780 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3781 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3782 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3783 $helppage = $reg[1];
3786 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3787 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3788 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3789 $helppage = $reg[1];
3792 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3793 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3794 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3795 $helppage = $reg[1];
3798 if (empty($helppage)) {
3799 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3800 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3801 $helppage = $reg[1];
3806 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3826function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3828 global $langs, $user;
3831 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3832 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3833 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3834 if ($showtitlebefore) {
3835 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3837 $ret .=
'<div class="tagtd">';
3838 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3839 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3840 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3841 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3842 $ret .=
' placeholder="'.strip_tags($title).
'"';
3843 $ret .= ($autofocus ?
' autofocus' :
'');
3844 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3845 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3846 $ret .=
'<span class="fa fa-search"></span>';
3847 $ret .=
'</button>';
3849 $ret .=
"</form>\n";
3854if (!function_exists(
"llxFooter")) {
3868 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3871 global $delayedhtmlcontent;
3872 global $contextpage, $page, $limit, $mode;
3873 global $dolibarr_distrib;
3875 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3879 $parameters = array();
3880 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3881 if (empty($reshook)) {
3882 $llxfooter .= $hookmanager->resPrint;
3883 } elseif ($reshook > 0) {
3884 $llxfooter = $hookmanager->resPrint;
3895 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3897 foreach ($user->lastsearch_values_tmp as $key => $val) {
3898 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3899 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3900 if (empty($val[
'sortfield'])) {
3901 unset($val[
'sortfield']);
3903 if (empty($val[
'sortorder'])) {
3904 unset($val[
'sortorder']);
3906 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3907 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3908 unset($_SESSION[
'lastsearch_values_'.$key]);
3914 $relativepathstring = $_SERVER[
"PHP_SELF"];
3916 if (constant(
'DOL_URL_ROOT')) {
3917 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3919 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3920 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3921 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3922 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3923 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3924 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3925 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3927 if (!empty($contextpage)) {
3928 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3930 if (!empty($page) && $page > 0) {
3931 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3933 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3934 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3936 if (!empty($mode)) {
3937 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3940 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3941 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3942 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3943 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3949 if (
$conf->use_javascript_ajax) {
3950 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3951 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3954 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3955 print
'<div class="error">'.$msg.
'</div>';
3963 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3965 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3966 print
'</div> <!-- End div id-right -->'.
"\n";
3969 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3970 print
'</div> <!-- End div id-container -->'.
"\n";
3975 print
'<!-- '.$comment.
' -->'.
"\n";
3980 if (!empty($delayedhtmlcontent)) {
3981 print $delayedhtmlcontent;
3984 if (!empty(
$conf->use_javascript_ajax)) {
3985 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3986 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
4031 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4032 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4035 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
4036 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
4043 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4044 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4047 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
4048 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
4049 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
4052 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4055 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4056 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4057 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
4059 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4061 $arrayofmoredata = array(
4062 'action' =>
'dolibarrping',
4065 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4067 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4070 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4071 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4076 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4082 $forceregistration =
GETPOSTINT(
'forceregistration');
4084 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4085 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4088 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4090 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4093 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4094 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4095 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4098 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4099 || $forceregistration) {
4101 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4102 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4103 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4105 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4107 $arrayofdata = array(
4108 'action' =>
'dolibarrregistration',
4119 'country_code' =>
$mysoc->country_code,
4132 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4135 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4136 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4141 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4185 $parameters = array();
4186 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4188 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...