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 if (!is_string($usertotest)) {
656 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
660 $goontestloop =
false;
661 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
662 $goontestloop =
true;
664 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
665 $goontestloop =
true;
667 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
668 $goontestloop =
true;
670 if (
GETPOST(
'openid_mode',
'alpha')) {
671 $goontestloop =
true;
673 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
674 $goontestloop =
true;
676 if (!empty($_COOKIE[
'login_dolibarr'])) {
677 $goontestloop =
true;
680 if (!is_object($langs)) {
681 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
684 if (defined(
'MAIN_LANG_DEFAULT')) {
685 $langcode = constant(
'MAIN_LANG_DEFAULT');
687 $langs->setDefaultLang($langcode);
691 if (!empty($_SERVER[
'HTTP_EXPOSED_CREDENTIAL_CHECK'])) {
694 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);
700 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
703 $oauthmodetotestarray = array(
'google');
704 foreach ($oauthmodetotestarray as $oauthmodetotest) {
705 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
707 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn') == $oauthmodetotest) {
710 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);
711 foreach ($authmode as $tmpkey => $tmpval) {
712 if ($tmpval == $oauthmodetotest.
'oauth') {
713 unset($authmode[$tmpkey]);
722 if ($login ===
'--bad-login-validity--') {
727 $dol_authmode =
$conf->authmode;
728 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
729 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
730 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
731 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
732 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
735 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
736 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
737 if ($dol_dst_first && $dol_dst_second) {
738 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
742 if ($datenow >= $datefirst && $datenow < $datesecond) {
746 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
747 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
752 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
754 $langs->loadLangs(array(
'main',
'errors'));
758 if (empty($_SESSION[
"dol_loginmesg"])) {
759 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
763 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
766 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
774 $hookmanager->initHooks(array(
'login'));
775 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
776 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
786 if (!$login || (in_array(
'ldap', $authmode) && !in_array(
'openid_connect', $authmode) && empty($passwordtotest))) {
788 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);
789 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
794 return 'ERROR_NOT_LOGGED';
796 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
797 http_response_code(401);
801 dol_loginfunction($langs,
$conf, (!empty($mysoc) ? $mysoc :
''));
806 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
808 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
809 dol_syslog(
'User not found or not valid, connection refused');
811 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
812 session_name($sessionname);
815 if ($resultFetchUser == 0) {
817 $langs->loadLangs(array(
'main',
'errors'));
819 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
821 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
822 } elseif ($resultFetchUser < 0) {
823 $_SESSION[
"dol_loginmesg"] = $user->error;
825 $user->context[
'audit'] = $user->error;
828 $langs->loadLangs(array(
'main',
'errors'));
830 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
832 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
836 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
845 $hookmanager->initHooks(array(
'login'));
846 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
847 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
852 $paramsurl = array();
854 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
857 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
860 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
862 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
866 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
867 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
872 $login = $_SESSION[
"dol_login"];
873 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
874 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
876 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
880 if ($resultFetchUser <= 0
881 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
882 || ($user->status != $user::STATUS_ENABLED)
883 || ($user->isNotIntoValidityDateRange())) {
884 if ($resultFetchUser <= 0) {
886 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
887 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
889 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
890 } elseif ($user->status != $user::STATUS_ENABLED) {
895 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
898 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
899 session_name($sessionname);
902 if ($resultFetchUser == 0) {
903 $langs->loadLangs(array(
'main',
'errors'));
905 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
907 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
908 } elseif ($resultFetchUser < 0) {
909 $_SESSION[
"dol_loginmesg"] = $user->error;
911 $user->context[
'audit'] = $user->error;
913 $langs->loadLangs(array(
'main',
'errors'));
915 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
917 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
921 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
929 $hookmanager->initHooks(array(
'login'));
930 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
931 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
936 $paramsurl = array();
938 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
941 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
944 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
947 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
951 $hookmanager->initHooks(array(
'main'));
954 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
955 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
956 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
958 if (constant(
'DOL_URL_ROOT')) {
959 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
961 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
962 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
966 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
967 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
968 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
970 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
971 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
972 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
974 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
975 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
976 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
978 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
979 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
980 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
982 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
983 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
984 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
987 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
988 if (empty($_SESSION[
'pageforbacktolist'])) {
989 $pageforbacktolistarray = array();
991 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
993 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
994 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
995 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
996 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1001 $parameters = array();
1002 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1011 if (!isset($_SESSION[
"dol_login"])) {
1016 $_SESSION[
"dol_login"] = $user->login;
1017 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1018 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1019 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1020 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1021 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1022 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1023 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1024 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1025 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1026 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1028 $_SESSION[
"dol_entity"] =
$conf->entity;
1030 if (!empty($dol_hide_topmenu)) {
1031 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1033 if (!empty($dol_hide_leftmenu)) {
1034 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1036 if (!empty($dol_optimize_smallscreen)) {
1037 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1039 if (!empty($dol_no_mouse_hover)) {
1040 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1042 if (!empty($dol_use_jmobile)) {
1043 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1046 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1050 $user->update_last_login_date();
1052 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1053 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1056 $user->context[
'audit'] = $loginfo;
1057 $user->context[
'authentication_method'] = $dol_authmode;
1060 $result = $user->call_trigger(
'USER_LOGIN', $user);
1068 $hookmanager->initHooks(array(
'login'));
1069 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1070 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1078 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1086 if (!empty($landingpage)) {
1088 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1089 header(
'Location: '.$newpath);
1098 $user->rights->user->user->lire = 1;
1099 $user->rights->user->user->creer = 1;
1100 $user->rights->user->user->password = 1;
1101 $user->rights->user->user->supprimer = 1;
1102 $user->rights->user->self->creer = 1;
1103 $user->rights->user->self->password = 1;
1107 if (!$user->hasRight(
'user',
'user_advance')) {
1108 $user->rights->user->user_advance =
new stdClass();
1110 if (!$user->hasRight(
'user',
'self_advance')) {
1111 $user->rights->user->self_advance =
new stdClass();
1113 if (!$user->hasRight(
'user',
'group_advance')) {
1114 $user->rights->user->group_advance =
new stdClass();
1117 $user->rights->user->user_advance->readperms = 1;
1118 $user->rights->user->user_advance->write = 1;
1119 $user->rights->user->self_advance->readperms = 1;
1120 $user->rights->user->self_advance->writeperms = 1;
1121 $user->rights->user->group_advance->read = 1;
1122 $user->rights->user->group_advance->readperms = 1;
1123 $user->rights->user->group_advance->write = 1;
1124 $user->rights->user->group_advance->delete = 1;
1133 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1136 if ((
int)
$conf->liste_limit <= 0) {
1138 $conf->liste_limit = 15;
1139 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1140 $conf->liste_limit = 8;
1141 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1142 $conf->liste_limit = 10;
1143 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1144 $conf->liste_limit = 20;
1148 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1155 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1159 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1160 $user->loadDefaultValues();
1166if (
GETPOST(
'theme',
'aZ09')) {
1168 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1173 $conf->use_javascript_ajax = 0;
1184 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1194if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1195 $conf->dol_hide_leftmenu = 1;
1197if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1198 $conf->dol_hide_topmenu = 1;
1200if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1201 $conf->dol_optimize_smallscreen = 1;
1203if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1204 $conf->dol_no_mouse_hover = 1;
1206if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1207 $conf->dol_use_jmobile = 1;
1210if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1211 $conf->dol_no_mouse_hover = 1;
1215if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1216 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1217 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1220 $conf->dol_optimize_smallscreen = 1;
1223 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1227if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1228 $conf->theme =
'eldy';
1229 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1232if (!defined(
'NOREQUIRETRAN')) {
1233 if (!
GETPOST(
'lang',
'aZ09')) {
1235 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1238 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1239 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1245if (!defined(
'NOLOGIN')) {
1248 if (!$user->login) {
1253 if ($user->statut < 1) {
1255 $langs->loadLangs(array(
"errors",
"other"));
1256 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1261 $user->loadRights();
1264dol_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);
1269if (!defined(
'NOREQUIRETRAN')) {
1271 $langs->loadLangs(array(
'main',
'dict'));
1275$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1276$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1277$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1289if (empty(
$conf->browser->firefox)) {
1290 define(
'ROWS_1', 1);
1291 define(
'ROWS_2', 2);
1292 define(
'ROWS_3', 3);
1293 define(
'ROWS_4', 4);
1294 define(
'ROWS_5', 5);
1295 define(
'ROWS_6', 6);
1296 define(
'ROWS_7', 7);
1297 define(
'ROWS_8', 8);
1298 define(
'ROWS_9', 9);
1300 define(
'ROWS_1', 0);
1301 define(
'ROWS_2', 1);
1302 define(
'ROWS_3', 2);
1303 define(
'ROWS_4', 3);
1304 define(
'ROWS_5', 4);
1305 define(
'ROWS_6', 5);
1306 define(
'ROWS_7', 6);
1307 define(
'ROWS_8', 7);
1308 define(
'ROWS_9', 8);
1311$heightforframes = 52;
1314if (!defined(
'NOREQUIREMENU')) {
1315 if (empty($user->socid)) {
1323 $file_menu =
$conf->standard_menu;
1324 if (
GETPOST(
'menu',
'alpha')) {
1325 $file_menu =
GETPOST(
'menu',
'alpha');
1328 if (!class_exists(
'MenuManager')) {
1330 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1331 foreach ($dirmenus as $dirmenu) {
1333 if (class_exists(
'MenuManager')) {
1337 if (!class_exists(
'MenuManager')) {
1338 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1339 $file_menu =
'eldy_menu.php';
1340 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1344 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1349if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1350 $message =
GETPOST(
'seteventmessages',
'alpha');
1351 $messages = explode(
',', $message);
1352 foreach ($messages as $key => $msg) {
1353 $tmp = explode(
':', $msg);
1360if (!function_exists(
"llxHeader")) {
1384 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1386 global
$conf, $hookmanager;
1388 $parameters = array(
1390 'title' => & $title,
1391 'help_url' => & $help_url,
1392 'target' => & $target,
1393 'disablejs' => & $disablejs,
1394 'disablehead' => & $disablehead,
1395 'arrayofjs' => & $arrayofjs,
1396 'arrayofcss' => & $arrayofcss,
1397 'morequerystring' => & $morequerystring,
1398 'morecssonbody' => & $morecssonbody,
1399 'replacemainareaby' => & $replacemainareaby,
1400 'disablenofollow' => & $disablenofollow,
1401 'disablenoindex' => & $disablenoindex
1404 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1406 print $hookmanager->resPrint;
1411 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1413 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1415 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1417 if ($mainmenu !=
'website') {
1418 $tmpcsstouse = $morecssonbody;
1423 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1426 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1427 $tmpcsstouse .=
' dol_openinpopup';
1430 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1433 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1434 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1437 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1438 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1442 if ($replacemainareaby) {
1443 print $replacemainareaby;
1461 global $db,
$conf, $hookmanager;
1463 if ($contenttype ==
'text/html') {
1464 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1466 header(
"Content-Type: ".$contenttype);
1472 header(
"X-Content-Type-Options: nosniff");
1475 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1476 header(
"X-Frame-Options: SAMEORIGIN");
1478 header(
"X-Frame-Options: ALLOWALL");
1482 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1483 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1484 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1485 header(
'Vary: Origin');
1492 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1507 if (!is_object($hookmanager)) {
1508 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1511 $hookmanager->initHooks(array(
"main"));
1513 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1514 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1516 $contentsecuritypolicy = $hookmanager->resPrint;
1518 $contentsecuritypolicy .= $hookmanager->resPrint;
1521 if (!empty($contentsecuritypolicy)) {
1522 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1525 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1529 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1544 if (!is_object($hookmanager)) {
1545 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1548 $hookmanager->initHooks(array(
"main"));
1550 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1551 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1553 $contentsecuritypolicy = $hookmanager->resPrint;
1555 $contentsecuritypolicy .= $hookmanager->resPrint;
1558 if (!empty($contentsecuritypolicy)) {
1559 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1562 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1569 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1572 header(
"Referrer-Policy: ".$referrerpolicy);
1575 if ($forcenocache) {
1576 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1598function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1600 global $db,
$conf, $langs, $user, $mysoc, $hookmanager;
1604 if (empty(
$conf->css)) {
1605 $conf->css =
'/theme/eldy/style.css.php';
1608 print
'<!doctype html>'.
"\n";
1610 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1613 if (empty($disablehead)) {
1614 if (!is_object($hookmanager)) {
1615 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1618 $hookmanager->initHooks(array(
"main"));
1620 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1624 if (
GETPOST(
'dol_basehref',
'alpha')) {
1625 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1629 print
'<meta charset="utf-8">'.
"\n";
1630 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1631 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1632 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1633 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1634 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1636 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1639 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1640 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1641 if (!empty($mysoc->logo_squarred_mini)) {
1642 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1647 if (empty(
$conf->dol_use_jmobile)) {
1648 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1649 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1653 $manifest = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/manifest.json.php';
1654 $parameters = array(
'manifest' => $manifest);
1655 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1657 $manifest = $hookmanager->resPrint;
1659 $manifest .= $hookmanager->resPrint;
1661 if (!empty($manifest)) {
1662 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1666 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1671 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1675 $appli = constant(
'DOL_APPLICATION_TITLE');
1678 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1691 $parameters = array(
'title' => $titletoshow);
1692 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1694 $titletoshow = $hookmanager->resPrint;
1696 $titletoshow .= $hookmanager->resPrint;
1705 $ext =
'version='.GETPOSTINT(
'version');
1708 if (
GETPOST(
'dol_resetcache')) {
1709 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1713 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1715 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1716 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1717 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1719 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1720 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1722 if (GETPOSTISSET(
'dol_openinpopup')) {
1723 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1725 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1726 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1728 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1729 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1731 if (GETPOSTISSET(
'dol_use_jmobile')) {
1732 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1735 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1736 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1738 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1739 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1743 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1744 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1747 if (!defined(
'DISABLE_JQUERY') && !$disablejs &&
$conf->use_javascript_ajax) {
1748 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1749 if (!defined(
'DISABLE_JQUERY_UI')) {
1750 $jquerytheme =
'base';
1754 if (constant(
'JS_JQUERY_UI')) {
1755 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1757 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1760 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1761 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1763 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1765 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1769 if (!defined(
'DISABLE_FONT_AWSOME')) {
1770 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1771 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1772 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1778 if (!empty(
$conf->modules_parts[
'theme'])) {
1779 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1782 $themesubdir = $reldir;
1788 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1789 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1790 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1794 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";
1799 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1800 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1804 if (!empty(
$conf->modules_parts[
'css'])) {
1805 $arraycss = (array)
$conf->modules_parts[
'css'];
1806 foreach ($arraycss as $modcss => $filescss) {
1807 $filescss = (array) $filescss;
1808 foreach ($filescss as $cssfile) {
1809 if (empty($cssfile)) {
1810 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1814 if ($urlforcss && $urlforcss !=
'/') {
1815 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1817 if (!preg_match(
'/\.css$/i', $cssfile)) {
1822 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1828 if (is_array($arrayofcss)) {
1829 foreach ($arrayofcss as $cssfile) {
1830 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1831 $urltofile = $cssfile;
1835 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1837 if (!preg_match(
'/\.css$/i', $cssfile)) {
1847 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1851 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty(
$conf->use_javascript_ajax)) {
1853 print
'<!-- Includes JS for JQuery -->'.
"\n";
1854 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1855 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1857 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1859 if (!defined(
'DISABLE_JQUERY_UI')) {
1860 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1861 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1863 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1867 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1868 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1871 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1872 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1876 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1880 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1881 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1882 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1883 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1884 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1885 print
'<script>'.
"\n";
1886 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1887 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1888 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1889 print 'var placeholderInPlace = \
' \';'.
"\n";
1890 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1891 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1892 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".
$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1893 print
'var withInPlace = 300;';
1894 print
'</script>'.
"\n";
1895 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1896 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1899 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1900 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1901 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1903 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1906 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1908 if (!defined(
'DISABLE_MULTISELECT')) {
1909 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1913 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
1915 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1916 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1917 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1918 $jsckeditor =
'ckeditor.js';
1919 if (constant(
'JS_CKEDITOR')) {
1921 $pathckeditor = constant(
'JS_CKEDITOR');
1923 print
'<script nonce="'.getNonce().
'">';
1924 print
'/* enable ckeditor by main.inc.php */';
1925 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1926 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1927 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1928 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";
1929 print
'</script>'.
"\n";
1930 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1932 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1933 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1935 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1937 print
'</script>'.
"\n";
1941 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1942 $enablebrowsernotif =
false;
1944 $enablebrowsernotif =
true;
1946 if (
$conf->browser->layout ==
'phone') {
1947 $enablebrowsernotif =
false;
1949 if ($enablebrowsernotif) {
1950 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1951 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1956 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1957 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
1958 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang . ($ext ?
'&' . $ext :
'') .
'"></script>' .
"\n";
1963 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1964 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1968 if (!empty(
$conf->modules_parts[
'js'])) {
1969 $arrayjs = (array)
$conf->modules_parts[
'js'];
1970 foreach ($arrayjs as $modjs => $filesjs) {
1971 $filesjs = (array) $filesjs;
1972 foreach ($filesjs as $jsfile) {
1975 if ($urlforjs && $urlforjs !=
'/') {
1976 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1977 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1979 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1985 if (is_array($arrayofjs)) {
1986 print
'<!-- Includes JS added by page -->'.
"\n";
1987 foreach ($arrayofjs as $jsfile) {
1988 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1989 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1991 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2000 if (file_exists($theme_js)) {
2001 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2005 if (!empty($head)) {
2012 $parameters = array();
2013 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2014 print $hookmanager->resPrint;
2016 print
"</head>\n\n";
2019 $conf->headerdone = 1;
2039function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2041 global $user,
$conf, $langs, $db, $form;
2043 global $hookmanager, $menumanager;
2048 $hookmanager->initHooks(array(
'toprightmenu'));
2053 if (empty(
$conf->headerdone)) {
2054 $disablenofollow = 0;
2055 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2056 print
'<body id="mainbody">';
2062 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2063 if (!isset($form) || !is_object($form)) {
2064 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2065 $form =
new Form($db);
2068 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2070 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2073 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2075 $menumanager->atarget = $target;
2077 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2081 $appli = constant(
'DOL_APPLICATION_TITLE');
2084 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2086 $appli .=
" ".DOL_VERSION;
2090 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2094 $logouthtmltext =
'';
2097 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2098 if (
$conf->browser->name ==
'chrome') {
2099 $stringforfirstkey .=
' ALT +';
2100 } elseif (
$conf->browser->name ==
'firefox') {
2101 $stringforfirstkey .=
' ALT + SHIFT +';
2103 $stringforfirstkey .=
' CTL +';
2105 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2106 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2107 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2108 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2109 $logouttext .=
'</a>';
2111 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2112 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2117 print
'<div class="login_block usedropdown">'.
"\n";
2121 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2124 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2144 $toprightmenu .=
'</div>';
2146 $toprightmenu .=
'</div>'.
"\n";
2150 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2153 $parameters = array();
2154 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2155 if (is_numeric($result)) {
2157 $toprightmenu .= $hookmanager->resPrint;
2159 $toprightmenu = $hookmanager->resPrint;
2162 $toprightmenu .= $result;
2166 if (isModEnabled(
'modulebuilder')) {
2167 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2169 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2172 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2179 if (isset($_POST) && is_array($_POST)) {
2180 foreach ($_POST as $key => $value) {
2181 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2182 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2185 if (!is_array($value)) {
2186 if ($value !==
'') {
2187 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2190 foreach ($value as $value2) {
2191 if (($value2 !==
'') && (!is_array($value2))) {
2192 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2198 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2199 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2201 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2204 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2209 $langs->load(
"help");
2216 if (empty($helppagename)) {
2217 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2219 $helppresent =
'helppresent';
2224 $helpbaseurl = $arrayres[
'helpbaseurl'];
2225 $helppage = $arrayres[
'helppage'];
2226 $mode = $arrayres[
'mode'];
2229 if ($helpbaseurl && $helppage) {
2231 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2232 if ($mode ==
'wiki') {
2233 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2235 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2237 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2240 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2241 if ($mode ==
'wiki') {
2243 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2246 $text .= sprintf($helpbaseurl, $helppage);
2249 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2250 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2253 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2258 $langs->load(
'admin');
2259 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2265 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2267 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2272 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2275 $toprightmenu .=
'</div>';
2279 $toprightmenu .=
'<div class="login_block_user">';
2282 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2287 $toprightmenu .=
'</div>';
2289 $toprightmenu .=
'</div>'.
"\n";
2292 print $toprightmenu;
2299 print
'<div style="clear: both;"></div>';
2300 print
"<!-- End top horizontal menu -->\n\n";
2303 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2304 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2318 global $langs,
$conf, $db, $hookmanager, $user, $mysoc;
2320 global $menumanager, $form;
2323 if (
$conf->browser->name ==
'textbrowser') {
2327 $langs->load(
'companies');
2329 $userImage = $userDropDownImage =
'';
2330 if (!empty($user->photo) || isModEnabled(
'gravatar')) {
2331 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2332 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2334 $nophoto =
'/public/theme/common/user_anonymous.png';
2335 if ($user->gender ==
'man') {
2336 $nophoto =
'/public/theme/common/user_man.png';
2338 if ($user->gender ==
'woman') {
2339 $nophoto =
'/public/theme/common/user_woman.png';
2342 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2343 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2347 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2348 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2350 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2352 while ($idprofcursor < 10) {
2354 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2355 if ($idprofcursor == 1) {
2356 $constkeyforprofid =
'MAIN_INFO_SIREN';
2358 if ($idprofcursor == 2) {
2359 $constkeyforprofid =
'MAIN_INFO_SIRET';
2361 if ($idprofcursor == 3) {
2362 $constkeyforprofid =
'MAIN_INFO_APE';
2364 if ($idprofcursor == 4) {
2365 $constkeyforprofid =
'MAIN_INFO_RCS';
2367 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2372 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid),
'1').
'</span>';
2376 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2377 if (isModEnabled(
'multicurrency')) {
2378 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
$conf->currency.
'</span>';
2380 $dropdownBody .=
'</div>';
2382 $dropdownBody .=
'<br>';
2383 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2384 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2387 if (!empty($user->admin)) {
2388 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2391 if (!empty($user->socid)) {
2392 $thirdpartystatic =
new Societe($db);
2393 $thirdpartystatic->fetch($user->socid);
2394 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2395 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2397 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2398 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2399 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2400 $dropdownBody .=
'<br>';
2402 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2403 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2405 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2407 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2408 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2409 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2410 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2412 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2414 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2416 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2417 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2418 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2423 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2424 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2425 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
$conf->browser->layout;
2426 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2427 if (
$conf->browser->layout ==
'phone') {
2428 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2430 if (!empty($_SESSION[
"disablemodules"])) {
2431 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2433 $dropdownBody .=
'</div>';
2436 $parameters = array(
'user' => $user,
'langs' => $langs);
2437 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2438 if (is_numeric($result)) {
2440 $dropdownBody .= $hookmanager->resPrint;
2442 $dropdownBody = $hookmanager->resPrint;
2446 if (empty($urllogout)) {
2447 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2452 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2453 if (
$conf->browser->name ==
'chrome') {
2454 $stringforfirstkey .=
' ALT +';
2455 } elseif (
$conf->browser->name ==
'firefox') {
2456 $stringforfirstkey .=
' ALT + SHIFT +';
2458 $stringforfirstkey .=
' CTL +';
2462 $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>';
2463 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2464 $jsonopen =
"closeTopMenuLoginDropdown()";
2465 $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');
2466 $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>';
2468 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2469 if (!empty($user->admin)) {
2470 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2474 $appli = constant(
'DOL_APPLICATION_TITLE');
2477 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2479 $appli .=
" ".DOL_VERSION;
2483 $btnUser =
'<!-- div for user link -->
2484 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2485 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2486 '.$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>' :
'').
'
2488 <div class="dropdown-menu">
2490 <div class="user-header">
2491 '.$userDropDownImage.
'
2493 '.$profilName.
'<br>';
2495 if ($user->datelastlogin) {
2496 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2497 if ($user->datepreviouslogin) {
2498 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2501 $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>';
2502 if ($user->datepreviouslogin) {
2503 $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>';
2511 <!-- Menu Body user-->
2512 <div class="user-body">'.$dropdownBody.
'</div>
2515 <div class="user-footer">
2516 <div class="pull-left">
2519 <div class="pull-left">
2520 '.$virtuelcardLink.
'
2522 <div class="pull-right">
2525 <div class="clearboth"></div>
2531 $btnUser =
'<!-- div for user link text browser -->
2532 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2533 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2534 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2539 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2541 <!-- Code to show/hide the user drop-down -->
2543 function closeTopMenuLoginDropdown() {
2544 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2546 jQuery("#topmenu-login-dropdown").removeClass("open");
2548 jQuery(document).ready(function() {
2549 jQuery(document).on("click", function(event) {
2550 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2551 /* console.log("click close login - we click outside"); */
2552 closeTopMenuLoginDropdown();
2559 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2560 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2561 event.preventDefault();
2562 jQuery("#topmenu-login-dropdown").toggleClass("open");
2565 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2566 console.log("Click on #topmenulogincompanyinfo-btn");
2567 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2568 jQuery("#topmenuloginmoreinfo").slideToggle();
2570 jQuery("#topmenulogincompanyinfo").slideToggle();
2573 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2574 console.log("Click on #topmenuloginmoreinfo-btn");
2575 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2576 jQuery("#topmenulogincompanyinfo").slideToggle();
2578 jQuery("#topmenuloginmoreinfo").slideToggle();
2598 global
$conf, $langs;
2609 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2610 if (
$conf->browser->os ===
'macintosh') {
2611 $stringforfirstkey .=
' CTL +';
2613 if (
$conf->browser->name ==
'chrome') {
2614 $stringforfirstkey .=
' ALT +';
2615 } elseif (
$conf->browser->name ==
'firefox') {
2616 $stringforfirstkey .=
' ALT + SHIFT +';
2618 $stringforfirstkey .=
' CTL +';
2622 if (!empty(
$conf->use_javascript_ajax)) {
2623 $html .=
'<!-- div for quick add link -->
2624 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2625 <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>
2628 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2630 <!-- Code to show/hide the user drop-down for the quick add -->
2632 jQuery(document).ready(function() {
2633 jQuery(document).on("click", function(event) {
2634 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2635 /* console.log("click close quick add - we click outside"); */
2637 $("#topmenu-quickadd-dropdown").removeClass("open");
2640 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2641 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2642 openQuickAddDropDown(event);
2646 $(document).keydown(function(event){
2647 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2648 if (ostype ===
"macintosh") {
2649 if ( event.which === 65 && event.ctrlKey ) {
2650 console.log(\
'control + a : trigger open quick add dropdown\');
2651 openQuickAddDropDown(event);
2654 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2655 console.log(\'control + shift + a : trigger open quick add dropdown\');
2656 openQuickAddDropDown(event);
2661 var openQuickAddDropDown = function(event) {
2662 event.preventDefault();
2663 $("#topmenu-quickadd-dropdown").toggleClass("open");
2683 global
$conf, $langs;
2694 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2695 if (
$conf->browser->os ===
'macintosh') {
2696 $stringforfirstkey .=
' CTL +';
2698 if (
$conf->browser->name ==
'chrome') {
2699 $stringforfirstkey .=
' ALT +';
2700 } elseif (
$conf->browser->name ==
'firefox') {
2701 $stringforfirstkey .=
' ALT + SHIFT +';
2703 $stringforfirstkey .=
' CTL +';
2708 if (!empty(
$conf->use_javascript_ajax)) {
2709 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2714 $html .=
'<!-- div for link to upload file -->
2715 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2716 <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>
2732 global $user, $langs, $hookmanager;
2737 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2738 "title" =>
"MenuNewMember@members",
2739 "name" =>
"Adherent@members",
2740 "picto" =>
"object_member",
2741 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2745 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2746 "title" =>
"MenuNewThirdParty@companies",
2747 "name" =>
"ThirdParty@companies",
2748 "picto" =>
"object_company",
2749 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2753 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2754 "title" =>
"NewContactAddress@companies",
2755 "name" =>
"Contact@companies",
2756 "picto" =>
"object_contact",
2757 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2761 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2762 "title" =>
"NewPropal@propal",
2763 "name" =>
"Proposal@propal",
2764 "picto" =>
"object_propal",
2765 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2770 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2771 "title" =>
"NewOrder@orders",
2772 "name" =>
"Order@orders",
2773 "picto" =>
"object_order",
2774 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2778 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2779 "title" =>
"NewBill@bills",
2780 "name" =>
"Bill@bills",
2781 "picto" =>
"object_bill",
2782 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2786 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2787 "title" =>
"NewContractSubscription@contracts",
2788 "name" =>
"Contract@contracts",
2789 "picto" =>
"object_contract",
2790 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2794 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2795 "title" =>
"SupplierProposalNew@supplier_proposal",
2796 "name" =>
"SupplierProposal@supplier_proposal",
2797 "picto" =>
"supplier_proposal",
2798 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2802 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2803 "title" =>
"NewSupplierOrderShort@orders",
2804 "name" =>
"SupplierOrder@orders",
2805 "picto" =>
"supplier_order",
2806 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2810 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2811 "title" =>
"NewBill@bills",
2812 "name" =>
"SupplierBill@bills",
2813 "picto" =>
"supplier_invoice",
2814 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2818 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2819 "title" =>
"NewTicket@ticket",
2820 "name" =>
"Ticket@ticket",
2821 "picto" =>
"ticket",
2822 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2826 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2827 "title" =>
"NewIntervention@interventions",
2828 "name" =>
"Intervention@interventions",
2829 "picto" =>
"intervention",
2830 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2834 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2835 "title" =>
"NewProduct@products",
2836 "name" =>
"Product@products",
2837 "picto" =>
"object_product",
2838 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2842 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2843 "title" =>
"NewService@products",
2844 "name" =>
"Service@products",
2845 "picto" =>
"object_service",
2846 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2850 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2851 "title" =>
"AddUser@users",
2852 "name" =>
"User@users",
2854 "activation" => $user->hasRight(
"user",
"user",
"write"),
2860 $dropDownQuickAddHtml =
'';
2864 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2866 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2869 $parameters = array();
2870 $hook_items = $items;
2871 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2872 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2873 if ($reshook == 0) {
2874 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2876 $items = $hookmanager->resArray;
2880 $position = array();
2881 foreach ($items[
'items'] as $key => $row) {
2882 $position[$key] = $row[
'position'];
2884 $array1_sort_order = SORT_ASC;
2885 array_multisort($position, $array1_sort_order, $items[
'items']);
2888 foreach ($items[
'items'] as $item) {
2889 if (!$item[
'activation']) {
2892 $langs->load(explode(
'@', $item[
'title'])[1]);
2893 $langs->load(explode(
'@', $item[
'name'])[1]);
2894 $dropDownQuickAddHtml .=
'
2895 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2896 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2901 $dropDownQuickAddHtml .=
'</div>';
2903 $dropDownQuickAddHtml .=
'</div>';
2905 return $dropDownQuickAddHtml;
2915 global $langs,
$conf, $user;
2920 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2931 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2932 if (
$conf->browser->os ===
'macintosh') {
2933 $stringforfirstkey .=
' CTL +';
2935 if (
$conf->browser->name ==
'chrome') {
2936 $stringforfirstkey .=
' ALT +';
2937 } elseif (
$conf->browser->name ==
'firefox') {
2938 $stringforfirstkey .=
' ALT + SHIFT +';
2940 $stringforfirstkey .=
' CTL +';
2944 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2945 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2946 $langs->load(
"bookmarks");
2949 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2953 $html .=
'<!-- div for bookmark link -->
2954 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2955 <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>
2956 <div class="dropdown-menu">
2962 <!-- Code to show/hide the bookmark drop-down -->
2964 jQuery(document).ready(function() {
2965 jQuery(document).on("click", function(event) {
2966 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2967 /* console.log("close bookmark dropdown - we click outside"); */
2969 $("#topmenu-bookmark-dropdown").removeClass("open");
2973 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2974 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2975 openBookMarkDropDown(event);
2979 jQuery(document).keydown(function(event) {
2980 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2981 if (ostype ===
"macintosh") {
2982 if ( event.which === 66 && event.ctrlKey ) {
2983 console.log(
"Click on control + b : trigger open bookmark dropdown");
2984 openBookMarkDropDown(event);
2987 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2988 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2989 openBookMarkDropDown(event);
2994 var openBookMarkDropDown =
function(event) {
2995 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2996 event.preventDefault();
2997 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2998 jQuery(
"#top-bookmark-search-input").focus();
3014function top_menu_search()
3016 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3021 $arrayresult = array();
3022 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3024 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3025 // accesskey is for Mac: CTRL + key for all browsers
3026 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3027 if ($conf->browser->name == 'chrome
') {
3028 $stringforfirstkey .= ' ALT +
';
3029 } elseif ($conf->browser->name == 'firefox
') {
3030 $stringforfirstkey .= ' ALT + SHIFT +
';
3032 $stringforfirstkey .= ' CTL +
';
3035 $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">
';
3037 $defaultAction = '';
3038 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3039 // Menu with all searchable items
3040 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3041 foreach ($arrayresult as $keyItem => $item) {
3042 if (empty($defaultAction)) {
3043 $defaultAction = $item['url
'];
3045 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3046 $buttonList .= $item['text
'];
3047 $buttonList .= '</
button>
';
3049 $buttonList .= '</div>
';
3051 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3054 <!-- search input -->
3055 <div
class=
"dropdown-header search-dropdown-header">
3061 <!--
Menu Body search -->
3062 <div
class=
"dropdown-body search-dropdown-body">
3067 $dropDownHtml .= '</form>
';
3069 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3070 // accesskey is for Mac: CTRL + key for all browsers
3071 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3072 if ($conf->browser->name == 'chrome
') {
3073 $stringforfirstkey .= ' ALT +
';
3074 } elseif ($conf->browser->name == 'firefox
') {
3075 $stringforfirstkey .= ' ALT + SHIFT +
';
3077 $stringforfirstkey .= ' CTL +
';
3080 $html .= '<!-- div
for Global Search -->
3081 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3082 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3083 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3085 <div
class=
"dropdown-menu dropdown-search">
3091 <!-- Code to show/hide the
user drop-down -->
3093 jQuery(document).ready(
function() {
3096 jQuery(
"#top-global-search-input").keydown(
function (e) {
3097 if (e.keyCode == 13 || e.keyCode == 40) {
3098 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3099 if (inputs[inputs.index(this) + 1] != null) {
3100 console.log(
"Force focus after keydow on #top-global-search-input");
3101 inputs[inputs.index(this) + 1].focus();
3102 if (e.keyCode == 13){
3103 inputs[inputs.index(this) + 1].trigger(
"click");
3113 jQuery(document).keydown(
function(e) {
3115 var $focused = $(
":focus");
3116 if($focused.length && $focused.hasClass(
"global-search-item")){
3119 if (e.keyCode == 38) {
3121 console.log(
"Force focus after keycode 38");
3122 $focused.prev().focus();
3126 if (e.keyCode == 40) {
3128 console.log(
"Force focus after keycode 40");
3129 $focused.next().focus();
3136 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3137 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3138 jQuery(
"#top-menu-action-search").submit();
3142 jQuery(document).on(
"click",
function(event) {
3143 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3144 console.log(
"click close search - we click outside");
3146 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3151 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3152 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3153 openGlobalSearchDropDown();
3157 jQuery(document).keydown(
function(e){
3158 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3159 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3160 openGlobalSearchDropDown();
3162 if ( e.which === 70 && e.alKey ) {
3163 console.log(\'alt + f : trigger open global-search dropdown\');
3164 openGlobalSearchDropDown();
3168 var openGlobalSearchDropDown = function() {
3169 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3170 jQuery("#top-global-search-input").focus();
3194function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3196 global $user,
$conf, $langs, $db, $form;
3197 global $hookmanager, $menumanager;
3201 if (!empty($menu_array_before)) {
3202 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);
3205 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3207 $hookmanager->initHooks(array(
'leftblock'));
3209 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3212 if (!is_object($form)) {
3213 $form =
new Form($db);
3218 if (
$conf->browser->layout ==
'phone') {
3219 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3223 $arrayresult = array();
3224 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3229 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3230 if (
$conf->browser->name ==
'chrome') {
3231 $stringforfirstkey .=
' ALT +';
3232 } elseif (
$conf->browser->name ==
'firefox') {
3233 $stringforfirstkey .=
' ALT + SHIFT +';
3235 $stringforfirstkey .=
' CTL +';
3239 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3240 $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');
3242 if (is_array($arrayresult)) {
3244 foreach ($arrayresult as $key => $val) {
3245 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3251 $parameters = array(
'searchform' => $searchform);
3252 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3253 if (empty($reshook)) {
3254 $searchform .= $hookmanager->resPrint;
3256 $searchform = $hookmanager->resPrint;
3261 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3262 $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>';
3264 $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>';
3265 $searchform .=
'<script>
3266 jQuery(document).ready(function () {
3267 jQuery("#divsearchforms1").click(function(){
3268 jQuery("#divsearchforms2").toggle();
3272 $searchform .=
'</div>';
3276 $searchform .=
'<script>
3277 jQuery(document).keydown(function(e){
3278 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3279 console.log(\'control + shift + f : trigger open global-search dropdown\');
3280 openGlobalSearchDropDown();
3282 if( (e.which === 83 || e.which === 115) && e.altKey ){
3283 console.log(\'alt + s : trigger open global-search dropdown\');
3284 openGlobalSearchDropDown();
3288 var openGlobalSearchDropDown = function() {
3289 jQuery("#searchselectcombo").select2(\'open\');
3295 print
'<!-- Begin left menu -->'.
"\n";
3297 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3301 $menumanager->menu_array = $menu_array_before;
3303 $menumanager->menu_array_after = $menu_array_after;
3306 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3309 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3314 print
"<!-- Begin Help Block-->\n";
3315 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3319 $doliurl =
'https://www.dolibarr.org';
3321 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3322 $doliurl =
'https://www.dolibarr.fr';
3324 if (preg_match(
'/es/i', $langs->defaultlang)) {
3325 $doliurl =
'https://www.dolibarr.es';
3327 if (preg_match(
'/de/i', $langs->defaultlang)) {
3328 $doliurl =
'https://www.dolibarr.de';
3330 if (preg_match(
'/it/i', $langs->defaultlang)) {
3331 $doliurl =
'https://www.dolibarr.it';
3333 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3334 $doliurl =
'https://www.dolibarr.gr';
3337 $appli = constant(
'DOL_APPLICATION_TITLE');
3340 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3342 $appli .=
" ".DOL_VERSION;
3350 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3352 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3354 print
'<span class="help">';
3362 print
'</div>'.
"\n";
3367 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3370 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3371 $bugbaseurl .=
'&title=';
3372 $bugbaseurl .= urlencode(
"Bug: ");
3373 $bugbaseurl .=
'&body=';
3374 $bugbaseurl .= urlencode(
"# Instructions\n");
3375 $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");
3376 $bugbaseurl .= urlencode(
"*Please:*\n");
3377 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3378 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3379 $bugbaseurl .= urlencode(
"\n");
3380 $bugbaseurl .= urlencode(
"\n");
3381 $bugbaseurl .= urlencode(
"# Bug\n");
3382 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3383 $bugbaseurl .= urlencode(
"\n");
3384 $bugbaseurl .= urlencode(
"## Environment\n");
3385 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3386 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3387 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3388 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3389 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3390 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3391 $bugbaseurl .= urlencode(
"\n");
3392 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3393 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3394 $bugbaseurl .= urlencode(
"\n");
3395 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3396 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3397 $bugbaseurl .= urlencode(
"\n");
3398 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3399 $bugbaseurl .= urlencode(
"[*Files*]\n");
3400 $bugbaseurl .= urlencode(
"\n");
3402 $bugbaseurl .= urlencode(
"\n");
3403 $bugbaseurl .= urlencode(
"## Report\n");
3411 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3412 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3413 if (empty($reshook)) {
3414 $bugbaseurl .= $hookmanager->resPrint;
3416 $bugbaseurl = $hookmanager->resPrint;
3419 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3420 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3425 print
"<!-- End Help Block-->\n";
3429 print
"<!-- End left menu -->\n";
3433 $parameters = array();
3434 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3435 print $hookmanager->resPrint;
3437 print
'</div></div> <!-- End side-nav id-left -->';
3441 print
'<!-- Begin right area -->'.
"\n";
3443 if (empty($leftmenuwithoutmainarea)) {
3457 global
$conf, $langs, $hookmanager;
3459 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3460 print
'<div id="id-right">';
3465 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3467 $hookmanager->initHooks(array(
'main'));
3468 $parameters = array();
3469 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3470 print $hookmanager->resPrint;
3473 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3478 $parameters = array();
3479 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3480 if (empty($reshook)) {
3481 print
'<!-- Begin show mysoc info header -->'.
"\n";
3482 print
'<div id="mysoc-info-header">'.
"\n";
3483 print
'<table class="centpercent div-table-responsive">'.
"\n";
3485 print
'<tr><td rowspan="0" class="width20p">';
3487 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'))).
'">';
3489 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3490 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3502 print
'</table>'.
"\n";
3503 print
'</div>'.
"\n";
3504 print
'<!-- End show mysoc info header -->'.
"\n";
3523 if (preg_match(
'/^http/i', $helppagename)) {
3525 $helpbaseurl =
'%s';
3526 $helppage = $helppagename;
3531 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3532 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3533 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3534 $helppage = $reg[1];
3537 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3538 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3539 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3540 $helppage = $reg[1];
3543 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3544 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3545 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3546 $helppage = $reg[1];
3549 if (empty($helppage)) {
3550 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3551 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3552 $helppage = $reg[1];
3557 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3577function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3579 global $langs, $user;
3582 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3583 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3584 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3585 if ($showtitlebefore) {
3586 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3588 $ret .=
'<div class="tagtd">';
3589 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3590 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3591 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3592 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3593 $ret .=
' placeholder="'.strip_tags($title).
'"';
3594 $ret .= ($autofocus ?
' autofocus' :
'');
3595 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3596 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3597 $ret .=
'<span class="fa fa-search"></span>';
3598 $ret .=
'</button>';
3600 $ret .=
"</form>\n";
3605if (!function_exists(
"llxFooter")) {
3619 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3621 global
$conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3622 global $delayedhtmlcontent;
3623 global $contextpage, $page, $limit, $mode;
3624 global $dolibarr_distrib;
3626 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3630 $parameters = array();
3631 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3632 if (empty($reshook)) {
3633 $llxfooter .= $hookmanager->resPrint;
3634 } elseif ($reshook > 0) {
3635 $llxfooter = $hookmanager->resPrint;
3646 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3648 foreach ($user->lastsearch_values_tmp as $key => $val) {
3649 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3650 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3651 if (empty($val[
'sortfield'])) {
3652 unset($val[
'sortfield']);
3654 if (empty($val[
'sortorder'])) {
3655 unset($val[
'sortorder']);
3657 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3658 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3659 unset($_SESSION[
'lastsearch_values_'.$key]);
3665 $relativepathstring = $_SERVER[
"PHP_SELF"];
3667 if (constant(
'DOL_URL_ROOT')) {
3668 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3670 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3671 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3672 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3673 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3674 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3675 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3676 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3678 if (!empty($contextpage)) {
3679 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3681 if (!empty($page) && $page > 0) {
3682 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3684 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3685 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3687 if (!empty($mode)) {
3688 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3691 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3692 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3693 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3694 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3700 if (
$conf->use_javascript_ajax) {
3701 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3702 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3705 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3706 print
'<div class="error">'.$msg.
'</div>';
3714 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3716 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3717 print
'</div> <!-- End div id-right -->'.
"\n";
3720 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3721 print
'</div> <!-- End div id-container -->'.
"\n";
3726 print
'<!-- '.$comment.
' -->'.
"\n";
3731 if (!empty($delayedhtmlcontent)) {
3732 print $delayedhtmlcontent;
3735 if (!empty(
$conf->use_javascript_ajax)) {
3736 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3737 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3742 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3743 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3746 jQuery(document).ready(
function () {
3747 $(
'a.documentpreview').click(
function() {
3748 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3749 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3752 , element:
'<?php echo dol_escape_js($object->element) ?>'
3753 , action:
'DOC_PREVIEW'
3754 , token:
'<?php echo currentToken(); ?>'
3758 $(
'a.documentdownload').click(
function() {
3759 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3760 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3763 , element:
'<?php echo dol_escape_js($object->element) ?>'
3764 , action:
'DOC_DOWNLOAD'
3765 , token:
'<?php echo currentToken(); ?>'
3776 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3777 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3780 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3781 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3786 $forceping =
GETPOST(
'forceping',
'alpha');
3787 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3789 $hash_unique_id =
dol_hash(
'dolibarr'.
$conf->file->instance_unique_id,
'sha256');
3795 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3796 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3797 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3801 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
3803 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3805 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";
3806 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3807 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
3809 $distrib =
'standard';
3810 if (isset($_SERVER[
"SERVER_ADMIN"]) && $_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3811 $distrib =
'doliwamp';
3813 if (!empty($dolibarr_distrib)) {
3814 $distrib = $dolibarr_distrib;
3818 jQuery(document).ready(
function (tmp) {
3819 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
3822 url:
"<?php echo $url_for_ping ?>",
3826 hash_algo:
'dol_hash-sha256',
3827 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3828 action:
'dolibarrping',
3829 version:
'<?php echo (float) DOL_VERSION; ?>',
3830 entity:
'<?php echo (int) $conf->entity; ?>',
3831 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3832 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3833 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3834 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3835 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
3836 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3837 token:
'notrequired'
3839 success:
function (data,
status, xhr) {
3840 console.log(
"Ping ok");
3843 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3846 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3849 error:
function (data,
status,xhr) {
3850 console.log(
"Ping ko: " + data);
3853 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3856 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3866 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3867 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3874 $parameters = array();
3875 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3877 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.