46if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
47 list($usec, $sec) = explode(
" ", microtime());
48 $micro_start_time = ((float) $usec + (
float) $sec);
51 if (defined(
'XDEBUGCOVERAGE')) {
52 xdebug_start_code_coverage();
56require __DIR__.
'/waf.inc.php';
59if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
60 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
63if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
64 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
69if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
70 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
74require_once
'filefunc.inc.php';
92if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
93 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
94 $tmplist = explode(
',', $tmpautoset[1]);
95 $cookiearrayvalue = array();
96 foreach ($tmplist as $tmpkey) {
97 $postkey = $tmpautoset[0].
'_'.$tmpkey;
100 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
103 $cookiename = $tmpautoset[0];
104 $cookievalue = json_encode($cookiearrayvalue);
111if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
112 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
118$prefix = dol_getprefix(
'');
119$sessionname =
'DOLSESSID_'.$prefix;
120$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
121if (!empty($_COOKIE[$sessiontimeout])) {
122 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
127if (!defined(
'NOSESSION')) {
128 if (PHP_VERSION_ID < 70300) {
129 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
132 $sessioncookieparams = array(
136 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
140 session_set_cookie_params($sessioncookieparams);
142 session_name($sessionname);
149require_once
'master.inc.php';
161@phan-var-force Conf $conf
162@phan-var-force ?DoliDB $db
163@phan-var-force ?HookManager $hookmanager
164@phan-var-force ?Translate $langs
165@phan-var-force ?User $user
174 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
176 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
178 } elseif (defined(
'NOREQUIREDB')) {
180 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
182 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
186 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
187 print
'Sorry, your application is offline.'.
"\n";
188 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";
189 $nexturl =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
190 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
192 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
194 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
202register_shutdown_function(
'dol_shutdown');
205if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
207 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
209 $renderer = $debugbar->getJavascriptRenderer();
211 $conf->global->MAIN_HTML_HEADER =
'';
213 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
215 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
216 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
220if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
222 $conf->browser->name = $tmp[
'browsername'];
223 $conf->browser->os = $tmp[
'browseros'];
224 $conf->browser->version = $tmp[
'browserversion'];
225 $conf->browser->ua = $tmp[
'browserua'];
226 $conf->browser->layout = $tmp[
'layout'];
229 if ($conf->browser->layout ==
'phone') {
230 $conf->dol_no_mouse_hover = 1;
236 $conf->theme =
GETPOST(
'theme',
'aZ09');
237 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
241if (
GETPOSTINT(
'textbrowser') || (!empty($conf->browser->name) && $conf->browser->name ==
'textbrowser')) {
242 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
247if (!empty($conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
249 if (is_numeric($conf->file->main_force_https)) {
250 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
251 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
252 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
257 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
261 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
266 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
267 header(
"Location: ".$newurl);
270 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);
274if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
275 $listofip = explode(
',', $dolibarr_main_restrict_ip);
277 foreach ($listofip as $ip) {
279 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
285 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
291if (!defined(
'NOREQUIREHTML')) {
292 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
294if (!defined(
'NOREQUIREAJAX')) {
295 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
300 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
301 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
305$checkifupgraderequired =
false;
307 $checkifupgraderequired =
true;
310 $checkifupgraderequired =
true;
312if ($checkifupgraderequired) {
314 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
315 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
316 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
317 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
319 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
321 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
322 if (php_sapi_name() ===
"cli") {
323 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
325 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
333if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
335 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
337 if (isset($_SESSION[
'newtoken'])) {
338 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
341 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
345 $token =
dol_hash(uniqid((
string) mt_rand(),
false),
'md5');
346 $_SESSION[
'newtoken'] = $token;
347 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
355if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
356 $tmpaction =
GETPOST(
'action',
'aZ09');
358 $sensitiveget =
false;
359 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
362 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, array(
'create',
'create2',
'createsite',
'createcard',
'edit',
'editcontract',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'reconcile',
'specimen',
'validatenewpassword')))) {
363 $sensitiveget =
true;
367 $arrayofactiontoforcetokencheck = array(
369 'doprev',
'donext',
'dvprev',
'dvnext',
370 'freezone',
'install',
373 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
374 $sensitiveget =
true;
377 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
378 $sensitiveget =
true;
385 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
387 GETPOSTISSET(
'massaction') ||
388 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
391 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
394 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
395 $langs->loadLangs(array(
"errors",
"install"));
396 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
397 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
399 http_response_code(403);
400 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
401 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);
402 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";
404 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);
405 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";
406 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";
410 print
" into setup).\n";
417 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
419 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
420 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);
423 if (!defined(
'NOTOKENRENEWAL')) {
425 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
428 if (isset($_POST[
'id'])) {
429 $savid = ((int) $_POST[
'id']);
432 unset($_GET[
'confirm']);
433 unset($_GET[
'action']);
434 unset($_GET[
'confirmmassaction']);
435 unset($_GET[
'massaction']);
436 unset($_GET[
'token']);
438 $_POST[
'id'] = ((int) $savid);
441 $_GET[
'errorcode'] =
'InvalidToken';
447if (!empty($dolibarr_main_demo)) {
449 if (GETPOSTISSET(
'disablemodules')) {
450 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
452 if (!empty($_SESSION[
"disablemodules"])) {
453 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
455 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
456 foreach ($disabled_modules as $module) {
458 if (empty($conf->$module)) {
462 $conf->$module->enabled =
false;
463 unset($conf->modules[$module]);
465 foreach ($modulepartkeys as $modulepartkey) {
466 unset($conf->modules_parts[$modulepartkey][$module]);
468 if ($module ==
'fournisseur') {
469 $conf->supplier_order->enabled = 0;
470 $conf->supplier_invoice->enabled = 0;
471 unset($conf->modules[
'supplier_order']);
472 unset($conf->modules[
'supplier_invoice']);
480$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
481if (is_array($modulepart) && count($modulepart) > 0) {
482 foreach ($conf->modules as $module) {
483 if (in_array($module, $modulepart)) {
484 $modulepart = $module;
489if (is_array($modulepart)) {
500if (!defined(
'NOLOGIN')) {
504 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
505 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
508 if (empty($dolibarr_main_authentication)) {
509 $dolibarr_main_authentication =
'dolibarr';
512 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
513 $dolibarr_auto_user =
'auto';
517 $authmode = explode(
',', $dolibarr_main_authentication);
520 if (!count($authmode)) {
521 $langs->load(
'main');
522 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
529 $resultFetchUser =
'';
531 $dol_authmode =
null;
533 if (!isset($_SESSION[
"dol_login"])) {
535 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
537 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
539 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
540 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
541 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
542 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
543 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
544 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
545 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
546 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
549 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
550 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
551 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
553 if ($dol_hide_topmenu) {
554 $query += [
'dol_hide_topmenu' => $dol_hide_topmenu];
556 if ($dol_hide_leftmenu) {
557 $query += [
'dol_hide_leftmenu' => $dol_hide_leftmenu];
559 if ($dol_optimize_smallscreen) {
560 $query += [
'dol_optimize_smallscreen' => $dol_optimize_smallscreen];
562 if ($dol_no_mouse_hover) {
563 $query += [
'dol_no_mouse_hover='.$dol_no_mouse_hover];
565 if ($dol_use_jmobile) {
566 $query += [
'dol_use_jmobile='.$dol_use_jmobile];
568 header(
"Location: " .
dolBuildUrl(DOL_URL_ROOT .
'/public/demo/index.php', $query));
575 $hookmanager->initHooks(array(
'login'));
576 $parameters = array();
577 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
584 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
588 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
592 $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());
593 $fullpathclassfile =
'';
594 foreach ($dirModCaptcha as $dir) {
595 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
596 if ($fullpathclassfile) {
602 if ($fullpathclassfile) {
603 include_once $fullpathclassfile;
607 $classname =
"modCaptcha".ucfirst($captcha);
608 if (class_exists($classname)) {
610 $captchaobj =
new $classname($db, $conf, $langs, $user);
611 '@phan-var-force ModeleCaptcha $captchaobj';
613 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
614 $ok = $captchaobj->validateCodeAfterLoginSubmit();
616 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
621 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
626 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
633 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
635 $langs->loadLangs(array(
'main',
'errors'));
637 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
641 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
644 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
652 $hookmanager->initHooks(array(
'login'));
653 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
654 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
663 $allowedmethodtopostusername = 3;
664 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
665 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
668 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
669 if (!is_string($usertotest)) {
675 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
676 $entitytotest = (
GETPOSTINT(
'entity') ?
GETPOSTINT(
'entity') : (!empty($conf->entity) ? $conf->entity : 1));
679 $goontestloop =
false;
680 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
681 $goontestloop =
true;
683 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
684 $goontestloop =
true;
686 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
687 $goontestloop =
true;
689 if (
GETPOST(
'openid_mode',
'alpha')) {
690 $goontestloop =
true;
692 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
693 $goontestloop =
true;
695 if (!empty($_COOKIE[
'login_dolibarr'])) {
696 $goontestloop =
true;
699 if (!is_object($langs)) {
700 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
703 if (defined(
'MAIN_LANG_DEFAULT')) {
704 $langcode = constant(
'MAIN_LANG_DEFAULT');
706 $langs->setDefaultLang($langcode);
710 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
713 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);
719 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
722 $oauthmodetotestarray = array(
'google');
723 foreach ($oauthmodetotestarray as $oauthmodetotest) {
724 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
726 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
729 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);
730 foreach ($authmode as $tmpkey => $tmpval) {
731 if ($tmpval == $oauthmodetotest.
'oauth') {
732 unset($authmode[$tmpkey]);
741 if ($login ===
'--bad-login-validity--') {
746 $dol_authmode = $conf->authmode;
747 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
748 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
749 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
750 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
751 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
754 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
755 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
756 if ($dol_dst_first && $dol_dst_second) {
757 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
761 if ($datenow >= $datefirst && $datenow < $datesecond) {
765 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
766 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
771 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
773 $langs->loadLangs(array(
'main',
'errors'));
777 if (empty($_SESSION[
"dol_loginmesg"])) {
778 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
782 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
785 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
793 $hookmanager->initHooks(array(
'login'));
794 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
795 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
805 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
807 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);
808 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
813 return 'ERROR_NOT_LOGGED';
815 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
816 http_response_code(401);
820 dol_loginfunction($langs, $conf, (!empty(
$mysoc) ?
$mysoc :
''));
825 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
827 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
828 dol_syslog(
'User not found or not valid, connection refused');
830 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
831 session_name($sessionname);
834 if ($resultFetchUser == 0) {
836 $langs->loadLangs(array(
'main',
'errors'));
838 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
840 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
841 } elseif ($resultFetchUser < 0) {
842 $_SESSION[
"dol_loginmesg"] = $user->error;
844 $user->context[
'audit'] = $user->error;
847 $langs->loadLangs(array(
'main',
'errors'));
849 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
851 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
855 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
864 $hookmanager->initHooks(array(
'login'));
865 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
866 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
873 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
879 $paramsurl += [
'lang' => (string)
GETPOST(
'lang',
'aZ09')];
881 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
885 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
886 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
891 $login = $_SESSION[
"dol_login"];
892 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
893 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
895 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
899 if ($resultFetchUser <= 0
900 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
901 || ($user->status != $user::STATUS_ENABLED)
902 || ($user->isNotIntoValidityDateRange())) {
903 if ($resultFetchUser <= 0) {
905 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
906 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
908 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
909 } elseif ($user->status != $user::STATUS_ENABLED) {
914 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
917 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
918 session_name($sessionname);
921 if ($resultFetchUser == 0) {
922 $langs->loadLangs(array(
'main',
'errors'));
924 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
926 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
927 } elseif ($resultFetchUser < 0) {
928 $_SESSION[
"dol_loginmesg"] = $user->error;
930 $user->context[
'audit'] = $user->error;
932 $langs->loadLangs(array(
'main',
'errors'));
934 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
936 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
940 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
948 $hookmanager->initHooks(array(
'login'));
949 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
950 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
955 $paramsurl = array();
957 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
960 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
963 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
966 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
970 $hookmanager->initHooks(array(
'main'));
973 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
974 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
975 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
977 if (constant(
'DOL_URL_ROOT')) {
978 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
980 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
981 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
985 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
986 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
987 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
989 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
990 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
991 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
993 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
994 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
995 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
997 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
998 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
999 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1001 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1002 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1003 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1006 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1007 if (empty($_SESSION[
'pageforbacktolist'])) {
1008 $pageforbacktolistarray = array();
1010 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1012 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1013 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1014 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1015 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1020 $parameters = array();
1021 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1030 if (!isset($_SESSION[
"dol_login"])) {
1035 $_SESSION[
"dol_login"] = $user->login;
1036 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1037 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1038 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1039 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1040 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1041 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1042 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1043 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1044 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1045 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1047 $_SESSION[
"dol_entity"] = $conf->entity;
1052 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1053 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1055 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1056 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1058 if (!empty($dol_optimize_smallscreen)) {
1059 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1061 if (!empty($dol_no_mouse_hover)) {
1062 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1064 if (!empty($dol_use_jmobile)) {
1065 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1068 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1072 $user->update_last_login_date();
1074 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1075 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1078 $user->context[
'audit'] = $loginfo;
1079 $user->context[
'authentication_method'] = $dol_authmode;
1082 $result = $user->call_trigger(
'USER_LOGIN', $user);
1090 $hookmanager->initHooks(array(
'login'));
1091 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1092 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1100 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1108 if (!empty($landingpage)) {
1110 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1111 header(
'Location: '.$newpath);
1119 $user->rights->user->user->lire = 1;
1120 $user->rights->user->user->creer = 1;
1121 $user->rights->user->user->password = 1;
1122 $user->rights->user->user->supprimer = 1;
1123 $user->rights->user->self->creer = 1;
1124 $user->rights->user->self->password = 1;
1128 if (!$user->hasRight(
'user',
'user_advance')) {
1129 $user->rights->user->user_advance =
new stdClass();
1131 if (!$user->hasRight(
'user',
'self_advance')) {
1132 $user->rights->user->self_advance =
new stdClass();
1134 if (!$user->hasRight(
'user',
'group_advance')) {
1135 $user->rights->user->group_advance =
new stdClass();
1138 $user->rights->user->user_advance->readperms = 1;
1139 $user->rights->user->user_advance->write = 1;
1140 $user->rights->user->self_advance->readperms = 1;
1141 $user->rights->user->self_advance->writeperms = 1;
1142 $user->rights->user->group_advance->read = 1;
1143 $user->rights->user->group_advance->readperms = 1;
1144 $user->rights->user->group_advance->write = 1;
1145 $user->rights->user->group_advance->delete = 1;
1154 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1155 $conf->liste_limit =
getDolUserInt(
'MAIN_SIZE_LISTE_LIMIT');
1157 if ((
int) $conf->liste_limit <= 0) {
1159 $conf->liste_limit = 15;
1160 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1161 $conf->liste_limit = 8;
1162 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1163 $conf->liste_limit = 10;
1164 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1165 $conf->liste_limit = 20;
1169 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1170 $conf->main_checkbox_left_column =
getDolUserInt(
'MAIN_CHECKBOX_LEFT_COLUMN');
1176 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1180 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1181 $user->loadDefaultValues();
1187if (
GETPOST(
'theme',
'aZ09')) {
1188 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1189 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1194 $conf->use_javascript_ajax = 0;
1197 $conf->use_javascript_ajax = !
getDolUserString(
'MAIN_DISABLE_JAVASCRIPT') ? 1 : 0;
1203 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER =
getDolUserString(
'MAIN_OPTIMIZEFORTEXTBROWSER');
1205 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1212$conf->global->MAIN_OPTIMIZEFORCOLORBLIND =
getDolUserString(
'MAIN_OPTIMIZEFORCOLORBLIND');
1215if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1216 $conf->dol_hide_leftmenu = 1;
1218if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1219 $conf->dol_hide_topmenu = 1;
1221if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1222 $conf->dol_optimize_smallscreen = 1;
1224if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1225 $conf->dol_no_mouse_hover = 1;
1227if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1228 $conf->dol_use_jmobile = 1;
1231if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1232 $conf->dol_no_mouse_hover = 1;
1236if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1237 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1238 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1241 $conf->dol_optimize_smallscreen = 1;
1244 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1248if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1249 $conf->theme =
'eldy';
1250 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1253if (!defined(
'NOREQUIRETRAN')) {
1254 if (!
GETPOST(
'lang',
'aZ09')) {
1256 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1259 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1260 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1266if (!defined(
'NOLOGIN')) {
1269 if (!$user->login) {
1274 if ($user->statut < 1) {
1276 $langs->loadLangs(array(
"errors",
"other"));
1277 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1282 $user->loadRights();
1285dol_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);
1290if (!defined(
'NOREQUIRETRAN')) {
1292 $langs->loadLangs(array(
'main',
'dict'));
1298 $conf->browser->stringforfirstkey = $langs->trans(
"KeyboardShortcut");
1299 if (!empty($conf->browser->os) && $conf->browser->os ==
'macintosh') {
1300 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1302 if (!empty($conf->browser->name) && $conf->browser->name ==
'chrome') {
1303 $conf->browser->stringforfirstkey .=
' ALT +';
1304 } elseif (!empty($conf->browser->name) && $conf->browser->name ==
'firefox') {
1305 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1307 $conf->browser->stringforfirstkey .=
' CTL +';
1313$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1314$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1315$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1327if (empty($conf->browser->firefox)) {
1328 define(
'ROWS_1', 1);
1329 define(
'ROWS_2', 2);
1330 define(
'ROWS_3', 3);
1331 define(
'ROWS_4', 4);
1332 define(
'ROWS_5', 5);
1333 define(
'ROWS_6', 6);
1334 define(
'ROWS_7', 7);
1335 define(
'ROWS_8', 8);
1336 define(
'ROWS_9', 9);
1338 define(
'ROWS_1', 0);
1339 define(
'ROWS_2', 1);
1340 define(
'ROWS_3', 2);
1341 define(
'ROWS_4', 3);
1342 define(
'ROWS_5', 4);
1343 define(
'ROWS_6', 5);
1344 define(
'ROWS_7', 6);
1345 define(
'ROWS_8', 7);
1346 define(
'ROWS_9', 8);
1349$heightforframes = 52;
1352if (!defined(
'NOREQUIREMENU')) {
1353 if (empty($user->socid)) {
1361 $file_menu = $conf->standard_menu;
1362 if (
GETPOST(
'menu',
'alpha')) {
1363 $file_menu =
GETPOST(
'menu',
'alpha');
1366 if (!class_exists(
'MenuManager')) {
1368 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1369 foreach ($dirmenus as $dirmenu) {
1371 if (class_exists(
'MenuManager')) {
1375 if (!class_exists(
'MenuManager')) {
1376 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1377 $file_menu =
'eldy_menu.php';
1378 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1382 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1387if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1388 $message =
GETPOST(
'seteventmessages',
'alpha');
1389 $messages = explode(
',', $message);
1390 foreach ($messages as $key => $msg) {
1391 $tmp = explode(
':', $msg);
1398if (!function_exists(
"llxHeader")) {
1422 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1424 global $conf, $hookmanager;
1426 $parameters = array(
1428 'title' => & $title,
1429 'help_url' => & $help_url,
1430 'target' => & $target,
1431 'disablejs' => & $disablejs,
1432 'disablehead' => & $disablehead,
1433 'arrayofjs' => & $arrayofjs,
1434 'arrayofcss' => & $arrayofcss,
1435 'morequerystring' => & $morequerystring,
1436 'morecssonbody' => & $morecssonbody,
1437 'replacemainareaby' => & $replacemainareaby,
1438 'disablenofollow' => & $disablenofollow,
1439 'disablenoindex' => & $disablenoindex
1442 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1444 print $hookmanager->resPrint;
1449 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1451 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1453 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1455 if ($mainmenu !=
'website') {
1456 $tmpcsstouse = $morecssonbody;
1461 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1464 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1465 $tmpcsstouse .=
' dol_openinpopup';
1468 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1471 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1472 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1475 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1476 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1480 if ($replacemainareaby) {
1481 print $replacemainareaby;
1499 global $db, $conf, $hookmanager;
1501 if ($contenttype ==
'text/html') {
1502 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1504 header(
"Content-Type: ".$contenttype);
1510 header(
"X-Content-Type-Options: nosniff");
1513 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1514 header(
"X-Frame-Options: SAMEORIGIN");
1516 header(
"X-Frame-Options: ALLOWALL");
1520 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1521 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1522 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1523 header(
'Vary: Origin');
1530 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1545 if (!is_object($hookmanager)) {
1546 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1549 $hookmanager->initHooks(array(
"main"));
1551 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1552 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1554 $contentsecuritypolicy = $hookmanager->resPrint;
1556 $contentsecuritypolicy .= $hookmanager->resPrint;
1559 if (!empty($contentsecuritypolicy)) {
1560 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1563 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1567 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1582 if (!is_object($hookmanager)) {
1583 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1586 $hookmanager->initHooks(array(
"main"));
1588 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1589 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1591 $contentsecuritypolicy = $hookmanager->resPrint;
1593 $contentsecuritypolicy .= $hookmanager->resPrint;
1596 if (!empty($contentsecuritypolicy)) {
1597 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1600 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1607 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1609 if (!empty($referrerpolicy)) {
1610 header(
"Referrer-Policy: ".$referrerpolicy);
1613 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1617 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1620 header(
"Strict-Transport-Security: ".$sts);
1623 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1627 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1630 header(
"Permissions-Policy: ".$pp);
1633 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1637 if ($forcenocache) {
1638 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1660function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1662 global $db, $conf, $langs, $user,
$mysoc, $hookmanager;
1666 if (empty($conf->css)) {
1667 $conf->css =
'/theme/eldy/style.css.php';
1670 print
'<!doctype html>'.
"\n";
1672 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1675 if (empty($disablehead)) {
1676 if (!is_object($hookmanager)) {
1677 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1680 $hookmanager->initHooks(array(
"main"));
1682 $ext =
'layout='.(empty($conf->browser->layout) ?
'' : $conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1686 if (
GETPOST(
'dol_basehref',
'alpha')) {
1687 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1691 print
'<meta charset="utf-8">'.
"\n";
1692 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1693 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1694 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1695 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1696 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1698 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1701 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1702 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1703 if (!empty(
$mysoc->logo_squarred_mini)) {
1704 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1709 if (empty($conf->dol_use_jmobile)) {
1710 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1711 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1715 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1716 $parameters = array(
'manifest' => $manifest);
1717 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1719 $manifest = $hookmanager->resPrint;
1721 $manifest .= $hookmanager->resPrint;
1723 if (!empty($manifest)) {
1724 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1728 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1733 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1737 $appli = constant(
'DOL_APPLICATION_TITLE');
1740 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1753 $parameters = array(
'title' => $titletoshow);
1754 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1756 $titletoshow = $hookmanager->resPrint;
1758 $titletoshow .= $hookmanager->resPrint;
1767 $ext =
'version='.GETPOSTINT(
'version');
1770 if (
GETPOST(
'dol_resetcache')) {
1771 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1775 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1777 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1778 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1779 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1781 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1782 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1784 if (GETPOSTISSET(
'dol_openinpopup')) {
1785 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1787 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1788 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1790 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1791 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1793 if (GETPOSTISSET(
'dol_use_jmobile')) {
1794 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1795 $conf->dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile');
1797 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1798 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1800 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1801 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1805 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1806 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1809 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && $conf->use_javascript_ajax) {
1810 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1811 if (!defined(
'DISABLE_JQUERY_UI')) {
1812 $jquerytheme =
'base';
1816 if (constant(
'JS_JQUERY_UI')) {
1817 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1819 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1822 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1823 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1825 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1827 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1831 if (!defined(
'DISABLE_FONT_AWSOME')) {
1832 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1833 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1834 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1840 if (!empty($conf->modules_parts[
'theme'])) {
1841 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1844 $themesubdir = $reldir;
1850 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1851 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1852 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1864 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1865 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1869 if (!empty($conf->modules_parts[
'css'])) {
1870 $arraycss = (array) $conf->modules_parts[
'css'];
1871 foreach ($arraycss as $modcss => $filescss) {
1872 $filescss = (array) $filescss;
1873 foreach ($filescss as $cssfile) {
1874 if (empty($cssfile)) {
1875 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1879 if ($urlforcss && $urlforcss !=
'/') {
1880 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1882 if (!preg_match(
'/\.css$/i', $cssfile)) {
1887 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1893 if (is_array($arrayofcss)) {
1894 foreach ($arrayofcss as $cssfile) {
1895 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1896 $urltofile = $cssfile;
1900 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1902 if (!preg_match(
'/\.css$/i', $cssfile)) {
1912 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1916 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty($conf->use_javascript_ajax)) {
1918 print
'<!-- Includes JS for JQuery -->'.
"\n";
1919 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1920 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
1922 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
1924 if (!defined(
'DISABLE_JQUERY_UI')) {
1925 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1926 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1928 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1932 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1933 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
1936 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1937 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
1941 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
1945 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1946 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1947 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js?' . $ext .
'"></script>'.
"\n";
1948 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js?' . $ext .
'"></script>'.
"\n";
1949 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js?' . $ext .
'"></script>'.
"\n";
1950 print
'<script nonce="'.getNonce().
'" >'.
"\n";
1951 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1952 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1953 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1954 print 'var placeholderInPlace = \
' \';'.
"\n";
1955 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1956 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1957 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1958 print
'var withInPlace = 300;';
1959 print
'</script>'.
"\n";
1960 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js?' . $ext .
'"></script>'.
"\n";
1961 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js?' . $ext .
'"></script>'.
"\n";
1963 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1966 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
1968 if (!defined(
'DISABLE_MULTISELECT')) {
1969 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
1973 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1976 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1977 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1978 $jsckeditor =
'ckeditor.js';
1979 if (constant(
'JS_CKEDITOR')) {
1981 $pathckeditor = constant(
'JS_CKEDITOR');
1983 print
'<script nonce="'.getNonce().
'">';
1984 print
'/* enable ckeditor by main.inc.php */';
1985 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1986 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1987 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1988 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";
1989 print
'</script>'.
"\n";
1990 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
1992 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1993 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1995 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1997 print
'</script>'.
"\n";
2001 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2002 $enablebrowsernotif =
false;
2004 $enablebrowsernotif =
true;
2006 if ($conf->browser->layout ==
'phone') {
2007 $enablebrowsernotif =
false;
2009 if ($enablebrowsernotif) {
2010 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2011 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2016 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2017 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2018 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2023 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2024 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2028 if (!empty($conf->modules_parts[
'js'])) {
2029 $arrayjs = (array) $conf->modules_parts[
'js'];
2030 foreach ($arrayjs as $modjs => $filesjs) {
2031 $filesjs = (array) $filesjs;
2032 foreach ($filesjs as $jsfile) {
2035 if ($urlforjs && $urlforjs !=
'/') {
2036 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2037 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2039 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2045 if (is_array($arrayofjs)) {
2046 print
'<!-- Includes JS added by page -->'.
"\n";
2047 foreach ($arrayofjs as $jsfile) {
2048 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2049 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2051 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2059 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2060 if (file_exists($theme_js)) {
2061 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2065 if (!empty($head)) {
2072 $parameters = array();
2073 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2074 print $hookmanager->resPrint;
2076 print
"</head>\n\n";
2079 $conf->headerdone = 1;
2099function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2101 global $user, $conf, $langs, $db, $form;
2102 global $dolibarr_main_authentication, $dolibarr_main_demo;
2103 global $hookmanager, $menumanager;
2108 $hookmanager->initHooks(array(
'toprightmenu'));
2113 if (empty($conf->headerdone)) {
2114 $disablenofollow = 0;
2115 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2116 print
'<body id="mainbody">';
2122 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2123 if (!isset($form) || !is_object($form)) {
2124 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2125 $form =
new Form($db);
2128 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2130 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2133 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2135 $menumanager->atarget = $target;
2137 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2141 $appli = constant(
'DOL_APPLICATION_TITLE');
2144 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2146 $appli .=
" ".DOL_VERSION;
2150 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2154 $logouthtmltext =
'';
2156 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2157 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2158 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2159 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2160 $logouttext .=
'</a>';
2162 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2163 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2168 print
'<div class="login_block usedropdown">'.
"\n";
2172 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2175 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2195 $toprightmenu .=
'</div>';
2197 $toprightmenu .=
'</div>'.
"\n";
2201 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2204 $parameters = array();
2205 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2206 if (is_numeric($result)) {
2208 $toprightmenu .= $hookmanager->resPrint;
2210 $toprightmenu = $hookmanager->resPrint;
2213 $toprightmenu .= $result;
2218 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2220 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2223 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2230 if (isset($_POST) && is_array($_POST)) {
2231 foreach ($_POST as $key => $value) {
2232 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2233 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2236 if (!is_array($value)) {
2237 if ($value !==
'') {
2238 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2241 foreach ($value as $value2) {
2242 if (($value2 !==
'') && (!is_array($value2))) {
2243 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2249 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2250 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2252 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2255 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2260 $langs->load(
"help");
2267 if (empty($helppagename)) {
2268 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2270 $helppresent =
'helppresent';
2275 $helpbaseurl = $arrayres[
'helpbaseurl'];
2276 $helppage = $arrayres[
'helppage'];
2277 $mode = $arrayres[
'mode'];
2280 if ($helpbaseurl && $helppage) {
2282 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2283 if ($mode ==
'wiki') {
2284 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2286 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2288 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2291 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2292 if ($mode ==
'wiki') {
2294 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2297 $text .= sprintf($helpbaseurl, $helppage);
2300 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2301 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2304 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2309 $langs->load(
'admin');
2310 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2316 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2318 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2323 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2326 $toprightmenu .=
'</div>';
2330 $toprightmenu .=
'<div class="login_block_user">';
2333 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2338 $toprightmenu .=
'</div>';
2340 $toprightmenu .=
'</div>'.
"\n";
2343 print $toprightmenu;
2350 print
'<div style="clear: both;"></div>';
2351 print
"<!-- End top horizontal menu -->\n\n";
2354 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2355 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2369 global $langs, $conf, $db, $hookmanager, $user,
$mysoc;
2370 global $dolibarr_main_authentication, $dolibarr_main_demo;
2371 global $menumanager, $form;
2374 if ($conf->browser->name ==
'textbrowser') {
2378 $langs->load(
'companies');
2380 $userImage = $userDropDownImage =
'';
2381 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2382 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2383 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2385 $nophoto =
'/public/theme/common/user_anonymous.png';
2386 if ($user->gender ==
'man') {
2387 $nophoto =
'/public/theme/common/user_man.png';
2389 if ($user->gender ==
'woman') {
2390 $nophoto =
'/public/theme/common/user_woman.png';
2393 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2395 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2399 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2400 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2404 while ($idprofcursor < 10) {
2406 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2407 if ($idprofcursor == 1) {
2408 $constkeyforprofid =
'MAIN_INFO_SIREN';
2410 if ($idprofcursor == 2) {
2411 $constkeyforprofid =
'MAIN_INFO_SIRET';
2413 if ($idprofcursor == 3) {
2414 $constkeyforprofid =
'MAIN_INFO_APE';
2416 if ($idprofcursor == 4) {
2417 $constkeyforprofid =
'MAIN_INFO_RCS';
2419 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2429 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2431 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2433 $dropdownBody .=
'</div>';
2435 $dropdownBody .=
'<br>';
2436 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2437 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2440 if (!empty($user->admin)) {
2441 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2444 if (!empty($user->socid)) {
2445 $thirdpartystatic =
new Societe($db);
2446 $thirdpartystatic->fetch($user->socid);
2447 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2448 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2450 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2451 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2452 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2453 $dropdownBody .=
'<br>';
2455 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2456 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2458 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2460 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2461 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2462 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2463 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2465 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2467 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2469 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2470 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2471 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2476 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst($conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2477 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2478 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2479 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2480 if ($conf->browser->layout ==
'phone') {
2481 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2483 if (!empty($_SESSION[
"disablemodules"])) {
2484 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2486 $dropdownBody .=
'</div>';
2489 $parameters = array(
'user' => $user,
'langs' => $langs);
2490 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2491 if (is_numeric($result)) {
2493 $dropdownBody .= $hookmanager->resPrint;
2495 $dropdownBody = $hookmanager->resPrint;
2499 if (empty($urllogout)) {
2500 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2504 $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>';
2505 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2506 $jsonopen =
"closeTopMenuLoginDropdown()";
2507 $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');
2508 $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>';
2510 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2511 if (!empty($user->admin)) {
2512 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2516 $appli = constant(
'DOL_APPLICATION_TITLE');
2519 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2521 $appli .=
" ".DOL_VERSION;
2525 $btnUser =
'<!-- div for user link -->
2526 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2527 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2528 '.$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>' :
'').
'
2530 <div class="dropdown-menu">
2532 <div class="user-header">
2533 '.$userDropDownImage.
'
2535 '.$profilName.
'<br>';
2537 if ($user->datelastlogin) {
2538 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2539 if ($user->datepreviouslogin) {
2540 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2543 $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>';
2544 if ($user->datepreviouslogin) {
2545 $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>';
2553 <!-- Menu Body user-->
2554 <div class="user-body">'.$dropdownBody.
'</div>
2557 <div class="user-footer">
2558 <div class="pull-left">
2561 <div class="pull-left">
2562 '.$virtuelcardLink.
'
2564 <div class="pull-right">
2567 <div class="clearboth"></div>
2573 $btnUser =
'<!-- div for user link text browser -->
2574 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2575 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2576 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2581 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2583 <!-- Code to show/hide the user drop-down -->
2585 function closeTopMenuLoginDropdown() {
2586 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2588 jQuery("#topmenu-login-dropdown").removeClass("open");
2590 jQuery(document).ready(function() {
2591 jQuery(document).on("click", function(event) {
2592 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2593 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2594 /* console.log("click close login - we click outside"); */
2595 closeTopMenuLoginDropdown();
2603 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2604 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2605 event.preventDefault();
2606 jQuery("#topmenu-login-dropdown").toggleClass("open");
2609 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2610 console.log("Click on #topmenulogincompanyinfo-btn");
2611 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2612 jQuery("#topmenuloginmoreinfo").slideToggle();
2614 jQuery("#topmenulogincompanyinfo").slideToggle();
2617 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2618 console.log("Click on #topmenuloginmoreinfo-btn");
2619 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2620 jQuery("#topmenulogincompanyinfo").slideToggle();
2622 jQuery("#topmenuloginmoreinfo").slideToggle();
2642 global $conf, $langs;
2651 if (!empty($conf->use_javascript_ajax)) {
2652 $html .=
'<!-- div for quick add link -->
2653 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2654 <a accesskey="a" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$conf->browser->stringforfirstkey.
' a)"><i class="fa fa-plus-circle"></i></a>
2657 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2659 <!-- Code to show/hide the user drop-down for the quick add -->
2661 jQuery(document).ready(function() {
2662 jQuery(document).on("click", function(event) {
2663 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2664 /* console.log("click close quick add - we click outside"); */
2666 $("#topmenu-quickadd-dropdown").removeClass("open");
2669 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2670 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2671 openQuickAddDropDown(event);
2675 $(document).keydown(function(event){
2676 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2677 if (ostype ===
"macintosh") {
2678 if ( event.which === 65 && event.ctrlKey ) {
2679 console.log(\
'control + a : trigger open quick add dropdown\');
2680 openQuickAddDropDown(event);
2683 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2684 console.log(\'control + shift + a : trigger open quick add dropdown\');
2685 openQuickAddDropDown(event);
2690 var openQuickAddDropDown = function(event) {
2691 event.preventDefault();
2692 $("#topmenu-quickadd-dropdown").toggleClass("open");
2712 global $conf, $langs;
2721 if (!empty($conf->use_javascript_ajax)) {
2722 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2727 $html .=
'<!-- div for link to upload file -->
2728 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2729 <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>
2745 global $user, $langs, $hookmanager;
2750 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2751 "title" =>
"MenuNewMember@members",
2752 "name" =>
"Adherent@members",
2753 "picto" =>
"object_member",
2754 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2758 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2759 "title" =>
"MenuNewThirdParty@companies",
2760 "name" =>
"ThirdParty@companies",
2761 "picto" =>
"object_company",
2762 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2766 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2767 "title" =>
"NewContactAddress@companies",
2768 "name" =>
"Contact@companies",
2769 "picto" =>
"object_contact",
2770 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2774 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2775 "title" =>
"NewPropal@propal",
2776 "name" =>
"Proposal@propal",
2777 "picto" =>
"object_propal",
2778 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2783 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2784 "title" =>
"NewOrder@orders",
2785 "name" =>
"Order@orders",
2786 "picto" =>
"object_order",
2787 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2791 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2792 "title" =>
"NewBill@bills",
2793 "name" =>
"Bill@bills",
2794 "picto" =>
"object_bill",
2795 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2799 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2800 "title" =>
"NewContractSubscription@contracts",
2801 "name" =>
"Contract@contracts",
2802 "picto" =>
"object_contract",
2803 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2807 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2808 "title" =>
"SupplierProposalNew@supplier_proposal",
2809 "name" =>
"SupplierProposal@supplier_proposal",
2810 "picto" =>
"supplier_proposal",
2811 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2815 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2816 "title" =>
"NewSupplierOrderShort@orders",
2817 "name" =>
"SupplierOrder@orders",
2818 "picto" =>
"supplier_order",
2819 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2823 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2824 "title" =>
"NewBill@bills",
2825 "name" =>
"SupplierBill@bills",
2826 "picto" =>
"supplier_invoice",
2827 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2831 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2832 "title" =>
"NewTicket@ticket",
2833 "name" =>
"Ticket@ticket",
2834 "picto" =>
"ticket",
2835 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2839 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2840 "title" =>
"NewIntervention@interventions",
2841 "name" =>
"Intervention@interventions",
2842 "picto" =>
"intervention",
2843 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2847 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2848 "title" =>
"NewProduct@products",
2849 "name" =>
"Product@products",
2850 "picto" =>
"object_product",
2851 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2855 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2856 "title" =>
"NewService@products",
2857 "name" =>
"Service@products",
2858 "picto" =>
"object_service",
2859 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2863 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2864 "title" =>
"AddUser@users",
2865 "name" =>
"User@users",
2867 "activation" => $user->hasRight(
"user",
"user",
"write"),
2873 $dropDownQuickAddHtml =
'';
2877 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2879 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2882 $parameters = array();
2883 $hook_items = $items;
2884 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2885 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2886 if ($reshook == 0) {
2887 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2889 $items = $hookmanager->resArray;
2893 $position = array();
2894 foreach ($items[
'items'] as $key => $row) {
2895 $position[$key] = $row[
'position'];
2897 $array1_sort_order = SORT_ASC;
2898 array_multisort($position, $array1_sort_order, $items[
'items']);
2901 foreach ($items[
'items'] as $item) {
2902 if (!$item[
'activation']) {
2905 $langs->load(explode(
'@', $item[
'title'])[1]);
2906 $langs->load(explode(
'@', $item[
'name'])[1]);
2907 $dropDownQuickAddHtml .=
'
2908 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2909 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2914 $dropDownQuickAddHtml .=
'</div>';
2916 $dropDownQuickAddHtml .=
'</div>';
2918 return $dropDownQuickAddHtml;
2928 global $langs, $conf, $user;
2933 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2942 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2943 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2944 $langs->load(
"bookmarks");
2947 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2951 $html .=
'<!-- div for bookmark link -->
2952 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2953 <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>
2954 <div class="dropdown-menu">
2960 <!-- Code to show/hide the bookmark drop-down -->
2962 jQuery(document).ready(function() {
2963 jQuery(document).on("click", function(event) {
2964 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2965 /* console.log("close bookmark dropdown - we click outside"); */
2967 $("#topmenu-bookmark-dropdown").removeClass("open");
2971 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2972 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2973 openBookMarkDropDown(event);
2977 jQuery(document).keydown(function(event) {
2978 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2979 if (ostype ===
"macintosh") {
2980 if ( event.which === 66 && event.ctrlKey ) {
2981 console.log(
"Click on control + b : trigger open bookmark dropdown");
2982 openBookMarkDropDown(event);
2985 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2986 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2987 openBookMarkDropDown(event);
2992 var openBookMarkDropDown =
function(event) {
2993 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2994 event.preventDefault();
2995 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2996 jQuery(
"#top-bookmark-search-input").focus();
3012function top_menu_search()
3014 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3019 $arrayresult = array();
3020 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3022 $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">
';
3024 $defaultAction = '';
3025 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3026 // Menu with all searchable items
3027 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3028 foreach ($arrayresult as $keyItem => $item) {
3029 if (empty($defaultAction)) {
3030 $defaultAction = $item['url
'];
3032 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3033 $buttonList .= $item['text
'];
3034 $buttonList .= '</
button>
';
3036 $buttonList .= '</div>
';
3038 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3041 <!-- search input -->
3042 <div
class=
"dropdown-header search-dropdown-header">
3048 <!--
Menu Body search -->
3049 <div
class=
"dropdown-body search-dropdown-body">
3054 $dropDownHtml .= '</form>
';
3056 $html .= '<!-- div
for Global Search -->
3057 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3058 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3059 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3061 <div
class=
"dropdown-menu dropdown-search">
3067 <!-- Code to show/hide the
user drop-down -->
3069 jQuery(document).ready(
function() {
3072 jQuery(
"#top-global-search-input").keydown(
function (e) {
3073 if (e.keyCode == 13 || e.keyCode == 40) {
3074 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3075 if (inputs[inputs.index(this) + 1] != null) {
3076 console.log(
"Force focus after keydow on #top-global-search-input");
3077 inputs[inputs.index(this) + 1].focus();
3078 if (e.keyCode == 13){
3079 inputs[inputs.index(this) + 1].trigger(
"click");
3089 jQuery(document).keydown(
function(e) {
3091 var $focused = $(
":focus");
3092 if($focused.length && $focused.hasClass(
"global-search-item")){
3095 if (e.keyCode == 38) {
3097 console.log(
"Force focus after keycode 38");
3098 $focused.prev().focus();
3102 if (e.keyCode == 40) {
3104 console.log(
"Force focus after keycode 40");
3105 $focused.next().focus();
3112 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3113 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3114 jQuery(
"#top-menu-action-search").submit();
3118 jQuery(document).on(
"click",
function(event) {
3119 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3120 console.log(
"click close search - we click outside");
3122 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3127 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3128 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3129 openGlobalSearchDropDown();
3133 jQuery(document).keydown(
function(e){
3134 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3135 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3136 openGlobalSearchDropDown();
3138 if ( e.which === 70 && e.alKey ) {
3139 console.log(\'alt + f : trigger open global-search dropdown\');
3140 openGlobalSearchDropDown();
3144 var openGlobalSearchDropDown = function() {
3145 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3146 jQuery("#top-global-search-input").focus();
3170function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3172 global $user, $conf, $langs, $db, $form;
3173 global $hookmanager, $menumanager;
3177 if (!empty($menu_array_before)) {
3178 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);
3181 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3183 $hookmanager->initHooks(array(
'leftblock'));
3185 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3188 if (!is_object($form)) {
3189 $form =
new Form($db);
3194 if ($conf->browser->layout ==
'phone') {
3195 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3199 $arrayresult = array();
3200 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3202 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3204 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3205 $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');
3207 if (is_array($arrayresult)) {
3209 foreach ($arrayresult as $key => $val) {
3210 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3216 $parameters = array(
'searchform' => $searchform);
3217 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3218 if (empty($reshook)) {
3219 $searchform .= $hookmanager->resPrint;
3221 $searchform = $hookmanager->resPrint;
3225 if (
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') || empty($conf->use_javascript_ajax)) {
3226 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3227 $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>';
3228 } elseif ($conf->use_javascript_ajax &&
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3229 $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>';
3230 $searchform .=
'<script>
3231 jQuery(document).ready(function () {
3232 jQuery("#divsearchforms1").click(function(){
3233 jQuery("#divsearchforms2").toggle();
3237 $searchform .=
'</div>';
3241 $searchform .=
'<script>
3242 jQuery(document).keydown(function(e){
3243 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3244 console.log(\'control + shift + f : trigger open global-search dropdown\');
3245 openGlobalSearchDropDown();
3247 if( (e.which === 83 || e.which === 115) && e.altKey ){
3248 console.log(\'alt + s : trigger open global-search dropdown\');
3249 openGlobalSearchDropDown();
3253 var openGlobalSearchDropDown = function() {
3254 jQuery("#searchselectcombo").select2(\'open\');
3260 print
'<!-- Begin left menu -->'.
"\n";
3262 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3266 $menumanager->menu_array = $menu_array_before;
3268 $menumanager->menu_array_after = $menu_array_after;
3271 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3274 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3280 print
"<!-- Begin Help Block-->\n";
3281 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3285 $doliurl =
'https://www.dolibarr.org';
3287 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3288 $doliurl =
'https://www.dolibarr.fr';
3290 if (preg_match(
'/es/i', $langs->defaultlang)) {
3291 $doliurl =
'https://www.dolibarr.es';
3293 if (preg_match(
'/de/i', $langs->defaultlang)) {
3294 $doliurl =
'https://www.dolibarr.de';
3296 if (preg_match(
'/it/i', $langs->defaultlang)) {
3297 $doliurl =
'https://www.dolibarr.it';
3299 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3300 $doliurl =
'https://www.dolibarr.gr';
3303 $appli = constant(
'DOL_APPLICATION_TITLE');
3306 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3308 $appli .=
" ".DOL_VERSION;
3316 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3318 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3320 print
'<span class="help">';
3328 print
'</div>'.
"\n";
3333 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3336 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3337 $bugbaseurl .=
'&title=';
3338 $bugbaseurl .= urlencode(
"Bug: ");
3339 $bugbaseurl .=
'&body=';
3340 $bugbaseurl .= urlencode(
"# Instructions\n");
3341 $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");
3342 $bugbaseurl .= urlencode(
"*Please:*\n");
3343 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3344 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3345 $bugbaseurl .= urlencode(
"\n");
3346 $bugbaseurl .= urlencode(
"\n");
3347 $bugbaseurl .= urlencode(
"# Bug\n");
3348 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3349 $bugbaseurl .= urlencode(
"\n");
3350 $bugbaseurl .= urlencode(
"## Environment\n");
3351 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3352 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3353 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3354 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3355 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3356 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3357 $bugbaseurl .= urlencode(
"\n");
3358 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3359 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3360 $bugbaseurl .= urlencode(
"\n");
3361 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3362 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3363 $bugbaseurl .= urlencode(
"\n");
3364 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3365 $bugbaseurl .= urlencode(
"[*Files*]\n");
3366 $bugbaseurl .= urlencode(
"\n");
3368 $bugbaseurl .= urlencode(
"\n");
3369 $bugbaseurl .= urlencode(
"## Report\n");
3377 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3378 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3379 if (empty($reshook)) {
3380 $bugbaseurl .= $hookmanager->resPrint;
3382 $bugbaseurl = $hookmanager->resPrint;
3385 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3386 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3391 print
"<!-- End Help Block-->\n";
3396 print
"<!-- End left menu -->\n";
3400 $parameters = array();
3401 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3402 print $hookmanager->resPrint;
3404 print
'</div></div> <!-- End side-nav id-left -->';
3408 print
'<!-- Begin right area -->'.
"\n";
3410 if (empty($leftmenuwithoutmainarea)) {
3424 global $conf, $langs, $hookmanager;
3426 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3427 print
'<div id="id-right">';
3432 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3434 $hookmanager->initHooks(array(
'main'));
3435 $parameters = array();
3436 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3437 print $hookmanager->resPrint;
3440 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3445 $parameters = array();
3446 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3447 if (empty($reshook)) {
3448 print
'<!-- Begin show mysoc info header -->'.
"\n";
3449 print
'<div id="mysoc-info-header">'.
"\n";
3450 print
'<table class="centpercent div-table-responsive">'.
"\n";
3452 print
'<tr><td rowspan="0" class="width20p">';
3454 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'))).
'">';
3456 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3457 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3469 print
'</table>'.
"\n";
3470 print
'</div>'.
"\n";
3471 print
'<!-- End show mysoc info header -->'.
"\n";
3490 if (preg_match(
'/^http/i', $helppagename)) {
3492 $helpbaseurl =
'%s';
3493 $helppage = $helppagename;
3498 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3499 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3500 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3501 $helppage = $reg[1];
3504 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3505 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3506 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3507 $helppage = $reg[1];
3510 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3511 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3512 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3513 $helppage = $reg[1];
3516 if (empty($helppage)) {
3517 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3518 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3519 $helppage = $reg[1];
3524 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3544function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3546 global $langs, $user;
3549 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3550 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3551 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3552 if ($showtitlebefore) {
3553 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3555 $ret .=
'<div class="tagtd">';
3556 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3557 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3558 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3559 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3560 $ret .=
' placeholder="'.strip_tags($title).
'"';
3561 $ret .= ($autofocus ?
' autofocus' :
'');
3562 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3563 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3564 $ret .=
'<span class="fa fa-search"></span>';
3565 $ret .=
'</button>';
3567 $ret .=
"</form>\n";
3572if (!function_exists(
"llxFooter")) {
3586 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3588 global $conf, $db, $langs, $user,
$mysoc,
$object, $hookmanager, $action;
3589 global $delayedhtmlcontent;
3590 global $contextpage, $page, $limit, $mode;
3591 global $dolibarr_distrib;
3593 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3597 $parameters = array();
3598 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3599 if (empty($reshook)) {
3600 $llxfooter .= $hookmanager->resPrint;
3601 } elseif ($reshook > 0) {
3602 $llxfooter = $hookmanager->resPrint;
3613 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3615 foreach ($user->lastsearch_values_tmp as $key => $val) {
3616 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3617 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3618 if (empty($val[
'sortfield'])) {
3619 unset($val[
'sortfield']);
3621 if (empty($val[
'sortorder'])) {
3622 unset($val[
'sortorder']);
3624 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3625 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3626 unset($_SESSION[
'lastsearch_values_'.$key]);
3632 $relativepathstring = $_SERVER[
"PHP_SELF"];
3634 if (constant(
'DOL_URL_ROOT')) {
3635 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3637 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3638 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3639 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3640 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3641 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3642 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3643 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3645 if (!empty($contextpage)) {
3646 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3648 if (!empty($page) && $page > 0) {
3649 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3651 if (!empty($limit) && $limit != $conf->liste_limit) {
3652 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3654 if (!empty($mode)) {
3655 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3658 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3659 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3660 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3661 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3667 if ($conf->use_javascript_ajax) {
3668 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3669 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3672 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3673 print
'<div class="error">'.$msg.
'</div>';
3681 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3683 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3684 print
'</div> <!-- End div id-right -->'.
"\n";
3687 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3688 print
'</div> <!-- End div id-container -->'.
"\n";
3693 print
'<!-- '.$comment.
' -->'.
"\n";
3698 if (!empty($delayedhtmlcontent)) {
3699 print $delayedhtmlcontent;
3702 if (!empty($conf->use_javascript_ajax)) {
3703 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3704 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
3711 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3712 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3715 jQuery(document).ready(
function () {
3716 $(
'a.documentpreview').click(
function() {
3717 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3718 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3720 id: <?php echo
$object->id; ?>
3721 , element:
'<?php echo dol_escape_js($object->element) ?>'
3722 , action:
'DOC_PREVIEW'
3723 , token:
'<?php echo currentToken(); ?>'
3727 $(
'a.documentdownload').click(
function() {
3728 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3729 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3731 id: <?php echo
$object->id; ?>
3732 , element:
'<?php echo dol_escape_js($object->element) ?>'
3733 , action:
'DOC_DOWNLOAD'
3734 , token:
'<?php echo currentToken(); ?>'
3745 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3746 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3749 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3750 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3757 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3758 $hash_unique_id_ping =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3759 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
3760 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
3761 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
3764 || (!empty($conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3767 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3768 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3769 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
3771 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3773 $arrayofdata = array(
3774 'action' =>
'dolibarrping',
3775 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
3777 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceping);
3780 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3781 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3783 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3786 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
3792 $forceregistration =
GETPOSTINT(
'forceregistration');
3794 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
3795 include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
3797 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
3799 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
3801 $hash_unique_id_registration =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3802 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
3803 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
3804 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
3807 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3808 || $forceregistration) {
3810 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
3811 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
3812 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
3814 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3816 $arrayofdata = array(
3817 'action' =>
'dolibarrregistration',
3838 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
3841 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
3842 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3844 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3847 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
3852 $parameters = array();
3853 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3855 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.
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.
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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
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.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
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.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getNonce()
Return a random string to be used as a nonce value for js.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
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_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.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.