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)');
226$tmp =
getBrowserInfo((
string) ($_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'];
234if (
$conf->browser->layout ==
'phone') {
235 $conf->dol_no_mouse_hover = 1;
241 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
245if (
GETPOSTINT(
'textbrowser') || (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'textbrowser')) {
246 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
251if (!empty(
$conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
253 if (is_numeric(
$conf->file->main_force_https)) {
254 if (
$conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
255 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
256 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
261 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
265 $newurl =
$conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
270 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
271 header(
"Location: ".$newurl);
274 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);
278if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
279 $listofip = explode(
',', $dolibarr_main_restrict_ip);
281 $user_ip = $_SERVER[
'REMOTE_ADDR'];
282 foreach ($listofip as $ip) {
283 $authorized_ip = trim($ip);
284 if (strpos($authorized_ip,
'/')) {
289 } elseif ($user_ip == $authorized_ip) {
295 print
'Access refused by IP protection. Your detected IP is: '.dol_escape_htmltag($user_ip);
301if (!defined(
'NOREQUIREHTML')) {
302 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
304if (!defined(
'NOREQUIREAJAX')) {
305 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
310 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
311 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
315$checkifupgraderequired =
false;
317 $checkifupgraderequired =
true;
320 $checkifupgraderequired =
true;
322if ($checkifupgraderequired && !defined(
'MAIN_VERSION_DISABLE_DB_CHECK')) {
324 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
325 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
326 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
327 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
329 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
331 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
332 if (php_sapi_name() ===
"cli") {
333 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
335 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
343if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
345 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
347 if (isset($_SESSION[
'newtoken'])) {
348 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
351 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
355 $token = bin2hex(random_bytes(32));
356 $_SESSION[
'newtoken'] = $token;
357 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
365if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
366 $tmpaction =
GETPOST(
'action',
'aZ09');
368 $sensitiveget =
false;
372 $legitimate_actions = array(
388 'presend_addmessage',
394 'validatenewpassword',
397 if (
GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, $legitimate_actions))) {
400 $sensitiveget =
true;
404 $arrayofactiontoforcetokencheck = array(
406 'doprev',
'donext',
'dvprev',
'dvnext',
407 'freezone',
'install',
408 'reopen',
'swapstatut'
410 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
411 $sensitiveget =
true;
414 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
415 $sensitiveget =
true;
422 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
428 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
431 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
432 $langs->loadLangs(array(
"errors",
"install"));
433 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
434 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
436 http_response_code(403);
437 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
438 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);
439 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";
441 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);
442 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";
443 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";
447 print
" into setup).\n";
454 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
457 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);
460 if (!defined(
'NOTOKENRENEWAL')) {
462 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
465 if (isset($_POST[
'id'])) {
466 $savid = ((int) $_POST[
'id']);
469 unset($_GET[
'confirm']);
470 unset($_GET[
'action']);
471 unset($_GET[
'confirmmassaction']);
472 unset($_GET[
'massaction']);
473 unset($_GET[
'token']);
475 $_POST[
'id'] = ((int) $savid);
478 $_GET[
'errorcode'] =
'InvalidToken';
484if (!empty($dolibarr_main_demo)) {
487 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
489 if (!empty($_SESSION[
"disablemodules"])) {
490 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
492 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
493 foreach ($disabled_modules as
$module) {
495 if (empty(
$conf->$module)) {
499 $conf->$module->enabled =
false;
502 foreach ($modulepartkeys as $modulepartkey) {
505 if (
$module ==
'fournisseur') {
506 $conf->supplier_order->enabled = 0;
507 $conf->supplier_invoice->enabled = 0;
508 unset(
$conf->modules[
'supplier_order']);
509 unset(
$conf->modules[
'supplier_invoice']);
517$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
518if (is_array($modulepart) && count($modulepart) > 0) {
520 if (in_array(
$module, $modulepart)) {
526if (is_array($modulepart)) {
537if (!defined(
'NOLOGIN')) {
541 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
542 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
545 if (empty($dolibarr_main_authentication)) {
546 $dolibarr_main_authentication =
'dolibarr';
549 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
550 $dolibarr_auto_user =
'auto';
554 $authmode = explode(
',', $dolibarr_main_authentication);
557 if (!count($authmode)) {
558 $langs->load(
'main');
559 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
566 $resultFetchUser =
'';
568 $dol_authmode =
null;
570 if (!isset($_SESSION[
"dol_login"])) {
572 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
574 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
576 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
577 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
578 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
579 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
580 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
581 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
582 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
583 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
586 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
587 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
588 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
590 if ($dol_hide_topmenu) {
591 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
593 if ($dol_hide_leftmenu) {
594 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
596 if ($dol_optimize_smallscreen) {
597 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
599 if ($dol_no_mouse_hover) {
600 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
602 if ($dol_use_jmobile) {
603 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
605 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
612 $hookmanager->initHooks(array(
'login'));
613 $parameters = array();
614 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
621 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
625 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
629 $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());
630 $fullpathclassfile =
'';
631 foreach ($dirModCaptcha as $dir) {
632 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
633 if ($fullpathclassfile) {
639 if ($fullpathclassfile) {
640 include_once $fullpathclassfile;
644 $classname =
"modCaptcha".ucfirst($captcha);
645 if (class_exists($classname)) {
647 $captchaobj =
new $classname($db,
$conf, $langs, $user);
648 '@phan-var-force ModeleCaptcha $captchaobj';
650 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
651 $ok = $captchaobj->validateCodeAfterLoginSubmit();
653 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
658 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
663 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
670 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
672 $langs->loadLangs(array(
'main',
'errors'));
674 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
678 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
681 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
689 $hookmanager->initHooks(array(
'login'));
690 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
691 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
700 $allowedmethodtopostusername = 3;
701 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
702 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
706 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
707 if (!is_string($usertotest)) {
713 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
717 $goontestloop =
false;
718 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
719 $goontestloop =
true;
721 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
722 $goontestloop =
true;
724 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
725 $goontestloop =
true;
727 if (
GETPOST(
'openid_mode',
'alpha')) {
728 $goontestloop =
true;
730 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
731 $goontestloop =
true;
733 if (!empty($_COOKIE[
'login_dolibarr'])) {
734 $goontestloop =
true;
737 if (!is_object($langs)) {
738 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
741 if (defined(
'MAIN_LANG_DEFAULT')) {
742 $langcode = constant(
'MAIN_LANG_DEFAULT');
744 $langs->setDefaultLang($langcode);
748 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
751 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);
759 if (
GETPOST(
'actionlogin',
'aZ09') ==
'login' && !
GETPOST(
'afteroauthloginreturn',
'alphanohtml', 1) &&
GETPOST(
'password',
'password', 1)) {
760 dol_syslog(
"--- Login submission with credentials in the query string refused for ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
761 $langs->loadLangs(array(
'main',
'errors'));
762 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginMustBePostMethod");
769 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
772 $oauthmodetotestarray = array(
'google');
773 foreach ($oauthmodetotestarray as $oauthmodetotest) {
774 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
776 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
779 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);
780 foreach ($authmode as $tmpkey => $tmpval) {
781 if ($tmpval == $oauthmodetotest.
'oauth') {
782 unset($authmode[$tmpkey]);
791 if ($login ===
'--bad-login-validity--') {
796 $dol_authmode =
$conf->authmode;
798 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
799 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
800 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
801 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
802 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
805 $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"];
806 $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"];
807 if ($dol_dst_first && $dol_dst_second) {
808 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
812 if ($datenow >= $datefirst && $datenow < $datesecond) {
816 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
817 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
822 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
824 $langs->loadLangs(array(
'main',
'errors'));
828 if (empty($_SESSION[
"dol_loginmesg"])) {
829 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
833 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
836 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
844 $hookmanager->initHooks(array(
'login'));
845 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
846 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
856 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
858 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);
859 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
864 return 'ERROR_NOT_LOGGED';
866 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
867 http_response_code(401);
876 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
878 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
879 dol_syslog(
'User not found or not valid, connection refused');
881 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
882 session_name($sessionname);
885 if ($resultFetchUser == 0) {
887 $langs->loadLangs(array(
'main',
'errors'));
889 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
891 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
892 } elseif ($resultFetchUser < 0) {
893 $_SESSION[
"dol_loginmesg"] = $user->error;
895 $user->context[
'audit'] = $user->error;
898 $langs->loadLangs(array(
'main',
'errors'));
900 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
902 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
906 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
915 $hookmanager->initHooks(array(
'login'));
916 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
917 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
924 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
930 $paramsurl += [
'lang' => (string)
GETPOST(
'lang',
'aZ09')];
932 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
936 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
937 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
940 if ($entitytotest > 0 &&
$conf->entity != $entitytotest) {
944 $conf->entity = $entitytotest;
949 $login = $_SESSION[
"dol_login"];
950 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
951 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
953 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
957 if ($resultFetchUser <= 0
958 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
959 || ($user->status != $user::STATUS_ENABLED)
960 || ($user->isNotIntoValidityDateRange())) {
961 if ($resultFetchUser <= 0) {
963 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
964 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
966 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
967 } elseif ($user->status != $user::STATUS_ENABLED) {
972 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
975 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
976 session_name($sessionname);
979 if ($resultFetchUser == 0) {
980 $langs->loadLangs(array(
'main',
'errors'));
982 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
984 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
985 } elseif ($resultFetchUser < 0) {
986 $_SESSION[
"dol_loginmesg"] = $user->error;
988 $user->context[
'audit'] = $user->error;
990 $langs->loadLangs(array(
'main',
'errors'));
992 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
994 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
998 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1006 $hookmanager->initHooks(array(
'login'));
1007 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1008 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1013 $paramsurl = array();
1015 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1018 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1020 if (
GETPOST(
'lang',
'aZ09')) {
1021 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1024 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1028 $hookmanager->initHooks(array(
'main'));
1031 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1032 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1033 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1035 if (constant(
'DOL_URL_ROOT')) {
1036 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1038 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1039 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1043 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1044 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1045 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1047 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1048 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1049 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1051 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1052 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1053 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1055 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1056 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1057 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1059 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1060 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1061 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1064 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1065 if (empty($_SESSION[
'pageforbacktolist'])) {
1066 $pageforbacktolistarray = array();
1068 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1070 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1071 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1072 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1073 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1078 $parameters = array();
1079 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1081 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1088 if (!isset($_SESSION[
"dol_login"])) {
1093 $_SESSION[
"dol_login"] = $user->login;
1094 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1095 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1096 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1097 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1098 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1099 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1100 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1101 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1102 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1103 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1105 $_SESSION[
"dol_entity"] =
$conf->entity;
1110 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1111 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1113 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1114 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1116 if (!empty($dol_optimize_smallscreen)) {
1117 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1119 if (!empty($dol_no_mouse_hover)) {
1120 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1122 if (!empty($dol_use_jmobile)) {
1123 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1126 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1130 if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db' && !empty(
$conf->file->main_limit_sessions_per_user) && (
int)
$conf->file->main_limit_sessions_per_user > 0) {
1136 $user->update_last_login_date();
1138 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1139 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1142 $user->context[
'audit'] = $loginfo;
1143 $user->context[
'authentication_method'] = $dol_authmode;
1146 $result = $user->call_trigger(
'USER_LOGIN', $user);
1154 $hookmanager->initHooks(array(
'login'));
1155 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1156 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1164 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1172 if (!empty($landingpage)) {
1174 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1175 header(
'Location: '.$newpath);
1182 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1184 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1185 $currentpage = $_SERVER[
'PHP_SELF'];
1187 foreach ($allowedpages as $page) {
1188 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1194 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1201 $user->rights->user->user->lire = 1;
1202 $user->rights->user->user->creer = 1;
1203 $user->rights->user->user->password = 1;
1204 $user->rights->user->user->supprimer = 1;
1205 $user->rights->user->self->creer = 1;
1206 $user->rights->user->self->password = 1;
1210 if (!$user->hasRight(
'user',
'user_advance')) {
1211 $user->rights->user->user_advance =
new stdClass();
1213 if (!$user->hasRight(
'user',
'self_advance')) {
1214 $user->rights->user->self_advance =
new stdClass();
1216 if (!$user->hasRight(
'user',
'group_advance')) {
1217 $user->rights->user->group_advance =
new stdClass();
1220 $user->rights->user->user_advance->readperms = 1;
1221 $user->rights->user->user_advance->write = 1;
1222 $user->rights->user->self_advance->readperms = 1;
1223 $user->rights->user->self_advance->writeperms = 1;
1224 $user->rights->user->group_advance->read = 1;
1225 $user->rights->user->group_advance->readperms = 1;
1226 $user->rights->user->group_advance->write = 1;
1227 $user->rights->user->group_advance->delete = 1;
1236 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1239 if ((
int)
$conf->liste_limit <= 0) {
1244 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1251 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1255 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1256 $user->loadDefaultValues();
1262if (
GETPOST(
'theme',
'aZ09')) {
1264 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1269 $conf->use_javascript_ajax = 0;
1280 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1290if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1291 $conf->dol_hide_leftmenu = 1;
1293if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1294 $conf->dol_hide_topmenu = 1;
1296if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1297 $conf->dol_optimize_smallscreen = 1;
1299if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1300 $conf->dol_no_mouse_hover = 1;
1302if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1303 $conf->dol_use_jmobile = 1;
1306if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1307 $conf->dol_no_mouse_hover = 1;
1311if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1312 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1313 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1316 $conf->dol_optimize_smallscreen = 1;
1319 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1323if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1324 $conf->theme =
'eldy';
1325 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1328if (!defined(
'NOREQUIRETRAN')) {
1329 if (!
GETPOST(
'lang',
'aZ09')) {
1331 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1334 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1335 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1341if (!defined(
'NOLOGIN')) {
1344 if (!$user->login) {
1349 if ($user->status < 1) {
1351 $langs->loadLangs(array(
"errors",
"other"));
1352 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1357 $user->loadRights();
1360dol_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);
1365if (!defined(
'NOREQUIRETRAN')) {
1367 $langs->loadLangs(array(
'main',
'dict'));
1373 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1374 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1375 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1377 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1378 $conf->browser->stringforfirstkey .=
' ALT +';
1379 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1380 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1382 $conf->browser->stringforfirstkey .=
' CTL +';
1388$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1389$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1390$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1402if (empty(
$conf->browser->firefox)) {
1403 define(
'ROWS_1', 1);
1404 define(
'ROWS_2', 2);
1405 define(
'ROWS_3', 3);
1406 define(
'ROWS_4', 4);
1407 define(
'ROWS_5', 5);
1408 define(
'ROWS_6', 6);
1409 define(
'ROWS_7', 7);
1410 define(
'ROWS_8', 8);
1411 define(
'ROWS_9', 9);
1413 define(
'ROWS_1', 0);
1414 define(
'ROWS_2', 1);
1415 define(
'ROWS_3', 2);
1416 define(
'ROWS_4', 3);
1417 define(
'ROWS_5', 4);
1418 define(
'ROWS_6', 5);
1419 define(
'ROWS_7', 6);
1420 define(
'ROWS_8', 7);
1421 define(
'ROWS_9', 8);
1424$heightforframes = 52;
1427if (!defined(
'NOREQUIREMENU')) {
1428 if (empty($user->socid)) {
1436 $file_menu =
$conf->standard_menu;
1437 if (
GETPOST(
'menu',
'alpha')) {
1438 $file_menu =
GETPOST(
'menu',
'alpha');
1441 if (!class_exists(
'MenuManager')) {
1443 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1444 foreach ($dirmenus as $dirmenu) {
1446 if (class_exists(
'MenuManager')) {
1450 if (!class_exists(
'MenuManager')) {
1451 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1452 $file_menu =
'eldy_menu.php';
1453 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1457 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1459 $menumanager->loadMenu();
1462if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1463 $message =
GETPOST(
'seteventmessages',
'alpha');
1464 $messages = explode(
',', $message);
1465 foreach ($messages as $key => $msg) {
1466 $tmp = explode(
':', $msg);
1467 setEventMessages($tmp[0],
null, !empty($tmp[1]) ? $tmp[1] :
'mesgs');
1473if (!function_exists(
"llxHeader")) {
1497 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1499 global
$conf, $hookmanager;
1501 $parameters = array(
1503 'title' => & $title,
1504 'help_url' => & $help_url,
1505 'target' => & $target,
1506 'disablejs' => & $disablejs,
1507 'disablehead' => & $disablehead,
1508 'arrayofjs' => & $arrayofjs,
1509 'arrayofcss' => & $arrayofcss,
1510 'morequerystring' => & $morequerystring,
1511 'morecssonbody' => & $morecssonbody,
1512 'replacemainareaby' => & $replacemainareaby,
1513 'disablenofollow' => & $disablenofollow,
1514 'disablenoindex' => & $disablenoindex
1517 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1519 print $hookmanager->resPrint;
1524 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1526 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1528 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1530 if ($mainmenu !=
'website') {
1531 $tmpcsstouse = $morecssonbody;
1536 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1539 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1540 $tmpcsstouse .=
' dol_openinpopup';
1543 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1546 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1547 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1550 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1551 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1555 if ($replacemainareaby) {
1556 print $replacemainareaby;
1574 global $db,
$conf, $hookmanager;
1576 if ($contenttype !=
'none') {
1577 if ($contenttype ==
'text/html') {
1578 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1580 header(
"Content-Type: ".$contenttype);
1587 header(
"X-Content-Type-Options: nosniff");
1590 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1591 header(
"X-Frame-Options: SAMEORIGIN");
1593 header(
"X-Frame-Options: ALLOWALL");
1597 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1598 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1599 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1600 header(
'Vary: Origin');
1607 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1622 if (!is_object($hookmanager)) {
1623 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1626 $hookmanager->initHooks(array(
"main"));
1628 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1629 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1631 $contentsecuritypolicy = $hookmanager->resPrint;
1633 $contentsecuritypolicy .= $hookmanager->resPrint;
1637 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1639 if (!empty($contentsecuritypolicy)) {
1640 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1643 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1647 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1662 if (!is_object($hookmanager)) {
1663 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1666 $hookmanager->initHooks(array(
"main"));
1668 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1669 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1671 $contentsecuritypolicy = $hookmanager->resPrint;
1673 $contentsecuritypolicy .= $hookmanager->resPrint;
1677 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1679 if (!empty($contentsecuritypolicy)) {
1680 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1683 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1690 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1692 if (!empty($referrerpolicy)) {
1693 header(
"Referrer-Policy: ".$referrerpolicy);
1696 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1700 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1703 header(
"Strict-Transport-Security: ".$sts);
1706 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1710 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1713 header(
"Permissions-Policy: ".$pp);
1716 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1720 if ($forcenocache) {
1721 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1743function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1745 global $db,
$conf, $langs, $user,
$mysoc, $hookmanager;
1749 if (empty(
$conf->css)) {
1750 $conf->css =
'/theme/eldy/style.css.php';
1753 print
'<!doctype html>'.
"\n";
1755 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1758 if (empty($disablehead)) {
1759 if (!is_object($hookmanager)) {
1760 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1763 $hookmanager->initHooks(array(
"main"));
1765 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1769 if (
GETPOST(
'dol_basehref',
'alpha')) {
1770 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1774 print
'<meta charset="utf-8">'.
"\n";
1775 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1776 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1777 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1778 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1779 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1781 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1784 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1785 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1786 if (!empty(
$mysoc->logo_squarred_mini)) {
1787 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1792 if (empty(
$conf->dol_use_jmobile)) {
1793 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1794 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1798 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1799 $parameters = array(
'manifest' => $manifest);
1800 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1802 $manifest = $hookmanager->resPrint;
1804 $manifest .= $hookmanager->resPrint;
1806 if (!empty($manifest)) {
1807 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1811 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1816 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1820 $appli = constant(
'DOL_APPLICATION_TITLE');
1823 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1836 $parameters = array(
'title' => $titletoshow);
1837 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1839 $titletoshow = $hookmanager->resPrint;
1841 $titletoshow .= $hookmanager->resPrint;
1850 $ext =
'version='.GETPOSTINT(
'version');
1853 if (
GETPOST(
'dol_resetcache')) {
1854 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1858 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1860 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1862 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1865 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1868 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1871 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1874 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1877 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1881 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1884 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1895 'DOL_VERSION' => DOL_VERSION,
1896 'DOL_URL_ROOT' => DOL_URL_ROOT,
1899 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1901 'dolibarr-context.umd.js',
1902 'dolibarr-tool.seteventmessage.js'
1905 if (! defined(
'NOREQUIRETRAN')) {
1907 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1908 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1909 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1910 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1914 foreach ($jsContextFiles as $jsContextFile) {
1915 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1919 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1925 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1926 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1929 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1930 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1931 if (!defined(
'DISABLE_JQUERY_UI')) {
1932 $jquerytheme =
'base';
1936 if (constant(
'JS_JQUERY_UI')) {
1937 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1939 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1942 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1943 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1945 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1947 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1951 if (!defined(
'DISABLE_FONT_AWSOME')) {
1952 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1953 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1954 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1960 if (!empty(
$conf->modules_parts[
'theme'])) {
1961 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1964 $themesubdir = $reldir;
1970 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1971 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1972 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1984 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1985 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1989 if (!empty(
$conf->modules_parts[
'css'])) {
1990 $arraycss = (array)
$conf->modules_parts[
'css'];
1991 foreach ($arraycss as $modcss => $filescss) {
1992 $filescss = (array) $filescss;
1993 foreach ($filescss as $cssfile) {
1994 if (empty($cssfile)) {
1995 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1999 if ($urlforcss && $urlforcss !=
'/') {
2000 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
2002 if (!preg_match(
'/\.css$/i', $cssfile)) {
2007 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
2013 if (is_array($arrayofcss)) {
2014 foreach ($arrayofcss as $cssfile) {
2015 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
2016 $urltofile = $cssfile;
2020 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2022 if (!preg_match(
'/\.css$/i', $cssfile)) {
2032 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2036 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
2038 print
'<!-- Includes JS for JQuery -->'.
"\n";
2039 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2040 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
2042 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
2044 if (!defined(
'DISABLE_JQUERY_UI')) {
2045 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2046 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2048 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2052 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2053 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
2056 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2057 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2061 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2083 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2086 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2088 if (!defined(
'DISABLE_MULTISELECT')) {
2089 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2093 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2096 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2097 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2098 $jsckeditor =
'ckeditor.js';
2099 if (constant(
'JS_CKEDITOR')) {
2101 $pathckeditor = constant(
'JS_CKEDITOR');
2103 print
'<script nonce="'.getNonce().
'">';
2104 print
'/* enable ckeditor by main.inc.php */';
2105 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2106 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2107 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2108 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";
2109 print
'</script>'.
"\n";
2110 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2112 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2113 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2115 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2117 print
'</script>'.
"\n";
2121 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2122 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2123 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2124 $jstinymce =
'tinymce.min.js';
2125 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2126 $pathtinymce = constant(
'JS_TINYMCE');
2128 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2129 print
'<script nonce="'.getNonce().
'">';
2130 print
'/* enable tinymce by main.inc.php */';
2131 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2132 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2133 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";
2134 print
'</script>'.
"\n";
2135 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2136 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2140 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2141 $enablebrowsernotif =
false;
2143 $enablebrowsernotif =
true;
2145 if (
$conf->browser->layout ==
'phone') {
2146 $enablebrowsernotif =
false;
2148 if ($enablebrowsernotif) {
2149 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2150 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2155 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2156 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2157 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2162 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2163 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2167 if (!empty(
$conf->modules_parts[
'js'])) {
2168 $arrayjs = (array)
$conf->modules_parts[
'js'];
2169 foreach ($arrayjs as $modjs => $filesjs) {
2170 $filesjs = (array) $filesjs;
2171 foreach ($filesjs as $jsfile) {
2174 if ($urlforjs && $urlforjs !=
'/') {
2175 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2176 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2178 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2184 if (is_array($arrayofjs)) {
2185 print
'<!-- Includes JS added by page -->'.
"\n";
2186 foreach ($arrayofjs as $jsfile) {
2187 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2188 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2190 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2199 if (file_exists($theme_js)) {
2200 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2204 if (!empty($head)) {
2211 $parameters = array();
2212 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2213 print $hookmanager->resPrint;
2215 print
"</head>\n\n";
2218 $conf->headerdone = 1;
2238function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2240 global $user,
$conf, $langs, $db, $form;
2241 global $dolibarr_main_authentication, $dolibarr_main_demo;
2242 global $hookmanager, $menumanager;
2247 $hookmanager->initHooks(array(
'toprightmenu'));
2252 if (empty(
$conf->headerdone)) {
2253 $disablenofollow = 0;
2254 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2255 print
'<body id="mainbody">';
2261 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2262 if (!isset($form) || !is_object($form)) {
2263 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2264 $form =
new Form($db);
2267 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2269 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2272 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2274 $menumanager->atarget = $target;
2276 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2280 $appli = constant(
'DOL_APPLICATION_TITLE');
2283 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2285 $appli .=
" ".DOL_VERSION;
2289 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2293 $logouthtmltext =
'';
2295 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2296 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2297 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2298 $logouttext .= img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2299 $logouttext .=
'</a>';
2301 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2302 $logouttext .= img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2307 print
'<div class="login_block usedropdown">'.
"\n";
2311 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2314 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2337 $toprightmenu .=
'</div>';
2339 $toprightmenu .=
'</div>'.
"\n";
2343 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2346 $parameters = array();
2347 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2348 if (is_numeric($result)) {
2350 $toprightmenu .= $hookmanager->resPrint;
2352 $toprightmenu = $hookmanager->resPrint;
2355 $toprightmenu .= $result;
2360 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2362 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2365 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2372 if (isset($_POST) && is_array($_POST)) {
2373 foreach ($_POST as $key => $value) {
2374 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2375 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2378 if (!is_array($value)) {
2379 if ($value !==
'') {
2380 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2383 foreach ($value as $value2) {
2384 if (($value2 !==
'') && (!is_array($value2))) {
2385 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2391 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2392 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2394 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2397 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2402 $langs->load(
"help");
2409 if (empty($helppagename)) {
2410 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2412 $helppresent =
'helppresent';
2417 $helpbaseurl = $arrayres[
'helpbaseurl'];
2418 $helppage = $arrayres[
'helppage'];
2419 $mode = $arrayres[
'mode'];
2422 if ($helpbaseurl && $helppage) {
2424 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2425 if ($mode ==
'wiki') {
2426 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2428 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2430 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2433 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2434 if ($mode ==
'wiki') {
2436 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2439 $text .= sprintf($helpbaseurl, $helppage);
2442 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2443 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2446 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2451 $langs->load(
'admin');
2452 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2458 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2460 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2465 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2468 $toprightmenu .=
'</div>';
2472 $toprightmenu .=
'<div class="login_block_user">';
2475 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2480 $toprightmenu .=
'</div>';
2482 $toprightmenu .=
'</div>'.
"\n";
2485 print $toprightmenu;
2492 print
'<div style="clear: both;"></div>';
2493 print
"<!-- End top horizontal menu -->\n\n";
2496 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2497 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2511 global $langs,
$conf, $db, $hookmanager, $user,
$mysoc;
2512 global $dolibarr_main_authentication, $dolibarr_main_demo;
2513 global $menumanager, $form;
2516 if (
$conf->browser->name ==
'textbrowser') {
2520 $langs->load(
'companies');
2522 $userImage = $userDropDownImage =
'';
2523 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2524 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2525 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2527 $nophoto =
'/public/theme/common/user_anonymous.png';
2528 if ($user->gender ==
'man') {
2529 $nophoto =
'/public/theme/common/user_man.png';
2531 if ($user->gender ==
'woman') {
2532 $nophoto =
'/public/theme/common/user_woman.png';
2535 $userImage = img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2537 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2541 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2542 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2546 while ($idprofcursor < 10) {
2548 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2549 if ($idprofcursor == 1) {
2550 $constkeyforprofid =
'MAIN_INFO_SIREN';
2552 if ($idprofcursor == 2) {
2553 $constkeyforprofid =
'MAIN_INFO_SIRET';
2555 if ($idprofcursor == 3) {
2556 $constkeyforprofid =
'MAIN_INFO_APE';
2558 if ($idprofcursor == 4) {
2559 $constkeyforprofid =
'MAIN_INFO_RCS';
2561 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2571 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2573 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2575 $dropdownBody .=
'</div>';
2577 $dropdownBody .=
'<br>';
2578 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2579 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2582 if (!empty($user->admin)) {
2583 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.yn($user->admin).
' '.img_picto(
'',
'admin');
2586 if (!empty($user->socid)) {
2587 $thirdpartystatic =
new Societe($db);
2588 $thirdpartystatic->fetch($user->socid);
2589 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2590 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2592 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2593 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2594 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2595 $dropdownBody .=
'<br>';
2597 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2598 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2600 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2602 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2603 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2604 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2605 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2607 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2609 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2611 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2612 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2613 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2618 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2619 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT'] ??
''), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2620 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2621 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2622 if (!empty($_SESSION[
"disablemodules"])) {
2623 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2625 $dropdownBody .=
'</div>';
2628 $parameters = array(
'user' => $user,
'langs' => $langs);
2629 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2630 if (is_numeric($result)) {
2632 $dropdownBody .= $hookmanager->resPrint;
2634 $dropdownBody = $hookmanager->resPrint;
2638 if (empty($urllogout)) {
2639 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2643 $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>';
2644 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2645 $jsonopen =
"closeTopMenuLoginDropdown()";
2646 $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');
2647 $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>';
2649 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2650 if (!empty($user->admin)) {
2651 $profilName = img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2655 $appli = constant(
'DOL_APPLICATION_TITLE');
2658 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2660 $appli .=
" ".DOL_VERSION;
2664 $btnUser =
'<!-- div for user link -->
2665 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2666 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2667 '.$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>' :
'').
'
2669 <div class="dropdown-menu">
2671 <div class="user-header">
2672 '.$userDropDownImage.
'
2674 '.$profilName.
'<br>';
2676 if ($user->datelastlogin) {
2677 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2678 if ($user->datepreviouslogin) {
2679 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2682 $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>';
2683 if ($user->datepreviouslogin) {
2684 $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>';
2692 <!-- Menu Body user-->
2693 <div class="user-body">'.$dropdownBody.
'</div>
2696 <div class="user-footer">
2697 <div class="pull-left">
2700 <div class="pull-left">
2701 '.$virtuelcardLink.
'
2703 <div class="pull-right">
2706 <div class="clearboth"></div>
2712 $btnUser =
'<!-- div for user link text browser -->
2713 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2714 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2715 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2720 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2722 <!-- Code to show/hide the user drop-down -->
2724 function closeTopMenuLoginDropdown() {
2725 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2727 jQuery("#topmenu-login-dropdown").removeClass("open");
2729 jQuery(document).ready(function() {
2730 jQuery(document).on("click", function(event) {
2731 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2732 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2733 console.log("click close login - we click outside");
2734 // Hide the dropdown.
2735 closeTopMenuLoginDropdown();
2743 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2744 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2745 event.preventDefault();
2746 jQuery("#topmenu-login-dropdown").toggleClass("open");
2749 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2750 console.log("Click on #topmenulogincompanyinfo-btn");
2751 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2752 jQuery("#topmenuloginmoreinfo").slideToggle();
2754 jQuery("#topmenulogincompanyinfo").slideToggle();
2757 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2758 console.log("Click on #topmenuloginmoreinfo-btn");
2759 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2760 jQuery("#topmenulogincompanyinfo").slideToggle();
2762 jQuery("#topmenuloginmoreinfo").slideToggle();
2784 global
$conf, $langs, $user;
2792 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2796 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2802 $aicssver = @filemtime(DOL_DOCUMENT_ROOT.
'/ai/css/ai_assistant.css');
2803 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css?v='.urlencode((
string) ($aicssver ? $aicssver : DOL_VERSION)).
'">';
2807 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2808 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2809 <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>
2815 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2816 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2822 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2823 $aijsver = @filemtime($aijsfile);
2824 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2826 $html .=
'<script nonce="'.getNonce().
'">
2827 jQuery(document).ready(function() {
2828 jQuery(document).on("click", function(event) {
2829 if (jQuery("#topmenu-ai-popover").hasClass("open")) {
2830 // A click on a node removed from the DOM while the event was bubbling
2831 // (e.g. a chat action button like "Yes, continue" that removes its own
2832 // message bubble) must not be mistaken for a click outside the popover:
2833 // .closest() cannot reach the popover from a detached node.
2834 if (event.target instanceof Element && !event.target.isConnected) {
2837 if (!$(event.target).closest("#topmenu-ai-toggle").length && !$(event.target).closest("#topmenu-ai-popover").length) {
2838 console.log("click close ai dropdown - we click outside");
2839 // Hide the dropdown.
2840 jQuery("#topmenu-ai-popover").removeClass("open");
2847 var toggle = document.getElementById("topmenu-ai-toggle");
2848 var popover = document.getElementById("topmenu-ai-popover");
2849 if (!toggle || !popover) { return; }
2850 var body = popover.querySelector(".ai-popover-body");
2852 var loading = false;
2854 function positionPopover() {
2855 var top = document.getElementById("id-top");
2856 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2857 popover.style.setProperty("--ai-popover-top", anchor + "px");
2860 function loadChat() {
2861 if (loaded || loading) { return; }
2863 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2864 .then(function (resp) {
2865 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2868 .then(function (htmlcontent) {
2869 body.innerHTML = htmlcontent;
2870 return import(\''.
dol_escape_js($aijsurl).
'\').then(
function (mod) {
2871 mod.initAiAssistant(body.querySelector(
".ai-chat-container"));
2878 .
catch(
function (e) {
2879 console.error(
"AI Assistant popover load failed", e);
2880 body.innerHTML = \
'<div class="ai-popover-loading">'.dol_escape_js($langs->trans(
'Error')).
'</div>\';
2882 .finally(function () { loading = false; });
2885 function focusInput() {
2886 var input = body.querySelector("#user-input");
2887 if (input) { input.focus(); }
2890 // The expand button always opens the standalone full page
2891 // (/ai/assistant/index.php) in the current tab. There is no small mode:
2892 // the popover opens and stays in the large ("expanded") state.
2893 toggle.addEventListener("click", function (event) {
2894 console.log("Click on #topmenu-ai-toggle");
2895 event.preventDefault();
2896 // position:fixed can be hijacked by a transformed ancestor: hosting the
2897 // panel directly under <body> guarantees viewport coordinates.
2898 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2900 var isOpen = popover.classList.toggle("open");
2902 // Always open in the large ("expanded") state.
2903 popover.classList.add("expanded");
2905 if (loaded) { focusInput(); }
2909 popover.addEventListener("click", function (event) {
2910 console.log("Click on #topmenu-ai-popover");
2911 var closeBtn = event.target.closest("#ai-close-btn");
2912 var expandBtn = event.target.closest("#ai-expand-btn");
2914 popover.classList.remove("open");
2915 } else if (expandBtn) {
2916 // Open the standalone full page in the current tab.
2917 var url = expandBtn.dataset.fullscreenUrl;
2918 if (url) { window.location.href = url; }
2922 document.addEventListener("keydown", function (event) {
2923 if (event.key === "Escape" && popover.classList.contains("open")) {
2924 popover.classList.remove("open");
2941 global
$conf, $langs;
2950 if (!empty(
$conf->use_javascript_ajax)) {
2951 $html .=
'<!-- div for quick add link -->
2952 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2953 <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>
2956 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2958 <!-- Code to show/hide the user drop-down for the quick add -->
2959 <script nonce="'.getNonce().
'">
2960 jQuery(document).ready(function() {
2961 jQuery(document).on("click", function(event) {
2962 if (jQuery("#topmenu-quickadd-dropdown").hasClass("open")) {
2963 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2964 console.log("click close quick add - we click outside");
2965 // Hide the dropdown.
2966 $("#topmenu-quickadd-dropdown").removeClass("open");
2970 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2971 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2972 openQuickAddDropDown(event);
2976 $(document).keydown(function(event){
2978 if (ostype ===
"macintosh") {
2979 if ( event.which === 65 && event.ctrlKey ) {
2980 console.log(\
'control + a : trigger open quick add dropdown\');
2981 openQuickAddDropDown(event);
2984 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2985 console.log(\'control + shift + a : trigger open quick add dropdown\');
2986 openQuickAddDropDown(event);
2991 var openQuickAddDropDown = function(event) {
2992 event.preventDefault();
2993 $("#topmenu-quickadd-dropdown").toggleClass("open");
3013 global
$conf, $langs;
3022 if (!empty(
$conf->use_javascript_ajax)) {
3023 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
3028 $html .=
'<!-- div for link to upload file -->
3029 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
3030 <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>
3046 global $user, $langs, $hookmanager;
3051 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
3052 "title" =>
"MenuNewMember@members",
3053 "name" =>
"Adherent@members",
3054 "picto" =>
"object_member",
3055 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3059 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3060 "title" =>
"MenuNewThirdParty@companies",
3061 "name" =>
"ThirdParty@companies",
3062 "picto" =>
"object_company",
3063 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3067 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3068 "title" =>
"NewContactAddress@companies",
3069 "name" =>
"Contact@companies",
3070 "picto" =>
"object_contact",
3071 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3075 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3076 "title" =>
"NewPropal@propal",
3077 "name" =>
"Proposal@propal",
3078 "picto" =>
"object_propal",
3079 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3084 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3085 "title" =>
"NewOrder@orders",
3086 "name" =>
"Order@orders",
3087 "picto" =>
"object_order",
3088 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3092 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3093 "title" =>
"NewBill@bills",
3094 "name" =>
"Bill@bills",
3095 "picto" =>
"object_bill",
3096 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3100 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3101 "title" =>
"NewContractSubscription@contracts",
3102 "name" =>
"Contract@contracts",
3103 "picto" =>
"object_contract",
3104 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3108 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3109 "title" =>
"SupplierProposalNew@supplier_proposal",
3110 "name" =>
"SupplierProposal@supplier_proposal",
3111 "picto" =>
"supplier_proposal",
3112 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3116 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3117 "title" =>
"NewSupplierOrderShort@orders",
3118 "name" =>
"SupplierOrder@orders",
3119 "picto" =>
"supplier_order",
3120 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3124 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3125 "title" =>
"NewBill@bills",
3126 "name" =>
"SupplierBill@bills",
3127 "picto" =>
"supplier_invoice",
3128 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3132 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3133 "title" =>
"NewTicket@ticket",
3134 "name" =>
"Ticket@ticket",
3135 "picto" =>
"ticket",
3136 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3140 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3141 "title" =>
"NewIntervention@interventions",
3142 "name" =>
"Intervention@interventions",
3143 "picto" =>
"intervention",
3144 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3148 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3149 "title" =>
"NewProduct@products",
3150 "name" =>
"Product@products",
3151 "picto" =>
"object_product",
3152 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3156 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3157 "title" =>
"NewService@products",
3158 "name" =>
"Service@products",
3159 "picto" =>
"object_service",
3160 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3164 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3165 "title" =>
"StockTransferNew@stocks",
3166 "name" =>
"StockTransfer@stocks",
3168 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3172 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3173 "title" =>
"AddUser@users",
3174 "name" =>
"User@users",
3176 "activation" => $user->hasRight(
"user",
"user",
"write"),
3182 $dropDownQuickAddHtml =
'';
3186 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3188 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3191 $parameters = array();
3192 $hook_items = $items;
3193 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3194 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3195 if ($reshook == 0) {
3196 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3198 $items = $hookmanager->resArray;
3202 $position = array();
3203 foreach ($items[
'items'] as $key => $row) {
3204 $position[$key] = $row[
'position'];
3206 $array1_sort_order = SORT_ASC;
3207 array_multisort($position, $array1_sort_order, $items[
'items']);
3210 foreach ($items[
'items'] as $item) {
3211 if (!$item[
'activation']) {
3214 $langs->load(explode(
'@', $item[
'title'])[1]);
3215 $langs->load(explode(
'@', $item[
'name'])[1]);
3216 $dropDownQuickAddHtml .=
'
3217 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3218 '. img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3223 $dropDownQuickAddHtml .=
'</div>';
3225 $dropDownQuickAddHtml .=
'</div>';
3227 return $dropDownQuickAddHtml;
3237 global $langs,
$conf, $user;
3242 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3251 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3252 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3253 $langs->load(
"bookmarks");
3256 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3260 $html .=
'<!-- div for bookmark link -->
3261 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3262 <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>
3263 <div class="dropdown-menu">
3269 <!-- Code to show/hide the bookmark drop-down -->
3271 jQuery(document).ready(function() {
3272 jQuery(document).on("click", function(event) {
3273 if (jQuery("#topmenu-bookmark-dropdown").hasClass("open")) {
3274 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3275 console.log("close bookmark dropdown - we click outside");
3277 $("#topmenu-bookmark-dropdown").removeClass("open");
3282 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3283 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3284 openBookMarkDropDown(event);
3288 jQuery(document).keydown(function(event) {
3289 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3290 if (ostype ===
"macintosh") {
3291 if ( event.which === 66 && event.ctrlKey ) {
3292 console.log(
"Click on control + b : trigger open bookmark dropdown");
3293 openBookMarkDropDown(event);
3296 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3297 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3298 openBookMarkDropDown(event);
3303 var openBookMarkDropDown =
function(event) {
3304 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3305 event.preventDefault();
3306 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3307 jQuery(
"#top-bookmark-search-input").focus();
3323function top_menu_search()
3325 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3329 $usedbyinclude = 1; // Used by selectsearchbox.php
3330 $arrayresult = array();
3331 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3333 $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">
';
3335 $defaultAction = '';
3336 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3337 // Menu with all searchable items
3338 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3339 foreach ($arrayresult as $keyItem => $item) {
3340 if (empty($defaultAction)) {
3341 $defaultAction = $item['url
'];
3343 $buttonList .= '<
button class=
"dropdown-item global-search-item '.(empty($conf->dol_optimize_smallscreen) ? 'tdoverflowmax400' : 'tdoverflowmax300').'" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3344 $buttonList .= $item['text
'];
3345 $buttonList .= '</
button>
';
3347 $buttonList .= '</div>
';
3349 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3352 <!-- search input -->
3353 <div
class=
"dropdown-header search-dropdown-header">
3359 <!--
Menu Body search -->
3360 <div
class=
"dropdown-body search-dropdown-body">
3365 $dropDownHtml .= '</form>
';
3367 $html .= '<!-- div
for Global Search -->
3368 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3369 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3370 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3372 <div
class=
"dropdown-menu dropdown-search">
3378 <!-- Code to show/hide the
user drop-down -->
3380 jQuery(document).ready(
function() {
3383 jQuery(
"#top-global-search-input").keydown(
function (e) {
3384 if (e.keyCode == 13 || e.keyCode == 40) {
3385 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3386 if (inputs[inputs.index(this) + 1] != null) {
3387 console.log(
"Force focus after keydow on #top-global-search-input");
3388 inputs[inputs.index(this) + 1].focus();
3389 if (e.keyCode == 13){
3390 inputs[inputs.index(this) + 1].trigger(
"click");
3400 jQuery(document).keydown(
function(e) {
3402 var $focused = $(
":focus");
3403 if($focused.length && $focused.hasClass(
"global-search-item")){
3406 if (e.keyCode == 38) {
3408 console.log(
"Force focus after keycode 38");
3409 $focused.prev().focus();
3413 if (e.keyCode == 40) {
3415 console.log(
"Force focus after keycode 40");
3416 $focused.next().focus();
3423 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3424 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3425 jQuery(
"#top-menu-action-search").submit();
3429 jQuery(document).on(
"click",
function(event) {
3430 if (jQuery(
"#topmenu-global-search-dropdown").hasClass(
"open")) {
3431 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3432 console.log(
"click close search - we click outside");
3434 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3440 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3441 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3442 openGlobalSearchDropDown();
3446 jQuery(document).keydown(
function(e){
3447 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3448 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3449 openGlobalSearchDropDown();
3451 if ( e.which === 70 && e.alKey ) {
3452 console.log(\'alt + f : trigger open global-search dropdown\');
3453 openGlobalSearchDropDown();
3457 var openGlobalSearchDropDown = function() {
3458 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3459 jQuery("#top-global-search-input").focus();
3483function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3485 global $user,
$conf, $langs, $db, $form;
3486 global $hookmanager, $menumanager;
3490 if (!empty($menu_array_before)) {
3491 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);
3494 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3496 $hookmanager->initHooks(array(
'leftblock'));
3498 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3501 if (!is_object($form)) {
3502 $form =
new Form($db);
3507 if (
$conf->browser->layout ==
'phone') {
3508 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3512 $arrayresult = array();
3513 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3517 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3518 $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');
3520 if (is_array($arrayresult)) {
3522 foreach ($arrayresult as $key => $val) {
3523 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3529 $parameters = array(
'searchform' => $searchform);
3530 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3531 if (empty($reshook)) {
3532 $searchform .= $hookmanager->resPrint;
3534 $searchform = $hookmanager->resPrint;
3539 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3540 $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>';
3542 $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>';
3543 $searchform .=
'<script>
3544 jQuery(document).ready(function () {
3545 jQuery("#divsearchforms1").click(function(){
3546 jQuery("#divsearchforms2").toggle();
3550 $searchform .=
'</div>';
3554 $searchform .=
'<script>
3555 jQuery(document).keydown(function(e){
3556 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3557 console.log(\'control + shift + f : trigger open global-search dropdown\');
3558 openGlobalSearchDropDown();
3560 if( (e.which === 83 || e.which === 115) && e.altKey ){
3561 console.log(\'alt + s : trigger open global-search dropdown\');
3562 openGlobalSearchDropDown();
3566 var openGlobalSearchDropDown = function() {
3567 jQuery("#searchselectcombo").select2(\'open\');
3573 print
'<!-- Begin left menu -->'.
"\n";
3575 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3579 $menumanager->menu_array = $menu_array_before;
3581 $menumanager->menu_array_after = $menu_array_after;
3584 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3587 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3593 print
"<!-- Begin Help Block-->\n";
3594 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3598 $doliurl =
'https://www.dolibarr.org';
3600 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3601 $doliurl =
'https://www.dolibarr.fr';
3603 if (preg_match(
'/es/i', $langs->defaultlang)) {
3604 $doliurl =
'https://www.dolibarr.es';
3606 if (preg_match(
'/de/i', $langs->defaultlang)) {
3607 $doliurl =
'https://www.dolibarr.de';
3609 if (preg_match(
'/it/i', $langs->defaultlang)) {
3610 $doliurl =
'https://www.dolibarr.it';
3612 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3613 $doliurl =
'https://www.dolibarr.gr';
3616 $appli = constant(
'DOL_APPLICATION_TITLE');
3619 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3621 $appli .=
" ".DOL_VERSION;
3629 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3631 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3633 print
'<span class="help">';
3641 print
'</div>'.
"\n";
3646 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3649 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3650 $bugbaseurl .=
'&title=';
3651 $bugbaseurl .= urlencode(
"Bug: ");
3652 $bugbaseurl .=
'&body=';
3653 $bugbaseurl .= urlencode(
"# Instructions\n");
3654 $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");
3655 $bugbaseurl .= urlencode(
"*Please:*\n");
3656 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3657 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3658 $bugbaseurl .= urlencode(
"\n");
3659 $bugbaseurl .= urlencode(
"\n");
3660 $bugbaseurl .= urlencode(
"# Bug\n");
3661 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3662 $bugbaseurl .= urlencode(
"\n");
3663 $bugbaseurl .= urlencode(
"## Environment\n");
3664 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3665 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3666 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3667 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3668 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3669 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3670 $bugbaseurl .= urlencode(
"\n");
3671 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3672 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3673 $bugbaseurl .= urlencode(
"\n");
3674 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3675 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3676 $bugbaseurl .= urlencode(
"\n");
3677 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3678 $bugbaseurl .= urlencode(
"[*Files*]\n");
3679 $bugbaseurl .= urlencode(
"\n");
3681 $bugbaseurl .= urlencode(
"\n");
3682 $bugbaseurl .= urlencode(
"## Report\n");
3690 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3691 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3692 if (empty($reshook)) {
3693 $bugbaseurl .= $hookmanager->resPrint;
3695 $bugbaseurl = $hookmanager->resPrint;
3698 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3699 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3704 print
"<!-- End Help Block-->\n";
3709 print
"<!-- End left menu -->\n";
3713 $parameters = array();
3714 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3715 print $hookmanager->resPrint;
3717 print
'</div></div> <!-- End side-nav id-left -->';
3721 print
'<!-- Begin right area -->'.
"\n";
3723 if (empty($leftmenuwithoutmainarea)) {
3737 global
$conf, $langs, $hookmanager;
3739 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3740 print
'<div id="id-right">';
3745 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3747 $hookmanager->initHooks(array(
'main'));
3748 $parameters = array();
3749 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3750 print $hookmanager->resPrint;
3753 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3758 $parameters = array();
3759 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3760 if (empty($reshook)) {
3761 print
'<!-- Begin show mysoc info header -->'.
"\n";
3762 print
'<div id="mysoc-info-header">'.
"\n";
3763 print
'<table class="centpercent div-table-responsive">'.
"\n";
3765 print
'<tr><td rowspan="0" class="width20p">';
3767 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'))).
'">';
3769 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3770 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3782 print
'</table>'.
"\n";
3783 print
'</div>'.
"\n";
3784 print
'<!-- End show mysoc info header -->'.
"\n";
3803 if (preg_match(
'/^http/i', $helppagename)) {
3805 $helpbaseurl =
'%s';
3806 $helppage = $helppagename;
3811 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3812 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3813 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3814 $helppage = $reg[1];
3817 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3818 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3819 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3820 $helppage = $reg[1];
3823 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3824 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3825 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3826 $helppage = $reg[1];
3829 if (empty($helppage)) {
3830 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3831 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3832 $helppage = $reg[1];
3837 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3857function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3859 global $langs, $user;
3862 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3863 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3864 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3865 if ($showtitlebefore) {
3866 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3868 $ret .=
'<div class="tagtd">';
3869 $ret .= img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3870 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3871 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3872 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3873 $ret .=
' placeholder="'.strip_tags($title).
'"';
3874 $ret .= ($autofocus ?
' autofocus' :
'');
3875 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3876 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3877 $ret .=
'<span class="fa fa-search"></span>';
3878 $ret .=
'</button>';
3880 $ret .=
"</form>\n";
3885if (!function_exists(
"llxFooter")) {
3899 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3902 global $delayedhtmlcontent;
3903 global $contextpage, $page, $limit, $mode;
3904 global $dolibarr_distrib;
3906 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3910 $parameters = array();
3911 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3912 if (empty($reshook)) {
3913 $llxfooter .= $hookmanager->resPrint;
3914 } elseif ($reshook > 0) {
3915 $llxfooter = $hookmanager->resPrint;
3926 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3928 foreach ($user->lastsearch_values_tmp as $key => $val) {
3929 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3930 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3931 if (empty($val[
'sortfield'])) {
3932 unset($val[
'sortfield']);
3934 if (empty($val[
'sortorder'])) {
3935 unset($val[
'sortorder']);
3937 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3938 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3939 unset($_SESSION[
'lastsearch_values_'.$key]);
3945 $relativepathstring = $_SERVER[
"PHP_SELF"];
3947 if (constant(
'DOL_URL_ROOT')) {
3948 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3950 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3951 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3952 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3953 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3954 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3955 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3956 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3958 if (!empty($contextpage)) {
3959 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3961 if (!empty($page) && $page > 0) {
3962 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3964 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3965 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3967 if (!empty($mode)) {
3968 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3971 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3972 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3973 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3974 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3980 if (
$conf->use_javascript_ajax) {
3981 $title = img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3982 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3985 $msg = img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3986 print
'<div class="error">'.$msg.
'</div>';
3994 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3996 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3997 print
'</div> <!-- End div id-right -->'.
"\n";
4000 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
4001 print
'</div> <!-- End div id-container -->'.
"\n";
4006 print
'<!-- '.$comment.
' -->'.
"\n";
4011 if (!empty($delayedhtmlcontent)) {
4012 print $delayedhtmlcontent;
4015 if (!empty(
$conf->use_javascript_ajax)) {
4016 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
4017 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
4021 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4022 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4025 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
4026 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
4033 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4034 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4037 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
4038 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
4039 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
4042 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4045 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4046 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4047 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
4049 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4051 $arrayofmoredata = array(
4052 'action' =>
'dolibarrping',
4055 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4057 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4060 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4061 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4066 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4072 $forceregistration =
GETPOSTINT(
'forceregistration');
4074 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4075 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4078 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4080 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4083 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4084 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4085 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4088 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4089 || $forceregistration) {
4091 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4092 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4093 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4095 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4097 $arrayofdata = array(
4098 'action' =>
'dolibarrregistration',
4109 'country_code' =>
$mysoc->country_code,
4122 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4125 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4126 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4131 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4175 $parameters = array();
4176 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4178 print $hookmanager->resPrint;
if(! $sortfield) if(! $sortorder) $object
$propal type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
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.
if(! $sortfield) if(! $sortorder) $module
dol_stringtotime($string, $gm=1, $processnotimeasnoon=0)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata=array(), $forceping=0)
Function to output HTML to make an ajax call to make registration.
dol_now($mode='gmt')
Return date for now.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
getListLimitFromScreenHeight()
Get the limit of list to show according to the screen height.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getNonce()
Return a random string to be used as a nonce value for js.
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.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
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.
dolSessionsLimitForUser($fk_user, $keepcount, $currentsessionid)
Enforce a maximum number of concurrent database sessions for a given user.
$conf db user
Active Directory does not allow anonymous connections.
$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...