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;
1049 if (!empty($dol_hide_topmenu)) {
1050 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1052 if (!empty($dol_hide_leftmenu)) {
1053 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1055 if (!empty($dol_optimize_smallscreen)) {
1056 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1058 if (!empty($dol_no_mouse_hover)) {
1059 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1061 if (!empty($dol_use_jmobile)) {
1062 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1065 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1069 $user->update_last_login_date();
1071 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1072 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1075 $user->context[
'audit'] = $loginfo;
1076 $user->context[
'authentication_method'] = $dol_authmode;
1079 $result = $user->call_trigger(
'USER_LOGIN', $user);
1087 $hookmanager->initHooks(array(
'login'));
1088 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1089 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1097 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1105 if (!empty($landingpage)) {
1107 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1108 header(
'Location: '.$newpath);
1116 $user->rights->user->user->lire = 1;
1117 $user->rights->user->user->creer = 1;
1118 $user->rights->user->user->password = 1;
1119 $user->rights->user->user->supprimer = 1;
1120 $user->rights->user->self->creer = 1;
1121 $user->rights->user->self->password = 1;
1125 if (!$user->hasRight(
'user',
'user_advance')) {
1126 $user->rights->user->user_advance =
new stdClass();
1128 if (!$user->hasRight(
'user',
'self_advance')) {
1129 $user->rights->user->self_advance =
new stdClass();
1131 if (!$user->hasRight(
'user',
'group_advance')) {
1132 $user->rights->user->group_advance =
new stdClass();
1135 $user->rights->user->user_advance->readperms = 1;
1136 $user->rights->user->user_advance->write = 1;
1137 $user->rights->user->self_advance->readperms = 1;
1138 $user->rights->user->self_advance->writeperms = 1;
1139 $user->rights->user->group_advance->read = 1;
1140 $user->rights->user->group_advance->readperms = 1;
1141 $user->rights->user->group_advance->write = 1;
1142 $user->rights->user->group_advance->delete = 1;
1151 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1152 $conf->liste_limit =
getDolUserInt(
'MAIN_SIZE_LISTE_LIMIT');
1154 if ((
int) $conf->liste_limit <= 0) {
1156 $conf->liste_limit = 15;
1157 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1158 $conf->liste_limit = 8;
1159 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1160 $conf->liste_limit = 10;
1161 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1162 $conf->liste_limit = 20;
1166 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1167 $conf->main_checkbox_left_column =
getDolUserInt(
'MAIN_CHECKBOX_LEFT_COLUMN');
1173 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1177 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1178 $user->loadDefaultValues();
1184if (
GETPOST(
'theme',
'aZ09')) {
1185 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1186 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1191 $conf->use_javascript_ajax = 0;
1194 $conf->use_javascript_ajax = !
getDolUserString(
'MAIN_DISABLE_JAVASCRIPT') ? 1 : 0;
1200 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER =
getDolUserString(
'MAIN_OPTIMIZEFORTEXTBROWSER');
1202 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1209$conf->global->MAIN_OPTIMIZEFORCOLORBLIND =
getDolUserString(
'MAIN_OPTIMIZEFORCOLORBLIND');
1212if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1213 $conf->dol_hide_leftmenu = 1;
1215if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1216 $conf->dol_hide_topmenu = 1;
1218if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1219 $conf->dol_optimize_smallscreen = 1;
1221if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1222 $conf->dol_no_mouse_hover = 1;
1224if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1225 $conf->dol_use_jmobile = 1;
1228if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1229 $conf->dol_no_mouse_hover = 1;
1233if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1234 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1235 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1238 $conf->dol_optimize_smallscreen = 1;
1241 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1245if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1246 $conf->theme =
'eldy';
1247 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1250if (!defined(
'NOREQUIRETRAN')) {
1251 if (!
GETPOST(
'lang',
'aZ09')) {
1253 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1256 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1257 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1263if (!defined(
'NOLOGIN')) {
1266 if (!$user->login) {
1271 if ($user->statut < 1) {
1273 $langs->loadLangs(array(
"errors",
"other"));
1274 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1279 $user->loadRights();
1282dol_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);
1287if (!defined(
'NOREQUIRETRAN')) {
1289 $langs->loadLangs(array(
'main',
'dict'));
1295 $conf->browser->stringforfirstkey = $langs->trans(
"KeyboardShortcut");
1296 if (!empty($conf->browser->os) && $conf->browser->os ==
'macintosh') {
1297 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1299 if (!empty($conf->browser->name) && $conf->browser->name ==
'chrome') {
1300 $conf->browser->stringforfirstkey .=
' ALT +';
1301 } elseif (!empty($conf->browser->name) && $conf->browser->name ==
'firefox') {
1302 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1304 $conf->browser->stringforfirstkey .=
' CTL +';
1310$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1311$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1312$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1324if (empty($conf->browser->firefox)) {
1325 define(
'ROWS_1', 1);
1326 define(
'ROWS_2', 2);
1327 define(
'ROWS_3', 3);
1328 define(
'ROWS_4', 4);
1329 define(
'ROWS_5', 5);
1330 define(
'ROWS_6', 6);
1331 define(
'ROWS_7', 7);
1332 define(
'ROWS_8', 8);
1333 define(
'ROWS_9', 9);
1335 define(
'ROWS_1', 0);
1336 define(
'ROWS_2', 1);
1337 define(
'ROWS_3', 2);
1338 define(
'ROWS_4', 3);
1339 define(
'ROWS_5', 4);
1340 define(
'ROWS_6', 5);
1341 define(
'ROWS_7', 6);
1342 define(
'ROWS_8', 7);
1343 define(
'ROWS_9', 8);
1346$heightforframes = 52;
1349if (!defined(
'NOREQUIREMENU')) {
1350 if (empty($user->socid)) {
1358 $file_menu = $conf->standard_menu;
1359 if (
GETPOST(
'menu',
'alpha')) {
1360 $file_menu =
GETPOST(
'menu',
'alpha');
1363 if (!class_exists(
'MenuManager')) {
1365 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1366 foreach ($dirmenus as $dirmenu) {
1368 if (class_exists(
'MenuManager')) {
1372 if (!class_exists(
'MenuManager')) {
1373 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1374 $file_menu =
'eldy_menu.php';
1375 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1379 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1384if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1385 $message =
GETPOST(
'seteventmessages',
'alpha');
1386 $messages = explode(
',', $message);
1387 foreach ($messages as $key => $msg) {
1388 $tmp = explode(
':', $msg);
1395if (!function_exists(
"llxHeader")) {
1419 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1421 global $conf, $hookmanager;
1423 $parameters = array(
1425 'title' => & $title,
1426 'help_url' => & $help_url,
1427 'target' => & $target,
1428 'disablejs' => & $disablejs,
1429 'disablehead' => & $disablehead,
1430 'arrayofjs' => & $arrayofjs,
1431 'arrayofcss' => & $arrayofcss,
1432 'morequerystring' => & $morequerystring,
1433 'morecssonbody' => & $morecssonbody,
1434 'replacemainareaby' => & $replacemainareaby,
1435 'disablenofollow' => & $disablenofollow,
1436 'disablenoindex' => & $disablenoindex
1439 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1441 print $hookmanager->resPrint;
1446 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1448 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1450 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1452 if ($mainmenu !=
'website') {
1453 $tmpcsstouse = $morecssonbody;
1458 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1461 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1462 $tmpcsstouse .=
' dol_openinpopup';
1465 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1468 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1469 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1472 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1473 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1477 if ($replacemainareaby) {
1478 print $replacemainareaby;
1496 global $db, $conf, $hookmanager;
1498 if ($contenttype ==
'text/html') {
1499 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1501 header(
"Content-Type: ".$contenttype);
1507 header(
"X-Content-Type-Options: nosniff");
1510 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1511 header(
"X-Frame-Options: SAMEORIGIN");
1513 header(
"X-Frame-Options: ALLOWALL");
1517 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1518 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1519 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1520 header(
'Vary: Origin');
1527 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1542 if (!is_object($hookmanager)) {
1543 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1546 $hookmanager->initHooks(array(
"main"));
1548 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1549 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1551 $contentsecuritypolicy = $hookmanager->resPrint;
1553 $contentsecuritypolicy .= $hookmanager->resPrint;
1556 if (!empty($contentsecuritypolicy)) {
1557 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1560 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1564 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1579 if (!is_object($hookmanager)) {
1580 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1583 $hookmanager->initHooks(array(
"main"));
1585 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1586 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1588 $contentsecuritypolicy = $hookmanager->resPrint;
1590 $contentsecuritypolicy .= $hookmanager->resPrint;
1593 if (!empty($contentsecuritypolicy)) {
1594 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1597 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1604 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1606 if (!empty($referrerpolicy)) {
1607 header(
"Referrer-Policy: ".$referrerpolicy);
1610 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1614 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1617 header(
"Strict-Transport-Security: ".$sts);
1620 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1624 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1627 header(
"Permissions-Policy: ".$pp);
1630 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1634 if ($forcenocache) {
1635 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1657function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1659 global $db, $conf, $langs, $user,
$mysoc, $hookmanager;
1663 if (empty($conf->css)) {
1664 $conf->css =
'/theme/eldy/style.css.php';
1667 print
'<!doctype html>'.
"\n";
1669 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1672 if (empty($disablehead)) {
1673 if (!is_object($hookmanager)) {
1674 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1677 $hookmanager->initHooks(array(
"main"));
1679 $ext =
'layout='.(empty($conf->browser->layout) ?
'' : $conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1683 if (
GETPOST(
'dol_basehref',
'alpha')) {
1684 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1688 print
'<meta charset="utf-8">'.
"\n";
1689 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1690 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1691 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1692 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1693 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1695 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1698 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1699 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1700 if (!empty(
$mysoc->logo_squarred_mini)) {
1701 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1706 if (empty($conf->dol_use_jmobile)) {
1707 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1708 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1712 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1713 $parameters = array(
'manifest' => $manifest);
1714 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1716 $manifest = $hookmanager->resPrint;
1718 $manifest .= $hookmanager->resPrint;
1720 if (!empty($manifest)) {
1721 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1725 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1730 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1734 $appli = constant(
'DOL_APPLICATION_TITLE');
1737 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1750 $parameters = array(
'title' => $titletoshow);
1751 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1753 $titletoshow = $hookmanager->resPrint;
1755 $titletoshow .= $hookmanager->resPrint;
1764 $ext =
'version='.GETPOSTINT(
'version');
1767 if (
GETPOST(
'dol_resetcache')) {
1768 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1772 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1774 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1775 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1776 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1778 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1779 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1781 if (GETPOSTISSET(
'dol_openinpopup')) {
1782 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1784 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1785 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1787 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1788 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1790 if (GETPOSTISSET(
'dol_use_jmobile')) {
1791 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1792 $conf->dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile');
1794 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1795 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1797 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1798 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1802 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1803 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1806 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && $conf->use_javascript_ajax) {
1807 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1808 if (!defined(
'DISABLE_JQUERY_UI')) {
1809 $jquerytheme =
'base';
1813 if (constant(
'JS_JQUERY_UI')) {
1814 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1816 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1819 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1820 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1822 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1824 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1828 if (!defined(
'DISABLE_FONT_AWSOME')) {
1829 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1830 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1831 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1837 if (!empty($conf->modules_parts[
'theme'])) {
1838 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1841 $themesubdir = $reldir;
1847 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1848 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1849 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1861 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1862 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1866 if (!empty($conf->modules_parts[
'css'])) {
1867 $arraycss = (array) $conf->modules_parts[
'css'];
1868 foreach ($arraycss as $modcss => $filescss) {
1869 $filescss = (array) $filescss;
1870 foreach ($filescss as $cssfile) {
1871 if (empty($cssfile)) {
1872 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1876 if ($urlforcss && $urlforcss !=
'/') {
1877 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1879 if (!preg_match(
'/\.css$/i', $cssfile)) {
1884 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1890 if (is_array($arrayofcss)) {
1891 foreach ($arrayofcss as $cssfile) {
1892 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1893 $urltofile = $cssfile;
1897 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1899 if (!preg_match(
'/\.css$/i', $cssfile)) {
1909 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1913 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty($conf->use_javascript_ajax)) {
1915 print
'<!-- Includes JS for JQuery -->'.
"\n";
1916 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1917 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
1919 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
1921 if (!defined(
'DISABLE_JQUERY_UI')) {
1922 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1923 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1925 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1929 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1930 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
1933 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1934 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
1938 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
1942 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1943 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1944 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js?' . $ext .
'"></script>'.
"\n";
1945 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js?' . $ext .
'"></script>'.
"\n";
1946 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js?' . $ext .
'"></script>'.
"\n";
1947 print
'<script nonce="'.getNonce().
'" >'.
"\n";
1948 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1949 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1950 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1951 print 'var placeholderInPlace = \
' \';'.
"\n";
1952 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1953 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1954 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1955 print
'var withInPlace = 300;';
1956 print
'</script>'.
"\n";
1957 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js?' . $ext .
'"></script>'.
"\n";
1958 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js?' . $ext .
'"></script>'.
"\n";
1960 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1963 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
1965 if (!defined(
'DISABLE_MULTISELECT')) {
1966 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
1970 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1973 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1974 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1975 $jsckeditor =
'ckeditor.js';
1976 if (constant(
'JS_CKEDITOR')) {
1978 $pathckeditor = constant(
'JS_CKEDITOR');
1980 print
'<script nonce="'.getNonce().
'">';
1981 print
'/* enable ckeditor by main.inc.php */';
1982 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1983 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1984 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1985 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";
1986 print
'</script>'.
"\n";
1987 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
1989 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1990 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1992 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1994 print
'</script>'.
"\n";
1998 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1999 $enablebrowsernotif =
false;
2001 $enablebrowsernotif =
true;
2003 if ($conf->browser->layout ==
'phone') {
2004 $enablebrowsernotif =
false;
2006 if ($enablebrowsernotif) {
2007 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2008 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2013 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2014 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2015 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2020 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2021 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2025 if (!empty($conf->modules_parts[
'js'])) {
2026 $arrayjs = (array) $conf->modules_parts[
'js'];
2027 foreach ($arrayjs as $modjs => $filesjs) {
2028 $filesjs = (array) $filesjs;
2029 foreach ($filesjs as $jsfile) {
2032 if ($urlforjs && $urlforjs !=
'/') {
2033 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2034 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2036 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2042 if (is_array($arrayofjs)) {
2043 print
'<!-- Includes JS added by page -->'.
"\n";
2044 foreach ($arrayofjs as $jsfile) {
2045 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2046 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2048 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2056 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2057 if (file_exists($theme_js)) {
2058 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2062 if (!empty($head)) {
2069 $parameters = array();
2070 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2071 print $hookmanager->resPrint;
2073 print
"</head>\n\n";
2076 $conf->headerdone = 1;
2096function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2098 global $user, $conf, $langs, $db, $form;
2099 global $dolibarr_main_authentication, $dolibarr_main_demo;
2100 global $hookmanager, $menumanager;
2105 $hookmanager->initHooks(array(
'toprightmenu'));
2110 if (empty($conf->headerdone)) {
2111 $disablenofollow = 0;
2112 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2113 print
'<body id="mainbody">';
2119 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2120 if (!isset($form) || !is_object($form)) {
2121 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2122 $form =
new Form($db);
2125 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2127 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2130 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2132 $menumanager->atarget = $target;
2134 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2138 $appli = constant(
'DOL_APPLICATION_TITLE');
2141 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2143 $appli .=
" ".DOL_VERSION;
2147 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2151 $logouthtmltext =
'';
2153 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2154 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2155 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2156 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2157 $logouttext .=
'</a>';
2159 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2160 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2165 print
'<div class="login_block usedropdown">'.
"\n";
2169 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2172 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2192 $toprightmenu .=
'</div>';
2194 $toprightmenu .=
'</div>'.
"\n";
2198 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2201 $parameters = array();
2202 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2203 if (is_numeric($result)) {
2205 $toprightmenu .= $hookmanager->resPrint;
2207 $toprightmenu = $hookmanager->resPrint;
2210 $toprightmenu .= $result;
2215 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2217 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2220 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2227 if (isset($_POST) && is_array($_POST)) {
2228 foreach ($_POST as $key => $value) {
2229 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2230 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2233 if (!is_array($value)) {
2234 if ($value !==
'') {
2235 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2238 foreach ($value as $value2) {
2239 if (($value2 !==
'') && (!is_array($value2))) {
2240 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2246 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2247 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2249 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2252 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2257 $langs->load(
"help");
2264 if (empty($helppagename)) {
2265 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2267 $helppresent =
'helppresent';
2272 $helpbaseurl = $arrayres[
'helpbaseurl'];
2273 $helppage = $arrayres[
'helppage'];
2274 $mode = $arrayres[
'mode'];
2277 if ($helpbaseurl && $helppage) {
2279 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2280 if ($mode ==
'wiki') {
2281 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2283 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2285 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2288 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2289 if ($mode ==
'wiki') {
2291 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2294 $text .= sprintf($helpbaseurl, $helppage);
2297 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2298 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2301 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2306 $langs->load(
'admin');
2307 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2313 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2315 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2320 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2323 $toprightmenu .=
'</div>';
2327 $toprightmenu .=
'<div class="login_block_user">';
2330 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2335 $toprightmenu .=
'</div>';
2337 $toprightmenu .=
'</div>'.
"\n";
2340 print $toprightmenu;
2347 print
'<div style="clear: both;"></div>';
2348 print
"<!-- End top horizontal menu -->\n\n";
2351 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2352 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2366 global $langs, $conf, $db, $hookmanager, $user,
$mysoc;
2367 global $dolibarr_main_authentication, $dolibarr_main_demo;
2368 global $menumanager, $form;
2371 if ($conf->browser->name ==
'textbrowser') {
2375 $langs->load(
'companies');
2377 $userImage = $userDropDownImage =
'';
2378 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2379 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2380 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2382 $nophoto =
'/public/theme/common/user_anonymous.png';
2383 if ($user->gender ==
'man') {
2384 $nophoto =
'/public/theme/common/user_man.png';
2386 if ($user->gender ==
'woman') {
2387 $nophoto =
'/public/theme/common/user_woman.png';
2390 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2392 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2396 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2397 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2401 while ($idprofcursor < 10) {
2403 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2404 if ($idprofcursor == 1) {
2405 $constkeyforprofid =
'MAIN_INFO_SIREN';
2407 if ($idprofcursor == 2) {
2408 $constkeyforprofid =
'MAIN_INFO_SIRET';
2410 if ($idprofcursor == 3) {
2411 $constkeyforprofid =
'MAIN_INFO_APE';
2413 if ($idprofcursor == 4) {
2414 $constkeyforprofid =
'MAIN_INFO_RCS';
2416 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2426 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2428 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2430 $dropdownBody .=
'</div>';
2432 $dropdownBody .=
'<br>';
2433 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2434 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2437 if (!empty($user->admin)) {
2438 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2441 if (!empty($user->socid)) {
2442 $thirdpartystatic =
new Societe($db);
2443 $thirdpartystatic->fetch($user->socid);
2444 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2445 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2447 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2448 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2449 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2450 $dropdownBody .=
'<br>';
2452 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2453 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2455 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2457 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2458 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2459 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2460 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2462 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2464 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2466 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2467 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2468 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2473 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst($conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2474 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2475 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2476 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2477 if ($conf->browser->layout ==
'phone') {
2478 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2480 if (!empty($_SESSION[
"disablemodules"])) {
2481 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2483 $dropdownBody .=
'</div>';
2486 $parameters = array(
'user' => $user,
'langs' => $langs);
2487 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2488 if (is_numeric($result)) {
2490 $dropdownBody .= $hookmanager->resPrint;
2492 $dropdownBody = $hookmanager->resPrint;
2496 if (empty($urllogout)) {
2497 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2501 $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>';
2502 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2503 $jsonopen =
"closeTopMenuLoginDropdown()";
2504 $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');
2505 $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>';
2507 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2508 if (!empty($user->admin)) {
2509 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2513 $appli = constant(
'DOL_APPLICATION_TITLE');
2516 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2518 $appli .=
" ".DOL_VERSION;
2522 $btnUser =
'<!-- div for user link -->
2523 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2524 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2525 '.$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>' :
'').
'
2527 <div class="dropdown-menu">
2529 <div class="user-header">
2530 '.$userDropDownImage.
'
2532 '.$profilName.
'<br>';
2534 if ($user->datelastlogin) {
2535 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2536 if ($user->datepreviouslogin) {
2537 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2540 $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>';
2541 if ($user->datepreviouslogin) {
2542 $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>';
2550 <!-- Menu Body user-->
2551 <div class="user-body">'.$dropdownBody.
'</div>
2554 <div class="user-footer">
2555 <div class="pull-left">
2558 <div class="pull-left">
2559 '.$virtuelcardLink.
'
2561 <div class="pull-right">
2564 <div class="clearboth"></div>
2570 $btnUser =
'<!-- div for user link text browser -->
2571 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2572 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2573 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2578 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2580 <!-- Code to show/hide the user drop-down -->
2582 function closeTopMenuLoginDropdown() {
2583 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2585 jQuery("#topmenu-login-dropdown").removeClass("open");
2587 jQuery(document).ready(function() {
2588 jQuery(document).on("click", function(event) {
2589 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2590 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2591 /* console.log("click close login - we click outside"); */
2592 closeTopMenuLoginDropdown();
2600 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2601 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2602 event.preventDefault();
2603 jQuery("#topmenu-login-dropdown").toggleClass("open");
2606 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2607 console.log("Click on #topmenulogincompanyinfo-btn");
2608 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2609 jQuery("#topmenuloginmoreinfo").slideToggle();
2611 jQuery("#topmenulogincompanyinfo").slideToggle();
2614 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2615 console.log("Click on #topmenuloginmoreinfo-btn");
2616 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2617 jQuery("#topmenulogincompanyinfo").slideToggle();
2619 jQuery("#topmenuloginmoreinfo").slideToggle();
2639 global $conf, $langs;
2648 if (!empty($conf->use_javascript_ajax)) {
2649 $html .=
'<!-- div for quick add link -->
2650 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2651 <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>
2654 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2656 <!-- Code to show/hide the user drop-down for the quick add -->
2658 jQuery(document).ready(function() {
2659 jQuery(document).on("click", function(event) {
2660 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2661 /* console.log("click close quick add - we click outside"); */
2663 $("#topmenu-quickadd-dropdown").removeClass("open");
2666 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2667 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2668 openQuickAddDropDown(event);
2672 $(document).keydown(function(event){
2673 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2674 if (ostype ===
"macintosh") {
2675 if ( event.which === 65 && event.ctrlKey ) {
2676 console.log(\
'control + a : trigger open quick add dropdown\');
2677 openQuickAddDropDown(event);
2680 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2681 console.log(\'control + shift + a : trigger open quick add dropdown\');
2682 openQuickAddDropDown(event);
2687 var openQuickAddDropDown = function(event) {
2688 event.preventDefault();
2689 $("#topmenu-quickadd-dropdown").toggleClass("open");
2709 global $conf, $langs;
2718 if (!empty($conf->use_javascript_ajax)) {
2719 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2724 $html .=
'<!-- div for link to upload file -->
2725 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2726 <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>
2742 global $user, $langs, $hookmanager;
2747 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2748 "title" =>
"MenuNewMember@members",
2749 "name" =>
"Adherent@members",
2750 "picto" =>
"object_member",
2751 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2755 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2756 "title" =>
"MenuNewThirdParty@companies",
2757 "name" =>
"ThirdParty@companies",
2758 "picto" =>
"object_company",
2759 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2763 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2764 "title" =>
"NewContactAddress@companies",
2765 "name" =>
"Contact@companies",
2766 "picto" =>
"object_contact",
2767 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2771 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2772 "title" =>
"NewPropal@propal",
2773 "name" =>
"Proposal@propal",
2774 "picto" =>
"object_propal",
2775 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2780 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2781 "title" =>
"NewOrder@orders",
2782 "name" =>
"Order@orders",
2783 "picto" =>
"object_order",
2784 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2788 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2789 "title" =>
"NewBill@bills",
2790 "name" =>
"Bill@bills",
2791 "picto" =>
"object_bill",
2792 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2796 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2797 "title" =>
"NewContractSubscription@contracts",
2798 "name" =>
"Contract@contracts",
2799 "picto" =>
"object_contract",
2800 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2804 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2805 "title" =>
"SupplierProposalNew@supplier_proposal",
2806 "name" =>
"SupplierProposal@supplier_proposal",
2807 "picto" =>
"supplier_proposal",
2808 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2812 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2813 "title" =>
"NewSupplierOrderShort@orders",
2814 "name" =>
"SupplierOrder@orders",
2815 "picto" =>
"supplier_order",
2816 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2820 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2821 "title" =>
"NewBill@bills",
2822 "name" =>
"SupplierBill@bills",
2823 "picto" =>
"supplier_invoice",
2824 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2828 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2829 "title" =>
"NewTicket@ticket",
2830 "name" =>
"Ticket@ticket",
2831 "picto" =>
"ticket",
2832 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2836 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2837 "title" =>
"NewIntervention@interventions",
2838 "name" =>
"Intervention@interventions",
2839 "picto" =>
"intervention",
2840 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2844 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2845 "title" =>
"NewProduct@products",
2846 "name" =>
"Product@products",
2847 "picto" =>
"object_product",
2848 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2852 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2853 "title" =>
"NewService@products",
2854 "name" =>
"Service@products",
2855 "picto" =>
"object_service",
2856 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2860 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2861 "title" =>
"AddUser@users",
2862 "name" =>
"User@users",
2864 "activation" => $user->hasRight(
"user",
"user",
"write"),
2870 $dropDownQuickAddHtml =
'';
2874 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2876 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2879 $parameters = array();
2880 $hook_items = $items;
2881 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2882 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2883 if ($reshook == 0) {
2884 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2886 $items = $hookmanager->resArray;
2890 $position = array();
2891 foreach ($items[
'items'] as $key => $row) {
2892 $position[$key] = $row[
'position'];
2894 $array1_sort_order = SORT_ASC;
2895 array_multisort($position, $array1_sort_order, $items[
'items']);
2898 foreach ($items[
'items'] as $item) {
2899 if (!$item[
'activation']) {
2902 $langs->load(explode(
'@', $item[
'title'])[1]);
2903 $langs->load(explode(
'@', $item[
'name'])[1]);
2904 $dropDownQuickAddHtml .=
'
2905 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2906 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2911 $dropDownQuickAddHtml .=
'</div>';
2913 $dropDownQuickAddHtml .=
'</div>';
2915 return $dropDownQuickAddHtml;
2925 global $langs, $conf, $user;
2930 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2939 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2940 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2941 $langs->load(
"bookmarks");
2944 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2948 $html .=
'<!-- div for bookmark link -->
2949 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2950 <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>
2951 <div class="dropdown-menu">
2957 <!-- Code to show/hide the bookmark drop-down -->
2959 jQuery(document).ready(function() {
2960 jQuery(document).on("click", function(event) {
2961 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2962 /* console.log("close bookmark dropdown - we click outside"); */
2964 $("#topmenu-bookmark-dropdown").removeClass("open");
2968 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2969 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2970 openBookMarkDropDown(event);
2974 jQuery(document).keydown(function(event) {
2975 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2976 if (ostype ===
"macintosh") {
2977 if ( event.which === 66 && event.ctrlKey ) {
2978 console.log(
"Click on control + b : trigger open bookmark dropdown");
2979 openBookMarkDropDown(event);
2982 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2983 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2984 openBookMarkDropDown(event);
2989 var openBookMarkDropDown =
function(event) {
2990 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2991 event.preventDefault();
2992 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2993 jQuery(
"#top-bookmark-search-input").focus();
3009function top_menu_search()
3011 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3016 $arrayresult = array();
3017 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3019 $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">
';
3021 $defaultAction = '';
3022 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3023 // Menu with all searchable items
3024 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3025 foreach ($arrayresult as $keyItem => $item) {
3026 if (empty($defaultAction)) {
3027 $defaultAction = $item['url
'];
3029 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3030 $buttonList .= $item['text
'];
3031 $buttonList .= '</
button>
';
3033 $buttonList .= '</div>
';
3035 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3038 <!-- search input -->
3039 <div
class=
"dropdown-header search-dropdown-header">
3045 <!--
Menu Body search -->
3046 <div
class=
"dropdown-body search-dropdown-body">
3051 $dropDownHtml .= '</form>
';
3053 $html .= '<!-- div
for Global Search -->
3054 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3055 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3056 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3058 <div
class=
"dropdown-menu dropdown-search">
3064 <!-- Code to show/hide the
user drop-down -->
3066 jQuery(document).ready(
function() {
3069 jQuery(
"#top-global-search-input").keydown(
function (e) {
3070 if (e.keyCode == 13 || e.keyCode == 40) {
3071 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3072 if (inputs[inputs.index(this) + 1] != null) {
3073 console.log(
"Force focus after keydow on #top-global-search-input");
3074 inputs[inputs.index(this) + 1].focus();
3075 if (e.keyCode == 13){
3076 inputs[inputs.index(this) + 1].trigger(
"click");
3086 jQuery(document).keydown(
function(e) {
3088 var $focused = $(
":focus");
3089 if($focused.length && $focused.hasClass(
"global-search-item")){
3092 if (e.keyCode == 38) {
3094 console.log(
"Force focus after keycode 38");
3095 $focused.prev().focus();
3099 if (e.keyCode == 40) {
3101 console.log(
"Force focus after keycode 40");
3102 $focused.next().focus();
3109 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3110 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3111 jQuery(
"#top-menu-action-search").submit();
3115 jQuery(document).on(
"click",
function(event) {
3116 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3117 console.log(
"click close search - we click outside");
3119 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3124 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3125 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3126 openGlobalSearchDropDown();
3130 jQuery(document).keydown(
function(e){
3131 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3132 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3133 openGlobalSearchDropDown();
3135 if ( e.which === 70 && e.alKey ) {
3136 console.log(\'alt + f : trigger open global-search dropdown\');
3137 openGlobalSearchDropDown();
3141 var openGlobalSearchDropDown = function() {
3142 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3143 jQuery("#top-global-search-input").focus();
3167function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3169 global $user, $conf, $langs, $db, $form;
3170 global $hookmanager, $menumanager;
3174 if (!empty($menu_array_before)) {
3175 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);
3178 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3180 $hookmanager->initHooks(array(
'leftblock'));
3182 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3185 if (!is_object($form)) {
3186 $form =
new Form($db);
3191 if ($conf->browser->layout ==
'phone') {
3192 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3196 $arrayresult = array();
3197 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3199 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3201 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3202 $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');
3204 if (is_array($arrayresult)) {
3206 foreach ($arrayresult as $key => $val) {
3207 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3213 $parameters = array(
'searchform' => $searchform);
3214 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3215 if (empty($reshook)) {
3216 $searchform .= $hookmanager->resPrint;
3218 $searchform = $hookmanager->resPrint;
3222 if (
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') || empty($conf->use_javascript_ajax)) {
3223 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3224 $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>';
3225 } elseif ($conf->use_javascript_ajax &&
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3226 $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>';
3227 $searchform .=
'<script>
3228 jQuery(document).ready(function () {
3229 jQuery("#divsearchforms1").click(function(){
3230 jQuery("#divsearchforms2").toggle();
3234 $searchform .=
'</div>';
3238 $searchform .=
'<script>
3239 jQuery(document).keydown(function(e){
3240 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3241 console.log(\'control + shift + f : trigger open global-search dropdown\');
3242 openGlobalSearchDropDown();
3244 if( (e.which === 83 || e.which === 115) && e.altKey ){
3245 console.log(\'alt + s : trigger open global-search dropdown\');
3246 openGlobalSearchDropDown();
3250 var openGlobalSearchDropDown = function() {
3251 jQuery("#searchselectcombo").select2(\'open\');
3257 print
'<!-- Begin left menu -->'.
"\n";
3259 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3263 $menumanager->menu_array = $menu_array_before;
3265 $menumanager->menu_array_after = $menu_array_after;
3268 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3271 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3277 print
"<!-- Begin Help Block-->\n";
3278 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3282 $doliurl =
'https://www.dolibarr.org';
3284 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3285 $doliurl =
'https://www.dolibarr.fr';
3287 if (preg_match(
'/es/i', $langs->defaultlang)) {
3288 $doliurl =
'https://www.dolibarr.es';
3290 if (preg_match(
'/de/i', $langs->defaultlang)) {
3291 $doliurl =
'https://www.dolibarr.de';
3293 if (preg_match(
'/it/i', $langs->defaultlang)) {
3294 $doliurl =
'https://www.dolibarr.it';
3296 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3297 $doliurl =
'https://www.dolibarr.gr';
3300 $appli = constant(
'DOL_APPLICATION_TITLE');
3303 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3305 $appli .=
" ".DOL_VERSION;
3313 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3315 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3317 print
'<span class="help">';
3325 print
'</div>'.
"\n";
3330 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3333 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3334 $bugbaseurl .=
'&title=';
3335 $bugbaseurl .= urlencode(
"Bug: ");
3336 $bugbaseurl .=
'&body=';
3337 $bugbaseurl .= urlencode(
"# Instructions\n");
3338 $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");
3339 $bugbaseurl .= urlencode(
"*Please:*\n");
3340 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3341 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3342 $bugbaseurl .= urlencode(
"\n");
3343 $bugbaseurl .= urlencode(
"\n");
3344 $bugbaseurl .= urlencode(
"# Bug\n");
3345 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3346 $bugbaseurl .= urlencode(
"\n");
3347 $bugbaseurl .= urlencode(
"## Environment\n");
3348 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3349 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3350 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3351 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3352 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3353 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3354 $bugbaseurl .= urlencode(
"\n");
3355 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3356 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3357 $bugbaseurl .= urlencode(
"\n");
3358 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3359 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3360 $bugbaseurl .= urlencode(
"\n");
3361 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3362 $bugbaseurl .= urlencode(
"[*Files*]\n");
3363 $bugbaseurl .= urlencode(
"\n");
3365 $bugbaseurl .= urlencode(
"\n");
3366 $bugbaseurl .= urlencode(
"## Report\n");
3374 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3375 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3376 if (empty($reshook)) {
3377 $bugbaseurl .= $hookmanager->resPrint;
3379 $bugbaseurl = $hookmanager->resPrint;
3382 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3383 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3388 print
"<!-- End Help Block-->\n";
3393 print
"<!-- End left menu -->\n";
3397 $parameters = array();
3398 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3399 print $hookmanager->resPrint;
3401 print
'</div></div> <!-- End side-nav id-left -->';
3405 print
'<!-- Begin right area -->'.
"\n";
3407 if (empty($leftmenuwithoutmainarea)) {
3421 global $conf, $langs, $hookmanager;
3423 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3424 print
'<div id="id-right">';
3429 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3431 $hookmanager->initHooks(array(
'main'));
3432 $parameters = array();
3433 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3434 print $hookmanager->resPrint;
3437 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3442 $parameters = array();
3443 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3444 if (empty($reshook)) {
3445 print
'<!-- Begin show mysoc info header -->'.
"\n";
3446 print
'<div id="mysoc-info-header">'.
"\n";
3447 print
'<table class="centpercent div-table-responsive">'.
"\n";
3449 print
'<tr><td rowspan="0" class="width20p">';
3451 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'))).
'">';
3453 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3454 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3466 print
'</table>'.
"\n";
3467 print
'</div>'.
"\n";
3468 print
'<!-- End show mysoc info header -->'.
"\n";
3487 if (preg_match(
'/^http/i', $helppagename)) {
3489 $helpbaseurl =
'%s';
3490 $helppage = $helppagename;
3495 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3496 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3497 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3498 $helppage = $reg[1];
3501 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3502 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3503 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3504 $helppage = $reg[1];
3507 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3508 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3509 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3510 $helppage = $reg[1];
3513 if (empty($helppage)) {
3514 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3515 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3516 $helppage = $reg[1];
3521 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3541function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3543 global $langs, $user;
3546 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3547 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3548 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3549 if ($showtitlebefore) {
3550 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3552 $ret .=
'<div class="tagtd">';
3553 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3554 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3555 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3556 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3557 $ret .=
' placeholder="'.strip_tags($title).
'"';
3558 $ret .= ($autofocus ?
' autofocus' :
'');
3559 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3560 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3561 $ret .=
'<span class="fa fa-search"></span>';
3562 $ret .=
'</button>';
3564 $ret .=
"</form>\n";
3569if (!function_exists(
"llxFooter")) {
3583 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3585 global $conf, $db, $langs, $user,
$mysoc,
$object, $hookmanager, $action;
3586 global $delayedhtmlcontent;
3587 global $contextpage, $page, $limit, $mode;
3588 global $dolibarr_distrib;
3590 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3594 $parameters = array();
3595 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3596 if (empty($reshook)) {
3597 $llxfooter .= $hookmanager->resPrint;
3598 } elseif ($reshook > 0) {
3599 $llxfooter = $hookmanager->resPrint;
3610 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3612 foreach ($user->lastsearch_values_tmp as $key => $val) {
3613 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3614 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3615 if (empty($val[
'sortfield'])) {
3616 unset($val[
'sortfield']);
3618 if (empty($val[
'sortorder'])) {
3619 unset($val[
'sortorder']);
3621 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3622 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3623 unset($_SESSION[
'lastsearch_values_'.$key]);
3629 $relativepathstring = $_SERVER[
"PHP_SELF"];
3631 if (constant(
'DOL_URL_ROOT')) {
3632 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3634 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3635 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3636 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3637 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3638 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3639 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3640 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3642 if (!empty($contextpage)) {
3643 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3645 if (!empty($page) && $page > 0) {
3646 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3648 if (!empty($limit) && $limit != $conf->liste_limit) {
3649 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3651 if (!empty($mode)) {
3652 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3655 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3656 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3657 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3658 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3664 if ($conf->use_javascript_ajax) {
3665 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3666 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3669 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3670 print
'<div class="error">'.$msg.
'</div>';
3678 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3680 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3681 print
'</div> <!-- End div id-right -->'.
"\n";
3684 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3685 print
'</div> <!-- End div id-container -->'.
"\n";
3690 print
'<!-- '.$comment.
' -->'.
"\n";
3695 if (!empty($delayedhtmlcontent)) {
3696 print $delayedhtmlcontent;
3699 if (!empty($conf->use_javascript_ajax)) {
3700 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3701 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
3708 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3709 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3712 jQuery(document).ready(
function () {
3713 $(
'a.documentpreview').click(
function() {
3714 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3715 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3717 id: <?php echo
$object->id; ?>
3718 , element:
'<?php echo dol_escape_js($object->element) ?>'
3719 , action:
'DOC_PREVIEW'
3720 , token:
'<?php echo currentToken(); ?>'
3724 $(
'a.documentdownload').click(
function() {
3725 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3726 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3728 id: <?php echo
$object->id; ?>
3729 , element:
'<?php echo dol_escape_js($object->element) ?>'
3730 , action:
'DOC_DOWNLOAD'
3731 , token:
'<?php echo currentToken(); ?>'
3742 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3743 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3746 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3747 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3754 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3755 $hash_unique_id_ping =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3756 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
3757 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
3758 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
3761 || (!empty($conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3764 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3765 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3766 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
3768 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3770 $arrayofdata = array(
3771 'action' =>
'dolibarrping',
3772 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
3774 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceping);
3777 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3778 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3780 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3783 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
3789 $forceregistration =
GETPOSTINT(
'forceregistration');
3791 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
3792 include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
3794 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
3796 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
3798 $hash_unique_id_registration =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3799 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
3800 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
3801 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
3804 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3805 || $forceregistration) {
3807 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
3808 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
3809 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
3811 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3813 $arrayofdata = array(
3814 'action' =>
'dolibarrregistration',
3835 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
3838 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
3839 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3841 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3844 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
3849 $parameters = array();
3850 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3852 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.