47if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
48 [$usec, $sec] = explode(
" ", microtime());
49 $micro_start_time = ((float) $usec + (
float) $sec);
52 if (defined(
'XDEBUGCOVERAGE')) {
53 xdebug_start_code_coverage();
57require __DIR__.
'/waf.inc.php';
60if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
61 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
64if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
65 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
70if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
71 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
75require_once
'filefunc.inc.php';
90include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/securitycore.lib.php';
95if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
96 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
97 $tmplist = explode(
',', $tmpautoset[1]);
98 $cookiearrayvalue = array();
99 foreach ($tmplist as $tmpkey) {
100 $postkey = $tmpautoset[0].
'_'.$tmpkey;
103 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
106 $cookiename = $tmpautoset[0];
107 $cookievalue = json_encode($cookiearrayvalue);
114if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
115 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
121$prefix = dol_getprefix(
'');
122$sessionname =
'DOLSESSID_'.$prefix;
123$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
124if (!empty($_COOKIE[$sessiontimeout])) {
125 ini_set(
'session.gc_maxlifetime', max(120, min(3600 * 24, (
int) $_COOKIE[$sessiontimeout])));
130if (!defined(
'NOSESSION')) {
131 if (PHP_VERSION_ID < 70300) {
132 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
135 $sessioncookieparams = array(
139 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
143 session_set_cookie_params($sessioncookieparams);
145 session_name($sessionname);
152require_once
'master.inc.php';
165@phan-var-force Conf $conf
166@phan-var-force ?DoliDB $db
167@phan-var-force ?HookManager $hookmanager
168@phan-var-force ?Translate $langs
169@phan-var-force ?User $user
178 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
180 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
182 } elseif (defined(
'NOREQUIREDB')) {
184 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
186 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
190 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
191 print
'Sorry, your application is offline.'.
"\n";
192 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";
193 $nexturl =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
194 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
196 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
198 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
206register_shutdown_function(
'dol_shutdown');
209if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
211 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
213 $renderer = $debugbar->getJavascriptRenderer();
215 $conf->global->MAIN_HTML_HEADER =
'';
217 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
219 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
220 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
224if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
226 $conf->browser->name = $tmp[
'browsername'];
227 $conf->browser->os = $tmp[
'browseros'];
228 $conf->browser->version = $tmp[
'browserversion'];
229 $conf->browser->ua = $tmp[
'browserua'];
230 $conf->browser->layout = $tmp[
'layout'];
233 if (
$conf->browser->layout ==
'phone') {
234 $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;
369 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
372 $legitimate_actions = array(
385 'presend_addmessage',
391 'validatenewpassword',
394 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, $legitimate_actions))) {
397 $sensitiveget =
true;
401 $arrayofactiontoforcetokencheck = array(
403 'doprev',
'donext',
'dvprev',
'dvnext',
404 'freezone',
'install',
407 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
408 $sensitiveget =
true;
411 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
412 $sensitiveget =
true;
419 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
421 GETPOSTISSET(
'massaction') ||
422 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
425 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
428 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
429 $langs->loadLangs(array(
"errors",
"install"));
430 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
431 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
433 http_response_code(403);
434 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
435 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);
436 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";
438 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);
439 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";
440 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";
444 print
" into setup).\n";
451 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
453 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
454 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);
457 if (!defined(
'NOTOKENRENEWAL')) {
459 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
462 if (isset($_POST[
'id'])) {
463 $savid = ((int) $_POST[
'id']);
466 unset($_GET[
'confirm']);
467 unset($_GET[
'action']);
468 unset($_GET[
'confirmmassaction']);
469 unset($_GET[
'massaction']);
470 unset($_GET[
'token']);
472 $_POST[
'id'] = ((int) $savid);
475 $_GET[
'errorcode'] =
'InvalidToken';
481if (!empty($dolibarr_main_demo)) {
483 if (GETPOSTISSET(
'disablemodules')) {
484 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
486 if (!empty($_SESSION[
"disablemodules"])) {
487 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
489 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
490 foreach ($disabled_modules as $module) {
492 if (empty(
$conf->$module)) {
496 $conf->$module->enabled =
false;
497 unset(
$conf->modules[$module]);
499 foreach ($modulepartkeys as $modulepartkey) {
500 unset(
$conf->modules_parts[$modulepartkey][$module]);
502 if ($module ==
'fournisseur') {
503 $conf->supplier_order->enabled = 0;
504 $conf->supplier_invoice->enabled = 0;
505 unset(
$conf->modules[
'supplier_order']);
506 unset(
$conf->modules[
'supplier_invoice']);
514$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
515if (is_array($modulepart) && count($modulepart) > 0) {
516 foreach (
$conf->modules as $module) {
517 if (in_array($module, $modulepart)) {
518 $modulepart = $module;
523if (is_array($modulepart)) {
534if (!defined(
'NOLOGIN')) {
538 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
539 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
542 if (empty($dolibarr_main_authentication)) {
543 $dolibarr_main_authentication =
'dolibarr';
546 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
547 $dolibarr_auto_user =
'auto';
551 $authmode = explode(
',', $dolibarr_main_authentication);
554 if (!count($authmode)) {
555 $langs->load(
'main');
556 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
563 $resultFetchUser =
'';
565 $dol_authmode =
null;
567 if (!isset($_SESSION[
"dol_login"])) {
569 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
571 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
573 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
574 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
575 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
576 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
577 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
578 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
579 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
580 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
583 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
584 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
585 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
587 if ($dol_hide_topmenu) {
588 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
590 if ($dol_hide_leftmenu) {
591 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
593 if ($dol_optimize_smallscreen) {
594 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
596 if ($dol_no_mouse_hover) {
597 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
599 if ($dol_use_jmobile) {
600 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
602 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
609 $hookmanager->initHooks(array(
'login'));
610 $parameters = array();
611 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
618 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
622 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
626 $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());
627 $fullpathclassfile =
'';
628 foreach ($dirModCaptcha as $dir) {
629 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
630 if ($fullpathclassfile) {
636 if ($fullpathclassfile) {
637 include_once $fullpathclassfile;
641 $classname =
"modCaptcha".ucfirst($captcha);
642 if (class_exists($classname)) {
644 $captchaobj =
new $classname(
$db,
$conf, $langs, $user);
645 '@phan-var-force ModeleCaptcha $captchaobj';
647 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
648 $ok = $captchaobj->validateCodeAfterLoginSubmit();
650 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
655 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
660 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
667 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
669 $langs->loadLangs(array(
'main',
'errors'));
671 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
675 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
678 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
686 $hookmanager->initHooks(array(
'login'));
687 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
688 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
697 $allowedmethodtopostusername = 3;
698 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
699 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
702 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
703 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
707 $goontestloop =
false;
708 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
709 $goontestloop =
true;
711 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
712 $goontestloop =
true;
714 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
715 $goontestloop =
true;
717 if (
GETPOST(
'openid_mode',
'alpha')) {
718 $goontestloop =
true;
720 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
721 $goontestloop =
true;
723 if (!empty($_COOKIE[
'login_dolibarr'])) {
724 $goontestloop =
true;
727 if (!is_object($langs)) {
728 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
731 if (defined(
'MAIN_LANG_DEFAULT')) {
732 $langcode = constant(
'MAIN_LANG_DEFAULT');
734 $langs->setDefaultLang($langcode);
738 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
741 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);
747 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
750 $oauthmodetotestarray = array(
'google');
751 foreach ($oauthmodetotestarray as $oauthmodetotest) {
752 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
754 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
757 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);
758 foreach ($authmode as $tmpkey => $tmpval) {
759 if ($tmpval == $oauthmodetotest.
'oauth') {
760 unset($authmode[$tmpkey]);
769 if ($login ===
'--bad-login-validity--') {
774 $dol_authmode =
$conf->authmode;
776 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
777 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
778 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
779 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
780 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
783 $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"];
784 $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"];
785 if ($dol_dst_first && $dol_dst_second) {
786 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
790 if ($datenow >= $datefirst && $datenow < $datesecond) {
794 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
795 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
800 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
802 $langs->loadLangs(array(
'main',
'errors'));
806 if (empty($_SESSION[
"dol_loginmesg"])) {
807 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
811 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
814 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
822 $hookmanager->initHooks(array(
'login'));
823 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
824 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
834 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
836 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);
837 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
842 return 'ERROR_NOT_LOGGED';
844 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
845 http_response_code(401);
854 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
856 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
857 dol_syslog(
'User not found or not valid, connection refused');
859 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
860 session_name($sessionname);
863 if ($resultFetchUser == 0) {
865 $langs->loadLangs(array(
'main',
'errors'));
867 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
869 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
870 } elseif ($resultFetchUser < 0) {
871 $_SESSION[
"dol_loginmesg"] = $user->error;
873 $user->context[
'audit'] = $user->error;
876 $langs->loadLangs(array(
'main',
'errors'));
878 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
880 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
884 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
893 $hookmanager->initHooks(array(
'login'));
894 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
895 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
902 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
910 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
914 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
915 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
920 $login = $_SESSION[
"dol_login"];
921 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
922 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
924 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
928 if ($resultFetchUser <= 0
929 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
930 || ($user->status != $user::STATUS_ENABLED)
931 || ($user->isNotIntoValidityDateRange())) {
932 if ($resultFetchUser <= 0) {
934 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
935 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
937 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
938 } elseif ($user->status != $user::STATUS_ENABLED) {
943 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
946 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
947 session_name($sessionname);
950 if ($resultFetchUser == 0) {
951 $langs->loadLangs(array(
'main',
'errors'));
953 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
955 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
956 } elseif ($resultFetchUser < 0) {
957 $_SESSION[
"dol_loginmesg"] = $user->error;
959 $user->context[
'audit'] = $user->error;
961 $langs->loadLangs(array(
'main',
'errors'));
963 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
965 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
969 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
977 $hookmanager->initHooks(array(
'login'));
978 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
979 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
984 $paramsurl = array();
986 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
989 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
992 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
995 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
999 $hookmanager->initHooks(array(
'main'));
1002 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1003 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1004 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1006 if (constant(
'DOL_URL_ROOT')) {
1007 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1009 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1010 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1014 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1015 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1016 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1018 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1019 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1020 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1022 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1023 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1024 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1026 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1027 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1028 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1030 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1031 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1032 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1035 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1036 if (empty($_SESSION[
'pageforbacktolist'])) {
1037 $pageforbacktolistarray = array();
1039 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1041 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1042 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1043 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1044 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1049 $parameters = array();
1050 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1059 if (!isset($_SESSION[
"dol_login"])) {
1064 $_SESSION[
"dol_login"] = $user->login;
1065 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1066 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1067 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1068 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1069 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1070 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1071 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1072 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1073 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1074 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1076 $_SESSION[
"dol_entity"] =
$conf->entity;
1078 if (!empty($dol_hide_topmenu)) {
1079 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1081 if (!empty($dol_hide_leftmenu)) {
1082 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1084 if (!empty($dol_optimize_smallscreen)) {
1085 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1087 if (!empty($dol_no_mouse_hover)) {
1088 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1090 if (!empty($dol_use_jmobile)) {
1091 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1094 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1098 $user->update_last_login_date();
1100 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1101 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1104 $user->context[
'audit'] = $loginfo;
1105 $user->context[
'authentication_method'] = $dol_authmode;
1108 $result = $user->call_trigger(
'USER_LOGIN', $user);
1116 $hookmanager->initHooks(array(
'login'));
1117 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1118 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1126 dol_print_error(
$db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1134 if (!empty($landingpage)) {
1136 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1137 header(
'Location: '.$newpath);
1144 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1146 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1147 $currentpage = $_SERVER[
'PHP_SELF'];
1149 foreach ($allowedpages as $page) {
1150 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1156 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1163 $user->rights->user->user->lire = 1;
1164 $user->rights->user->user->creer = 1;
1165 $user->rights->user->user->password = 1;
1166 $user->rights->user->user->supprimer = 1;
1167 $user->rights->user->self->creer = 1;
1168 $user->rights->user->self->password = 1;
1172 if (!$user->hasRight(
'user',
'user_advance')) {
1173 $user->rights->user->user_advance =
new stdClass();
1175 if (!$user->hasRight(
'user',
'self_advance')) {
1176 $user->rights->user->self_advance =
new stdClass();
1178 if (!$user->hasRight(
'user',
'group_advance')) {
1179 $user->rights->user->group_advance =
new stdClass();
1182 $user->rights->user->user_advance->readperms = 1;
1183 $user->rights->user->user_advance->write = 1;
1184 $user->rights->user->self_advance->readperms = 1;
1185 $user->rights->user->self_advance->writeperms = 1;
1186 $user->rights->user->group_advance->read = 1;
1187 $user->rights->user->group_advance->readperms = 1;
1188 $user->rights->user->group_advance->write = 1;
1189 $user->rights->user->group_advance->delete = 1;
1198 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1201 if ((
int)
$conf->liste_limit <= 0) {
1206 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1213 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1217 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1218 $user->loadDefaultValues();
1224if (
GETPOST(
'theme',
'aZ09')) {
1226 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1231 $conf->use_javascript_ajax = 0;
1242 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1252if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1253 $conf->dol_hide_leftmenu = 1;
1255if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1256 $conf->dol_hide_topmenu = 1;
1258if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1259 $conf->dol_optimize_smallscreen = 1;
1261if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1262 $conf->dol_no_mouse_hover = 1;
1264if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1265 $conf->dol_use_jmobile = 1;
1268if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1269 $conf->dol_no_mouse_hover = 1;
1273if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1274 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1275 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1278 $conf->dol_optimize_smallscreen = 1;
1281 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1285if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1286 $conf->theme =
'eldy';
1287 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1290if (!defined(
'NOREQUIRETRAN')) {
1291 if (!
GETPOST(
'lang',
'aZ09')) {
1293 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1296 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1297 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1303if (!defined(
'NOLOGIN')) {
1306 if (!$user->login) {
1311 if ($user->status < 1) {
1313 $langs->loadLangs(array(
"errors",
"other"));
1314 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1319 $user->loadRights();
1322dol_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);
1327if (!defined(
'NOREQUIRETRAN')) {
1329 $langs->loadLangs(array(
'main',
'dict'));
1335 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1336 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1337 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1339 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1340 $conf->browser->stringforfirstkey .=
' ALT +';
1341 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1342 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1344 $conf->browser->stringforfirstkey .=
' CTL +';
1350$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1351$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1352$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1364if (empty(
$conf->browser->firefox)) {
1365 define(
'ROWS_1', 1);
1366 define(
'ROWS_2', 2);
1367 define(
'ROWS_3', 3);
1368 define(
'ROWS_4', 4);
1369 define(
'ROWS_5', 5);
1370 define(
'ROWS_6', 6);
1371 define(
'ROWS_7', 7);
1372 define(
'ROWS_8', 8);
1373 define(
'ROWS_9', 9);
1375 define(
'ROWS_1', 0);
1376 define(
'ROWS_2', 1);
1377 define(
'ROWS_3', 2);
1378 define(
'ROWS_4', 3);
1379 define(
'ROWS_5', 4);
1380 define(
'ROWS_6', 5);
1381 define(
'ROWS_7', 6);
1382 define(
'ROWS_8', 7);
1383 define(
'ROWS_9', 8);
1386$heightforframes = 52;
1389if (!defined(
'NOREQUIREMENU')) {
1390 if (empty($user->socid)) {
1398 $file_menu =
$conf->standard_menu;
1399 if (
GETPOST(
'menu',
'alpha')) {
1400 $file_menu =
GETPOST(
'menu',
'alpha');
1403 if (!class_exists(
'MenuManager')) {
1405 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1406 foreach ($dirmenus as $dirmenu) {
1408 if (class_exists(
'MenuManager')) {
1412 if (!class_exists(
'MenuManager')) {
1413 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1414 $file_menu =
'eldy_menu.php';
1415 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1419 $menumanager =
new MenuManager(
$db, empty($user->socid) ? 0 : 1);
1421 $menumanager->loadMenu();
1424if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1425 $message =
GETPOST(
'seteventmessages',
'alpha');
1426 $messages = explode(
',', $message);
1427 foreach ($messages as $key => $msg) {
1428 $tmp = explode(
':', $msg);
1435if (!function_exists(
"llxHeader")) {
1459 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1461 global
$conf, $hookmanager;
1463 $parameters = array(
1465 'title' => & $title,
1466 'help_url' => & $help_url,
1467 'target' => & $target,
1468 'disablejs' => & $disablejs,
1469 'disablehead' => & $disablehead,
1470 'arrayofjs' => & $arrayofjs,
1471 'arrayofcss' => & $arrayofcss,
1472 'morequerystring' => & $morequerystring,
1473 'morecssonbody' => & $morecssonbody,
1474 'replacemainareaby' => & $replacemainareaby,
1475 'disablenofollow' => & $disablenofollow,
1476 'disablenoindex' => & $disablenoindex
1479 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1481 print $hookmanager->resPrint;
1486 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1488 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1490 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1492 if ($mainmenu !=
'website') {
1493 $tmpcsstouse = $morecssonbody;
1498 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1501 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1502 $tmpcsstouse .=
' dol_openinpopup';
1505 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1508 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1509 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1512 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1513 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1517 if ($replacemainareaby) {
1518 print $replacemainareaby;
1538 if ($contenttype !=
'none') {
1539 if ($contenttype ==
'text/html') {
1540 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1542 header(
"Content-Type: ".$contenttype);
1549 header(
"X-Content-Type-Options: nosniff");
1552 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1553 header(
"X-Frame-Options: SAMEORIGIN");
1555 header(
"X-Frame-Options: ALLOWALL");
1559 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1560 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1561 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1562 header(
'Vary: Origin');
1569 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1584 if (!is_object($hookmanager)) {
1585 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1588 $hookmanager->initHooks(array(
"main"));
1590 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1591 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1593 $contentsecuritypolicy = $hookmanager->resPrint;
1595 $contentsecuritypolicy .= $hookmanager->resPrint;
1599 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1601 if (!empty($contentsecuritypolicy)) {
1602 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1605 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1609 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1624 if (!is_object($hookmanager)) {
1625 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1628 $hookmanager->initHooks(array(
"main"));
1630 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1631 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1633 $contentsecuritypolicy = $hookmanager->resPrint;
1635 $contentsecuritypolicy .= $hookmanager->resPrint;
1639 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1641 if (!empty($contentsecuritypolicy)) {
1642 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1645 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1652 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1654 if (!empty($referrerpolicy)) {
1655 header(
"Referrer-Policy: ".$referrerpolicy);
1658 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1662 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1665 header(
"Strict-Transport-Security: ".$sts);
1668 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1672 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1675 header(
"Permissions-Policy: ".$pp);
1678 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1682 if ($forcenocache) {
1683 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1705function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1711 if (empty(
$conf->css)) {
1712 $conf->css =
'/theme/eldy/style.css.php';
1715 print
'<!doctype html>'.
"\n";
1717 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1720 if (empty($disablehead)) {
1721 if (!is_object($hookmanager)) {
1722 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1725 $hookmanager->initHooks(array(
"main"));
1727 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1731 if (
GETPOST(
'dol_basehref',
'alpha')) {
1732 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1736 print
'<meta charset="utf-8">'.
"\n";
1737 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1738 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1739 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1740 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1741 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1743 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1746 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1747 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1748 if (!empty(
$mysoc->logo_squarred_mini)) {
1749 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1754 if (empty(
$conf->dol_use_jmobile)) {
1755 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1756 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1760 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1761 $parameters = array(
'manifest' => $manifest);
1762 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1764 $manifest = $hookmanager->resPrint;
1766 $manifest .= $hookmanager->resPrint;
1768 if (!empty($manifest)) {
1769 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1773 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1778 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1782 $appli = constant(
'DOL_APPLICATION_TITLE');
1785 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1798 $parameters = array(
'title' => $titletoshow);
1799 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1801 $titletoshow = $hookmanager->resPrint;
1803 $titletoshow .= $hookmanager->resPrint;
1812 $ext =
'version='.GETPOSTINT(
'version');
1815 if (
GETPOST(
'dol_resetcache')) {
1816 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1820 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1822 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1823 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1824 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1826 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1827 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1829 if (GETPOSTISSET(
'dol_openinpopup')) {
1830 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1832 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1833 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1835 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1836 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1838 if (GETPOSTISSET(
'dol_use_jmobile')) {
1839 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1842 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1843 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1845 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1846 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1857 'DOL_VERSION' => DOL_VERSION,
1858 'DOL_URL_ROOT' => DOL_URL_ROOT,
1861 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1863 'dolibarr-context.umd.js',
1864 'dolibarr-tool.seteventmessage.js'
1867 if (! defined(
'NOREQUIRETRAN')) {
1869 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1870 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1871 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1872 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1876 foreach ($jsContextFiles as $jsContextFile) {
1877 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1881 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1887 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1888 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1891 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1892 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1893 if (!defined(
'DISABLE_JQUERY_UI')) {
1894 $jquerytheme =
'base';
1898 if (constant(
'JS_JQUERY_UI')) {
1899 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1901 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1904 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1905 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1907 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1909 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1913 if (!defined(
'DISABLE_FONT_AWSOME')) {
1914 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1915 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1916 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1922 if (!empty(
$conf->modules_parts[
'theme'])) {
1923 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1926 $themesubdir = $reldir;
1932 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1933 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1934 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1946 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1947 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1951 if (!empty(
$conf->modules_parts[
'css'])) {
1952 $arraycss = (array)
$conf->modules_parts[
'css'];
1953 foreach ($arraycss as $modcss => $filescss) {
1954 $filescss = (array) $filescss;
1955 foreach ($filescss as $cssfile) {
1956 if (empty($cssfile)) {
1957 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1961 if ($urlforcss && $urlforcss !=
'/') {
1962 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1964 if (!preg_match(
'/\.css$/i', $cssfile)) {
1969 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1975 if (is_array($arrayofcss)) {
1976 foreach ($arrayofcss as $cssfile) {
1977 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1978 $urltofile = $cssfile;
1982 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1984 if (!preg_match(
'/\.css$/i', $cssfile)) {
1994 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1998 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
2000 print
'<!-- Includes JS for JQuery -->'.
"\n";
2001 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2002 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
2004 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
2006 if (!defined(
'DISABLE_JQUERY_UI')) {
2007 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2008 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2010 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
2014 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2015 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
2018 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2019 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2023 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2045 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2048 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2050 if (!defined(
'DISABLE_MULTISELECT')) {
2051 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2055 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2058 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2059 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2060 $jsckeditor =
'ckeditor.js';
2061 if (constant(
'JS_CKEDITOR')) {
2063 $pathckeditor = constant(
'JS_CKEDITOR');
2065 print
'<script nonce="'.getNonce().
'">';
2066 print
'/* enable ckeditor by main.inc.php */';
2067 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2068 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2069 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2070 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";
2071 print
'</script>'.
"\n";
2072 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2074 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2075 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2077 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2079 print
'</script>'.
"\n";
2083 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2084 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2085 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2086 $jstinymce =
'tinymce.min.js';
2087 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2088 $pathtinymce = constant(
'JS_TINYMCE');
2090 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2091 print
'<script nonce="'.getNonce().
'">';
2092 print
'/* enable tinymce by main.inc.php */';
2093 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2094 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2095 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";
2096 print
'</script>'.
"\n";
2097 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2098 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2102 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2103 $enablebrowsernotif =
false;
2105 $enablebrowsernotif =
true;
2107 if (
$conf->browser->layout ==
'phone') {
2108 $enablebrowsernotif =
false;
2110 if ($enablebrowsernotif) {
2111 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2112 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2117 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2118 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2119 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2124 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2125 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2129 if (!empty(
$conf->modules_parts[
'js'])) {
2130 $arrayjs = (array)
$conf->modules_parts[
'js'];
2131 foreach ($arrayjs as $modjs => $filesjs) {
2132 $filesjs = (array) $filesjs;
2133 foreach ($filesjs as $jsfile) {
2136 if ($urlforjs && $urlforjs !=
'/') {
2137 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2138 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2140 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2146 if (is_array($arrayofjs)) {
2147 print
'<!-- Includes JS added by page -->'.
"\n";
2148 foreach ($arrayofjs as $jsfile) {
2149 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2150 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2152 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2161 if (file_exists($theme_js)) {
2162 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2166 if (!empty($head)) {
2173 $parameters = array();
2174 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2175 print $hookmanager->resPrint;
2177 print
"</head>\n\n";
2180 $conf->headerdone = 1;
2200function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2202 global $user,
$conf, $langs,
$db, $form;
2203 global $dolibarr_main_authentication, $dolibarr_main_demo;
2204 global $hookmanager, $menumanager;
2209 $hookmanager->initHooks(array(
'toprightmenu'));
2214 if (empty(
$conf->headerdone)) {
2215 $disablenofollow = 0;
2216 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2217 print
'<body id="mainbody">';
2223 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2224 if (!isset($form) || !is_object($form)) {
2225 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2229 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2231 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2234 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2236 $menumanager->atarget = $target;
2238 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2242 $appli = constant(
'DOL_APPLICATION_TITLE');
2245 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2247 $appli .=
" ".DOL_VERSION;
2251 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2255 $logouthtmltext =
'';
2257 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2258 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2259 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2260 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2261 $logouttext .=
'</a>';
2263 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2264 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2269 print
'<div class="login_block usedropdown">'.
"\n";
2273 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2276 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2299 $toprightmenu .=
'</div>';
2301 $toprightmenu .=
'</div>'.
"\n";
2305 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2308 $parameters = array();
2309 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2310 if (is_numeric($result)) {
2312 $toprightmenu .= $hookmanager->resPrint;
2314 $toprightmenu = $hookmanager->resPrint;
2317 $toprightmenu .= $result;
2322 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2324 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2327 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2334 if (isset($_POST) && is_array($_POST)) {
2335 foreach ($_POST as $key => $value) {
2336 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2337 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2340 if (!is_array($value)) {
2341 if ($value !==
'') {
2342 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2345 foreach ($value as $value2) {
2346 if (($value2 !==
'') && (!is_array($value2))) {
2347 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2353 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2354 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2356 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2359 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2364 $langs->load(
"help");
2371 if (empty($helppagename)) {
2372 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2374 $helppresent =
'helppresent';
2379 $helpbaseurl = $arrayres[
'helpbaseurl'];
2380 $helppage = $arrayres[
'helppage'];
2381 $mode = $arrayres[
'mode'];
2384 if ($helpbaseurl && $helppage) {
2386 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2387 if ($mode ==
'wiki') {
2388 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2390 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2392 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2395 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2396 if ($mode ==
'wiki') {
2398 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2401 $text .= sprintf($helpbaseurl, $helppage);
2404 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2405 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2408 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2413 $langs->load(
'admin');
2414 $appli .=
'<br>'.$langs->trans(
"Database").
': '.
$db->database_name;
2420 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2422 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2427 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2430 $toprightmenu .=
'</div>';
2434 $toprightmenu .=
'<div class="login_block_user">';
2437 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2442 $toprightmenu .=
'</div>';
2444 $toprightmenu .=
'</div>'.
"\n";
2447 print $toprightmenu;
2454 print
'<div style="clear: both;"></div>';
2455 print
"<!-- End top horizontal menu -->\n\n";
2458 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2459 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2474 global $dolibarr_main_authentication, $dolibarr_main_demo;
2475 global $menumanager, $form;
2478 if (
$conf->browser->name ==
'textbrowser') {
2482 $langs->load(
'companies');
2484 $userImage = $userDropDownImage =
'';
2485 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2486 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2487 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2489 $nophoto =
'/public/theme/common/user_anonymous.png';
2490 if ($user->gender ==
'man') {
2491 $nophoto =
'/public/theme/common/user_man.png';
2493 if ($user->gender ==
'woman') {
2494 $nophoto =
'/public/theme/common/user_woman.png';
2497 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2499 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2503 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2504 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2508 while ($idprofcursor < 10) {
2510 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2511 if ($idprofcursor == 1) {
2512 $constkeyforprofid =
'MAIN_INFO_SIREN';
2514 if ($idprofcursor == 2) {
2515 $constkeyforprofid =
'MAIN_INFO_SIRET';
2517 if ($idprofcursor == 3) {
2518 $constkeyforprofid =
'MAIN_INFO_APE';
2520 if ($idprofcursor == 4) {
2521 $constkeyforprofid =
'MAIN_INFO_RCS';
2523 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2533 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2535 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2537 $dropdownBody .=
'</div>';
2539 $dropdownBody .=
'<br>';
2540 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2541 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2544 if (!empty($user->admin)) {
2545 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2548 if (!empty($user->socid)) {
2550 $thirdpartystatic->fetch($user->socid);
2551 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2552 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2554 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2555 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2556 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2557 $dropdownBody .=
'<br>';
2559 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2560 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2562 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2564 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2565 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2566 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2567 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2569 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2571 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2573 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2574 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2575 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2580 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2581 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2582 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2583 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2584 if (!empty($_SESSION[
"disablemodules"])) {
2585 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2587 $dropdownBody .=
'</div>';
2590 $parameters = array(
'user' => $user,
'langs' => $langs);
2591 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2592 if (is_numeric($result)) {
2594 $dropdownBody .= $hookmanager->resPrint;
2596 $dropdownBody = $hookmanager->resPrint;
2600 if (empty($urllogout)) {
2601 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2605 $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>';
2606 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2607 $jsonopen =
"closeTopMenuLoginDropdown()";
2608 $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');
2609 $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>';
2611 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2612 if (!empty($user->admin)) {
2613 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2617 $appli = constant(
'DOL_APPLICATION_TITLE');
2620 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2622 $appli .=
" ".DOL_VERSION;
2626 $btnUser =
'<!-- div for user link -->
2627 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2628 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2629 '.$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>' :
'').
'
2631 <div class="dropdown-menu">
2633 <div class="user-header">
2634 '.$userDropDownImage.
'
2636 '.$profilName.
'<br>';
2638 if ($user->datelastlogin) {
2639 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2640 if ($user->datepreviouslogin) {
2641 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2644 $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>';
2645 if ($user->datepreviouslogin) {
2646 $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>';
2654 <!-- Menu Body user-->
2655 <div class="user-body">'.$dropdownBody.
'</div>
2658 <div class="user-footer">
2659 <div class="pull-left">
2662 <div class="pull-left">
2663 '.$virtuelcardLink.
'
2665 <div class="pull-right">
2668 <div class="clearboth"></div>
2674 $btnUser =
'<!-- div for user link text browser -->
2675 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2676 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2677 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2682 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2684 <!-- Code to show/hide the user drop-down -->
2686 function closeTopMenuLoginDropdown() {
2687 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2689 jQuery("#topmenu-login-dropdown").removeClass("open");
2691 jQuery(document).ready(function() {
2692 jQuery(document).on("click", function(event) {
2693 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2694 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2695 /* console.log("click close login - we click outside"); */
2696 closeTopMenuLoginDropdown();
2704 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2705 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2706 event.preventDefault();
2707 jQuery("#topmenu-login-dropdown").toggleClass("open");
2710 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2711 console.log("Click on #topmenulogincompanyinfo-btn");
2712 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2713 jQuery("#topmenuloginmoreinfo").slideToggle();
2715 jQuery("#topmenulogincompanyinfo").slideToggle();
2718 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2719 console.log("Click on #topmenuloginmoreinfo-btn");
2720 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2721 jQuery("#topmenulogincompanyinfo").slideToggle();
2723 jQuery("#topmenuloginmoreinfo").slideToggle();
2745 global
$conf, $langs, $user;
2753 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2757 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2761 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css">';
2765 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2766 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2767 <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>
2773 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2774 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2780 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2781 $aijsver = @filemtime($aijsfile);
2782 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2784 $html .=
'<script nonce="'.getNonce().
'">
2786 var toggle = document.getElementById("topmenu-ai-toggle");
2787 var popover = document.getElementById("topmenu-ai-popover");
2788 if (!toggle || !popover) { return; }
2789 var body = popover.querySelector(".ai-popover-body");
2791 var loading = false;
2793 function positionPopover() {
2794 var top = document.getElementById("id-top");
2795 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2796 popover.style.setProperty("--ai-popover-top", anchor + "px");
2799 function loadChat() {
2800 if (loaded || loading) { return; }
2802 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2803 .then(function (resp) {
2804 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2807 .then(function (htmlcontent) {
2808 body.innerHTML = htmlcontent;
2809 return import("'.
dol_escape_js($aijsurl).
'").then(function (mod) {
2810 mod.initAiAssistant(body.querySelector(".ai-chat-container"));
2817 .catch(function (e) {
2818 console.error("AI Assistant popover load failed", e);
2819 body.innerHTML = "<div class=\"ai-popover-loading\">'.
dol_escape_js($langs->trans(
'Error')).
'</div>";
2821 .finally(function () { loading = false; });
2824 function focusInput() {
2825 var input = body.querySelector("#user-input");
2826 if (input) { input.focus(); }
2829 toggle.addEventListener("click", function (event) {
2830 event.preventDefault();
2831 // position:fixed can be hijacked by a transformed ancestor: hosting the
2832 // panel directly under <body> guarantees viewport coordinates.
2833 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2835 var isOpen = popover.classList.toggle("open");
2838 if (loaded) { focusInput(); }
2842 popover.addEventListener("click", function (event) {
2843 var closeBtn = event.target.closest("#ai-close-btn");
2844 var expandBtn = event.target.closest("#ai-expand-btn");
2846 popover.classList.remove("open");
2847 } else if (expandBtn) {
2848 var expanded = popover.classList.toggle("expanded");
2849 var icon = expandBtn.querySelector("i");
2850 if (icon) { icon.className = expanded ? "fa fa-compress-alt" : "fa fa-expand-alt"; }
2851 expandBtn.title = expanded ? (expandBtn.dataset.titleReduce || "") : (expandBtn.dataset.titleExpand || "");
2855 document.addEventListener("keydown", function (event) {
2856 if (event.key === "Escape" && popover.classList.contains("open")) {
2857 popover.classList.remove("open");
2874 global
$conf, $langs;
2883 if (!empty(
$conf->use_javascript_ajax)) {
2884 $html .=
'<!-- div for quick add link -->
2885 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2886 <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>
2889 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2891 <!-- Code to show/hide the user drop-down for the quick add -->
2893 jQuery(document).ready(function() {
2894 jQuery(document).on("click", function(event) {
2895 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2896 /* console.log("click close quick add - we click outside"); */
2898 $("#topmenu-quickadd-dropdown").removeClass("open");
2901 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2902 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2903 openQuickAddDropDown(event);
2907 $(document).keydown(function(event){
2908 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2909 if (ostype ===
"macintosh") {
2910 if ( event.which === 65 && event.ctrlKey ) {
2911 console.log(\
'control + a : trigger open quick add dropdown\');
2912 openQuickAddDropDown(event);
2915 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2916 console.log(\'control + shift + a : trigger open quick add dropdown\');
2917 openQuickAddDropDown(event);
2922 var openQuickAddDropDown = function(event) {
2923 event.preventDefault();
2924 $("#topmenu-quickadd-dropdown").toggleClass("open");
2944 global
$conf, $langs;
2953 if (!empty(
$conf->use_javascript_ajax)) {
2954 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2959 $html .=
'<!-- div for link to upload file -->
2960 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2961 <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>
2977 global $user, $langs, $hookmanager;
2982 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2983 "title" =>
"MenuNewMember@members",
2984 "name" =>
"Adherent@members",
2985 "picto" =>
"object_member",
2986 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2990 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2991 "title" =>
"MenuNewThirdParty@companies",
2992 "name" =>
"ThirdParty@companies",
2993 "picto" =>
"object_company",
2994 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2998 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2999 "title" =>
"NewContactAddress@companies",
3000 "name" =>
"Contact@companies",
3001 "picto" =>
"object_contact",
3002 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3006 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3007 "title" =>
"NewPropal@propal",
3008 "name" =>
"Proposal@propal",
3009 "picto" =>
"object_propal",
3010 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3015 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3016 "title" =>
"NewOrder@orders",
3017 "name" =>
"Order@orders",
3018 "picto" =>
"object_order",
3019 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3023 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3024 "title" =>
"NewBill@bills",
3025 "name" =>
"Bill@bills",
3026 "picto" =>
"object_bill",
3027 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3031 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3032 "title" =>
"NewContractSubscription@contracts",
3033 "name" =>
"Contract@contracts",
3034 "picto" =>
"object_contract",
3035 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3039 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3040 "title" =>
"SupplierProposalNew@supplier_proposal",
3041 "name" =>
"SupplierProposal@supplier_proposal",
3042 "picto" =>
"supplier_proposal",
3043 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3047 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3048 "title" =>
"NewSupplierOrderShort@orders",
3049 "name" =>
"SupplierOrder@orders",
3050 "picto" =>
"supplier_order",
3051 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3055 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3056 "title" =>
"NewBill@bills",
3057 "name" =>
"SupplierBill@bills",
3058 "picto" =>
"supplier_invoice",
3059 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3063 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3064 "title" =>
"NewTicket@ticket",
3065 "name" =>
"Ticket@ticket",
3066 "picto" =>
"ticket",
3067 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3071 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3072 "title" =>
"NewIntervention@interventions",
3073 "name" =>
"Intervention@interventions",
3074 "picto" =>
"intervention",
3075 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3079 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3080 "title" =>
"NewProduct@products",
3081 "name" =>
"Product@products",
3082 "picto" =>
"object_product",
3083 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3087 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3088 "title" =>
"NewService@products",
3089 "name" =>
"Service@products",
3090 "picto" =>
"object_service",
3091 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3095 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3096 "title" =>
"StockTransferNew@stocks",
3097 "name" =>
"StockTransfer@stocks",
3099 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3103 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3104 "title" =>
"AddUser@users",
3105 "name" =>
"User@users",
3107 "activation" => $user->hasRight(
"user",
"user",
"write"),
3113 $dropDownQuickAddHtml =
'';
3117 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3119 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3122 $parameters = array();
3123 $hook_items = $items;
3124 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3125 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3126 if ($reshook == 0) {
3127 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3129 $items = $hookmanager->resArray;
3133 $position = array();
3134 foreach ($items[
'items'] as $key => $row) {
3135 $position[$key] = $row[
'position'];
3137 $array1_sort_order = SORT_ASC;
3138 array_multisort($position, $array1_sort_order, $items[
'items']);
3141 foreach ($items[
'items'] as $item) {
3142 if (!$item[
'activation']) {
3145 $langs->load(explode(
'@', $item[
'title'])[1]);
3146 $langs->load(explode(
'@', $item[
'name'])[1]);
3147 $dropDownQuickAddHtml .=
'
3148 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3149 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3154 $dropDownQuickAddHtml .=
'</div>';
3156 $dropDownQuickAddHtml .=
'</div>';
3158 return $dropDownQuickAddHtml;
3168 global $langs,
$conf, $user;
3173 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3182 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3183 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3184 $langs->load(
"bookmarks");
3187 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3191 $html .=
'<!-- div for bookmark link -->
3192 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3193 <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>
3194 <div class="dropdown-menu">
3200 <!-- Code to show/hide the bookmark drop-down -->
3202 jQuery(document).ready(function() {
3203 jQuery(document).on("click", function(event) {
3204 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3205 /* console.log("close bookmark dropdown - we click outside"); */
3207 $("#topmenu-bookmark-dropdown").removeClass("open");
3211 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3212 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3213 openBookMarkDropDown(event);
3217 jQuery(document).keydown(function(event) {
3218 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3219 if (ostype ===
"macintosh") {
3220 if ( event.which === 66 && event.ctrlKey ) {
3221 console.log(
"Click on control + b : trigger open bookmark dropdown");
3222 openBookMarkDropDown(event);
3225 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3226 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3227 openBookMarkDropDown(event);
3232 var openBookMarkDropDown =
function(event) {
3233 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3234 event.preventDefault();
3235 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3236 jQuery(
"#top-bookmark-search-input").focus();
3252function top_menu_search()
3254 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3259 $arrayresult = array();
3260 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3262 $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">
';
3264 $defaultAction = '';
3265 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3266 // Menu with all searchable items
3267 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3268 foreach ($arrayresult as $keyItem => $item) {
3269 if (empty($defaultAction)) {
3270 $defaultAction = $item['url
'];
3272 $buttonList .= '<
button class=
"dropdown-item global-search-item '.(empty($conf->dol_optimize_smallscreen) ? 'tdoverflowmax400' : 'tdoverflowmax300').'" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3273 $buttonList .= $item['text
'];
3274 $buttonList .= '</
button>
';
3276 $buttonList .= '</div>
';
3278 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3281 <!-- search input -->
3282 <div
class=
"dropdown-header search-dropdown-header">
3288 <!--
Menu Body search -->
3289 <div
class=
"dropdown-body search-dropdown-body">
3294 $dropDownHtml .= '</form>
';
3296 $html .= '<!-- div
for Global Search -->
3297 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3298 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3299 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3301 <div
class=
"dropdown-menu dropdown-search">
3307 <!-- Code to show/hide the
user drop-down -->
3309 jQuery(document).ready(
function() {
3312 jQuery(
"#top-global-search-input").keydown(
function (e) {
3313 if (e.keyCode == 13 || e.keyCode == 40) {
3314 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3315 if (inputs[inputs.index(this) + 1] != null) {
3316 console.log(
"Force focus after keydow on #top-global-search-input");
3317 inputs[inputs.index(this) + 1].focus();
3318 if (e.keyCode == 13){
3319 inputs[inputs.index(this) + 1].trigger(
"click");
3329 jQuery(document).keydown(
function(e) {
3331 var $focused = $(
":focus");
3332 if($focused.length && $focused.hasClass(
"global-search-item")){
3335 if (e.keyCode == 38) {
3337 console.log(
"Force focus after keycode 38");
3338 $focused.prev().focus();
3342 if (e.keyCode == 40) {
3344 console.log(
"Force focus after keycode 40");
3345 $focused.next().focus();
3352 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3353 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3354 jQuery(
"#top-menu-action-search").submit();
3358 jQuery(document).on(
"click",
function(event) {
3359 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3360 console.log(
"click close search - we click outside");
3362 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3367 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3368 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3369 openGlobalSearchDropDown();
3373 jQuery(document).keydown(
function(e){
3374 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3375 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3376 openGlobalSearchDropDown();
3378 if ( e.which === 70 && e.alKey ) {
3379 console.log(\'alt + f : trigger open global-search dropdown\');
3380 openGlobalSearchDropDown();
3384 var openGlobalSearchDropDown = function() {
3385 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3386 jQuery("#top-global-search-input").focus();
3410function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3412 global $user,
$conf, $langs,
$db, $form;
3413 global $hookmanager, $menumanager;
3417 if (!empty($menu_array_before)) {
3418 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);
3421 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3423 $hookmanager->initHooks(array(
'leftblock'));
3425 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3428 if (!is_object($form)) {
3434 if (
$conf->browser->layout ==
'phone') {
3435 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3439 $arrayresult = array();
3440 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3444 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3445 $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');
3447 if (is_array($arrayresult)) {
3449 foreach ($arrayresult as $key => $val) {
3450 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3456 $parameters = array(
'searchform' => $searchform);
3457 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3458 if (empty($reshook)) {
3459 $searchform .= $hookmanager->resPrint;
3461 $searchform = $hookmanager->resPrint;
3466 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3467 $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>';
3469 $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>';
3470 $searchform .=
'<script>
3471 jQuery(document).ready(function () {
3472 jQuery("#divsearchforms1").click(function(){
3473 jQuery("#divsearchforms2").toggle();
3477 $searchform .=
'</div>';
3481 $searchform .=
'<script>
3482 jQuery(document).keydown(function(e){
3483 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3484 console.log(\'control + shift + f : trigger open global-search dropdown\');
3485 openGlobalSearchDropDown();
3487 if( (e.which === 83 || e.which === 115) && e.altKey ){
3488 console.log(\'alt + s : trigger open global-search dropdown\');
3489 openGlobalSearchDropDown();
3493 var openGlobalSearchDropDown = function() {
3494 jQuery("#searchselectcombo").select2(\'open\');
3500 print
'<!-- Begin left menu -->'.
"\n";
3502 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3506 $menumanager->menu_array = $menu_array_before;
3508 $menumanager->menu_array_after = $menu_array_after;
3511 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3514 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3520 print
"<!-- Begin Help Block-->\n";
3521 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3525 $doliurl =
'https://www.dolibarr.org';
3527 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3528 $doliurl =
'https://www.dolibarr.fr';
3530 if (preg_match(
'/es/i', $langs->defaultlang)) {
3531 $doliurl =
'https://www.dolibarr.es';
3533 if (preg_match(
'/de/i', $langs->defaultlang)) {
3534 $doliurl =
'https://www.dolibarr.de';
3536 if (preg_match(
'/it/i', $langs->defaultlang)) {
3537 $doliurl =
'https://www.dolibarr.it';
3539 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3540 $doliurl =
'https://www.dolibarr.gr';
3543 $appli = constant(
'DOL_APPLICATION_TITLE');
3546 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3548 $appli .=
" ".DOL_VERSION;
3556 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3558 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3560 print
'<span class="help">';
3568 print
'</div>'.
"\n";
3573 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3576 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3577 $bugbaseurl .=
'&title=';
3578 $bugbaseurl .= urlencode(
"Bug: ");
3579 $bugbaseurl .=
'&body=';
3580 $bugbaseurl .= urlencode(
"# Instructions\n");
3581 $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");
3582 $bugbaseurl .= urlencode(
"*Please:*\n");
3583 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3584 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3585 $bugbaseurl .= urlencode(
"\n");
3586 $bugbaseurl .= urlencode(
"\n");
3587 $bugbaseurl .= urlencode(
"# Bug\n");
3588 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3589 $bugbaseurl .= urlencode(
"\n");
3590 $bugbaseurl .= urlencode(
"## Environment\n");
3591 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3592 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3593 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3594 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3595 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.
$db->getVersion().
"\n");
3596 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3597 $bugbaseurl .= urlencode(
"\n");
3598 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3599 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3600 $bugbaseurl .= urlencode(
"\n");
3601 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3602 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3603 $bugbaseurl .= urlencode(
"\n");
3604 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3605 $bugbaseurl .= urlencode(
"[*Files*]\n");
3606 $bugbaseurl .= urlencode(
"\n");
3608 $bugbaseurl .= urlencode(
"\n");
3609 $bugbaseurl .= urlencode(
"## Report\n");
3617 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3618 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3619 if (empty($reshook)) {
3620 $bugbaseurl .= $hookmanager->resPrint;
3622 $bugbaseurl = $hookmanager->resPrint;
3625 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3626 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3631 print
"<!-- End Help Block-->\n";
3636 print
"<!-- End left menu -->\n";
3640 $parameters = array();
3641 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3642 print $hookmanager->resPrint;
3644 print
'</div></div> <!-- End side-nav id-left -->';
3648 print
'<!-- Begin right area -->'.
"\n";
3650 if (empty($leftmenuwithoutmainarea)) {
3664 global
$conf, $langs, $hookmanager;
3666 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3667 print
'<div id="id-right">';
3672 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3674 $hookmanager->initHooks(array(
'main'));
3675 $parameters = array();
3676 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3677 print $hookmanager->resPrint;
3680 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3685 $parameters = array();
3686 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3687 if (empty($reshook)) {
3688 print
'<!-- Begin show mysoc info header -->'.
"\n";
3689 print
'<div id="mysoc-info-header">'.
"\n";
3690 print
'<table class="centpercent div-table-responsive">'.
"\n";
3692 print
'<tr><td rowspan="0" class="width20p">';
3694 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'))).
'">';
3696 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3697 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3709 print
'</table>'.
"\n";
3710 print
'</div>'.
"\n";
3711 print
'<!-- End show mysoc info header -->'.
"\n";
3730 if (preg_match(
'/^http/i', $helppagename)) {
3732 $helpbaseurl =
'%s';
3733 $helppage = $helppagename;
3738 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3739 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3740 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3741 $helppage = $reg[1];
3744 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3745 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3746 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3747 $helppage = $reg[1];
3750 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3751 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3752 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3753 $helppage = $reg[1];
3756 if (empty($helppage)) {
3757 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3758 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3759 $helppage = $reg[1];
3764 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3784function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3786 global $langs, $user;
3789 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3790 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3791 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3792 if ($showtitlebefore) {
3793 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3795 $ret .=
'<div class="tagtd">';
3796 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3797 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3798 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3799 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3800 $ret .=
' placeholder="'.strip_tags($title).
'"';
3801 $ret .= ($autofocus ?
' autofocus' :
'');
3802 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3803 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3804 $ret .=
'<span class="fa fa-search"></span>';
3805 $ret .=
'</button>';
3807 $ret .=
"</form>\n";
3812if (!function_exists(
"llxFooter")) {
3826 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3829 global $delayedhtmlcontent;
3830 global $contextpage, $page, $limit, $mode;
3831 global $dolibarr_distrib;
3833 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3837 $parameters = array();
3838 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3839 if (empty($reshook)) {
3840 $llxfooter .= $hookmanager->resPrint;
3841 } elseif ($reshook > 0) {
3842 $llxfooter = $hookmanager->resPrint;
3853 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3855 foreach ($user->lastsearch_values_tmp as $key => $val) {
3856 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3857 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3858 if (empty($val[
'sortfield'])) {
3859 unset($val[
'sortfield']);
3861 if (empty($val[
'sortorder'])) {
3862 unset($val[
'sortorder']);
3864 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3865 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3866 unset($_SESSION[
'lastsearch_values_'.$key]);
3872 $relativepathstring = $_SERVER[
"PHP_SELF"];
3874 if (constant(
'DOL_URL_ROOT')) {
3875 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3877 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3878 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3879 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3880 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3881 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3882 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3883 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3885 if (!empty($contextpage)) {
3886 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3888 if (!empty($page) && $page > 0) {
3889 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3891 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3892 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3894 if (!empty($mode)) {
3895 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3898 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3899 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3900 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3901 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3907 if (
$conf->use_javascript_ajax) {
3908 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3909 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3912 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3913 print
'<div class="error">'.$msg.
'</div>';
3921 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3923 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3924 print
'</div> <!-- End div id-right -->'.
"\n";
3927 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3928 print
'</div> <!-- End div id-container -->'.
"\n";
3933 print
'<!-- '.$comment.
' -->'.
"\n";
3938 if (!empty($delayedhtmlcontent)) {
3939 print $delayedhtmlcontent;
3942 if (!empty(
$conf->use_javascript_ajax)) {
3943 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3944 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
3989 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3990 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3993 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3994 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
4001 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4002 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4005 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
4006 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
4007 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
4010 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4013 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4014 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4015 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
4017 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4019 $arrayofmoredata = array(
4020 'action' =>
'dolibarrping',
4023 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4025 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4028 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4029 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4034 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4040 $forceregistration =
GETPOSTINT(
'forceregistration');
4042 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4043 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4046 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4048 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4051 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4052 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4053 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4056 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4057 || $forceregistration) {
4059 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4060 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4061 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4063 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4065 $arrayofdata = array(
4066 'action' =>
'dolibarrregistration',
4077 'country_code' =>
$mysoc->country_code,
4090 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4093 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4094 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4099 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4143 $parameters = array();
4144 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4146 print $hookmanager->resPrint;
if(! $sortfield) if(! $sortorder) $object
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays), to know if a version (a,b,c) is lower than (x,...
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
isALNEQualifiedVersion($ignoredev=0, $ignoremodule=0)
Return if the version is a candidate version to get the LNE certification and if the prerequisites ar...
isRegistrationDataSaved()
Return if the KYC mandatory parameters are set Must be the same fields than the one defined as mandat...
getHashUniqueIdOfRegistration($algo='sha256')
Return a hash unique identifier of the registration (used to identify the registration of instance wi...
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata=array(), $forceping=0)
Function to output HTML to make an ajax call to make registration.
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
getListLimitFromScreenHeight()
Get the limit of list to show according to the screen height.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getNonce()
Return a random string to be used as a nonce value for js.
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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
top_menu_importfile()
Build the tooltip on top menu quick add.
top_menu_quickadd()
Build the tooltip on top menu quick add.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
top_menu_ai()
Build the HTML for the AI Assistant entry of the top menu: a toggle icon and a floating popover panel...
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after=array(), $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
printDropdownQuickadd($mode=0)
Generate list of quickadd items.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
top_menu_search()
Build the tooltip on top menu search.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
$conf db name
Only used if Module[ID]Name translation string is not found.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successful.
checkIPInCidr($ip, $cidr)
Check if IP address is in CIDR range.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...