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 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
670 $entitytotest = (
GETPOSTINT(
'entity') ?
GETPOSTINT(
'entity') : (!empty($conf->entity) ? $conf->entity : 1));
673 $goontestloop =
false;
674 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
675 $goontestloop =
true;
677 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
678 $goontestloop =
true;
680 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
681 $goontestloop =
true;
683 if (
GETPOST(
'openid_mode',
'alpha')) {
684 $goontestloop =
true;
686 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
687 $goontestloop =
true;
689 if (!empty($_COOKIE[
'login_dolibarr'])) {
690 $goontestloop =
true;
693 if (!is_object($langs)) {
694 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
697 if (defined(
'MAIN_LANG_DEFAULT')) {
698 $langcode = constant(
'MAIN_LANG_DEFAULT');
700 $langs->setDefaultLang($langcode);
704 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
707 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);
713 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
716 $oauthmodetotestarray = array(
'google');
717 foreach ($oauthmodetotestarray as $oauthmodetotest) {
718 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
720 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
723 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);
724 foreach ($authmode as $tmpkey => $tmpval) {
725 if ($tmpval == $oauthmodetotest.
'oauth') {
726 unset($authmode[$tmpkey]);
735 if ($login ===
'--bad-login-validity--') {
740 $dol_authmode = $conf->authmode;
741 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
742 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
743 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
744 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
745 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
748 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
749 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
750 if ($dol_dst_first && $dol_dst_second) {
751 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
755 if ($datenow >= $datefirst && $datenow < $datesecond) {
759 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
760 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
765 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
767 $langs->loadLangs(array(
'main',
'errors'));
771 if (empty($_SESSION[
"dol_loginmesg"])) {
772 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
776 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
779 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
787 $hookmanager->initHooks(array(
'login'));
788 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
789 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
799 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
801 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);
802 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
807 return 'ERROR_NOT_LOGGED';
809 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
810 http_response_code(401);
814 dol_loginfunction($langs, $conf, (!empty(
$mysoc) ?
$mysoc :
''));
819 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
821 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
822 dol_syslog(
'User not found or not valid, connection refused');
824 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
825 session_name($sessionname);
828 if ($resultFetchUser == 0) {
830 $langs->loadLangs(array(
'main',
'errors'));
832 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
834 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
835 } elseif ($resultFetchUser < 0) {
836 $_SESSION[
"dol_loginmesg"] = $user->error;
838 $user->context[
'audit'] = $user->error;
841 $langs->loadLangs(array(
'main',
'errors'));
843 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
845 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
849 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
858 $hookmanager->initHooks(array(
'login'));
859 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
860 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
867 $paramsurl += [
'textbrowser' =>
GETPOSTINT(
'textbrowser')];
873 $paramsurl += [
'lang' => (string)
GETPOST(
'lang',
'aZ09')];
875 header(
'Location: '.
dolBuildUrl(DOL_URL_ROOT .
'/index.php', $paramsurl));
879 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
880 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
885 $login = $_SESSION[
"dol_login"];
886 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
887 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
889 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
893 if ($resultFetchUser <= 0
894 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
895 || ($user->status != $user::STATUS_ENABLED)
896 || ($user->isNotIntoValidityDateRange())) {
897 if ($resultFetchUser <= 0) {
899 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
900 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
902 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
903 } elseif ($user->status != $user::STATUS_ENABLED) {
908 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
911 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
912 session_name($sessionname);
915 if ($resultFetchUser == 0) {
916 $langs->loadLangs(array(
'main',
'errors'));
918 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
920 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
921 } elseif ($resultFetchUser < 0) {
922 $_SESSION[
"dol_loginmesg"] = $user->error;
924 $user->context[
'audit'] = $user->error;
926 $langs->loadLangs(array(
'main',
'errors'));
928 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
930 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
934 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
942 $hookmanager->initHooks(array(
'login'));
943 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
944 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
949 $paramsurl = array();
951 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
954 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
957 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
960 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
964 $hookmanager->initHooks(array(
'main'));
967 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
968 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
969 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
971 if (constant(
'DOL_URL_ROOT')) {
972 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
974 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
975 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
979 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
980 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
981 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
983 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
984 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
985 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
987 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
988 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
989 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
991 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
992 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
993 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
995 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
996 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
997 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1000 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1001 if (empty($_SESSION[
'pageforbacktolist'])) {
1002 $pageforbacktolistarray = array();
1004 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1006 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1007 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1008 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1009 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1014 $parameters = array();
1015 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1024 if (!isset($_SESSION[
"dol_login"])) {
1029 $_SESSION[
"dol_login"] = $user->login;
1030 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1031 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1032 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1033 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1034 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1035 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1036 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1037 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1038 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1039 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1041 $_SESSION[
"dol_entity"] = $conf->entity;
1043 if (!empty($dol_hide_topmenu)) {
1044 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1046 if (!empty($dol_hide_leftmenu)) {
1047 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1049 if (!empty($dol_optimize_smallscreen)) {
1050 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1052 if (!empty($dol_no_mouse_hover)) {
1053 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1055 if (!empty($dol_use_jmobile)) {
1056 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1059 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1063 $user->update_last_login_date();
1065 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1066 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1069 $user->context[
'audit'] = $loginfo;
1070 $user->context[
'authentication_method'] = $dol_authmode;
1073 $result = $user->call_trigger(
'USER_LOGIN', $user);
1081 $hookmanager->initHooks(array(
'login'));
1082 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1083 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1091 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1099 if (!empty($landingpage)) {
1101 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1102 header(
'Location: '.$newpath);
1110 $user->rights->user->user->lire = 1;
1111 $user->rights->user->user->creer = 1;
1112 $user->rights->user->user->password = 1;
1113 $user->rights->user->user->supprimer = 1;
1114 $user->rights->user->self->creer = 1;
1115 $user->rights->user->self->password = 1;
1119 if (!$user->hasRight(
'user',
'user_advance')) {
1120 $user->rights->user->user_advance =
new stdClass();
1122 if (!$user->hasRight(
'user',
'self_advance')) {
1123 $user->rights->user->self_advance =
new stdClass();
1125 if (!$user->hasRight(
'user',
'group_advance')) {
1126 $user->rights->user->group_advance =
new stdClass();
1129 $user->rights->user->user_advance->readperms = 1;
1130 $user->rights->user->user_advance->write = 1;
1131 $user->rights->user->self_advance->readperms = 1;
1132 $user->rights->user->self_advance->writeperms = 1;
1133 $user->rights->user->group_advance->read = 1;
1134 $user->rights->user->group_advance->readperms = 1;
1135 $user->rights->user->group_advance->write = 1;
1136 $user->rights->user->group_advance->delete = 1;
1145 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1146 $conf->liste_limit =
getDolUserInt(
'MAIN_SIZE_LISTE_LIMIT');
1148 if ((
int) $conf->liste_limit <= 0) {
1150 $conf->liste_limit = 15;
1151 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1152 $conf->liste_limit = 8;
1153 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1154 $conf->liste_limit = 10;
1155 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1156 $conf->liste_limit = 20;
1160 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1161 $conf->main_checkbox_left_column =
getDolUserInt(
'MAIN_CHECKBOX_LEFT_COLUMN');
1167 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1171 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1172 $user->loadDefaultValues();
1178if (
GETPOST(
'theme',
'aZ09')) {
1179 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1180 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1185 $conf->use_javascript_ajax = 0;
1188 $conf->use_javascript_ajax = !
getDolUserString(
'MAIN_DISABLE_JAVASCRIPT') ? 1 : 0;
1194 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER =
getDolUserString(
'MAIN_OPTIMIZEFORTEXTBROWSER');
1196 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1203$conf->global->MAIN_OPTIMIZEFORCOLORBLIND =
getDolUserString(
'MAIN_OPTIMIZEFORCOLORBLIND');
1206if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1207 $conf->dol_hide_leftmenu = 1;
1209if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1210 $conf->dol_hide_topmenu = 1;
1212if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1213 $conf->dol_optimize_smallscreen = 1;
1215if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1216 $conf->dol_no_mouse_hover = 1;
1218if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1219 $conf->dol_use_jmobile = 1;
1222if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1223 $conf->dol_no_mouse_hover = 1;
1227if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1228 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1229 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1232 $conf->dol_optimize_smallscreen = 1;
1235 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1239if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1240 $conf->theme =
'eldy';
1241 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1244if (!defined(
'NOREQUIRETRAN')) {
1245 if (!
GETPOST(
'lang',
'aZ09')) {
1247 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1250 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1251 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1257if (!defined(
'NOLOGIN')) {
1260 if (!$user->login) {
1265 if ($user->statut < 1) {
1267 $langs->loadLangs(array(
"errors",
"other"));
1268 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1273 $user->loadRights();
1276dol_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);
1281if (!defined(
'NOREQUIRETRAN')) {
1283 $langs->loadLangs(array(
'main',
'dict'));
1289 $conf->browser->stringforfirstkey = $langs->trans(
"KeyboardShortcut");
1290 if (!empty($conf->browser->os) && $conf->browser->os ==
'macintosh') {
1291 $conf->browser->stringforfirstkey .=
' CTRL + Option +';
1293 if (!empty($conf->browser->name) && $conf->browser->name ==
'chrome') {
1294 $conf->browser->stringforfirstkey .=
' ALT +';
1295 } elseif (!empty($conf->browser->name) && $conf->browser->name ==
'firefox') {
1296 $conf->browser->stringforfirstkey .=
' ALT + SHIFT +';
1298 $conf->browser->stringforfirstkey .=
' CTL +';
1304$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1305$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1306$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1318if (empty($conf->browser->firefox)) {
1319 define(
'ROWS_1', 1);
1320 define(
'ROWS_2', 2);
1321 define(
'ROWS_3', 3);
1322 define(
'ROWS_4', 4);
1323 define(
'ROWS_5', 5);
1324 define(
'ROWS_6', 6);
1325 define(
'ROWS_7', 7);
1326 define(
'ROWS_8', 8);
1327 define(
'ROWS_9', 9);
1329 define(
'ROWS_1', 0);
1330 define(
'ROWS_2', 1);
1331 define(
'ROWS_3', 2);
1332 define(
'ROWS_4', 3);
1333 define(
'ROWS_5', 4);
1334 define(
'ROWS_6', 5);
1335 define(
'ROWS_7', 6);
1336 define(
'ROWS_8', 7);
1337 define(
'ROWS_9', 8);
1340$heightforframes = 52;
1343if (!defined(
'NOREQUIREMENU')) {
1344 if (empty($user->socid)) {
1352 $file_menu = $conf->standard_menu;
1353 if (
GETPOST(
'menu',
'alpha')) {
1354 $file_menu =
GETPOST(
'menu',
'alpha');
1357 if (!class_exists(
'MenuManager')) {
1359 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1360 foreach ($dirmenus as $dirmenu) {
1362 if (class_exists(
'MenuManager')) {
1366 if (!class_exists(
'MenuManager')) {
1367 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1368 $file_menu =
'eldy_menu.php';
1369 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1373 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1378if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1379 $message =
GETPOST(
'seteventmessages',
'alpha');
1380 $messages = explode(
',', $message);
1381 foreach ($messages as $key => $msg) {
1382 $tmp = explode(
':', $msg);
1389if (!function_exists(
"llxHeader")) {
1413 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1415 global $conf, $hookmanager;
1417 $parameters = array(
1419 'title' => & $title,
1420 'help_url' => & $help_url,
1421 'target' => & $target,
1422 'disablejs' => & $disablejs,
1423 'disablehead' => & $disablehead,
1424 'arrayofjs' => & $arrayofjs,
1425 'arrayofcss' => & $arrayofcss,
1426 'morequerystring' => & $morequerystring,
1427 'morecssonbody' => & $morecssonbody,
1428 'replacemainareaby' => & $replacemainareaby,
1429 'disablenofollow' => & $disablenofollow,
1430 'disablenoindex' => & $disablenoindex
1433 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1435 print $hookmanager->resPrint;
1440 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1442 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1444 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1446 if ($mainmenu !=
'website') {
1447 $tmpcsstouse = $morecssonbody;
1452 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1455 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1456 $tmpcsstouse .=
' dol_openinpopup';
1459 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1462 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1463 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1466 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1467 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1471 if ($replacemainareaby) {
1472 print $replacemainareaby;
1490 global $db, $conf, $hookmanager;
1492 if ($contenttype ==
'text/html') {
1493 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1495 header(
"Content-Type: ".$contenttype);
1501 header(
"X-Content-Type-Options: nosniff");
1504 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1505 header(
"X-Frame-Options: SAMEORIGIN");
1507 header(
"X-Frame-Options: ALLOWALL");
1511 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1512 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1513 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1514 header(
'Vary: Origin');
1521 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1536 if (!is_object($hookmanager)) {
1537 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1540 $hookmanager->initHooks(array(
"main"));
1542 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1543 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1545 $contentsecuritypolicy = $hookmanager->resPrint;
1547 $contentsecuritypolicy .= $hookmanager->resPrint;
1550 if (!empty($contentsecuritypolicy)) {
1551 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1554 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1558 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1573 if (!is_object($hookmanager)) {
1574 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1577 $hookmanager->initHooks(array(
"main"));
1579 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1580 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1582 $contentsecuritypolicy = $hookmanager->resPrint;
1584 $contentsecuritypolicy .= $hookmanager->resPrint;
1587 if (!empty($contentsecuritypolicy)) {
1588 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1591 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1598 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1600 if (!empty($referrerpolicy)) {
1601 header(
"Referrer-Policy: ".$referrerpolicy);
1604 header(
"Referrer-Policy: ".constant(
'MAIN_SECURITY_FORCERP'));
1608 if (!defined(
'MAIN_SECURITY_FORCESTS')) {
1611 header(
"Strict-Transport-Security: ".$sts);
1614 header(
"Strict-Transport-Security: ".constant(
'MAIN_SECURITY_FORCESTS'));
1618 if (!defined(
'MAIN_SECURITY_FORCEPP')) {
1621 header(
"Permissions-Policy: ".$pp);
1624 header(
"Permissions-Policy: ".constant(
'MAIN_SECURITY_FORCEPP'));
1628 if ($forcenocache) {
1629 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1651function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1653 global $db, $conf, $langs, $user,
$mysoc, $hookmanager;
1657 if (empty($conf->css)) {
1658 $conf->css =
'/theme/eldy/style.css.php';
1661 print
'<!doctype html>'.
"\n";
1663 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1666 if (empty($disablehead)) {
1667 if (!is_object($hookmanager)) {
1668 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1671 $hookmanager->initHooks(array(
"main"));
1673 $ext =
'layout='.(empty($conf->browser->layout) ?
'' : $conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1677 if (
GETPOST(
'dol_basehref',
'alpha')) {
1678 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1682 print
'<meta charset="utf-8">'.
"\n";
1683 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1684 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1685 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1686 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1687 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1689 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1692 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1693 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1694 if (!empty(
$mysoc->logo_squarred_mini)) {
1695 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.
$mysoc->logo_squarred_mini);
1700 if (empty($conf->dol_use_jmobile)) {
1701 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1702 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1706 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1707 $parameters = array(
'manifest' => $manifest);
1708 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1710 $manifest = $hookmanager->resPrint;
1712 $manifest .= $hookmanager->resPrint;
1714 if (!empty($manifest)) {
1715 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1719 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1724 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1728 $appli = constant(
'DOL_APPLICATION_TITLE');
1731 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1744 $parameters = array(
'title' => $titletoshow);
1745 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1747 $titletoshow = $hookmanager->resPrint;
1749 $titletoshow .= $hookmanager->resPrint;
1758 $ext =
'version='.GETPOSTINT(
'version');
1761 if (
GETPOST(
'dol_resetcache')) {
1762 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1766 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1768 $themeparam .=
'&' .$ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1769 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1770 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1772 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1773 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1775 if (GETPOSTISSET(
'dol_openinpopup')) {
1776 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1778 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1779 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1781 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1782 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1784 if (GETPOSTISSET(
'dol_use_jmobile')) {
1785 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1786 $conf->dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile');
1788 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1789 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1791 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1792 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1796 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1797 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1800 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && $conf->use_javascript_ajax) {
1801 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1802 if (!defined(
'DISABLE_JQUERY_UI')) {
1803 $jquerytheme =
'base';
1807 if (constant(
'JS_JQUERY_UI')) {
1808 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css?' . $ext .
'">' .
"\n";
1810 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css?' . $ext .
'">' .
"\n";
1813 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1814 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css?' . $ext .
'">'.
"\n";
1816 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1818 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css?' . $ext .
'">'.
"\n";
1822 if (!defined(
'DISABLE_FONT_AWSOME')) {
1823 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1824 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1825 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css?' . $ext .
'">'.
"\n";
1831 if (!empty($conf->modules_parts[
'theme'])) {
1832 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1835 $themesubdir = $reldir;
1841 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1842 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1843 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1855 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css?' . $ext .
"\">\n";
1856 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css?' . $ext .
"\">\n";
1860 if (!empty($conf->modules_parts[
'css'])) {
1861 $arraycss = (array) $conf->modules_parts[
'css'];
1862 foreach ($arraycss as $modcss => $filescss) {
1863 $filescss = (array) $filescss;
1864 foreach ($filescss as $cssfile) {
1865 if (empty($cssfile)) {
1866 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1870 if ($urlforcss && $urlforcss !=
'/') {
1871 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1873 if (!preg_match(
'/\.css$/i', $cssfile)) {
1878 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1884 if (is_array($arrayofcss)) {
1885 foreach ($arrayofcss as $cssfile) {
1886 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1887 $urltofile = $cssfile;
1891 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1893 if (!preg_match(
'/\.css$/i', $cssfile)) {
1903 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php?' . $ext .
'&revision='.getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1907 if (!defined(
'DISABLE_JQUERY') && (!$disablejs || $disablejs == 2) && !empty($conf->use_javascript_ajax)) {
1909 print
'<!-- Includes JS for JQuery -->'.
"\n";
1910 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1911 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js?' . $ext .
'"></script>'.
"\n";
1913 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js?' . $ext .
'"></script>'.
"\n";
1915 if (!defined(
'DISABLE_JQUERY_UI')) {
1916 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1917 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1919 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js?' . $ext .
'"></script>' .
"\n";
1923 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1924 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js?' . $ext .
'"></script>'.
"\n";
1927 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1928 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js?' . $ext .
'"></script>'.
"\n";
1932 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js?' . $ext .
'"></script>'.
"\n";
1936 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1937 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1938 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js?' . $ext .
'"></script>'.
"\n";
1939 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js?' . $ext .
'"></script>'.
"\n";
1940 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js?' . $ext .
'"></script>'.
"\n";
1941 print
'<script nonce="'.getNonce().
'" >'.
"\n";
1942 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1943 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1944 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1945 print 'var placeholderInPlace = \
' \';'.
"\n";
1946 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1947 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1948 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1949 print
'var withInPlace = 300;';
1950 print
'</script>'.
"\n";
1951 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js?' . $ext .
'"></script>'.
"\n";
1952 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js?' . $ext .
'"></script>'.
"\n";
1954 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1957 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js?' . $ext .
'"></script>'.
"\n";
1959 if (!defined(
'DISABLE_MULTISELECT')) {
1960 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js?' . $ext .
'"></script>'.
"\n";
1964 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1967 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1968 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1969 $jsckeditor =
'ckeditor.js';
1970 if (constant(
'JS_CKEDITOR')) {
1972 $pathckeditor = constant(
'JS_CKEDITOR');
1974 print
'<script nonce="'.getNonce().
'">';
1975 print
'/* enable ckeditor by main.inc.php */';
1976 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1977 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js?' . $ext, 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1978 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1979 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";
1980 print
'</script>'.
"\n";
1981 print
'<script src="'.$pathckeditor.$jsckeditor.
'?' . $ext .
'"></script>'.
"\n";
1983 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1984 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1986 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1988 print
'</script>'.
"\n";
1992 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1993 $enablebrowsernotif =
false;
1995 $enablebrowsernotif =
true;
1997 if ($conf->browser->layout ==
'phone') {
1998 $enablebrowsernotif =
false;
2000 if ($enablebrowsernotif) {
2001 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2002 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.
'&' . $ext .
'"></script>'.
"\n";
2007 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2008 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
2009 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang .
'&' . $ext .
'"></script>' .
"\n";
2014 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js?' . $ext .
'"></script>'.
"\n";
2015 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js?' . $ext .
'"></script>'.
"\n";
2019 if (!empty($conf->modules_parts[
'js'])) {
2020 $arrayjs = (array) $conf->modules_parts[
'js'];
2021 foreach ($arrayjs as $modjs => $filesjs) {
2022 $filesjs = (array) $filesjs;
2023 foreach ($filesjs as $jsfile) {
2026 if ($urlforjs && $urlforjs !=
'/') {
2027 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2028 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2030 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2036 if (is_array($arrayofjs)) {
2037 print
'<!-- Includes JS added by page -->'.
"\n";
2038 foreach ($arrayofjs as $jsfile) {
2039 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2040 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2042 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2050 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2051 if (file_exists($theme_js)) {
2052 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js?' . $ext .
'"></script>'.
"\n";
2056 if (!empty($head)) {
2063 $parameters = array();
2064 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2065 print $hookmanager->resPrint;
2067 print
"</head>\n\n";
2070 $conf->headerdone = 1;
2090function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2092 global $user, $conf, $langs, $db, $form;
2093 global $dolibarr_main_authentication, $dolibarr_main_demo;
2094 global $hookmanager, $menumanager;
2099 $hookmanager->initHooks(array(
'toprightmenu'));
2104 if (empty($conf->headerdone)) {
2105 $disablenofollow = 0;
2106 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2107 print
'<body id="mainbody">';
2113 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2114 if (!isset($form) || !is_object($form)) {
2115 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2116 $form =
new Form($db);
2119 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2121 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2124 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2126 $menumanager->atarget = $target;
2128 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2132 $appli = constant(
'DOL_APPLICATION_TITLE');
2135 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2137 $appli .=
" ".DOL_VERSION;
2141 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2145 $logouthtmltext =
'';
2147 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2148 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2149 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2150 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2151 $logouttext .=
'</a>';
2153 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2154 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$conf->browser->stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2159 print
'<div class="login_block usedropdown">'.
"\n";
2163 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2166 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2186 $toprightmenu .=
'</div>';
2188 $toprightmenu .=
'</div>'.
"\n";
2192 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2195 $parameters = array();
2196 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2197 if (is_numeric($result)) {
2199 $toprightmenu .= $hookmanager->resPrint;
2201 $toprightmenu = $hookmanager->resPrint;
2204 $toprightmenu .= $result;
2209 $text =
'<a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/modulebuilder/index.php', [
'mainmenu' =>
'home',
'leftmenu' =>
'admintools']) .
'" target="modulebuilder">';
2211 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2214 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2221 if (isset($_POST) && is_array($_POST)) {
2222 foreach ($_POST as $key => $value) {
2223 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2224 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2227 if (!is_array($value)) {
2228 if ($value !==
'') {
2229 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2232 foreach ($value as $value2) {
2233 if (($value2 !==
'') && (!is_array($value2))) {
2234 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2240 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2241 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2243 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2246 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2251 $langs->load(
"help");
2258 if (empty($helppagename)) {
2259 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2261 $helppresent =
'helppresent';
2266 $helpbaseurl = $arrayres[
'helpbaseurl'];
2267 $helppage = $arrayres[
'helppage'];
2268 $mode = $arrayres[
'mode'];
2271 if ($helpbaseurl && $helppage) {
2273 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2274 if ($mode ==
'wiki') {
2275 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2277 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2279 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2282 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2283 if ($mode ==
'wiki') {
2285 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2288 $text .= sprintf($helpbaseurl, $helppage);
2291 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2292 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2295 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2300 $langs->load(
'admin');
2301 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2307 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2309 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2314 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2317 $toprightmenu .=
'</div>';
2321 $toprightmenu .=
'<div class="login_block_user">';
2324 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2329 $toprightmenu .=
'</div>';
2331 $toprightmenu .=
'</div>'.
"\n";
2334 print $toprightmenu;
2341 print
'<div style="clear: both;"></div>';
2342 print
"<!-- End top horizontal menu -->\n\n";
2345 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2346 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2360 global $langs, $conf, $db, $hookmanager, $user,
$mysoc;
2361 global $dolibarr_main_authentication, $dolibarr_main_demo;
2362 global $menumanager, $form;
2365 if ($conf->browser->name ==
'textbrowser') {
2369 $langs->load(
'companies');
2371 $userImage = $userDropDownImage =
'';
2372 if (!empty($user->photo) ||
isModEnabled(
'gravatar')) {
2373 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2374 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2376 $nophoto =
'/public/theme/common/user_anonymous.png';
2377 if ($user->gender ==
'man') {
2378 $nophoto =
'/public/theme/common/user_man.png';
2380 if ($user->gender ==
'woman') {
2381 $nophoto =
'/public/theme/common/user_woman.png';
2384 $userImage =
img_picto(
'',
'user',
'class="photo photouserphoto userphoto"');
2386 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2390 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2391 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2395 while ($idprofcursor < 10) {
2397 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2398 if ($idprofcursor == 1) {
2399 $constkeyforprofid =
'MAIN_INFO_SIREN';
2401 if ($idprofcursor == 2) {
2402 $constkeyforprofid =
'MAIN_INFO_SIRET';
2404 if ($idprofcursor == 3) {
2405 $constkeyforprofid =
'MAIN_INFO_APE';
2407 if ($idprofcursor == 4) {
2408 $constkeyforprofid =
'MAIN_INFO_RCS';
2410 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor,
$mysoc->country_code) !=
'-');
2420 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.(
$mysoc->country_code ? $langs->trans(
"Country".
$mysoc->country_code).
' '.$langFlag :
'').
'</span>';
2422 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
getDolCurrency().
'</span>';
2424 $dropdownBody .=
'</div>';
2426 $dropdownBody .=
'<br>';
2427 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2428 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2431 if (!empty($user->admin)) {
2432 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin).
' '.
img_picto(
'',
'admin');
2435 if (!empty($user->socid)) {
2436 $thirdpartystatic =
new Societe($db);
2437 $thirdpartystatic->fetch($user->socid);
2438 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2439 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2441 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2442 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2443 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2444 $dropdownBody .=
'<br>';
2446 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2447 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2449 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2451 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2452 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2453 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2454 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2456 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2458 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.$langs->getDefaultLang().($langFlag ?
' '.$langFlag :
'');;
2460 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2461 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2462 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2467 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst($conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2468 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2469 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2470 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2471 if ($conf->browser->layout ==
'phone') {
2472 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2474 if (!empty($_SESSION[
"disablemodules"])) {
2475 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2477 $dropdownBody .=
'</div>';
2480 $parameters = array(
'user' => $user,
'langs' => $langs);
2481 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2482 if (is_numeric($result)) {
2484 $dropdownBody .= $hookmanager->resPrint;
2486 $dropdownBody = $hookmanager->resPrint;
2490 if (empty($urllogout)) {
2491 $urllogout =
dolBuildUrl(DOL_URL_ROOT .
'/user/logout.php', [],
true);
2495 $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>';
2496 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2497 $jsonopen =
"closeTopMenuLoginDropdown()";
2498 $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');
2499 $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>';
2501 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2502 if (!empty($user->admin)) {
2503 $profilName =
img_picto($langs->trans(
"Administrator"),
'admin').
' '.$profilName;
2507 $appli = constant(
'DOL_APPLICATION_TITLE');
2510 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2512 $appli .=
" ".DOL_VERSION;
2516 $btnUser =
'<!-- div for user link -->
2517 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2518 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2519 '.$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>' :
'').
'
2521 <div class="dropdown-menu">
2523 <div class="user-header">
2524 '.$userDropDownImage.
'
2526 '.$profilName.
'<br>';
2528 if ($user->datelastlogin) {
2529 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2530 if ($user->datepreviouslogin) {
2531 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2534 $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>';
2535 if ($user->datepreviouslogin) {
2536 $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>';
2544 <!-- Menu Body user-->
2545 <div class="user-body">'.$dropdownBody.
'</div>
2548 <div class="user-footer">
2549 <div class="pull-left">
2552 <div class="pull-left">
2553 '.$virtuelcardLink.
'
2555 <div class="pull-right">
2558 <div class="clearboth"></div>
2564 $btnUser =
'<!-- div for user link text browser -->
2565 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2566 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2567 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2572 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2574 <!-- Code to show/hide the user drop-down -->
2576 function closeTopMenuLoginDropdown() {
2577 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2579 jQuery("#topmenu-login-dropdown").removeClass("open");
2581 jQuery(document).ready(function() {
2582 jQuery(document).on("click", function(event) {
2583 if (jQuery("#topmenu-login-dropdown").hasClass("open")) {
2584 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2585 /* console.log("click close login - we click outside"); */
2586 closeTopMenuLoginDropdown();
2594 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2595 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2596 event.preventDefault();
2597 jQuery("#topmenu-login-dropdown").toggleClass("open");
2600 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2601 console.log("Click on #topmenulogincompanyinfo-btn");
2602 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2603 jQuery("#topmenuloginmoreinfo").slideToggle();
2605 jQuery("#topmenulogincompanyinfo").slideToggle();
2608 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2609 console.log("Click on #topmenuloginmoreinfo-btn");
2610 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2611 jQuery("#topmenulogincompanyinfo").slideToggle();
2613 jQuery("#topmenuloginmoreinfo").slideToggle();
2633 global $conf, $langs;
2642 if (!empty($conf->use_javascript_ajax)) {
2643 $html .=
'<!-- div for quick add link -->
2644 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2645 <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>
2648 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2650 <!-- Code to show/hide the user drop-down for the quick add -->
2652 jQuery(document).ready(function() {
2653 jQuery(document).on("click", function(event) {
2654 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2655 /* console.log("click close quick add - we click outside"); */
2657 $("#topmenu-quickadd-dropdown").removeClass("open");
2660 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2661 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2662 openQuickAddDropDown(event);
2666 $(document).keydown(function(event){
2667 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2668 if (ostype ===
"macintosh") {
2669 if ( event.which === 65 && event.ctrlKey ) {
2670 console.log(\
'control + a : trigger open quick add dropdown\');
2671 openQuickAddDropDown(event);
2674 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2675 console.log(\'control + shift + a : trigger open quick add dropdown\');
2676 openQuickAddDropDown(event);
2681 var openQuickAddDropDown = function(event) {
2682 event.preventDefault();
2683 $("#topmenu-quickadd-dropdown").toggleClass("open");
2703 global $conf, $langs;
2712 if (!empty($conf->use_javascript_ajax)) {
2713 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2718 $html .=
'<!-- div for link to upload file -->
2719 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2720 <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>
2736 global $user, $langs, $hookmanager;
2741 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2742 "title" =>
"MenuNewMember@members",
2743 "name" =>
"Adherent@members",
2744 "picto" =>
"object_member",
2745 "activation" =>
isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2749 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2750 "title" =>
"MenuNewThirdParty@companies",
2751 "name" =>
"ThirdParty@companies",
2752 "picto" =>
"object_company",
2753 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2757 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2758 "title" =>
"NewContactAddress@companies",
2759 "name" =>
"Contact@companies",
2760 "picto" =>
"object_contact",
2761 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2765 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2766 "title" =>
"NewPropal@propal",
2767 "name" =>
"Proposal@propal",
2768 "picto" =>
"object_propal",
2769 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2774 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2775 "title" =>
"NewOrder@orders",
2776 "name" =>
"Order@orders",
2777 "picto" =>
"object_order",
2778 "activation" =>
isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2782 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2783 "title" =>
"NewBill@bills",
2784 "name" =>
"Bill@bills",
2785 "picto" =>
"object_bill",
2786 "activation" =>
isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2790 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2791 "title" =>
"NewContractSubscription@contracts",
2792 "name" =>
"Contract@contracts",
2793 "picto" =>
"object_contract",
2794 "activation" =>
isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2798 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2799 "title" =>
"SupplierProposalNew@supplier_proposal",
2800 "name" =>
"SupplierProposal@supplier_proposal",
2801 "picto" =>
"supplier_proposal",
2802 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2806 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2807 "title" =>
"NewSupplierOrderShort@orders",
2808 "name" =>
"SupplierOrder@orders",
2809 "picto" =>
"supplier_order",
2810 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2814 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2815 "title" =>
"NewBill@bills",
2816 "name" =>
"SupplierBill@bills",
2817 "picto" =>
"supplier_invoice",
2818 "activation" => (
isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2822 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2823 "title" =>
"NewTicket@ticket",
2824 "name" =>
"Ticket@ticket",
2825 "picto" =>
"ticket",
2826 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2830 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2831 "title" =>
"NewIntervention@interventions",
2832 "name" =>
"Intervention@interventions",
2833 "picto" =>
"intervention",
2834 "activation" =>
isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2838 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2839 "title" =>
"NewProduct@products",
2840 "name" =>
"Product@products",
2841 "picto" =>
"object_product",
2842 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2846 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2847 "title" =>
"NewService@products",
2848 "name" =>
"Service@products",
2849 "picto" =>
"object_service",
2850 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2854 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2855 "title" =>
"AddUser@users",
2856 "name" =>
"User@users",
2858 "activation" => $user->hasRight(
"user",
"user",
"write"),
2864 $dropDownQuickAddHtml =
'';
2868 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2870 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2873 $parameters = array();
2874 $hook_items = $items;
2875 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2876 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2877 if ($reshook == 0) {
2878 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2880 $items = $hookmanager->resArray;
2884 $position = array();
2885 foreach ($items[
'items'] as $key => $row) {
2886 $position[$key] = $row[
'position'];
2888 $array1_sort_order = SORT_ASC;
2889 array_multisort($position, $array1_sort_order, $items[
'items']);
2892 foreach ($items[
'items'] as $item) {
2893 if (!$item[
'activation']) {
2896 $langs->load(explode(
'@', $item[
'title'])[1]);
2897 $langs->load(explode(
'@', $item[
'name'])[1]);
2898 $dropDownQuickAddHtml .=
'
2899 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2900 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2905 $dropDownQuickAddHtml .=
'</div>';
2907 $dropDownQuickAddHtml .=
'</div>';
2909 return $dropDownQuickAddHtml;
2919 global $langs, $conf, $user;
2924 if (!
isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2933 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2934 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2935 $langs->load(
"bookmarks");
2938 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2942 $html .=
'<!-- div for bookmark link -->
2943 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2944 <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>
2945 <div class="dropdown-menu">
2951 <!-- Code to show/hide the bookmark drop-down -->
2953 jQuery(document).ready(function() {
2954 jQuery(document).on("click", function(event) {
2955 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2956 /* console.log("close bookmark dropdown - we click outside"); */
2958 $("#topmenu-bookmark-dropdown").removeClass("open");
2962 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2963 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2964 openBookMarkDropDown(event);
2968 jQuery(document).keydown(function(event) {
2969 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2970 if (ostype ===
"macintosh") {
2971 if ( event.which === 66 && event.ctrlKey ) {
2972 console.log(
"Click on control + b : trigger open bookmark dropdown");
2973 openBookMarkDropDown(event);
2976 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2977 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2978 openBookMarkDropDown(event);
2983 var openBookMarkDropDown =
function(event) {
2984 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2985 event.preventDefault();
2986 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2987 jQuery(
"#top-bookmark-search-input").focus();
3003function top_menu_search()
3005 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3010 $arrayresult = array();
3011 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3013 $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">
';
3015 $defaultAction = '';
3016 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3017 // Menu with all searchable items
3018 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3019 foreach ($arrayresult as $keyItem => $item) {
3020 if (empty($defaultAction)) {
3021 $defaultAction = $item['url
'];
3023 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3024 $buttonList .= $item['text
'];
3025 $buttonList .= '</
button>
';
3027 $buttonList .= '</div>
';
3029 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3032 <!-- search input -->
3033 <div
class=
"dropdown-header search-dropdown-header">
3039 <!--
Menu Body search -->
3040 <div
class=
"dropdown-body search-dropdown-body">
3045 $dropDownHtml .= '</form>
';
3047 $html .= '<!-- div
for Global Search -->
3048 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3049 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$conf->browser->stringforfirstkey.' s)">
3050 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3052 <div
class=
"dropdown-menu dropdown-search">
3058 <!-- Code to show/hide the
user drop-down -->
3060 jQuery(document).ready(
function() {
3063 jQuery(
"#top-global-search-input").keydown(
function (e) {
3064 if (e.keyCode == 13 || e.keyCode == 40) {
3065 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3066 if (inputs[inputs.index(this) + 1] != null) {
3067 console.log(
"Force focus after keydow on #top-global-search-input");
3068 inputs[inputs.index(this) + 1].focus();
3069 if (e.keyCode == 13){
3070 inputs[inputs.index(this) + 1].trigger(
"click");
3080 jQuery(document).keydown(
function(e) {
3082 var $focused = $(
":focus");
3083 if($focused.length && $focused.hasClass(
"global-search-item")){
3086 if (e.keyCode == 38) {
3088 console.log(
"Force focus after keycode 38");
3089 $focused.prev().focus();
3093 if (e.keyCode == 40) {
3095 console.log(
"Force focus after keycode 40");
3096 $focused.next().focus();
3103 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3104 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3105 jQuery(
"#top-menu-action-search").submit();
3109 jQuery(document).on(
"click",
function(event) {
3110 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3111 console.log(
"click close search - we click outside");
3113 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3118 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3119 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3120 openGlobalSearchDropDown();
3124 jQuery(document).keydown(
function(e){
3125 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3126 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3127 openGlobalSearchDropDown();
3129 if ( e.which === 70 && e.alKey ) {
3130 console.log(\'alt + f : trigger open global-search dropdown\');
3131 openGlobalSearchDropDown();
3135 var openGlobalSearchDropDown = function() {
3136 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3137 jQuery("#top-global-search-input").focus();
3161function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3163 global $user, $conf, $langs, $db, $form;
3164 global $hookmanager, $menumanager;
3168 if (!empty($menu_array_before)) {
3169 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);
3172 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3174 $hookmanager->initHooks(array(
'leftblock'));
3176 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3179 if (!is_object($form)) {
3180 $form =
new Form($db);
3185 if ($conf->browser->layout ==
'phone') {
3186 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3190 $arrayresult = array();
3191 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3193 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3195 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3196 $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');
3198 if (is_array($arrayresult)) {
3200 foreach ($arrayresult as $key => $val) {
3201 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3207 $parameters = array(
'searchform' => $searchform);
3208 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3209 if (empty($reshook)) {
3210 $searchform .= $hookmanager->resPrint;
3212 $searchform = $hookmanager->resPrint;
3216 if (
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') || empty($conf->use_javascript_ajax)) {
3217 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3218 $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>';
3219 } elseif ($conf->use_javascript_ajax &&
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3220 $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>';
3221 $searchform .=
'<script>
3222 jQuery(document).ready(function () {
3223 jQuery("#divsearchforms1").click(function(){
3224 jQuery("#divsearchforms2").toggle();
3228 $searchform .=
'</div>';
3232 $searchform .=
'<script>
3233 jQuery(document).keydown(function(e){
3234 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3235 console.log(\'control + shift + f : trigger open global-search dropdown\');
3236 openGlobalSearchDropDown();
3238 if( (e.which === 83 || e.which === 115) && e.altKey ){
3239 console.log(\'alt + s : trigger open global-search dropdown\');
3240 openGlobalSearchDropDown();
3244 var openGlobalSearchDropDown = function() {
3245 jQuery("#searchselectcombo").select2(\'open\');
3251 print
'<!-- Begin left menu -->'.
"\n";
3253 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3257 $menumanager->menu_array = $menu_array_before;
3259 $menumanager->menu_array_after = $menu_array_after;
3262 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3265 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3271 print
"<!-- Begin Help Block-->\n";
3272 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3276 $doliurl =
'https://www.dolibarr.org';
3278 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3279 $doliurl =
'https://www.dolibarr.fr';
3281 if (preg_match(
'/es/i', $langs->defaultlang)) {
3282 $doliurl =
'https://www.dolibarr.es';
3284 if (preg_match(
'/de/i', $langs->defaultlang)) {
3285 $doliurl =
'https://www.dolibarr.de';
3287 if (preg_match(
'/it/i', $langs->defaultlang)) {
3288 $doliurl =
'https://www.dolibarr.it';
3290 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3291 $doliurl =
'https://www.dolibarr.gr';
3294 $appli = constant(
'DOL_APPLICATION_TITLE');
3297 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3299 $appli .=
" ".DOL_VERSION;
3307 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3309 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3311 print
'<span class="help">';
3319 print
'</div>'.
"\n";
3324 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3327 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3328 $bugbaseurl .=
'&title=';
3329 $bugbaseurl .= urlencode(
"Bug: ");
3330 $bugbaseurl .=
'&body=';
3331 $bugbaseurl .= urlencode(
"# Instructions\n");
3332 $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");
3333 $bugbaseurl .= urlencode(
"*Please:*\n");
3334 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3335 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3336 $bugbaseurl .= urlencode(
"\n");
3337 $bugbaseurl .= urlencode(
"\n");
3338 $bugbaseurl .= urlencode(
"# Bug\n");
3339 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3340 $bugbaseurl .= urlencode(
"\n");
3341 $bugbaseurl .= urlencode(
"## Environment\n");
3342 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3343 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3344 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3345 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3346 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3347 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3348 $bugbaseurl .= urlencode(
"\n");
3349 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3350 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3351 $bugbaseurl .= urlencode(
"\n");
3352 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3353 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3354 $bugbaseurl .= urlencode(
"\n");
3355 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3356 $bugbaseurl .= urlencode(
"[*Files*]\n");
3357 $bugbaseurl .= urlencode(
"\n");
3359 $bugbaseurl .= urlencode(
"\n");
3360 $bugbaseurl .= urlencode(
"## Report\n");
3368 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3369 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3370 if (empty($reshook)) {
3371 $bugbaseurl .= $hookmanager->resPrint;
3373 $bugbaseurl = $hookmanager->resPrint;
3376 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3377 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3382 print
"<!-- End Help Block-->\n";
3387 print
"<!-- End left menu -->\n";
3391 $parameters = array();
3392 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3393 print $hookmanager->resPrint;
3395 print
'</div></div> <!-- End side-nav id-left -->';
3399 print
'<!-- Begin right area -->'.
"\n";
3401 if (empty($leftmenuwithoutmainarea)) {
3415 global $conf, $langs, $hookmanager;
3417 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3418 print
'<div id="id-right">';
3423 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3425 $hookmanager->initHooks(array(
'main'));
3426 $parameters = array();
3427 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3428 print $hookmanager->resPrint;
3431 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3436 $parameters = array();
3437 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3438 if (empty($reshook)) {
3439 print
'<!-- Begin show mysoc info header -->'.
"\n";
3440 print
'<div id="mysoc-info-header">'.
"\n";
3441 print
'<table class="centpercent div-table-responsive">'.
"\n";
3443 print
'<tr><td rowspan="0" class="width20p">';
3445 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'))).
'">';
3447 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3448 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3460 print
'</table>'.
"\n";
3461 print
'</div>'.
"\n";
3462 print
'<!-- End show mysoc info header -->'.
"\n";
3481 if (preg_match(
'/^http/i', $helppagename)) {
3483 $helpbaseurl =
'%s';
3484 $helppage = $helppagename;
3489 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3490 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3491 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3492 $helppage = $reg[1];
3495 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3496 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3497 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3498 $helppage = $reg[1];
3501 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3502 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3503 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3504 $helppage = $reg[1];
3507 if (empty($helppage)) {
3508 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3509 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3510 $helppage = $reg[1];
3515 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3535function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3537 global $langs, $user;
3540 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3541 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3542 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3543 if ($showtitlebefore) {
3544 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3546 $ret .=
'<div class="tagtd">';
3547 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3548 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3549 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3550 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3551 $ret .=
' placeholder="'.strip_tags($title).
'"';
3552 $ret .= ($autofocus ?
' autofocus' :
'');
3553 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3554 $ret .=
'<button type="submit" class="button bordertransp nohover" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3555 $ret .=
'<span class="fa fa-search"></span>';
3556 $ret .=
'</button>';
3558 $ret .=
"</form>\n";
3563if (!function_exists(
"llxFooter")) {
3577 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3579 global $conf, $db, $langs, $user,
$mysoc,
$object, $hookmanager, $action;
3580 global $delayedhtmlcontent;
3581 global $contextpage, $page, $limit, $mode;
3582 global $dolibarr_distrib;
3584 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3588 $parameters = array();
3589 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3590 if (empty($reshook)) {
3591 $llxfooter .= $hookmanager->resPrint;
3592 } elseif ($reshook > 0) {
3593 $llxfooter = $hookmanager->resPrint;
3604 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3606 foreach ($user->lastsearch_values_tmp as $key => $val) {
3607 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3608 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3609 if (empty($val[
'sortfield'])) {
3610 unset($val[
'sortfield']);
3612 if (empty($val[
'sortorder'])) {
3613 unset($val[
'sortorder']);
3615 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3616 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3617 unset($_SESSION[
'lastsearch_values_'.$key]);
3623 $relativepathstring = $_SERVER[
"PHP_SELF"];
3625 if (constant(
'DOL_URL_ROOT')) {
3626 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3628 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3629 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3630 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3631 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3632 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3633 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3634 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3636 if (!empty($contextpage)) {
3637 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3639 if (!empty($page) && $page > 0) {
3640 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3642 if (!empty($limit) && $limit != $conf->liste_limit) {
3643 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3645 if (!empty($mode)) {
3646 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3649 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3650 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3651 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3652 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3658 if ($conf->use_javascript_ajax) {
3659 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3660 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3663 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3664 print
'<div class="error">'.$msg.
'</div>';
3672 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3674 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3675 print
'</div> <!-- End div id-right -->'.
"\n";
3678 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3679 print
'</div> <!-- End div id-container -->'.
"\n";
3684 print
'<!-- '.$comment.
' -->'.
"\n";
3689 if (!empty($delayedhtmlcontent)) {
3690 print $delayedhtmlcontent;
3693 if (!empty($conf->use_javascript_ajax)) {
3694 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3695 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang .
'&' . $ext .
'"></script>'.
"\n";
3702 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3703 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3706 jQuery(document).ready(
function () {
3707 $(
'a.documentpreview').click(
function() {
3708 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3709 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3711 id: <?php echo
$object->id; ?>
3712 , element:
'<?php echo dol_escape_js($object->element) ?>'
3713 , action:
'DOC_PREVIEW'
3714 , token:
'<?php echo currentToken(); ?>'
3718 $(
'a.documentdownload').click(
function() {
3719 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3720 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3722 id: <?php echo
$object->id; ?>
3723 , element:
'<?php echo dol_escape_js($object->element) ?>'
3724 , action:
'DOC_DOWNLOAD'
3725 , token:
'<?php echo currentToken(); ?>'
3736 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3737 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3740 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3741 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3748 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3749 $hash_unique_id_ping =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3750 $constanttosavelastko =
'MAIN_LAST_PING_KO_DATE';
3751 $constanttosavefirstok =
'MAIN_FIRST_PING_OK_DATE';
3752 $constanttosavefirstokid =
'MAIN_FIRST_PING_OK_ID';
3755 || (!empty($conf->file->instance_unique_id) && (($hash_unique_id_ping.
' - '.DOL_VERSION) !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3758 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3759 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3760 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_ping]) || $forceping) {
3762 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3764 $arrayofdata = array(
3765 'action' =>
'dolibarrping',
3766 'country_code' => (
$mysoc->country_code ?
$mysoc->country_code :
'unknown')
3768 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceping);
3771 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3772 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3774 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3777 print
"\n<!-- NO JS CODE TO call the ping. It was already done for this couple uniqueid and version -->\n";
3783 $forceregistration =
GETPOSTINT(
'forceregistration');
3785 if (
isModEnabled(
'blockedlog') && (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceregistration)) {
3786 include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/blockedlog.lib.php';
3788 print
"\n<!-- NO JS CODE TO ENABLE the registration. Not a LNE qualified version -->\n";
3790 print
"\n<!-- NO JS CODE TO ENABLE the registration. Registration data not saved -->\n";
3792 $hash_unique_id_registration =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256', 1);
3793 $constanttosavelastko =
'MAIN_LAST_REGISTRATION_KO_DATE';
3794 $constanttosavefirstok =
'MAIN_FIRST_REGISTRATION_OK_DATE';
3795 $constanttosavefirstokid =
'MAIN_FIRST_REGISTRATION_OK_ID';
3798 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id_registration.
' - '.DOL_VERSION !=
getDolGlobalString($constanttosavefirstokid)) && (
getDolGlobalString($constanttosavefirstokid) !=
'disabled'))
3799 || $forceregistration) {
3801 if ((strpos(
'alpha', DOL_VERSION) > 0 || strpos(
'beta', DOL_VERSION) > 0) && !$forceregistration) {
3802 print
"\n<!-- NO JS CODE TO ENABLE the registration. It is an alpha or beta version -->\n";
3803 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id_registration]) || $forceregistration) {
3805 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3807 $arrayofdata = array(
3808 'action' =>
'dolibarrregistration',
3829 printCodeForPing($constanttosavelastko, $constanttosavefirstok, $arrayofdata, $forceregistration);
3832 print
"\n<!-- NO JS CODE TO ENABLE the registration. It was disabled -->\n";
3833 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3835 dolibarr_set_const($db, $constanttosavefirstokid,
'disabled',
'chaine', 0,
'', $conf->entity);
3838 print
"\n<!-- NO JS CODE TO call the registration. It was already done for this couple uniqueid and version -->\n";
3843 $parameters = array();
3844 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3846 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.