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 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, array(
'check',
'create',
'create2',
'createsite',
'createcard',
'edit',
'editcontract',
'editfile',
'editvalidator',
'file_manager',
'history',
'presend',
'presend_addmessage',
'preview',
'reconcile',
'specimen',
'testsetup',
'undeployconfirmed',
'validatenewpassword',
'view')))) {
375 $sensitiveget =
true;
379 $arrayofactiontoforcetokencheck = array(
381 'doprev',
'donext',
'dvprev',
'dvnext',
382 'freezone',
'install',
385 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
386 $sensitiveget =
true;
389 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
390 $sensitiveget =
true;
397 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
399 GETPOSTISSET(
'massaction') ||
400 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
403 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
406 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
407 $langs->loadLangs(array(
"errors",
"install"));
408 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
409 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
411 http_response_code(403);
412 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
413 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);
414 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";
416 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);
417 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";
418 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";
422 print
" into setup).\n";
429 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
431 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
432 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);
435 if (!defined(
'NOTOKENRENEWAL')) {
437 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
440 if (isset($_POST[
'id'])) {
441 $savid = ((int) $_POST[
'id']);
444 unset($_GET[
'confirm']);
445 unset($_GET[
'action']);
446 unset($_GET[
'confirmmassaction']);
447 unset($_GET[
'massaction']);
448 unset($_GET[
'token']);
450 $_POST[
'id'] = ((int) $savid);
453 $_GET[
'errorcode'] =
'InvalidToken';
459if (!empty($dolibarr_main_demo)) {
461 if (GETPOSTISSET(
'disablemodules')) {
462 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
464 if (!empty($_SESSION[
"disablemodules"])) {
465 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
467 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
468 foreach ($disabled_modules as $module) {
470 if (empty(
$conf->$module)) {
474 $conf->$module->enabled =
false;
475 unset(
$conf->modules[$module]);
477 foreach ($modulepartkeys as $modulepartkey) {
478 unset(
$conf->modules_parts[$modulepartkey][$module]);
480 if ($module ==
'fournisseur') {
481 $conf->supplier_order->enabled = 0;
482 $conf->supplier_invoice->enabled = 0;
483 unset(
$conf->modules[
'supplier_order']);
484 unset(
$conf->modules[
'supplier_invoice']);
492$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
493if (is_array($modulepart) && count($modulepart) > 0) {
494 foreach (
$conf->modules as $module) {
495 if (in_array($module, $modulepart)) {
496 $modulepart = $module;
501if (is_array($modulepart)) {
512if (!defined(
'NOLOGIN')) {
516 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
517 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
520 if (empty($dolibarr_main_authentication)) {
521 $dolibarr_main_authentication =
'dolibarr';
524 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
525 $dolibarr_auto_user =
'auto';
529 $authmode = explode(
',', $dolibarr_main_authentication);
532 if (!count($authmode)) {
533 $langs->load(
'main');
534 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
541 $resultFetchUser =
'';
543 $dol_authmode =
null;
545 if (!isset($_SESSION[
"dol_login"])) {
547 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
549 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
551 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
552 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
553 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
554 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
555 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
556 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
557 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
558 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
561 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
562 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
563 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
565 if ($dol_hide_topmenu) {
566 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
568 if ($dol_hide_leftmenu) {
569 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
571 if ($dol_optimize_smallscreen) {
572 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
574 if ($dol_no_mouse_hover) {
575 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
577 if ($dol_use_jmobile) {
578 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
580 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
587 $hookmanager->initHooks(array(
'login'));
588 $parameters = array();
589 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
596 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
600 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
604 $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());
605 $fullpathclassfile =
'';
606 foreach ($dirModCaptcha as $dir) {
607 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
608 if ($fullpathclassfile) {
614 if ($fullpathclassfile) {
615 include_once $fullpathclassfile;
619 $classname =
"modCaptcha".ucfirst($captcha);
620 if (class_exists($classname)) {
622 $captchaobj =
new $classname(
$db,
$conf, $langs, $user);
623 '@phan-var-force ModeleCaptcha $captchaobj';
625 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
626 $ok = $captchaobj->validateCodeAfterLoginSubmit();
628 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
633 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
638 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
645 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
647 $langs->loadLangs(array(
'main',
'errors'));
649 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
653 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
656 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
664 $hookmanager->initHooks(array(
'login'));
665 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
666 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
675 $allowedmethodtopostusername = 3;
676 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
677 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
680 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
681 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
685 $goontestloop =
false;
686 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
687 $goontestloop =
true;
689 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
690 $goontestloop =
true;
692 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
693 $goontestloop =
true;
695 if (
GETPOST(
'openid_mode',
'alpha')) {
696 $goontestloop =
true;
698 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
699 $goontestloop =
true;
701 if (!empty($_COOKIE[
'login_dolibarr'])) {
702 $goontestloop =
true;
705 if (!is_object($langs)) {
706 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
709 if (defined(
'MAIN_LANG_DEFAULT')) {
710 $langcode = constant(
'MAIN_LANG_DEFAULT');
712 $langs->setDefaultLang($langcode);
716 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
719 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);
725 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
728 $oauthmodetotestarray = array(
'google');
729 foreach ($oauthmodetotestarray as $oauthmodetotest) {
730 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
732 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
735 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);
736 foreach ($authmode as $tmpkey => $tmpval) {
737 if ($tmpval == $oauthmodetotest.
'oauth') {
738 unset($authmode[$tmpkey]);
747 if ($login ===
'--bad-login-validity--') {
752 $dol_authmode =
$conf->authmode;
754 $dol_tz = empty($_POST[
"tz"]) ? (empty($_GET[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : (int) $_GET[
"tz"]) : $_POST[
"tz"];
755 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_GET[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_GET[
"tz_string"]) : $_POST[
"tz_string"];
756 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
757 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
758 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
761 $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"];
762 $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"];
763 if ($dol_dst_first && $dol_dst_second) {
764 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
768 if ($datenow >= $datefirst && $datenow < $datesecond) {
772 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_GET[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : (int) $_GET[
"screenheight"]) : $_POST[
"screenheight"];
773 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_GET[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : (int) $_GET[
"screenwidth"]) : $_POST[
"screenwidth"];
778 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
780 $langs->loadLangs(array(
'main',
'errors'));
784 if (empty($_SESSION[
"dol_loginmesg"])) {
785 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
789 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
792 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
800 $hookmanager->initHooks(array(
'login'));
801 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
802 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
812 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
814 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);
815 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
820 return 'ERROR_NOT_LOGGED';
822 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
823 http_response_code(401);
832 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
834 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
835 dol_syslog(
'User not found or not valid, connection refused');
837 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
838 session_name($sessionname);
841 if ($resultFetchUser == 0) {
843 $langs->loadLangs(array(
'main',
'errors'));
845 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
847 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
848 } elseif ($resultFetchUser < 0) {
849 $_SESSION[
"dol_loginmesg"] = $user->error;
851 $user->context[
'audit'] = $user->error;
854 $langs->loadLangs(array(
'main',
'errors'));
856 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
858 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
862 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
871 $hookmanager->initHooks(array(
'login'));
872 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
873 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
880 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
888 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
892 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
893 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
898 $login = $_SESSION[
"dol_login"];
899 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
900 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
902 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
906 if ($resultFetchUser <= 0
907 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
908 || ($user->status != $user::STATUS_ENABLED)
909 || ($user->isNotIntoValidityDateRange())) {
910 if ($resultFetchUser <= 0) {
912 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
913 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
915 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
916 } elseif ($user->status != $user::STATUS_ENABLED) {
921 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
924 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
925 session_name($sessionname);
928 if ($resultFetchUser == 0) {
929 $langs->loadLangs(array(
'main',
'errors'));
931 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
933 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
934 } elseif ($resultFetchUser < 0) {
935 $_SESSION[
"dol_loginmesg"] = $user->error;
937 $user->context[
'audit'] = $user->error;
939 $langs->loadLangs(array(
'main',
'errors'));
941 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
943 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
947 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
955 $hookmanager->initHooks(array(
'login'));
956 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
957 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
962 $paramsurl = array();
964 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
967 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
970 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
973 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
977 $hookmanager->initHooks(array(
'main'));
980 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
981 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
982 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
984 if (constant(
'DOL_URL_ROOT')) {
985 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
987 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
988 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
992 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
993 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
994 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
996 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
997 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
998 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1000 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1001 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1002 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1004 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1005 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1006 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1008 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1009 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1010 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1013 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1014 if (empty($_SESSION[
'pageforbacktolist'])) {
1015 $pageforbacktolistarray = array();
1017 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1019 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1020 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1021 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1022 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1027 $parameters = array();
1028 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1037 if (!isset($_SESSION[
"dol_login"])) {
1042 $_SESSION[
"dol_login"] = $user->login;
1043 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1044 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1045 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1046 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1047 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1048 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1049 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1050 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1051 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1052 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1054 $_SESSION[
"dol_entity"] =
$conf->entity;
1056 if (!empty($dol_hide_topmenu)) {
1057 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1059 if (!empty($dol_hide_leftmenu)) {
1060 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1062 if (!empty($dol_optimize_smallscreen)) {
1063 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1065 if (!empty($dol_no_mouse_hover)) {
1066 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1068 if (!empty($dol_use_jmobile)) {
1069 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1072 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1076 $user->update_last_login_date();
1078 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1079 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1082 $user->context[
'audit'] = $loginfo;
1083 $user->context[
'authentication_method'] = $dol_authmode;
1086 $result = $user->call_trigger(
'USER_LOGIN', $user);
1094 $hookmanager->initHooks(array(
'login'));
1095 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1096 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1104 dol_print_error(
$db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1112 if (!empty($landingpage)) {
1114 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1115 header(
'Location: '.$newpath);
1122 if (!empty($user->force_pass_change) && $dol_authmode ==
'dolibarr') {
1124 $allowedpages = array(
'/user/changepassword.php',
'/user/logout.php');
1125 $currentpage = $_SERVER[
'PHP_SELF'];
1127 foreach ($allowedpages as $page) {
1128 if (preg_match(
'/'.preg_quote($page,
'/').
'$/', $currentpage)) {
1134 header(
'Location: '.DOL_URL_ROOT.
'/user/changepassword.php');
1141 $user->rights->user->user->lire = 1;
1142 $user->rights->user->user->creer = 1;
1143 $user->rights->user->user->password = 1;
1144 $user->rights->user->user->supprimer = 1;
1145 $user->rights->user->self->creer = 1;
1146 $user->rights->user->self->password = 1;
1150 if (!$user->hasRight(
'user',
'user_advance')) {
1151 $user->rights->user->user_advance =
new stdClass();
1153 if (!$user->hasRight(
'user',
'self_advance')) {
1154 $user->rights->user->self_advance =
new stdClass();
1156 if (!$user->hasRight(
'user',
'group_advance')) {
1157 $user->rights->user->group_advance =
new stdClass();
1160 $user->rights->user->user_advance->readperms = 1;
1161 $user->rights->user->user_advance->write = 1;
1162 $user->rights->user->self_advance->readperms = 1;
1163 $user->rights->user->self_advance->writeperms = 1;
1164 $user->rights->user->group_advance->read = 1;
1165 $user->rights->user->group_advance->readperms = 1;
1166 $user->rights->user->group_advance->write = 1;
1167 $user->rights->user->group_advance->delete = 1;
1176 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1179 if ((
int)
$conf->liste_limit <= 0) {
1181 $conf->liste_limit = getListLimitFromScreenHeight();
1184 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1191 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1195 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1196 $user->loadDefaultValues();
1202if (
GETPOST(
'theme',
'aZ09')) {
1204 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1209 $conf->use_javascript_ajax = 0;
1220 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1230if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1231 $conf->dol_hide_leftmenu = 1;
1233if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1234 $conf->dol_hide_topmenu = 1;
1236if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1237 $conf->dol_optimize_smallscreen = 1;
1239if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1240 $conf->dol_no_mouse_hover = 1;
1242if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1243 $conf->dol_use_jmobile = 1;
1246if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1247 $conf->dol_no_mouse_hover = 1;
1251if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1252 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1253 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1256 $conf->dol_optimize_smallscreen = 1;
1259 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1263if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1264 $conf->theme =
'eldy';
1265 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1268if (!defined(
'NOREQUIRETRAN')) {
1269 if (!
GETPOST(
'lang',
'aZ09')) {
1271 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1274 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1275 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1281if (!defined(
'NOLOGIN')) {
1284 if (!$user->login) {
1289 if ($user->status < 1) {
1291 $langs->loadLangs(array(
"errors",
"other"));
1292 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1297 $user->loadRights();
1300dol_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);
1305if (!defined(
'NOREQUIRETRAN')) {
1307 $langs->loadLangs(array(
'main',
'dict'));
1313 $conf->browser->stringforfirstkey = $langs->transnoentities(
"KeyboardShortcut");
1314 if (!empty(
$conf->browser->os) &&
$conf->browser->os ==
'macintosh') {
1315 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1317 if (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'chrome') {
1318 $conf->browser->stringforfirstkey .=
' ALT +';
1319 } elseif (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'firefox') {
1320 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1322 $conf->browser->stringforfirstkey .=
' CTL +';
1328$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1329$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1330$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1342if (empty(
$conf->browser->firefox)) {
1343 define(
'ROWS_1', 1);
1344 define(
'ROWS_2', 2);
1345 define(
'ROWS_3', 3);
1346 define(
'ROWS_4', 4);
1347 define(
'ROWS_5', 5);
1348 define(
'ROWS_6', 6);
1349 define(
'ROWS_7', 7);
1350 define(
'ROWS_8', 8);
1351 define(
'ROWS_9', 9);
1353 define(
'ROWS_1', 0);
1354 define(
'ROWS_2', 1);
1355 define(
'ROWS_3', 2);
1356 define(
'ROWS_4', 3);
1357 define(
'ROWS_5', 4);
1358 define(
'ROWS_6', 5);
1359 define(
'ROWS_7', 6);
1360 define(
'ROWS_8', 7);
1361 define(
'ROWS_9', 8);
1364$heightforframes = 52;
1367if (!defined(
'NOREQUIREMENU')) {
1368 if (empty($user->socid)) {
1376 $file_menu =
$conf->standard_menu;
1377 if (
GETPOST(
'menu',
'alpha')) {
1378 $file_menu =
GETPOST(
'menu',
'alpha');
1381 if (!class_exists(
'MenuManager')) {
1383 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1384 foreach ($dirmenus as $dirmenu) {
1386 if (class_exists(
'MenuManager')) {
1390 if (!class_exists(
'MenuManager')) {
1391 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1392 $file_menu =
'eldy_menu.php';
1393 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1397 $menumanager =
new MenuManager(
$db, empty($user->socid) ? 0 : 1);
1399 $menumanager->loadMenu();
1402if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1403 $message =
GETPOST(
'seteventmessages',
'alpha');
1404 $messages = explode(
',', $message);
1405 foreach ($messages as $key => $msg) {
1406 $tmp = explode(
':', $msg);
1413if (!function_exists(
"llxHeader")) {
1437 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1439 global
$conf, $hookmanager;
1441 $parameters = array(
1443 'title' => & $title,
1444 'help_url' => & $help_url,
1445 'target' => & $target,
1446 'disablejs' => & $disablejs,
1447 'disablehead' => & $disablehead,
1448 'arrayofjs' => & $arrayofjs,
1449 'arrayofcss' => & $arrayofcss,
1450 'morequerystring' => & $morequerystring,
1451 'morecssonbody' => & $morecssonbody,
1452 'replacemainareaby' => & $replacemainareaby,
1453 'disablenofollow' => & $disablenofollow,
1454 'disablenoindex' => & $disablenoindex
1457 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1459 print $hookmanager->resPrint;
1464 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1466 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1468 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1470 if ($mainmenu !=
'website') {
1471 $tmpcsstouse = $morecssonbody;
1476 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1479 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1480 $tmpcsstouse .=
' dol_openinpopup';
1483 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1486 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1487 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1490 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1491 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1495 if ($replacemainareaby) {
1496 print $replacemainareaby;
1516 if ($contenttype !=
'none') {
1517 if ($contenttype ==
'text/html') {
1518 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1520 header(
"Content-Type: ".$contenttype);
1527 header(
"X-Content-Type-Options: nosniff");
1530 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1531 header(
"X-Frame-Options: SAMEORIGIN");
1533 header(
"X-Frame-Options: ALLOWALL");
1537 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1538 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1539 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1540 header(
'Vary: Origin');
1547 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1562 if (!is_object($hookmanager)) {
1563 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1566 $hookmanager->initHooks(array(
"main"));
1568 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1569 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1571 $contentsecuritypolicy = $hookmanager->resPrint;
1573 $contentsecuritypolicy .= $hookmanager->resPrint;
1577 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' *.dolibarr.org', $contentsecuritypolicy);
1579 if (!empty($contentsecuritypolicy)) {
1580 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1583 header(
"Content-Security-Policy-Report-Only: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1587 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1602 if (!is_object($hookmanager)) {
1603 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1606 $hookmanager->initHooks(array(
"main"));
1608 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1609 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1611 $contentsecuritypolicy = $hookmanager->resPrint;
1613 $contentsecuritypolicy .= $hookmanager->resPrint;
1617 $contentsecuritypolicy = preg_replace(
'/default-src \'self\'/',
'default-src \'self\' ping.dolibarr.org', $contentsecuritypolicy);
1619 if (!empty($contentsecuritypolicy)) {
1620 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1623 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1630 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1632 if (!empty($referrerpolicy)) {
1633 header(
"Referrer-Policy: ".$referrerpolicy);
1636 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1640 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1643 header(
"Strict-Transport-Security: ".$sts);
1646 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1650 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1653 header(
"Permissions-Policy: ".$pp);
1656 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1660 if ($forcenocache) {
1661 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1683function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1689 if (empty(
$conf->css)) {
1690 $conf->css =
'/theme/eldy/style.css.php';
1693 print
'<!doctype html>'.
"\n";
1695 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1698 if (empty($disablehead)) {
1699 if (!is_object($hookmanager)) {
1700 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1703 $hookmanager->initHooks(array(
"main"));
1705 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1709 if (
GETPOST(
'dol_basehref',
'alpha')) {
1710 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1714 print
'<meta charset="utf-8">'.
"\n";
1715 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1716 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1717 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1718 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1719 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1721 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1724 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1725 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1726 if (!empty(
$mysoc->logo_squarred_mini)) {
1727 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1732 if (empty(
$conf->dol_use_jmobile)) {
1733 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1734 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1738 $manifest = DOL_URL_ROOT.
'/theme/manifest.json.php';
1739 $parameters = array(
'manifest' => $manifest);
1740 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1742 $manifest = $hookmanager->resPrint;
1744 $manifest .= $hookmanager->resPrint;
1746 if (!empty($manifest)) {
1747 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1751 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1756 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1760 $appli = constant(
'DOL_APPLICATION_TITLE');
1763 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1776 $parameters = array(
'title' => $titletoshow);
1777 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1779 $titletoshow = $hookmanager->resPrint;
1781 $titletoshow .= $hookmanager->resPrint;
1790 $ext =
'version='.GETPOSTINT(
'version');
1793 if (
GETPOST(
'dol_resetcache')) {
1794 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1798 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1800 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1801 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1802 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1804 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1805 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1807 if (GETPOSTISSET(
'dol_openinpopup')) {
1808 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1810 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1811 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1813 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1814 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1816 if (GETPOSTISSET(
'dol_use_jmobile')) {
1817 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1820 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1821 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1823 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1824 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1835 'DOL_VERSION' => DOL_VERSION,
1836 'DOL_URL_ROOT' => DOL_URL_ROOT,
1839 $jsContextPathUrl = DOL_URL_ROOT .
'/public/includes/dolibarr-js-context';
1841 'dolibarr-context.umd.js',
1842 'dolibarr-tool.seteventmessage.js'
1845 if (! defined(
'NOREQUIRETRAN')) {
1847 $jsContextFiles[] =
'dolibarr-tool.langs.js';
1848 $jsContextVars[
'MAIN_LANG_DEFAULT'] = $langs->getDefaultLang();
1849 $jsContextVars[
'DOL_URL_ROOT'] = DOL_URL_ROOT;
1850 $jsContextVars[
'DOL_LANG_INTERFACE_URL'] =
dol_buildpath(
'public/langs/langs-tool-interface.php', 1);
1854 foreach ($jsContextFiles as $jsContextFile) {
1855 print
'<script nonce="'.getNonce().
'" src="'.$jsContextPathUrl.
'/'.$jsContextFile.
'?' . $ext .
'" ></script>'.
"\n";
1859 print
'<script nonce="'.getNonce().
'">Dolibarr.setContextVars('.json_encode($jsContextVars).
');</script>'.
"\n";
1865 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1866 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1869 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) &&
$conf->use_javascript_ajax) {
1870 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1871 if (!defined(
'DISABLE_JQUERY_UI')) {
1872 $jquerytheme =
'base';
1876 if (constant(
'JS_JQUERY_UI')) {
1877 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1879 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/public/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1882 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1883 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1885 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1887 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1891 if (!defined(
'DISABLE_FONT_AWSOME')) {
1892 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1893 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1894 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1900 if (!empty(
$conf->modules_parts[
'theme'])) {
1901 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1904 $themesubdir = $reldir;
1910 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1911 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1912 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1924 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1925 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1929 if (!empty(
$conf->modules_parts[
'css'])) {
1930 $arraycss = (array)
$conf->modules_parts[
'css'];
1931 foreach ($arraycss as $modcss => $filescss) {
1932 $filescss = (array) $filescss;
1933 foreach ($filescss as $cssfile) {
1934 if (empty($cssfile)) {
1935 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1939 if ($urlforcss && $urlforcss !=
'/') {
1940 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1942 if (!preg_match(
'/\.css$/i', $cssfile)) {
1947 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1953 if (is_array($arrayofcss)) {
1954 foreach ($arrayofcss as $cssfile) {
1955 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1956 $urltofile = $cssfile;
1960 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1962 if (!preg_match(
'/\.css$/i', $cssfile)) {
1972 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1976 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty(
$conf->use_javascript_ajax)) {
1978 print
'<!-- Includes JS for JQuery -->'.
"\n";
1979 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1980 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
1982 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
1984 if (!defined(
'DISABLE_JQUERY_UI')) {
1985 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1986 print
'<script nonce="' . getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1988 print
'<script nonce="' . getNonce() .
'" src="' . DOL_URL_ROOT .
'/public/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1992 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1993 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
1996 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1997 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
2001 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
2023 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2026 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
2028 if (!defined(
'DISABLE_MULTISELECT')) {
2029 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/public/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
2033 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2036 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2037 $pathckeditor = DOL_URL_ROOT.
'/public/includes/ckeditor/ckeditor/';
2038 $jsckeditor =
'ckeditor.js';
2039 if (constant(
'JS_CKEDITOR')) {
2041 $pathckeditor = constant(
'JS_CKEDITOR');
2043 print
'<script nonce="'.getNonce().
'">';
2044 print
'/* enable ckeditor by main.inc.php */';
2045 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2046 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2047 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2048 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";
2049 print
'</script>'.
"\n";
2050 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
2052 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2053 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2055 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2057 print
'</script>'.
"\n";
2061 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'tinymce' && !defined(
'DISABLE_TINYMCE')) || defined(
'FORCE_TINYMCE')) {
2062 print
'<!-- Includes JS for TinyMCE -->'.
"\n";
2063 $pathtinymce = DOL_URL_ROOT.
'/public/includes/tinymce/tinymce/';
2064 $jstinymce =
'tinymce.min.js';
2065 if (defined(
'JS_TINYMCE') && constant(
'JS_TINYMCE')) {
2066 $pathtinymce = constant(
'JS_TINYMCE');
2068 print
'<script src="'.$pathtinymce.$jstinymce.
'?'.$ext.
'"></script>'.
"\n";
2069 print
'<script nonce="'.getNonce().
'">';
2070 print
'/* enable tinymce by main.inc.php */';
2071 print
'var tinymceBasePath = \''.dol_escape_js($pathtinymce).
'\';
'."\n";
2072 print 'var tinymceFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2073 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";
2074 print
'</script>'.
"\n";
2075 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/tinymce/config.js?'.$ext, 1).
'"></script>'.
"\n";
2076 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/tinymce-ckeditor-compat.js?'.$ext.
'"></script>'.
"\n";
2080 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2081 $enablebrowsernotif =
false;
2083 $enablebrowsernotif =
true;
2085 if (
$conf->browser->layout ==
'phone') {
2086 $enablebrowsernotif =
false;
2088 if ($enablebrowsernotif) {
2089 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2090 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2095 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2096 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2097 print
'<script nonce="' . getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2102 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2103 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2107 if (!empty(
$conf->modules_parts[
'js'])) {
2108 $arrayjs = (array)
$conf->modules_parts[
'js'];
2109 foreach ($arrayjs as $modjs => $filesjs) {
2110 $filesjs = (array) $filesjs;
2111 foreach ($filesjs as $jsfile) {
2114 if ($urlforjs && $urlforjs !=
'/') {
2115 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2116 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2118 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2124 if (is_array($arrayofjs)) {
2125 print
'<!-- Includes JS added by page -->'.
"\n";
2126 foreach ($arrayofjs as $jsfile) {
2127 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2128 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2130 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2139 if (file_exists($theme_js)) {
2140 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2144 if (!empty($head)) {
2151 $parameters = array();
2152 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2153 print $hookmanager->resPrint;
2155 print
"</head>\n\n";
2158 $conf->headerdone = 1;
2178function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2180 global $user,
$conf, $langs,
$db, $form;
2181 global $dolibarr_main_authentication, $dolibarr_main_demo;
2182 global $hookmanager, $menumanager;
2187 $hookmanager->initHooks(array(
'toprightmenu'));
2192 if (empty(
$conf->headerdone)) {
2193 $disablenofollow = 0;
2194 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2195 print
'<body id="mainbody">';
2201 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2202 if (!isset($form) || !is_object($form)) {
2203 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2207 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2209 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2212 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2214 $menumanager->atarget = $target;
2216 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2220 $appli = constant(
'DOL_APPLICATION_TITLE');
2223 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2225 $appli .=
" ".DOL_VERSION;
2229 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2233 $logouthtmltext =
'';
2235 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2236 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2237 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.newToken().
'">';
2238 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2239 $logouttext .=
'</a>';
2241 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2242 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.
$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2247 print
'<div class="login_block usedropdown">'.
"\n";
2251 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2254 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2277 $toprightmenu .=
'</div>';
2279 $toprightmenu .=
'</div>'.
"\n";
2283 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2286 $parameters = array();
2287 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2288 if (is_numeric($result)) {
2290 $toprightmenu .= $hookmanager->resPrint;
2292 $toprightmenu = $hookmanager->resPrint;
2295 $toprightmenu .= $result;
2300 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2302 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2305 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2312 if (isset($_POST) && is_array($_POST)) {
2313 foreach ($_POST as $key => $value) {
2314 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2315 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2318 if (!is_array($value)) {
2319 if ($value !==
'') {
2320 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2323 foreach ($value as $value2) {
2324 if (($value2 !==
'') && (!is_array($value2))) {
2325 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2331 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2332 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2334 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2337 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2342 $langs->load(
"help");
2349 if (empty($helppagename)) {
2350 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2352 $helppresent =
'helppresent';
2357 $helpbaseurl = $arrayres[
'helpbaseurl'];
2358 $helppage = $arrayres[
'helppage'];
2359 $mode = $arrayres[
'mode'];
2362 if ($helpbaseurl && $helppage) {
2364 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2365 if ($mode ==
'wiki') {
2366 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2368 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2370 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2373 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2374 if ($mode ==
'wiki') {
2376 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2379 $text .= sprintf($helpbaseurl, $helppage);
2382 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2383 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2386 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2391 $langs->load(
'admin');
2392 $appli .=
'<br>'.$langs->trans(
"Database").
': '.
$db->database_name;
2398 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2400 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2405 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2408 $toprightmenu .=
'</div>';
2412 $toprightmenu .=
'<div class="login_block_user">';
2415 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2420 $toprightmenu .=
'</div>';
2422 $toprightmenu .=
'</div>'.
"\n";
2425 print $toprightmenu;
2432 print
'<div style="clear: both;"></div>';
2433 print
"<!-- End top horizontal menu -->\n\n";
2436 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2437 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2452 global $dolibarr_main_authentication, $dolibarr_main_demo;
2453 global $menumanager, $form;
2456 if (
$conf->browser->name ==
'textbrowser') {
2460 $langs->load(
'companies');
2462 $userImage = $userDropDownImage =
'';
2463 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2464 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2465 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2467 $nophoto =
'/public/theme/common/user_anonymous.png';
2468 if ($user->gender ==
'man') {
2469 $nophoto =
'/public/theme/common/user_man.png';
2471 if ($user->gender ==
'woman') {
2472 $nophoto =
'/public/theme/common/user_woman.png';
2475 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2477 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2481 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2482 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2486 while ($idprofcursor < 10) {
2488 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2489 if ($idprofcursor == 1) {
2490 $constkeyforprofid =
'MAIN_INFO_SIREN';
2492 if ($idprofcursor == 2) {
2493 $constkeyforprofid =
'MAIN_INFO_SIRET';
2495 if ($idprofcursor == 3) {
2496 $constkeyforprofid =
'MAIN_INFO_APE';
2498 if ($idprofcursor == 4) {
2499 $constkeyforprofid =
'MAIN_INFO_RCS';
2501 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2511 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2513 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2515 $dropdownBody .=
'</div>';
2517 $dropdownBody .=
'<br>';
2518 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2519 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2522 if (!empty($user->admin)) {
2523 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2526 if (!empty($user->socid)) {
2528 $thirdpartystatic->fetch($user->socid);
2529 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2530 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2532 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2533 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2534 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2535 $dropdownBody .=
'<br>';
2537 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2538 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2540 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2542 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2543 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2544 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2545 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2547 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2549 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2551 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2552 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2553 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2558 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2559 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2560 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2561 $dropdownBody .=
' <span class="opacitymedium">('.$conf->browser->layout.
')</span>';
2562 if (!empty($_SESSION[
"disablemodules"])) {
2563 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2565 $dropdownBody .=
'</div>';
2568 $parameters = array(
'user' => $user,
'langs' => $langs);
2569 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2570 if (is_numeric($result)) {
2572 $dropdownBody .= $hookmanager->resPrint;
2574 $dropdownBody = $hookmanager->resPrint;
2578 if (empty($urllogout)) {
2579 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2583 $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>';
2584 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2585 $jsonopen =
"closeTopMenuLoginDropdown()";
2586 $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');
2587 $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>';
2589 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2590 if (!empty($user->admin)) {
2591 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2595 $appli = constant(
'DOL_APPLICATION_TITLE');
2598 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2600 $appli .=
" ".DOL_VERSION;
2604 $btnUser =
'<!-- div for user link -->
2605 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2606 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2607 '.$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>' :
'').
'
2609 <div class="dropdown-menu">
2611 <div class="user-header">
2612 '.$userDropDownImage.
'
2614 '.$profilName.
'<br>';
2616 if ($user->datelastlogin) {
2617 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2618 if ($user->datepreviouslogin) {
2619 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2622 $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>';
2623 if ($user->datepreviouslogin) {
2624 $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>';
2632 <!-- Menu Body user-->
2633 <div class="user-body">'.$dropdownBody.
'</div>
2636 <div class="user-footer">
2637 <div class="pull-left">
2640 <div class="pull-left">
2641 '.$virtuelcardLink.
'
2643 <div class="pull-right">
2646 <div class="clearboth"></div>
2652 $btnUser =
'<!-- div for user link text browser -->
2653 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2654 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2655 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2660 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2662 <!-- Code to show/hide the user drop-down -->
2664 function closeTopMenuLoginDropdown() {
2665 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2667 jQuery("#topmenu-login-dropdown").removeClass("open");
2669 jQuery(document).ready(function() {
2670 jQuery(document).on("click", function(event) {
2671 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2672 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2673 /* console.log("click close login - we click outside"); */
2674 closeTopMenuLoginDropdown();
2682 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2683 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2684 event.preventDefault();
2685 jQuery("#topmenu-login-dropdown").toggleClass("open");
2688 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2689 console.log("Click on #topmenulogincompanyinfo-btn");
2690 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2691 jQuery("#topmenuloginmoreinfo").slideToggle();
2693 jQuery("#topmenulogincompanyinfo").slideToggle();
2696 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2697 console.log("Click on #topmenuloginmoreinfo-btn");
2698 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2699 jQuery("#topmenulogincompanyinfo").slideToggle();
2701 jQuery("#topmenuloginmoreinfo").slideToggle();
2723 global
$conf, $langs, $user;
2731 if (!$user->hasRight(
'ai',
'assistant',
'use')) {
2735 $ailabel = $langs->trans(
'AIAssistant').
' ('.
$conf->browser->stringforfirstkey.
' a)';
2739 $html .=
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/ai/css/ai_assistant.css">';
2743 $html .=
'<!-- div for AI Assistant link (opens the AI chat popover) -->
2744 <div id="topmenu-ai-dropdown" class="atoplogin dropdown inline-block">
2745 <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>
2751 $html .=
'<div id="topmenu-ai-popover" class="ai-popover" role="dialog" aria-modal="false" aria-label="'.dol_escape_htmltag($langs->trans(
'AIAssistant')).
'">
2752 <div class="ai-popover-body"><div class="ai-popover-loading"><i class="fa fa-circle-notch fa-spin"></i></div></div>
2758 $aijsfile = DOL_DOCUMENT_ROOT.
'/ai/js/ai_assistant.js';
2759 $aijsver = @filemtime($aijsfile);
2760 $aijsurl = DOL_URL_ROOT.
'/ai/js/ai_assistant.js?v='.urlencode((
string) ($aijsver ? $aijsver : DOL_VERSION));
2762 $html .=
'<script nonce="'.getNonce().
'">
2764 var toggle = document.getElementById("topmenu-ai-toggle");
2765 var popover = document.getElementById("topmenu-ai-popover");
2766 if (!toggle || !popover) { return; }
2767 var body = popover.querySelector(".ai-popover-body");
2769 var loading = false;
2771 function positionPopover() {
2772 var top = document.getElementById("id-top");
2773 var anchor = (top ? top.getBoundingClientRect().bottom : 44) + 4;
2774 popover.style.setProperty("--ai-popover-top", anchor + "px");
2777 function loadChat() {
2778 if (loaded || loading) { return; }
2780 fetch("'.DOL_URL_ROOT.
'/ai/assistant/popover.php", { credentials: "same-origin" })
2781 .then(function (resp) {
2782 if (!resp.ok) { throw new Error("HTTP " + resp.status); }
2785 .then(function (htmlcontent) {
2786 body.innerHTML = htmlcontent;
2787 return import("'.
dol_escape_js($aijsurl).
'").then(function (mod) {
2788 mod.initAiAssistant(body.querySelector(".ai-chat-container"));
2795 .catch(function (e) {
2796 console.error("AI Assistant popover load failed", e);
2797 body.innerHTML = "<div class=\"ai-popover-loading\">'.
dol_escape_js($langs->trans(
'Error')).
'</div>";
2799 .finally(function () { loading = false; });
2802 function focusInput() {
2803 var input = body.querySelector("#user-input");
2804 if (input) { input.focus(); }
2807 toggle.addEventListener("click", function (event) {
2808 event.preventDefault();
2809 // position:fixed can be hijacked by a transformed ancestor: hosting the
2810 // panel directly under <body> guarantees viewport coordinates.
2811 if (popover.parentNode !== document.body) { document.body.appendChild(popover); }
2813 var isOpen = popover.classList.toggle("open");
2816 if (loaded) { focusInput(); }
2820 popover.addEventListener("click", function (event) {
2821 var closeBtn = event.target.closest("#ai-close-btn");
2822 var expandBtn = event.target.closest("#ai-expand-btn");
2824 popover.classList.remove("open");
2825 } else if (expandBtn) {
2826 var expanded = popover.classList.toggle("expanded");
2827 var icon = expandBtn.querySelector("i");
2828 if (icon) { icon.className = expanded ? "fa fa-compress-alt" : "fa fa-expand-alt"; }
2829 expandBtn.title = expanded ? (expandBtn.dataset.titleReduce || "") : (expandBtn.dataset.titleExpand || "");
2833 document.addEventListener("keydown", function (event) {
2834 if (event.key === "Escape" && popover.classList.contains("open")) {
2835 popover.classList.remove("open");
2852 global
$conf, $langs;
2861 if (!empty(
$conf->use_javascript_ajax)) {
2862 $html .=
'<!-- div for quick add link -->
2863 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2864 <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>
2867 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2869 <!-- Code to show/hide the user drop-down for the quick add -->
2871 jQuery(document).ready(function() {
2872 jQuery(document).on("click", function(event) {
2873 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2874 /* console.log("click close quick add - we click outside"); */
2876 $("#topmenu-quickadd-dropdown").removeClass("open");
2879 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2880 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2881 openQuickAddDropDown(event);
2885 $(document).keydown(function(event){
2886 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2887 if (ostype ===
"macintosh") {
2888 if ( event.which === 65 && event.ctrlKey ) {
2889 console.log(\
'control + a : trigger open quick add dropdown\');
2890 openQuickAddDropDown(event);
2893 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2894 console.log(\'control + shift + a : trigger open quick add dropdown\');
2895 openQuickAddDropDown(event);
2900 var openQuickAddDropDown = function(event) {
2901 event.preventDefault();
2902 $("#topmenu-quickadd-dropdown").toggleClass("open");
2922 global
$conf, $langs;
2931 if (!empty(
$conf->use_javascript_ajax)) {
2932 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2937 $html .=
'<!-- div for link to upload file -->
2938 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2939 <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>
2955 global $user, $langs, $hookmanager;
2960 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2961 "title" =>
"MenuNewMember@members",
2962 "name" =>
"Adherent@members",
2963 "picto" =>
"object_member",
2964 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2968 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2969 "title" =>
"MenuNewThirdParty@companies",
2970 "name" =>
"ThirdParty@companies",
2971 "picto" =>
"object_company",
2972 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2976 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2977 "title" =>
"NewContactAddress@companies",
2978 "name" =>
"Contact@companies",
2979 "picto" =>
"object_contact",
2980 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2984 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2985 "title" =>
"NewPropal@propal",
2986 "name" =>
"Proposal@propal",
2987 "picto" =>
"object_propal",
2988 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2993 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2994 "title" =>
"NewOrder@orders",
2995 "name" =>
"Order@orders",
2996 "picto" =>
"object_order",
2997 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3001 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3002 "title" =>
"NewBill@bills",
3003 "name" =>
"Bill@bills",
3004 "picto" =>
"object_bill",
3005 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3009 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3010 "title" =>
"NewContractSubscription@contracts",
3011 "name" =>
"Contract@contracts",
3012 "picto" =>
"object_contract",
3013 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3017 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3018 "title" =>
"SupplierProposalNew@supplier_proposal",
3019 "name" =>
"SupplierProposal@supplier_proposal",
3020 "picto" =>
"supplier_proposal",
3021 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3025 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3026 "title" =>
"NewSupplierOrderShort@orders",
3027 "name" =>
"SupplierOrder@orders",
3028 "picto" =>
"supplier_order",
3029 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3033 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3034 "title" =>
"NewBill@bills",
3035 "name" =>
"SupplierBill@bills",
3036 "picto" =>
"supplier_invoice",
3037 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3041 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3042 "title" =>
"NewTicket@ticket",
3043 "name" =>
"Ticket@ticket",
3044 "picto" =>
"ticket",
3045 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3049 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3050 "title" =>
"NewIntervention@interventions",
3051 "name" =>
"Intervention@interventions",
3052 "picto" =>
"intervention",
3053 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3057 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3058 "title" =>
"NewProduct@products",
3059 "name" =>
"Product@products",
3060 "picto" =>
"object_product",
3061 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3065 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3066 "title" =>
"NewService@products",
3067 "name" =>
"Service@products",
3068 "picto" =>
"object_service",
3069 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3073 "url" =>
"/product/stock/stocktransfer/stocktransfer_card.php?action=create&mainmenu=products",
3074 "title" =>
"StockTransferNew@stocks",
3075 "name" =>
"StockTransfer@stocks",
3077 "activation" =>
isModEnabled(
"stocktransfer") && $user->hasRight(
"stocktransfer",
"stocktransfer",
"write"),
3081 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3082 "title" =>
"AddUser@users",
3083 "name" =>
"User@users",
3085 "activation" => $user->hasRight(
"user",
"user",
"write"),
3091 $dropDownQuickAddHtml =
'';
3095 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3097 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3100 $parameters = array();
3101 $hook_items = $items;
3102 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3103 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3104 if ($reshook == 0) {
3105 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3107 $items = $hookmanager->resArray;
3111 $position = array();
3112 foreach ($items[
'items'] as $key => $row) {
3113 $position[$key] = $row[
'position'];
3115 $array1_sort_order = SORT_ASC;
3116 array_multisort($position, $array1_sort_order, $items[
'items']);
3119 foreach ($items[
'items'] as $item) {
3120 if (!$item[
'activation']) {
3123 $langs->load(explode(
'@', $item[
'title'])[1]);
3124 $langs->load(explode(
'@', $item[
'name'])[1]);
3125 $dropDownQuickAddHtml .=
'
3126 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3127 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3132 $dropDownQuickAddHtml .=
'</div>';
3134 $dropDownQuickAddHtml .=
'</div>';
3136 return $dropDownQuickAddHtml;
3146 global $langs,
$conf, $user;
3151 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3160 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3161 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3162 $langs->load(
"bookmarks");
3165 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3169 $html .=
'<!-- div for bookmark link -->
3170 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3171 <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>
3172 <div class="dropdown-menu">
3178 <!-- Code to show/hide the bookmark drop-down -->
3180 jQuery(document).ready(function() {
3181 jQuery(document).on("click", function(event) {
3182 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3183 /* console.log("close bookmark dropdown - we click outside"); */
3185 $("#topmenu-bookmark-dropdown").removeClass("open");
3189 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3190 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3191 openBookMarkDropDown(event);
3195 jQuery(document).keydown(function(event) {
3196 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3197 if (ostype ===
"macintosh") {
3198 if ( event.which === 66 && event.ctrlKey ) {
3199 console.log(
"Click on control + b : trigger open bookmark dropdown");
3200 openBookMarkDropDown(event);
3203 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3204 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3205 openBookMarkDropDown(event);
3210 var openBookMarkDropDown =
function(event) {
3211 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
3212 event.preventDefault();
3213 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3214 jQuery(
"#top-bookmark-search-input").focus();
3230function top_menu_search()
3232 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3237 $arrayresult = array();
3238 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3240 $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">
';
3242 $defaultAction = '';
3243 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3244 // Menu with all searchable items
3245 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3246 foreach ($arrayresult as $keyItem => $item) {
3247 if (empty($defaultAction)) {
3248 $defaultAction = $item['url
'];
3250 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3251 $buttonList .= $item['text
'];
3252 $buttonList .= '</
button>
';
3254 $buttonList .= '</div>
';
3256 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3259 <!-- search input -->
3260 <div
class=
"dropdown-header search-dropdown-header">
3266 <!--
Menu Body search -->
3267 <div
class=
"dropdown-body search-dropdown-body">
3272 $dropDownHtml .= '</form>
';
3274 $html .= '<!-- div
for Global Search -->
3275 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3276 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3277 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3279 <div
class=
"dropdown-menu dropdown-search">
3285 <!-- Code to show/hide the
user drop-down -->
3287 jQuery(document).ready(
function() {
3290 jQuery(
"#top-global-search-input").keydown(
function (e) {
3291 if (e.keyCode == 13 || e.keyCode == 40) {
3292 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3293 if (inputs[inputs.index(this) + 1] != null) {
3294 console.log(
"Force focus after keydow on #top-global-search-input");
3295 inputs[inputs.index(this) + 1].focus();
3296 if (e.keyCode == 13){
3297 inputs[inputs.index(this) + 1].trigger(
"click");
3307 jQuery(document).keydown(
function(e) {
3309 var $focused = $(
":focus");
3310 if($focused.length && $focused.hasClass(
"global-search-item")){
3313 if (e.keyCode == 38) {
3315 console.log(
"Force focus after keycode 38");
3316 $focused.prev().focus();
3320 if (e.keyCode == 40) {
3322 console.log(
"Force focus after keycode 40");
3323 $focused.next().focus();
3330 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3331 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3332 jQuery(
"#top-menu-action-search").submit();
3336 jQuery(document).on(
"click",
function(event) {
3337 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3338 console.log(
"click close search - we click outside");
3340 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3345 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3346 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3347 openGlobalSearchDropDown();
3351 jQuery(document).keydown(
function(e){
3352 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3353 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3354 openGlobalSearchDropDown();
3356 if ( e.which === 70 && e.alKey ) {
3357 console.log(\'alt + f : trigger open global-search dropdown\');
3358 openGlobalSearchDropDown();
3362 var openGlobalSearchDropDown = function() {
3363 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3364 jQuery("#top-global-search-input").focus();
3388function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3390 global $user,
$conf, $langs,
$db, $form;
3391 global $hookmanager, $menumanager;
3395 if (!empty($menu_array_before)) {
3396 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);
3399 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3401 $hookmanager->initHooks(array(
'leftblock'));
3403 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3406 if (!is_object($form)) {
3412 if (
$conf->browser->layout ==
'phone') {
3413 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3417 $arrayresult = array();
3418 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3422 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3423 $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');
3425 if (is_array($arrayresult)) {
3427 foreach ($arrayresult as $key => $val) {
3428 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3434 $parameters = array(
'searchform' => $searchform);
3435 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3436 if (empty($reshook)) {
3437 $searchform .= $hookmanager->resPrint;
3439 $searchform = $hookmanager->resPrint;
3444 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3445 $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>';
3447 $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>';
3448 $searchform .=
'<script>
3449 jQuery(document).ready(function () {
3450 jQuery("#divsearchforms1").click(function(){
3451 jQuery("#divsearchforms2").toggle();
3455 $searchform .=
'</div>';
3459 $searchform .=
'<script>
3460 jQuery(document).keydown(function(e){
3461 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3462 console.log(\'control + shift + f : trigger open global-search dropdown\');
3463 openGlobalSearchDropDown();
3465 if( (e.which === 83 || e.which === 115) && e.altKey ){
3466 console.log(\'alt + s : trigger open global-search dropdown\');
3467 openGlobalSearchDropDown();
3471 var openGlobalSearchDropDown = function() {
3472 jQuery("#searchselectcombo").select2(\'open\');
3478 print
'<!-- Begin left menu -->'.
"\n";
3480 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3484 $menumanager->menu_array = $menu_array_before;
3486 $menumanager->menu_array_after = $menu_array_after;
3489 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3492 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3498 print
"<!-- Begin Help Block-->\n";
3499 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3503 $doliurl =
'https://www.dolibarr.org';
3505 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3506 $doliurl =
'https://www.dolibarr.fr';
3508 if (preg_match(
'/es/i', $langs->defaultlang)) {
3509 $doliurl =
'https://www.dolibarr.es';
3511 if (preg_match(
'/de/i', $langs->defaultlang)) {
3512 $doliurl =
'https://www.dolibarr.de';
3514 if (preg_match(
'/it/i', $langs->defaultlang)) {
3515 $doliurl =
'https://www.dolibarr.it';
3517 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3518 $doliurl =
'https://www.dolibarr.gr';
3521 $appli = constant(
'DOL_APPLICATION_TITLE');
3524 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3526 $appli .=
" ".DOL_VERSION;
3534 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3536 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3538 print
'<span class="help">';
3546 print
'</div>'.
"\n";
3551 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3554 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3555 $bugbaseurl .=
'&title=';
3556 $bugbaseurl .= urlencode(
"Bug: ");
3557 $bugbaseurl .=
'&body=';
3558 $bugbaseurl .= urlencode(
"# Instructions\n");
3559 $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");
3560 $bugbaseurl .= urlencode(
"*Please:*\n");
3561 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3562 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3563 $bugbaseurl .= urlencode(
"\n");
3564 $bugbaseurl .= urlencode(
"\n");
3565 $bugbaseurl .= urlencode(
"# Bug\n");
3566 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3567 $bugbaseurl .= urlencode(
"\n");
3568 $bugbaseurl .= urlencode(
"## Environment\n");
3569 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3570 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3571 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3572 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3573 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.
$db->getVersion().
"\n");
3574 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3575 $bugbaseurl .= urlencode(
"\n");
3576 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3577 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3578 $bugbaseurl .= urlencode(
"\n");
3579 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3580 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3581 $bugbaseurl .= urlencode(
"\n");
3582 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3583 $bugbaseurl .= urlencode(
"[*Files*]\n");
3584 $bugbaseurl .= urlencode(
"\n");
3586 $bugbaseurl .= urlencode(
"\n");
3587 $bugbaseurl .= urlencode(
"## Report\n");
3595 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3596 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3597 if (empty($reshook)) {
3598 $bugbaseurl .= $hookmanager->resPrint;
3600 $bugbaseurl = $hookmanager->resPrint;
3603 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3604 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3609 print
"<!-- End Help Block-->\n";
3614 print
"<!-- End left menu -->\n";
3618 $parameters = array();
3619 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3620 print $hookmanager->resPrint;
3622 print
'</div></div> <!-- End side-nav id-left -->';
3626 print
'<!-- Begin right area -->'.
"\n";
3628 if (empty($leftmenuwithoutmainarea)) {
3642 global
$conf, $langs, $hookmanager;
3644 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3645 print
'<div id="id-right">';
3650 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3652 $hookmanager->initHooks(array(
'main'));
3653 $parameters = array();
3654 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3655 print $hookmanager->resPrint;
3658 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3663 $parameters = array();
3664 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3665 if (empty($reshook)) {
3666 print
'<!-- Begin show mysoc info header -->'.
"\n";
3667 print
'<div id="mysoc-info-header">'.
"\n";
3668 print
'<table class="centpercent div-table-responsive">'.
"\n";
3670 print
'<tr><td rowspan="0" class="width20p">';
3672 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'))).
'">';
3674 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3675 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3687 print
'</table>'.
"\n";
3688 print
'</div>'.
"\n";
3689 print
'<!-- End show mysoc info header -->'.
"\n";
3708 if (preg_match(
'/^http/i', $helppagename)) {
3710 $helpbaseurl =
'%s';
3711 $helppage = $helppagename;
3716 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3717 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3718 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3719 $helppage = $reg[1];
3722 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3723 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3724 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3725 $helppage = $reg[1];
3728 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3729 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3730 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3731 $helppage = $reg[1];
3734 if (empty($helppage)) {
3735 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3736 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3737 $helppage = $reg[1];
3742 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3762function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3764 global $langs, $user;
3767 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3768 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3769 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3770 if ($showtitlebefore) {
3771 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3773 $ret .=
'<div class="tagtd">';
3774 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3775 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3776 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3777 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3778 $ret .=
' placeholder="'.strip_tags($title).
'"';
3779 $ret .= ($autofocus ?
' autofocus' :
'');
3780 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3781 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3782 $ret .=
'<span class="fa fa-search"></span>';
3783 $ret .=
'</button>';
3785 $ret .=
"</form>\n";
3790if (!function_exists(
"llxFooter")) {
3804 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3807 global $delayedhtmlcontent;
3808 global $contextpage, $page, $limit, $mode;
3809 global $dolibarr_distrib;
3811 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3815 $parameters = array();
3816 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3817 if (empty($reshook)) {
3818 $llxfooter .= $hookmanager->resPrint;
3819 } elseif ($reshook > 0) {
3820 $llxfooter = $hookmanager->resPrint;
3831 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3833 foreach ($user->lastsearch_values_tmp as $key => $val) {
3834 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3835 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3836 if (empty($val[
'sortfield'])) {
3837 unset($val[
'sortfield']);
3839 if (empty($val[
'sortorder'])) {
3840 unset($val[
'sortorder']);
3842 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3843 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3844 unset($_SESSION[
'lastsearch_values_'.$key]);
3850 $relativepathstring = $_SERVER[
"PHP_SELF"];
3852 if (constant(
'DOL_URL_ROOT')) {
3853 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3855 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3856 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3857 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3858 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3859 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3860 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3861 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3863 if (!empty($contextpage)) {
3864 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3866 if (!empty($page) && $page > 0) {
3867 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3869 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3870 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3872 if (!empty($mode)) {
3873 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3876 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3877 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3878 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3879 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3885 if (
$conf->use_javascript_ajax) {
3886 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3887 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3890 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3891 print
'<div class="error">'.$msg.
'</div>';
3899 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3901 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3902 print
'</div> <!-- End div id-right -->'.
"\n";
3905 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3906 print
'</div> <!-- End div id-container -->'.
"\n";
3911 print
'<!-- '.$comment.
' -->'.
"\n";
3916 if (!empty($delayedhtmlcontent)) {
3917 print $delayedhtmlcontent;
3920 if (!empty(
$conf->use_javascript_ajax)) {
3921 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3922 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
3967 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3968 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3971 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3972 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3979 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3980 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
3983 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
3984 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
3985 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
3988 || (!empty(
$conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3991 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3992 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3993 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
3995 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3997 $arrayofmoredata = array(
3998 'action' =>
'dolibarrping',
4001 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
4003 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofmoredata, $forceping);
4006 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4007 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4012 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
4018 $forceregistration =
GETPOSTINT(
'forceregistration');
4020 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
4021 require_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
4024 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
4026 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
4029 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
4030 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
4031 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
4034 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
4035 || $forceregistration) {
4037 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
4038 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
4039 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
4041 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4043 $arrayofdata = array(
4044 'action' =>
'dolibarrregistration',
4055 'country_code' =>
$mysoc->country_code,
4068 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
4071 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
4072 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4077 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
4121 $parameters = array();
4122 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
4124 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.
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.
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...
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...