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';
99if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
100 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
101 $tmplist = explode(
',', $tmpautoset[1]);
102 $cookiearrayvalue = array();
103 foreach ($tmplist as $tmpkey) {
104 $postkey = $tmpautoset[0].
'_'.$tmpkey;
107 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
110 $cookiename = $tmpautoset[0];
111 $cookievalue = json_encode($cookiearrayvalue);
118if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
119 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
125$prefix = dol_getprefix(
'');
126$sessionname =
'DOLSESSID_'.$prefix;
127$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
128if (!empty($_COOKIE[$sessiontimeout])) {
129 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
134if (!defined(
'NOSESSION')) {
135 if (PHP_VERSION_ID < 70300) {
136 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
139 $sessioncookieparams = array(
143 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
147 session_set_cookie_params($sessioncookieparams);
149 session_name($sessionname);
156require_once
'master.inc.php';
164 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
166 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
168 } elseif (defined(
'NOREQUIREDB')) {
170 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
172 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
176 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
177 print
'Sorry, your application is offline.'.
"\n";
178 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";
179 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
180 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
182 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
183 $nexturl = DOL_URL_ROOT.
'/';
184 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
192register_shutdown_function(
'dol_shutdown');
195if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
197 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
199 $renderer = $debugbar->getJavascriptRenderer();
201 $conf->global->MAIN_HTML_HEADER =
'';
203 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
205 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
206 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
210if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
212 $conf->browser->name = $tmp[
'browsername'];
213 $conf->browser->os = $tmp[
'browseros'];
214 $conf->browser->version = $tmp[
'browserversion'];
215 $conf->browser->ua = $tmp[
'browserua'];
216 $conf->browser->layout = $tmp[
'layout'];
219 if (
$conf->browser->layout ==
'phone') {
220 $conf->dol_no_mouse_hover = 1;
227 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
231if (
GETPOSTINT(
'textbrowser') || (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'textbrowser')) {
232 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
237if (!empty(
$conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
239 if (is_numeric(
$conf->file->main_force_https)) {
240 if (
$conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
241 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
242 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
247 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
251 $newurl =
$conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
256 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
257 header(
"Location: ".$newurl);
260 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);
264if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
265 $listofip = explode(
',', $dolibarr_main_restrict_ip);
267 foreach ($listofip as $ip) {
269 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
275 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
281if (!defined(
'NOREQUIREHTML')) {
282 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
284if (!defined(
'NOREQUIREAJAX')) {
285 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
290 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
291 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
295$checkifupgraderequired =
false;
297 $checkifupgraderequired =
true;
300 $checkifupgraderequired =
true;
302if ($checkifupgraderequired) {
304 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
305 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
306 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
307 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
309 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
311 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
312 if (php_sapi_name() ===
"cli") {
313 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
315 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
323if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
325 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
327 if (isset($_SESSION[
'newtoken'])) {
328 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
331 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
335 $token =
dol_hash(uniqid((
string) mt_rand(),
false),
'md5');
336 $_SESSION[
'newtoken'] = $token;
337 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
345if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
346 $tmpaction =
GETPOST(
'action',
'aZ09');
348 $sensitiveget =
false;
349 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
352 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')))) {
353 $sensitiveget =
true;
357 $arrayofactiontoforcetokencheck = array(
359 'doprev',
'donext',
'dvprev',
'dvnext',
360 'freezone',
'install',
363 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
364 $sensitiveget =
true;
367 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
368 $sensitiveget =
true;
375 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
377 GETPOSTISSET(
'massaction') ||
378 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
381 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
384 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
385 $langs->loadLangs(array(
"errors",
"install"));
386 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
387 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
389 http_response_code(403);
390 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
391 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);
392 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";
394 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);
395 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";
396 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";
400 print
" into setup).\n";
407 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
409 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
410 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);
413 if (!defined(
'NOTOKENRENEWAL')) {
415 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
418 if (isset($_POST[
'id'])) {
419 $savid = ((int) $_POST[
'id']);
422 unset($_GET[
'confirm']);
423 unset($_GET[
'action']);
424 unset($_GET[
'confirmmassaction']);
425 unset($_GET[
'massaction']);
426 unset($_GET[
'token']);
428 $_POST[
'id'] = ((int) $savid);
431 $_GET[
'errorcode'] =
'InvalidToken';
439 if (GETPOSTISSET(
'disablemodules')) {
440 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
442 if (!empty($_SESSION[
"disablemodules"])) {
443 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
445 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
446 foreach ($disabled_modules as $module) {
448 if (empty(
$conf->$module)) {
452 $conf->$module->enabled =
false;
453 unset(
$conf->modules[$module]);
455 foreach ($modulepartkeys as $modulepartkey) {
456 unset(
$conf->modules_parts[$modulepartkey][$module]);
458 if ($module ==
'fournisseur') {
459 $conf->supplier_order->enabled = 0;
460 $conf->supplier_invoice->enabled = 0;
461 unset(
$conf->modules[
'supplier_order']);
462 unset(
$conf->modules[
'supplier_invoice']);
470$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
471if (is_array($modulepart) && count($modulepart) > 0) {
472 foreach (
$conf->modules as $module) {
473 if (in_array($module, $modulepart)) {
474 $modulepart = $module;
479if (is_array($modulepart)) {
490if (!defined(
'NOLOGIN')) {
494 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
495 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
498 if (empty($dolibarr_main_authentication)) {
499 $dolibarr_main_authentication =
'dolibarr';
502 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
503 $dolibarr_auto_user =
'auto';
507 $authmode = explode(
',', $dolibarr_main_authentication);
510 if (!count($authmode)) {
511 $langs->load(
'main');
512 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
519 $resultFetchUser =
'';
521 $dol_authmode =
null;
523 if (!isset($_SESSION[
"dol_login"])) {
525 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
527 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
529 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
530 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
531 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
532 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
533 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
534 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
535 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
536 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
540 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
541 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
543 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
544 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
545 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
546 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
547 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
548 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
549 header(
"Location: ".$url);
556 $hookmanager->initHooks(array(
'login'));
557 $parameters = array();
558 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
565 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
569 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
573 $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());
574 $fullpathclassfile =
'';
575 foreach ($dirModCaptcha as $dir) {
576 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
577 if ($fullpathclassfile) {
583 if ($fullpathclassfile) {
584 include_once $fullpathclassfile;
588 $classname =
"modCaptcha".ucfirst($captcha);
589 if (class_exists($classname)) {
591 $captchaobj =
new $classname($db,
$conf, $langs, $user);
592 '@phan-var-force ModeleCaptcha $captchaobj';
594 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
595 $ok = $captchaobj->validateCodeAfterLoginSubmit();
597 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
602 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
607 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
614 dol_syslog(
'--- Security warning: Bad value for code, connection refused', LOG_NOTICE);
616 $langs->loadLangs(array(
'main',
'errors'));
618 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
622 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
625 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
633 $hookmanager->initHooks(array(
'login'));
634 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
635 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
644 $allowedmethodtopostusername = 3;
645 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
646 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
649 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
650 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
654 $goontestloop =
false;
655 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
656 $goontestloop =
true;
658 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
659 $goontestloop =
true;
661 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
662 $goontestloop =
true;
664 if (
GETPOST(
'openid_mode',
'alpha')) {
665 $goontestloop =
true;
667 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
668 $goontestloop =
true;
670 if (!empty($_COOKIE[
'login_dolibarr'])) {
671 $goontestloop =
true;
674 if (!is_object($langs)) {
675 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
678 if (defined(
'MAIN_LANG_DEFAULT')) {
679 $langcode = constant(
'MAIN_LANG_DEFAULT');
681 $langs->setDefaultLang($langcode);
685 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
688 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);
694 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
697 $oauthmodetotestarray = array(
'google');
698 foreach ($oauthmodetotestarray as $oauthmodetotest) {
699 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
701 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
704 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);
705 foreach ($authmode as $tmpkey => $tmpval) {
706 if ($tmpval == $oauthmodetotest.
'oauth') {
707 unset($authmode[$tmpkey]);
716 if ($login ===
'--bad-login-validity--') {
721 $dol_authmode =
$conf->authmode;
722 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
723 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
724 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
725 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
726 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
729 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
730 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
731 if ($dol_dst_first && $dol_dst_second) {
732 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
736 if ($datenow >= $datefirst && $datenow < $datesecond) {
740 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
741 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
746 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
748 $langs->loadLangs(array(
'main',
'errors'));
752 if (empty($_SESSION[
"dol_loginmesg"])) {
753 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
757 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
760 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
768 $hookmanager->initHooks(array(
'login'));
769 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
770 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
780 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
782 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);
783 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
788 return 'ERROR_NOT_LOGGED';
790 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
791 http_response_code(401);
795 dol_loginfunction($langs,
$conf, (!empty($mysoc) ? $mysoc :
''));
800 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
802 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
803 dol_syslog(
'User not found or not valid, connection refused');
805 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
806 session_name($sessionname);
809 if ($resultFetchUser == 0) {
811 $langs->loadLangs(array(
'main',
'errors'));
813 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
815 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
816 } elseif ($resultFetchUser < 0) {
817 $_SESSION[
"dol_loginmesg"] = $user->error;
819 $user->context[
'audit'] = $user->error;
822 $langs->loadLangs(array(
'main',
'errors'));
824 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
826 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
830 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
839 $hookmanager->initHooks(array(
'login'));
840 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
841 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
846 $paramsurl = array();
848 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
851 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
854 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
856 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
860 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
861 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
866 $login = $_SESSION[
"dol_login"];
867 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
868 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
870 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
874 if ($resultFetchUser <= 0
875 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
876 || ($user->status != $user::STATUS_ENABLED)
877 || ($user->isNotIntoValidityDateRange())) {
878 if ($resultFetchUser <= 0) {
880 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
881 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
883 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
884 } elseif ($user->status != $user::STATUS_ENABLED) {
889 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
892 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
893 session_name($sessionname);
896 if ($resultFetchUser == 0) {
897 $langs->loadLangs(array(
'main',
'errors'));
899 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
901 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
902 } elseif ($resultFetchUser < 0) {
903 $_SESSION[
"dol_loginmesg"] = $user->error;
905 $user->context[
'audit'] = $user->error;
907 $langs->loadLangs(array(
'main',
'errors'));
909 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
911 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
915 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
923 $hookmanager->initHooks(array(
'login'));
924 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
925 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
930 $paramsurl = array();
932 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
935 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
938 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
941 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
945 $hookmanager->initHooks(array(
'main'));
948 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
949 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
950 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
952 if (constant(
'DOL_URL_ROOT')) {
953 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
955 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
956 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
960 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
961 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
962 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
964 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
965 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
966 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
968 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
969 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
970 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
972 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
973 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
974 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
976 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
977 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
978 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
981 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
982 if (empty($_SESSION[
'pageforbacktolist'])) {
983 $pageforbacktolistarray = array();
985 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
987 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
988 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
989 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
990 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
995 $parameters = array();
996 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1005 if (!isset($_SESSION[
"dol_login"])) {
1010 $_SESSION[
"dol_login"] = $user->login;
1011 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1012 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1013 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1014 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1015 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1016 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1017 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1018 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1019 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1020 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1022 $_SESSION[
"dol_entity"] =
$conf->entity;
1024 if (!empty($dol_hide_topmenu)) {
1025 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1027 if (!empty($dol_hide_leftmenu)) {
1028 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1030 if (!empty($dol_optimize_smallscreen)) {
1031 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1033 if (!empty($dol_no_mouse_hover)) {
1034 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1036 if (!empty($dol_use_jmobile)) {
1037 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1040 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1044 $user->update_last_login_date();
1046 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1047 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1050 $user->context[
'audit'] = $loginfo;
1051 $user->context[
'authentication_method'] = $dol_authmode;
1054 $result = $user->call_trigger(
'USER_LOGIN', $user);
1062 $hookmanager->initHooks(array(
'login'));
1063 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1064 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1072 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1080 if (!empty($landingpage)) {
1082 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1083 header(
'Location: '.$newpath);
1092 $user->rights->user->user->lire = 1;
1093 $user->rights->user->user->creer = 1;
1094 $user->rights->user->user->password = 1;
1095 $user->rights->user->user->supprimer = 1;
1096 $user->rights->user->self->creer = 1;
1097 $user->rights->user->self->password = 1;
1101 if (!$user->hasRight(
'user',
'user_advance')) {
1102 $user->rights->user->user_advance =
new stdClass();
1104 if (!$user->hasRight(
'user',
'self_advance')) {
1105 $user->rights->user->self_advance =
new stdClass();
1107 if (!$user->hasRight(
'user',
'group_advance')) {
1108 $user->rights->user->group_advance =
new stdClass();
1111 $user->rights->user->user_advance->readperms = 1;
1112 $user->rights->user->user_advance->write = 1;
1113 $user->rights->user->self_advance->readperms = 1;
1114 $user->rights->user->self_advance->writeperms = 1;
1115 $user->rights->user->group_advance->read = 1;
1116 $user->rights->user->group_advance->readperms = 1;
1117 $user->rights->user->group_advance->write = 1;
1118 $user->rights->user->group_advance->delete = 1;
1127 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1130 if ((
int)
$conf->liste_limit <= 0) {
1132 $conf->liste_limit = 15;
1133 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1134 $conf->liste_limit = 8;
1135 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1136 $conf->liste_limit = 10;
1137 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1138 $conf->liste_limit = 20;
1142 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1149 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1153 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1154 $user->loadDefaultValues();
1160if (
GETPOST(
'theme',
'aZ09')) {
1162 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1167 $conf->use_javascript_ajax = 0;
1178 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1188if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1189 $conf->dol_hide_leftmenu = 1;
1191if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1192 $conf->dol_hide_topmenu = 1;
1194if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1195 $conf->dol_optimize_smallscreen = 1;
1197if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1198 $conf->dol_no_mouse_hover = 1;
1200if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1201 $conf->dol_use_jmobile = 1;
1204if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1205 $conf->dol_no_mouse_hover = 1;
1209if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1210 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1211 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1214 $conf->dol_optimize_smallscreen = 1;
1217 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1221if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1222 $conf->theme =
'eldy';
1223 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1226if (!defined(
'NOREQUIRETRAN')) {
1227 if (!
GETPOST(
'lang',
'aZ09')) {
1229 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1232 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1233 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1239if (!defined(
'NOLOGIN')) {
1242 if (!$user->login) {
1247 if ($user->statut < 1) {
1249 $langs->loadLangs(array(
"errors",
"other"));
1250 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1255 $user->loadRights();
1258dol_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);
1263if (!defined(
'NOREQUIRETRAN')) {
1265 $langs->loadLangs(array(
'main',
'dict'));
1269$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1270$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1271$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1283if (empty(
$conf->browser->firefox)) {
1284 define(
'ROWS_1', 1);
1285 define(
'ROWS_2', 2);
1286 define(
'ROWS_3', 3);
1287 define(
'ROWS_4', 4);
1288 define(
'ROWS_5', 5);
1289 define(
'ROWS_6', 6);
1290 define(
'ROWS_7', 7);
1291 define(
'ROWS_8', 8);
1292 define(
'ROWS_9', 9);
1294 define(
'ROWS_1', 0);
1295 define(
'ROWS_2', 1);
1296 define(
'ROWS_3', 2);
1297 define(
'ROWS_4', 3);
1298 define(
'ROWS_5', 4);
1299 define(
'ROWS_6', 5);
1300 define(
'ROWS_7', 6);
1301 define(
'ROWS_8', 7);
1302 define(
'ROWS_9', 8);
1305$heightforframes = 52;
1308if (!defined(
'NOREQUIREMENU')) {
1309 if (empty($user->socid)) {
1317 $file_menu =
$conf->standard_menu;
1318 if (
GETPOST(
'menu',
'alpha')) {
1319 $file_menu =
GETPOST(
'menu',
'alpha');
1322 if (!class_exists(
'MenuManager')) {
1324 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1325 foreach ($dirmenus as $dirmenu) {
1327 if (class_exists(
'MenuManager')) {
1331 if (!class_exists(
'MenuManager')) {
1332 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1333 $file_menu =
'eldy_menu.php';
1334 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1338 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1343if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1344 $message =
GETPOST(
'seteventmessages',
'alpha');
1345 $messages = explode(
',', $message);
1346 foreach ($messages as $key => $msg) {
1347 $tmp = explode(
':', $msg);
1354if (!function_exists(
"llxHeader")) {
1378 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1380 global
$conf, $hookmanager;
1382 $parameters = array(
1384 'title' => & $title,
1385 'help_url' => & $help_url,
1386 'target' => & $target,
1387 'disablejs' => & $disablejs,
1388 'disablehead' => & $disablehead,
1389 'arrayofjs' => & $arrayofjs,
1390 'arrayofcss' => & $arrayofcss,
1391 'morequerystring' => & $morequerystring,
1392 'morecssonbody' => & $morecssonbody,
1393 'replacemainareaby' => & $replacemainareaby,
1394 'disablenofollow' => & $disablenofollow,
1395 'disablenoindex' => & $disablenoindex
1398 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1400 print $hookmanager->resPrint;
1405 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1407 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1409 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1411 if ($mainmenu !=
'website') {
1412 $tmpcsstouse = $morecssonbody;
1417 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1420 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1421 $tmpcsstouse .=
' dol_openinpopup';
1424 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1427 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1428 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1431 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1432 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1436 if ($replacemainareaby) {
1437 print $replacemainareaby;
1455 global $db,
$conf, $hookmanager;
1457 if ($contenttype ==
'text/html') {
1458 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1460 header(
"Content-Type: ".$contenttype);
1466 header(
"X-Content-Type-Options: nosniff");
1469 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1470 header(
"X-Frame-Options: SAMEORIGIN");
1472 header(
"X-Frame-Options: ALLOWALL");
1476 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1477 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1478 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1479 header(
'Vary: Origin');
1486 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1501 if (!is_object($hookmanager)) {
1502 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1505 $hookmanager->initHooks(array(
"main"));
1507 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1508 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1510 $contentsecuritypolicy = $hookmanager->resPrint;
1512 $contentsecuritypolicy .= $hookmanager->resPrint;
1515 if (!empty($contentsecuritypolicy)) {
1516 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1519 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1523 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1538 if (!is_object($hookmanager)) {
1539 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1542 $hookmanager->initHooks(array(
"main"));
1544 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1545 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1547 $contentsecuritypolicy = $hookmanager->resPrint;
1549 $contentsecuritypolicy .= $hookmanager->resPrint;
1552 if (!empty($contentsecuritypolicy)) {
1553 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1556 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1563 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1566 header(
"Referrer-Policy: ".$referrerpolicy);
1569 if ($forcenocache) {
1570 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1592function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1594 global $db,
$conf, $langs, $user, $mysoc, $hookmanager;
1598 if (empty(
$conf->css)) {
1599 $conf->css =
'/theme/eldy/style.css.php';
1602 print
'<!doctype html>'.
"\n";
1604 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1607 if (empty($disablehead)) {
1608 if (!is_object($hookmanager)) {
1609 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1612 $hookmanager->initHooks(array(
"main"));
1614 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1618 if (
GETPOST(
'dol_basehref',
'alpha')) {
1619 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1623 print
'<meta charset="utf-8">'.
"\n";
1624 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1625 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1626 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1627 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1628 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1630 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1633 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1634 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1635 if (!empty($mysoc->logo_squarred_mini)) {
1636 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1641 if (empty(
$conf->dol_use_jmobile)) {
1642 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1643 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1647 $manifest = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/manifest.json.php';
1648 $parameters = array(
'manifest' => $manifest);
1649 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1651 $manifest = $hookmanager->resPrint;
1653 $manifest .= $hookmanager->resPrint;
1655 if (!empty($manifest)) {
1656 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1660 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1665 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1669 $appli = constant(
'DOL_APPLICATION_TITLE');
1672 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1685 $parameters = array(
'title' => $titletoshow);
1686 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1688 $titletoshow = $hookmanager->resPrint;
1690 $titletoshow .= $hookmanager->resPrint;
1699 $ext =
'version='.GETPOSTINT(
'version');
1702 if (
GETPOST(
'dol_resetcache')) {
1703 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1707 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1709 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1710 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1711 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1713 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1714 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1716 if (GETPOSTISSET(
'dol_openinpopup')) {
1717 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1719 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1720 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1722 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1723 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1725 if (GETPOSTISSET(
'dol_use_jmobile')) {
1726 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1729 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1730 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1732 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1733 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1737 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1738 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1741 if (!defined(
'DISABLE_JQUERY') && !$disablejs &&
$conf->use_javascript_ajax) {
1742 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1743 if (!defined(
'DISABLE_JQUERY_UI')) {
1744 $jquerytheme =
'base';
1748 if (constant(
'JS_JQUERY_UI')) {
1749 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1751 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1754 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1755 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1757 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1759 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1763 if (!defined(
'DISABLE_FONT_AWSOME')) {
1764 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1765 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1766 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1772 if (!empty(
$conf->modules_parts[
'theme'])) {
1773 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1776 $themesubdir = $reldir;
1782 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1783 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1784 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1788 print
'<!-- Includes CSS that does not exists as a workaround of flash bug of chrome -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="filethatdoesnotexiststosolvechromeflashbug">'.
"\n";
1793 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1794 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1798 if (!empty(
$conf->modules_parts[
'css'])) {
1799 $arraycss = (array)
$conf->modules_parts[
'css'];
1800 foreach ($arraycss as $modcss => $filescss) {
1801 $filescss = (array) $filescss;
1802 foreach ($filescss as $cssfile) {
1803 if (empty($cssfile)) {
1804 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1808 if ($urlforcss && $urlforcss !=
'/') {
1809 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1811 if (!preg_match(
'/\.css$/i', $cssfile)) {
1816 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1822 if (is_array($arrayofcss)) {
1823 foreach ($arrayofcss as $cssfile) {
1824 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1825 $urltofile = $cssfile;
1829 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1831 if (!preg_match(
'/\.css$/i', $cssfile)) {
1841 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1845 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty(
$conf->use_javascript_ajax)) {
1847 print
'<!-- Includes JS for JQuery -->'.
"\n";
1848 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1849 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1851 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1853 if (!defined(
'DISABLE_JQUERY_UI')) {
1854 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1855 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1857 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1861 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1862 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1865 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1866 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1870 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1874 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1875 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1876 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1877 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1878 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1879 print
'<script>'.
"\n";
1880 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1881 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1882 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1883 print 'var placeholderInPlace = \
' \';'.
"\n";
1884 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1885 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1886 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".
$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1887 print
'var withInPlace = 300;';
1888 print
'</script>'.
"\n";
1889 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1890 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1893 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1894 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1895 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1897 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1900 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1902 if (!defined(
'DISABLE_MULTISELECT')) {
1903 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1907 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
1909 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1910 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1911 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1912 $jsckeditor =
'ckeditor.js';
1913 if (constant(
'JS_CKEDITOR')) {
1915 $pathckeditor = constant(
'JS_CKEDITOR');
1917 print
'<script nonce="'.getNonce().
'">';
1918 print
'/* enable ckeditor by main.inc.php */';
1919 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1920 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1921 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1922 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";
1923 print
'</script>'.
"\n";
1924 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1926 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1927 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1929 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1931 print
'</script>'.
"\n";
1935 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1936 $enablebrowsernotif =
false;
1938 $enablebrowsernotif =
true;
1940 if (
$conf->browser->layout ==
'phone') {
1941 $enablebrowsernotif =
false;
1943 if ($enablebrowsernotif) {
1944 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1945 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1950 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1951 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
1952 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang . ($ext ?
'&' . $ext :
'') .
'"></script>' .
"\n";
1957 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1958 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1962 if (!empty(
$conf->modules_parts[
'js'])) {
1963 $arrayjs = (array)
$conf->modules_parts[
'js'];
1964 foreach ($arrayjs as $modjs => $filesjs) {
1965 $filesjs = (array) $filesjs;
1966 foreach ($filesjs as $jsfile) {
1969 if ($urlforjs && $urlforjs !=
'/') {
1970 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1971 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1973 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1979 if (is_array($arrayofjs)) {
1980 print
'<!-- Includes JS added by page -->'.
"\n";
1981 foreach ($arrayofjs as $jsfile) {
1982 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1983 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1985 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1994 if (file_exists($theme_js)) {
1995 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1999 if (!empty($head)) {
2006 $parameters = array();
2007 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2008 print $hookmanager->resPrint;
2010 print
"</head>\n\n";
2013 $conf->headerdone = 1;
2033function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2035 global $user,
$conf, $langs, $db, $form;
2037 global $hookmanager, $menumanager;
2042 $hookmanager->initHooks(array(
'toprightmenu'));
2047 if (empty(
$conf->headerdone)) {
2048 $disablenofollow = 0;
2049 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2050 print
'<body id="mainbody">';
2056 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2057 if (!isset($form) || !is_object($form)) {
2058 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2059 $form =
new Form($db);
2062 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2064 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2067 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2069 $menumanager->atarget = $target;
2071 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2075 $appli = constant(
'DOL_APPLICATION_TITLE');
2078 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2080 $appli .=
" ".DOL_VERSION;
2084 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2088 $logouthtmltext =
'';
2091 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2092 if (
$conf->browser->name ==
'chrome') {
2093 $stringforfirstkey .=
' ALT +';
2094 } elseif (
$conf->browser->name ==
'firefox') {
2095 $stringforfirstkey .=
' ALT + SHIFT +';
2097 $stringforfirstkey .=
' CTL +';
2099 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2100 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2101 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2102 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2103 $logouttext .=
'</a>';
2105 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2106 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2111 print
'<div class="login_block usedropdown">'.
"\n";
2115 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2118 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2138 $toprightmenu .=
'</div>';
2140 $toprightmenu .=
'</div>'.
"\n";
2144 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2147 $parameters = array();
2148 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2149 if (is_numeric($result)) {
2151 $toprightmenu .= $hookmanager->resPrint;
2153 $toprightmenu = $hookmanager->resPrint;
2156 $toprightmenu .= $result;
2160 if (isModEnabled(
'modulebuilder')) {
2161 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2163 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2166 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2173 if (isset($_POST) && is_array($_POST)) {
2174 foreach ($_POST as $key => $value) {
2175 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2176 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2179 if (!is_array($value)) {
2180 if ($value !==
'') {
2181 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2184 foreach ($value as $value2) {
2185 if (($value2 !==
'') && (!is_array($value2))) {
2186 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2192 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2193 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2195 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2198 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2203 $langs->load(
"help");
2210 if (empty($helppagename)) {
2211 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2213 $helppresent =
'helppresent';
2218 $helpbaseurl = $arrayres[
'helpbaseurl'];
2219 $helppage = $arrayres[
'helppage'];
2220 $mode = $arrayres[
'mode'];
2223 if ($helpbaseurl && $helppage) {
2225 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2226 if ($mode ==
'wiki') {
2227 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2229 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2231 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2234 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2235 if ($mode ==
'wiki') {
2237 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2240 $text .= sprintf($helpbaseurl, $helppage);
2243 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2244 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2247 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2252 $langs->load(
'admin');
2253 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2259 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2261 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2266 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2269 $toprightmenu .=
'</div>';
2273 $toprightmenu .=
'<div class="login_block_user">';
2276 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2281 $toprightmenu .=
'</div>';
2283 $toprightmenu .=
'</div>'.
"\n";
2286 print $toprightmenu;
2293 print
'<div style="clear: both;"></div>';
2294 print
"<!-- End top horizontal menu -->\n\n";
2297 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2298 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2312 global $langs,
$conf, $db, $hookmanager, $user, $mysoc;
2314 global $menumanager, $form;
2317 if (
$conf->browser->name ==
'textbrowser') {
2321 $langs->load(
'companies');
2323 $userImage = $userDropDownImage =
'';
2324 if (!empty($user->photo) || isModEnabled(
'gravatar')) {
2325 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2326 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2328 $nophoto =
'/public/theme/common/user_anonymous.png';
2329 if ($user->gender ==
'man') {
2330 $nophoto =
'/public/theme/common/user_man.png';
2332 if ($user->gender ==
'woman') {
2333 $nophoto =
'/public/theme/common/user_woman.png';
2336 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2337 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2341 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2342 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2344 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2346 while ($idprofcursor < 10) {
2348 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2349 if ($idprofcursor == 1) {
2350 $constkeyforprofid =
'MAIN_INFO_SIREN';
2352 if ($idprofcursor == 2) {
2353 $constkeyforprofid =
'MAIN_INFO_SIRET';
2355 if ($idprofcursor == 3) {
2356 $constkeyforprofid =
'MAIN_INFO_APE';
2358 if ($idprofcursor == 4) {
2359 $constkeyforprofid =
'MAIN_INFO_RCS';
2361 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2366 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid),
'1').
'</span>';
2370 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2371 if (isModEnabled(
'multicurrency')) {
2372 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
$conf->currency.
'</span>';
2374 $dropdownBody .=
'</div>';
2376 $dropdownBody .=
'<br>';
2377 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2378 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2381 if (!empty($user->admin)) {
2382 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2385 if (!empty($user->socid)) {
2386 $thirdpartystatic =
new Societe($db);
2387 $thirdpartystatic->fetch($user->socid);
2388 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2389 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2391 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2392 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2393 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2394 $dropdownBody .=
'<br>';
2396 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2397 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2399 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2401 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2402 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2403 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2404 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2406 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2408 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2410 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2411 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2412 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2417 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2418 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2419 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
$conf->browser->layout;
2420 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2421 if (
$conf->browser->layout ==
'phone') {
2422 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2424 if (!empty($_SESSION[
"disablemodules"])) {
2425 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2427 $dropdownBody .=
'</div>';
2430 $parameters = array(
'user' => $user,
'langs' => $langs);
2431 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2432 if (is_numeric($result)) {
2434 $dropdownBody .= $hookmanager->resPrint;
2436 $dropdownBody = $hookmanager->resPrint;
2440 if (empty($urllogout)) {
2441 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2446 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2447 if (
$conf->browser->name ==
'chrome') {
2448 $stringforfirstkey .=
' ALT +';
2449 } elseif (
$conf->browser->name ==
'firefox') {
2450 $stringforfirstkey .=
' ALT + SHIFT +';
2452 $stringforfirstkey .=
' CTL +';
2456 $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").
' ('.$stringforfirstkey.
' u)').
'"><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2457 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2458 $jsonopen =
"closeTopMenuLoginDropdown()";
2459 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.$stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.$stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover', $jsonopen,
'',
'v');
2460 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt pictofixedwidth"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2462 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2463 if (!empty($user->admin)) {
2464 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2468 $appli = constant(
'DOL_APPLICATION_TITLE');
2471 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2473 $appli .=
" ".DOL_VERSION;
2477 $btnUser =
'<!-- div for user link -->
2478 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2479 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2480 '.$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>' :
'').
'
2482 <div class="dropdown-menu">
2484 <div class="user-header">
2485 '.$userDropDownImage.
'
2487 '.$profilName.
'<br>';
2489 if ($user->datelastlogin) {
2490 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2491 if ($user->datepreviouslogin) {
2492 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2495 $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>';
2496 if ($user->datepreviouslogin) {
2497 $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>';
2505 <!-- Menu Body user-->
2506 <div class="user-body">'.$dropdownBody.
'</div>
2509 <div class="user-footer">
2510 <div class="pull-left">
2513 <div class="pull-left">
2514 '.$virtuelcardLink.
'
2516 <div class="pull-right">
2519 <div class="clearboth"></div>
2525 $btnUser =
'<!-- div for user link text browser -->
2526 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2527 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2528 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2533 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2535 <!-- Code to show/hide the user drop-down -->
2537 function closeTopMenuLoginDropdown() {
2538 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2540 jQuery("#topmenu-login-dropdown").removeClass("open");
2542 jQuery(document).ready(function() {
2543 jQuery(document).on("click", function(event) {
2544 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2545 /* console.log("click close login - we click outside"); */
2546 closeTopMenuLoginDropdown();
2553 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2554 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2555 event.preventDefault();
2556 jQuery("#topmenu-login-dropdown").toggleClass("open");
2559 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2560 console.log("Click on #topmenulogincompanyinfo-btn");
2561 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2562 jQuery("#topmenuloginmoreinfo").slideToggle();
2564 jQuery("#topmenulogincompanyinfo").slideToggle();
2567 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2568 console.log("Click on #topmenuloginmoreinfo-btn");
2569 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2570 jQuery("#topmenulogincompanyinfo").slideToggle();
2572 jQuery("#topmenuloginmoreinfo").slideToggle();
2592 global
$conf, $langs;
2603 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2604 if (
$conf->browser->os ===
'macintosh') {
2605 $stringforfirstkey .=
' CTL +';
2607 if (
$conf->browser->name ==
'chrome') {
2608 $stringforfirstkey .=
' ALT +';
2609 } elseif (
$conf->browser->name ==
'firefox') {
2610 $stringforfirstkey .=
' ALT + SHIFT +';
2612 $stringforfirstkey .=
' CTL +';
2616 if (!empty(
$conf->use_javascript_ajax)) {
2617 $html .=
'<!-- div for quick add link -->
2618 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2619 <a accesskey="a" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$stringforfirstkey.
' a)"><i class="fa fa-plus-circle"></i></a>
2622 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2624 <!-- Code to show/hide the user drop-down for the quick add -->
2626 jQuery(document).ready(function() {
2627 jQuery(document).on("click", function(event) {
2628 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2629 /* console.log("click close quick add - we click outside"); */
2631 $("#topmenu-quickadd-dropdown").removeClass("open");
2634 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2635 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2636 openQuickAddDropDown(event);
2640 $(document).keydown(function(event){
2641 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2642 if (ostype ===
"macintosh") {
2643 if ( event.which === 65 && event.ctrlKey ) {
2644 console.log(\
'control + a : trigger open quick add dropdown\');
2645 openQuickAddDropDown(event);
2648 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2649 console.log(\'control + shift + a : trigger open quick add dropdown\');
2650 openQuickAddDropDown(event);
2655 var openQuickAddDropDown = function(event) {
2656 event.preventDefault();
2657 $("#topmenu-quickadd-dropdown").toggleClass("open");
2677 global
$conf, $langs;
2688 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2689 if (
$conf->browser->os ===
'macintosh') {
2690 $stringforfirstkey .=
' CTL +';
2692 if (
$conf->browser->name ==
'chrome') {
2693 $stringforfirstkey .=
' ALT +';
2694 } elseif (
$conf->browser->name ==
'firefox') {
2695 $stringforfirstkey .=
' ALT + SHIFT +';
2697 $stringforfirstkey .=
' CTL +';
2702 if (!empty(
$conf->use_javascript_ajax)) {
2703 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2708 $html .=
'<!-- div for link to upload file -->
2709 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2710 <a accesskey="i" class="dropdown-togglex login-dropdown-a nofocusvisible" data-toggle="dropdown" href="'.$urlforuploadpage.
'" title="'.$langs->trans(
'UploadFile').
' ('.$stringforfirstkey.
' i)"><i class="fa fa-upload"></i></a>
2726 global $user, $langs, $hookmanager;
2731 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2732 "title" =>
"MenuNewMember@members",
2733 "name" =>
"Adherent@members",
2734 "picto" =>
"object_member",
2735 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2739 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2740 "title" =>
"MenuNewThirdParty@companies",
2741 "name" =>
"ThirdParty@companies",
2742 "picto" =>
"object_company",
2743 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2747 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2748 "title" =>
"NewContactAddress@companies",
2749 "name" =>
"Contact@companies",
2750 "picto" =>
"object_contact",
2751 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2755 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2756 "title" =>
"NewPropal@propal",
2757 "name" =>
"Proposal@propal",
2758 "picto" =>
"object_propal",
2759 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2764 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2765 "title" =>
"NewOrder@orders",
2766 "name" =>
"Order@orders",
2767 "picto" =>
"object_order",
2768 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2772 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2773 "title" =>
"NewBill@bills",
2774 "name" =>
"Bill@bills",
2775 "picto" =>
"object_bill",
2776 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2780 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2781 "title" =>
"NewContractSubscription@contracts",
2782 "name" =>
"Contract@contracts",
2783 "picto" =>
"object_contract",
2784 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2788 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2789 "title" =>
"SupplierProposalNew@supplier_proposal",
2790 "name" =>
"SupplierProposal@supplier_proposal",
2791 "picto" =>
"supplier_proposal",
2792 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2796 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2797 "title" =>
"NewSupplierOrderShort@orders",
2798 "name" =>
"SupplierOrder@orders",
2799 "picto" =>
"supplier_order",
2800 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2804 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2805 "title" =>
"NewBill@bills",
2806 "name" =>
"SupplierBill@bills",
2807 "picto" =>
"supplier_invoice",
2808 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2812 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2813 "title" =>
"NewTicket@ticket",
2814 "name" =>
"Ticket@ticket",
2815 "picto" =>
"ticket",
2816 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2820 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2821 "title" =>
"NewIntervention@interventions",
2822 "name" =>
"Intervention@interventions",
2823 "picto" =>
"intervention",
2824 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2828 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2829 "title" =>
"NewProduct@products",
2830 "name" =>
"Product@products",
2831 "picto" =>
"object_product",
2832 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2836 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2837 "title" =>
"NewService@products",
2838 "name" =>
"Service@products",
2839 "picto" =>
"object_service",
2840 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2844 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2845 "title" =>
"AddUser@users",
2846 "name" =>
"User@users",
2848 "activation" => $user->hasRight(
"user",
"user",
"write"),
2854 $dropDownQuickAddHtml =
'';
2858 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2860 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2863 $parameters = array();
2864 $hook_items = $items;
2865 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2866 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2867 if ($reshook == 0) {
2868 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2870 $items = $hookmanager->resArray;
2874 $position = array();
2875 foreach ($items[
'items'] as $key => $row) {
2876 $position[$key] = $row[
'position'];
2878 $array1_sort_order = SORT_ASC;
2879 array_multisort($position, $array1_sort_order, $items[
'items']);
2882 foreach ($items[
'items'] as $item) {
2883 if (!$item[
'activation']) {
2886 $langs->load(explode(
'@', $item[
'title'])[1]);
2887 $langs->load(explode(
'@', $item[
'name'])[1]);
2888 $dropDownQuickAddHtml .=
'
2889 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2890 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2895 $dropDownQuickAddHtml .=
'</div>';
2897 $dropDownQuickAddHtml .=
'</div>';
2899 return $dropDownQuickAddHtml;
2909 global $langs,
$conf, $user;
2914 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2925 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2926 if (
$conf->browser->os ===
'macintosh') {
2927 $stringforfirstkey .=
' CTL +';
2929 if (
$conf->browser->name ==
'chrome') {
2930 $stringforfirstkey .=
' ALT +';
2931 } elseif (
$conf->browser->name ==
'firefox') {
2932 $stringforfirstkey .=
' ALT + SHIFT +';
2934 $stringforfirstkey .=
' CTL +';
2938 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2939 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2940 $langs->load(
"bookmarks");
2943 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2947 $html .=
'<!-- div for bookmark link -->
2948 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2949 <a accesskey="b" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.$stringforfirstkey.
' b)"><i class="fa fa-star"></i></a>
2950 <div class="dropdown-menu">
2956 <!-- Code to show/hide the bookmark drop-down -->
2958 jQuery(document).ready(function() {
2959 jQuery(document).on("click", function(event) {
2960 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2961 /* console.log("close bookmark dropdown - we click outside"); */
2963 $("#topmenu-bookmark-dropdown").removeClass("open");
2967 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2968 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2969 openBookMarkDropDown(event);
2973 jQuery(document).keydown(function(event) {
2974 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2975 if (ostype ===
"macintosh") {
2976 if ( event.which === 66 && event.ctrlKey ) {
2977 console.log(
"Click on control + b : trigger open bookmark dropdown");
2978 openBookMarkDropDown(event);
2981 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2982 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2983 openBookMarkDropDown(event);
2988 var openBookMarkDropDown =
function(event) {
2989 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2990 event.preventDefault();
2991 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2992 jQuery(
"#top-bookmark-search-input").focus();
3008function top_menu_search()
3010 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3015 $arrayresult = array();
3016 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3018 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3019 // accesskey is for Mac: CTRL + key for all browsers
3020 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3021 if ($conf->browser->name == 'chrome
') {
3022 $stringforfirstkey .= ' ALT +
';
3023 } elseif ($conf->browser->name == 'firefox
') {
3024 $stringforfirstkey .= ' ALT + SHIFT +
';
3026 $stringforfirstkey .= ' CTL +
';
3029 $searchInput = '<input
type=
"search" name=
"search_all"'.($stringforfirstkey ? ' title=
"'.dol_escape_htmltag($stringforfirstkey.' s').'"' : '').' id=
"top-global-search-input" class=
"dropdown-search-input search_component_input" placeholder=
"'.$langs->trans('Search').'" autocomplete=
"off">
';
3031 $defaultAction = '';
3032 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3033 // Menu with all searchable items
3034 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3035 foreach ($arrayresult as $keyItem => $item) {
3036 if (empty($defaultAction)) {
3037 $defaultAction = $item['url
'];
3039 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3040 $buttonList .= $item['text
'];
3041 $buttonList .= '</
button>
';
3043 $buttonList .= '</div>
';
3045 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3048 <!-- search input -->
3049 <div
class=
"dropdown-header search-dropdown-header">
3055 <!--
Menu Body search -->
3056 <div
class=
"dropdown-body search-dropdown-body">
3061 $dropDownHtml .= '</form>
';
3063 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3064 // accesskey is for Mac: CTRL + key for all browsers
3065 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3066 if ($conf->browser->name == 'chrome
') {
3067 $stringforfirstkey .= ' ALT +
';
3068 } elseif ($conf->browser->name == 'firefox
') {
3069 $stringforfirstkey .= ' ALT + SHIFT +
';
3071 $stringforfirstkey .= ' CTL +
';
3074 $html .= '<!-- div
for Global Search -->
3075 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3076 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3077 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3079 <div
class=
"dropdown-menu dropdown-search">
3085 <!-- Code to show/hide the
user drop-down -->
3087 jQuery(document).ready(
function() {
3090 jQuery(
"#top-global-search-input").keydown(
function (e) {
3091 if (e.keyCode == 13 || e.keyCode == 40) {
3092 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3093 if (inputs[inputs.index(this) + 1] != null) {
3094 console.log(
"Force focus after keydow on #top-global-search-input");
3095 inputs[inputs.index(this) + 1].focus();
3096 if (e.keyCode == 13){
3097 inputs[inputs.index(this) + 1].trigger(
"click");
3107 jQuery(document).keydown(
function(e) {
3109 var $focused = $(
":focus");
3110 if($focused.length && $focused.hasClass(
"global-search-item")){
3113 if (e.keyCode == 38) {
3115 console.log(
"Force focus after keycode 38");
3116 $focused.prev().focus();
3120 if (e.keyCode == 40) {
3122 console.log(
"Force focus after keycode 40");
3123 $focused.next().focus();
3130 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3131 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3132 jQuery(
"#top-menu-action-search").submit();
3136 jQuery(document).on(
"click",
function(event) {
3137 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3138 console.log(
"click close search - we click outside");
3140 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3145 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3146 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3147 openGlobalSearchDropDown();
3151 jQuery(document).keydown(
function(e){
3152 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3153 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3154 openGlobalSearchDropDown();
3156 if ( e.which === 70 && e.alKey ) {
3157 console.log(\'alt + f : trigger open global-search dropdown\');
3158 openGlobalSearchDropDown();
3162 var openGlobalSearchDropDown = function() {
3163 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3164 jQuery("#top-global-search-input").focus();
3188function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3190 global $user,
$conf, $langs, $db, $form;
3191 global $hookmanager, $menumanager;
3195 if (!empty($menu_array_before)) {
3196 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);
3199 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3201 $hookmanager->initHooks(array(
'leftblock'));
3203 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3206 if (!is_object($form)) {
3207 $form =
new Form($db);
3212 if (
$conf->browser->layout ==
'phone') {
3213 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3217 $arrayresult = array();
3218 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3223 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3224 if (
$conf->browser->name ==
'chrome') {
3225 $stringforfirstkey .=
' ALT +';
3226 } elseif (
$conf->browser->name ==
'firefox') {
3227 $stringforfirstkey .=
' ALT + SHIFT +';
3229 $stringforfirstkey .=
' CTL +';
3233 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3234 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, (
string) $selected,
'accesskey="s"', 1, 0, (
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 0 : 1),
'vmenusearchselectcombo', 1, $textsearch, 1, $stringforfirstkey.
' s');
3236 if (is_array($arrayresult)) {
3238 foreach ($arrayresult as $key => $val) {
3239 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3245 $parameters = array(
'searchform' => $searchform);
3246 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3247 if (empty($reshook)) {
3248 $searchform .= $hookmanager->resPrint;
3250 $searchform = $hookmanager->resPrint;
3255 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3256 $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>';
3258 $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>';
3259 $searchform .=
'<script>
3260 jQuery(document).ready(function () {
3261 jQuery("#divsearchforms1").click(function(){
3262 jQuery("#divsearchforms2").toggle();
3266 $searchform .=
'</div>';
3270 $searchform .=
'<script>
3271 jQuery(document).keydown(function(e){
3272 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3273 console.log(\'control + shift + f : trigger open global-search dropdown\');
3274 openGlobalSearchDropDown();
3276 if( (e.which === 83 || e.which === 115) && e.altKey ){
3277 console.log(\'alt + s : trigger open global-search dropdown\');
3278 openGlobalSearchDropDown();
3282 var openGlobalSearchDropDown = function() {
3283 jQuery("#searchselectcombo").select2(\'open\');
3289 print
'<!-- Begin left menu -->'.
"\n";
3291 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3295 $menumanager->menu_array = $menu_array_before;
3297 $menumanager->menu_array_after = $menu_array_after;
3300 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3303 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3308 print
"<!-- Begin Help Block-->\n";
3309 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3313 $doliurl =
'https://www.dolibarr.org';
3315 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3316 $doliurl =
'https://www.dolibarr.fr';
3318 if (preg_match(
'/es/i', $langs->defaultlang)) {
3319 $doliurl =
'https://www.dolibarr.es';
3321 if (preg_match(
'/de/i', $langs->defaultlang)) {
3322 $doliurl =
'https://www.dolibarr.de';
3324 if (preg_match(
'/it/i', $langs->defaultlang)) {
3325 $doliurl =
'https://www.dolibarr.it';
3327 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3328 $doliurl =
'https://www.dolibarr.gr';
3331 $appli = constant(
'DOL_APPLICATION_TITLE');
3334 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3336 $appli .=
" ".DOL_VERSION;
3344 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3346 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3348 print
'<span class="help">';
3356 print
'</div>'.
"\n";
3361 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3364 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3365 $bugbaseurl .=
'&title=';
3366 $bugbaseurl .= urlencode(
"Bug: ");
3367 $bugbaseurl .=
'&body=';
3368 $bugbaseurl .= urlencode(
"# Instructions\n");
3369 $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");
3370 $bugbaseurl .= urlencode(
"*Please:*\n");
3371 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3372 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3373 $bugbaseurl .= urlencode(
"\n");
3374 $bugbaseurl .= urlencode(
"\n");
3375 $bugbaseurl .= urlencode(
"# Bug\n");
3376 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3377 $bugbaseurl .= urlencode(
"\n");
3378 $bugbaseurl .= urlencode(
"## Environment\n");
3379 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3380 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3381 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3382 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3383 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3384 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3385 $bugbaseurl .= urlencode(
"\n");
3386 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3387 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3388 $bugbaseurl .= urlencode(
"\n");
3389 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3390 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3391 $bugbaseurl .= urlencode(
"\n");
3392 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3393 $bugbaseurl .= urlencode(
"[*Files*]\n");
3394 $bugbaseurl .= urlencode(
"\n");
3396 $bugbaseurl .= urlencode(
"\n");
3397 $bugbaseurl .= urlencode(
"## Report\n");
3405 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3406 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3407 if (empty($reshook)) {
3408 $bugbaseurl .= $hookmanager->resPrint;
3410 $bugbaseurl = $hookmanager->resPrint;
3413 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3414 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3419 print
"<!-- End Help Block-->\n";
3423 print
"<!-- End left menu -->\n";
3427 $parameters = array();
3428 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3429 print $hookmanager->resPrint;
3431 print
'</div></div> <!-- End side-nav id-left -->';
3435 print
'<!-- Begin right area -->'.
"\n";
3437 if (empty($leftmenuwithoutmainarea)) {
3451 global
$conf, $langs, $hookmanager;
3453 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3454 print
'<div id="id-right">';
3459 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3461 $hookmanager->initHooks(array(
'main'));
3462 $parameters = array();
3463 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3464 print $hookmanager->resPrint;
3467 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3472 $parameters = array();
3473 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3474 if (empty($reshook)) {
3475 print
'<!-- Begin show mysoc info header -->'.
"\n";
3476 print
'<div id="mysoc-info-header">'.
"\n";
3477 print
'<table class="centpercent div-table-responsive">'.
"\n";
3479 print
'<tr><td rowspan="0" class="width20p">';
3481 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'))).
'">';
3483 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3484 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3496 print
'</table>'.
"\n";
3497 print
'</div>'.
"\n";
3498 print
'<!-- End show mysoc info header -->'.
"\n";
3517 if (preg_match(
'/^http/i', $helppagename)) {
3519 $helpbaseurl =
'%s';
3520 $helppage = $helppagename;
3525 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3526 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3527 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3528 $helppage = $reg[1];
3531 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3532 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3533 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3534 $helppage = $reg[1];
3537 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3538 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3539 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3540 $helppage = $reg[1];
3543 if (empty($helppage)) {
3544 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3545 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3546 $helppage = $reg[1];
3551 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3571function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3573 global $langs, $user;
3576 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3577 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3578 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3579 if ($showtitlebefore) {
3580 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3582 $ret .=
'<div class="tagtd">';
3583 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3584 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3585 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3586 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3587 $ret .=
' placeholder="'.strip_tags($title).
'"';
3588 $ret .= ($autofocus ?
' autofocus' :
'');
3589 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3590 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3591 $ret .=
'<span class="fa fa-search"></span>';
3592 $ret .=
'</button>';
3594 $ret .=
"</form>\n";
3599if (!function_exists(
"llxFooter")) {
3613 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3615 global
$conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3616 global $delayedhtmlcontent;
3617 global $contextpage, $page, $limit, $mode;
3618 global $dolibarr_distrib;
3620 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3624 $parameters = array();
3625 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3626 if (empty($reshook)) {
3627 $llxfooter .= $hookmanager->resPrint;
3628 } elseif ($reshook > 0) {
3629 $llxfooter = $hookmanager->resPrint;
3640 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3642 foreach ($user->lastsearch_values_tmp as $key => $val) {
3643 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3644 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3645 if (empty($val[
'sortfield'])) {
3646 unset($val[
'sortfield']);
3648 if (empty($val[
'sortorder'])) {
3649 unset($val[
'sortorder']);
3651 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3652 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3653 unset($_SESSION[
'lastsearch_values_'.$key]);
3659 $relativepathstring = $_SERVER[
"PHP_SELF"];
3661 if (constant(
'DOL_URL_ROOT')) {
3662 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3664 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3665 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3666 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3667 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3668 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3669 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3670 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3672 if (!empty($contextpage)) {
3673 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3675 if (!empty($page) && $page > 0) {
3676 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3678 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3679 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3681 if (!empty($mode)) {
3682 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3685 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3686 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3687 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3688 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3694 if (
$conf->use_javascript_ajax) {
3695 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3696 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3699 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3700 print
'<div class="error">'.$msg.
'</div>';
3708 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3710 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3711 print
'</div> <!-- End div id-right -->'.
"\n";
3714 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3715 print
'</div> <!-- End div id-container -->'.
"\n";
3720 print
'<!-- '.$comment.
' -->'.
"\n";
3725 if (!empty($delayedhtmlcontent)) {
3726 print $delayedhtmlcontent;
3729 if (!empty(
$conf->use_javascript_ajax)) {
3730 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3731 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3736 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3737 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3740 jQuery(document).ready(
function () {
3741 $(
'a.documentpreview').click(
function() {
3742 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3743 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3746 , element:
'<?php echo dol_escape_js($object->element) ?>'
3747 , action:
'DOC_PREVIEW'
3748 , token:
'<?php echo currentToken(); ?>'
3752 $(
'a.documentdownload').click(
function() {
3753 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3754 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3757 , element:
'<?php echo dol_escape_js($object->element) ?>'
3758 , action:
'DOC_DOWNLOAD'
3759 , token:
'<?php echo currentToken(); ?>'
3770 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3771 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3774 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3775 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3780 $forceping =
GETPOST(
'forceping',
'alpha');
3781 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3783 $hash_unique_id =
dol_hash(
'dolibarr'.
$conf->file->instance_unique_id,
'sha256');
3789 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3790 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3791 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3795 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
3797 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3799 print
"\n".
'<!-- Includes JS for Ping of Dolibarr forceping='.$forceping.
' MAIN_FIRST_PING_OK_DATE='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_DATE").
' MAIN_FIRST_PING_OK_ID='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_ID").
' MAIN_LAST_PING_KO_DATE='.
getDolGlobalString(
"MAIN_LAST_PING_KO_DATE").
' -->'.
"\n";
3800 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3801 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
3803 $distrib =
'standard';
3804 if (isset($_SERVER[
"SERVER_ADMIN"]) && $_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3805 $distrib =
'doliwamp';
3807 if (!empty($dolibarr_distrib)) {
3808 $distrib = $dolibarr_distrib;
3812 jQuery(document).ready(
function (tmp) {
3813 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
3816 url:
"<?php echo $url_for_ping ?>",
3820 hash_algo:
'dol_hash-sha256',
3821 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3822 action:
'dolibarrping',
3823 version:
'<?php echo (float) DOL_VERSION; ?>',
3824 entity:
'<?php echo (int) $conf->entity; ?>',
3825 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3826 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3827 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3828 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3829 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
3830 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3831 token:
'notrequired'
3833 success:
function (data,
status, xhr) {
3834 console.log(
"Ping ok");
3837 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3840 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3843 error:
function (data,
status,xhr) {
3844 console.log(
"Ping ko: " + data);
3847 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3850 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3860 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3861 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3868 $parameters = array();
3869 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3871 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $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.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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( 'DOL_APPLICATION_TITLE')) if(!defined('DOL_VERSION')) if(!defined( 'EURO')) if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
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.
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.
dol_now($mode='auto')
Return date for now.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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.
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_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.
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...
ui state ui widget content ui state ui widget header ui state a ui 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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
global $dolibarr_main_demo
$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
$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.