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;
1033 if (!empty($dol_hide_topmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1034 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1036 if (!empty($dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1037 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1039 if (!empty($dol_optimize_smallscreen)) {
1040 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1042 if (!empty($dol_no_mouse_hover)) {
1043 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1045 if (!empty($dol_use_jmobile)) {
1046 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1049 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1053 $user->update_last_login_date();
1055 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1056 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1059 $user->context[
'audit'] = $loginfo;
1060 $user->context[
'authentication_method'] = $dol_authmode;
1063 $result = $user->call_trigger(
'USER_LOGIN', $user);
1071 $hookmanager->initHooks(array(
'login'));
1072 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1073 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1081 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1089 if (!empty($landingpage)) {
1091 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1092 header(
'Location: '.$newpath);
1101 $user->rights->user->user->lire = 1;
1102 $user->rights->user->user->creer = 1;
1103 $user->rights->user->user->password = 1;
1104 $user->rights->user->user->supprimer = 1;
1105 $user->rights->user->self->creer = 1;
1106 $user->rights->user->self->password = 1;
1110 if (!$user->hasRight(
'user',
'user_advance')) {
1111 $user->rights->user->user_advance =
new stdClass();
1113 if (!$user->hasRight(
'user',
'self_advance')) {
1114 $user->rights->user->self_advance =
new stdClass();
1116 if (!$user->hasRight(
'user',
'group_advance')) {
1117 $user->rights->user->group_advance =
new stdClass();
1120 $user->rights->user->user_advance->readperms = 1;
1121 $user->rights->user->user_advance->write = 1;
1122 $user->rights->user->self_advance->readperms = 1;
1123 $user->rights->user->self_advance->writeperms = 1;
1124 $user->rights->user->group_advance->read = 1;
1125 $user->rights->user->group_advance->readperms = 1;
1126 $user->rights->user->group_advance->write = 1;
1127 $user->rights->user->group_advance->delete = 1;
1136 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1139 if ((
int)
$conf->liste_limit <= 0) {
1141 $conf->liste_limit = 15;
1142 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1143 $conf->liste_limit = 8;
1144 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1145 $conf->liste_limit = 10;
1146 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1147 $conf->liste_limit = 20;
1151 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1158 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1162 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1163 $user->loadDefaultValues();
1169if (
GETPOST(
'theme',
'aZ09')) {
1171 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1176 $conf->use_javascript_ajax = 0;
1187 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1197if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1198 $conf->dol_hide_leftmenu = 1;
1200if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1201 $conf->dol_hide_topmenu = 1;
1203if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1204 $conf->dol_optimize_smallscreen = 1;
1206if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1207 $conf->dol_no_mouse_hover = 1;
1209if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1210 $conf->dol_use_jmobile = 1;
1213if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1214 $conf->dol_no_mouse_hover = 1;
1218if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1219 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1220 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1223 $conf->dol_optimize_smallscreen = 1;
1226 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1230if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1231 $conf->theme =
'eldy';
1232 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1235if (!defined(
'NOREQUIRETRAN')) {
1236 if (!
GETPOST(
'lang',
'aZ09')) {
1238 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1241 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1242 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1248if (!defined(
'NOLOGIN')) {
1251 if (!$user->login) {
1256 if ($user->statut < 1) {
1258 $langs->loadLangs(array(
"errors",
"other"));
1259 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1264 $user->loadRights();
1267dol_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);
1272if (!defined(
'NOREQUIRETRAN')) {
1274 $langs->loadLangs(array(
'main',
'dict'));
1278$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1279$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1280$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1292if (empty(
$conf->browser->firefox)) {
1293 define(
'ROWS_1', 1);
1294 define(
'ROWS_2', 2);
1295 define(
'ROWS_3', 3);
1296 define(
'ROWS_4', 4);
1297 define(
'ROWS_5', 5);
1298 define(
'ROWS_6', 6);
1299 define(
'ROWS_7', 7);
1300 define(
'ROWS_8', 8);
1301 define(
'ROWS_9', 9);
1303 define(
'ROWS_1', 0);
1304 define(
'ROWS_2', 1);
1305 define(
'ROWS_3', 2);
1306 define(
'ROWS_4', 3);
1307 define(
'ROWS_5', 4);
1308 define(
'ROWS_6', 5);
1309 define(
'ROWS_7', 6);
1310 define(
'ROWS_8', 7);
1311 define(
'ROWS_9', 8);
1314$heightforframes = 52;
1317if (!defined(
'NOREQUIREMENU')) {
1318 if (empty($user->socid)) {
1326 $file_menu =
$conf->standard_menu;
1327 if (
GETPOST(
'menu',
'alpha')) {
1328 $file_menu =
GETPOST(
'menu',
'alpha');
1331 if (!class_exists(
'MenuManager')) {
1333 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1334 foreach ($dirmenus as $dirmenu) {
1336 if (class_exists(
'MenuManager')) {
1340 if (!class_exists(
'MenuManager')) {
1341 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1342 $file_menu =
'eldy_menu.php';
1343 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1347 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1352if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1353 $message =
GETPOST(
'seteventmessages',
'alpha');
1354 $messages = explode(
',', $message);
1355 foreach ($messages as $key => $msg) {
1356 $tmp = explode(
':', $msg);
1363if (!function_exists(
"llxHeader")) {
1387 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1389 global
$conf, $hookmanager;
1391 $parameters = array(
1393 'title' => & $title,
1394 'help_url' => & $help_url,
1395 'target' => & $target,
1396 'disablejs' => & $disablejs,
1397 'disablehead' => & $disablehead,
1398 'arrayofjs' => & $arrayofjs,
1399 'arrayofcss' => & $arrayofcss,
1400 'morequerystring' => & $morequerystring,
1401 'morecssonbody' => & $morecssonbody,
1402 'replacemainareaby' => & $replacemainareaby,
1403 'disablenofollow' => & $disablenofollow,
1404 'disablenoindex' => & $disablenoindex
1407 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1409 print $hookmanager->resPrint;
1414 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1416 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1418 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1420 if ($mainmenu !=
'website') {
1421 $tmpcsstouse = $morecssonbody;
1426 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1429 if (
GETPOST(
'dol_openinpopup',
'aZ09')) {
1430 $tmpcsstouse .=
' dol_openinpopup';
1433 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1436 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1437 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1440 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1441 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1445 if ($replacemainareaby) {
1446 print $replacemainareaby;
1464 global $db,
$conf, $hookmanager;
1466 if ($contenttype ==
'text/html') {
1467 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1469 header(
"Content-Type: ".$contenttype);
1475 header(
"X-Content-Type-Options: nosniff");
1478 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1479 header(
"X-Frame-Options: SAMEORIGIN");
1481 header(
"X-Frame-Options: ALLOWALL");
1485 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1486 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1487 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1488 header(
'Vary: Origin');
1495 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1510 if (!is_object($hookmanager)) {
1511 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1514 $hookmanager->initHooks(array(
"main"));
1516 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1517 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1519 $contentsecuritypolicy = $hookmanager->resPrint;
1521 $contentsecuritypolicy .= $hookmanager->resPrint;
1524 if (!empty($contentsecuritypolicy)) {
1525 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1528 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1532 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1547 if (!is_object($hookmanager)) {
1548 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1551 $hookmanager->initHooks(array(
"main"));
1553 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1554 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1556 $contentsecuritypolicy = $hookmanager->resPrint;
1558 $contentsecuritypolicy .= $hookmanager->resPrint;
1561 if (!empty($contentsecuritypolicy)) {
1562 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1565 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1572 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1575 header(
"Referrer-Policy: ".$referrerpolicy);
1578 if ($forcenocache) {
1579 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1601function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1603 global $db,
$conf, $langs, $user, $mysoc, $hookmanager;
1607 if (empty(
$conf->css)) {
1608 $conf->css =
'/theme/eldy/style.css.php';
1611 print
'<!doctype html>'.
"\n";
1613 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1616 if (empty($disablehead)) {
1617 if (!is_object($hookmanager)) {
1618 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1621 $hookmanager->initHooks(array(
"main"));
1623 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1627 if (
GETPOST(
'dol_basehref',
'alpha')) {
1628 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1632 print
'<meta charset="utf-8">'.
"\n";
1633 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1634 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1635 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1636 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1637 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1639 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1642 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1643 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1644 if (!empty($mysoc->logo_squarred_mini)) {
1645 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1650 if (empty(
$conf->dol_use_jmobile)) {
1651 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1652 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1656 $manifest = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/manifest.json.php';
1657 $parameters = array(
'manifest' => $manifest);
1658 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1660 $manifest = $hookmanager->resPrint;
1662 $manifest .= $hookmanager->resPrint;
1664 if (!empty($manifest)) {
1665 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1669 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1674 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1678 $appli = constant(
'DOL_APPLICATION_TITLE');
1681 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1694 $parameters = array(
'title' => $titletoshow);
1695 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1697 $titletoshow = $hookmanager->resPrint;
1699 $titletoshow .= $hookmanager->resPrint;
1708 $ext =
'version='.GETPOSTINT(
'version');
1711 if (
GETPOST(
'dol_resetcache')) {
1712 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1716 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1718 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1719 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1720 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1722 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1723 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1725 if (GETPOSTISSET(
'dol_openinpopup')) {
1726 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1728 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1729 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1731 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1732 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1734 if (GETPOSTISSET(
'dol_use_jmobile')) {
1735 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1738 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1739 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1741 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1742 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1746 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1747 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1750 if (!defined(
'DISABLE_JQUERY') && !$disablejs &&
$conf->use_javascript_ajax) {
1751 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1752 if (!defined(
'DISABLE_JQUERY_UI')) {
1753 $jquerytheme =
'base';
1757 if (constant(
'JS_JQUERY_UI')) {
1758 print
'<link rel="stylesheet" type="text/css" href="' . JS_JQUERY_UI .
'css/' . $jquerytheme .
'/jquery-ui.min.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1760 print
'<link rel="stylesheet" type="text/css" href="' . DOL_URL_ROOT .
'/includes/jquery/css/' . $jquerytheme .
'/jquery-ui.css' . ($ext ?
'?' . $ext :
'') .
'">' .
"\n";
1763 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1764 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1766 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1768 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1772 if (!defined(
'DISABLE_FONT_AWSOME')) {
1773 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1774 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1775 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1781 if (!empty(
$conf->modules_parts[
'theme'])) {
1782 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
1785 $themesubdir = $reldir;
1791 if (!defined(
'DISABLE_CSS_DEFAULT_THEME')) {
1792 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1793 print
'<link rel="stylesheet" type="text/css" href="' . $themepath . $themeparam .
'">' .
"\n";
1797 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";
1802 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1803 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1807 if (!empty(
$conf->modules_parts[
'css'])) {
1808 $arraycss = (array)
$conf->modules_parts[
'css'];
1809 foreach ($arraycss as $modcss => $filescss) {
1810 $filescss = (array) $filescss;
1811 foreach ($filescss as $cssfile) {
1812 if (empty($cssfile)) {
1813 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1817 if ($urlforcss && $urlforcss !=
'/') {
1818 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1820 if (!preg_match(
'/\.css$/i', $cssfile)) {
1825 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1831 if (is_array($arrayofcss)) {
1832 foreach ($arrayofcss as $cssfile) {
1833 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1834 $urltofile = $cssfile;
1838 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1840 if (!preg_match(
'/\.css$/i', $cssfile)) {
1850 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1854 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty(
$conf->use_javascript_ajax)) {
1856 print
'<!-- Includes JS for JQuery -->'.
"\n";
1857 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1858 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1860 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1862 if (!defined(
'DISABLE_JQUERY_UI')) {
1863 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1864 print
'<script nonce="' .
getNonce() .
'" src="' . JS_JQUERY_UI .
'jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1866 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/includes/jquery/js/jquery-ui.min.js' . ($ext ?
'?' . $ext :
'') .
'"></script>' .
"\n";
1870 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1871 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1874 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1875 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1879 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1883 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1884 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1885 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1886 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1887 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1888 print
'<script>'.
"\n";
1889 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1890 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1891 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1892 print 'var placeholderInPlace = \
' \';'.
"\n";
1893 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1894 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1895 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".
$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1896 print
'var withInPlace = 300;';
1897 print
'</script>'.
"\n";
1898 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1899 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1902 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1903 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1904 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1906 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1909 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1911 if (!defined(
'DISABLE_MULTISELECT')) {
1912 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1916 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
1918 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1919 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1920 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1921 $jsckeditor =
'ckeditor.js';
1922 if (constant(
'JS_CKEDITOR')) {
1924 $pathckeditor = constant(
'JS_CKEDITOR');
1926 print
'<script nonce="'.getNonce().
'">';
1927 print
'/* enable ckeditor by main.inc.php */';
1928 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1929 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1930 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1931 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";
1932 print
'</script>'.
"\n";
1933 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1935 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1936 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1938 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1940 print
'</script>'.
"\n";
1944 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1945 $enablebrowsernotif =
false;
1947 $enablebrowsernotif =
true;
1949 if (
$conf->browser->layout ==
'phone') {
1950 $enablebrowsernotif =
false;
1952 if ($enablebrowsernotif) {
1953 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1954 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1959 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1960 if (!defined(
'DISABLE_LIB_HEAD_JS')) {
1961 print
'<script nonce="' .
getNonce() .
'" src="' . DOL_URL_ROOT .
'/core/js/lib_head.js.php?lang=' . $langs->defaultlang . ($ext ?
'&' . $ext :
'') .
'"></script>' .
"\n";
1966 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1967 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1971 if (!empty(
$conf->modules_parts[
'js'])) {
1972 $arrayjs = (array)
$conf->modules_parts[
'js'];
1973 foreach ($arrayjs as $modjs => $filesjs) {
1974 $filesjs = (array) $filesjs;
1975 foreach ($filesjs as $jsfile) {
1978 if ($urlforjs && $urlforjs !=
'/') {
1979 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1980 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1982 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1988 if (is_array($arrayofjs)) {
1989 print
'<!-- Includes JS added by page -->'.
"\n";
1990 foreach ($arrayofjs as $jsfile) {
1991 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1992 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1994 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2003 if (file_exists($theme_js)) {
2004 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2008 if (!empty($head)) {
2015 $parameters = array();
2016 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2017 print $hookmanager->resPrint;
2019 print
"</head>\n\n";
2022 $conf->headerdone = 1;
2042function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2044 global $user,
$conf, $langs, $db, $form;
2046 global $hookmanager, $menumanager;
2051 $hookmanager->initHooks(array(
'toprightmenu'));
2056 if (empty(
$conf->headerdone)) {
2057 $disablenofollow = 0;
2058 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2059 print
'<body id="mainbody">';
2065 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2066 if (!isset($form) || !is_object($form)) {
2067 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2068 $form =
new Form($db);
2071 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2073 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2076 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2078 $menumanager->atarget = $target;
2080 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2084 $appli = constant(
'DOL_APPLICATION_TITLE');
2087 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2089 $appli .=
" ".DOL_VERSION;
2093 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2097 $logouthtmltext =
'';
2100 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2101 if (
$conf->browser->name ==
'chrome') {
2102 $stringforfirstkey .=
' ALT +';
2103 } elseif (
$conf->browser->name ==
'firefox') {
2104 $stringforfirstkey .=
' ALT + SHIFT +';
2106 $stringforfirstkey .=
' CTL +';
2108 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2109 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2110 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2111 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2112 $logouttext .=
'</a>';
2114 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2115 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2120 print
'<div class="login_block usedropdown">'.
"\n";
2124 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2127 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2147 $toprightmenu .=
'</div>';
2149 $toprightmenu .=
'</div>'.
"\n";
2153 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2156 $parameters = array();
2157 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2158 if (is_numeric($result)) {
2160 $toprightmenu .= $hookmanager->resPrint;
2162 $toprightmenu = $hookmanager->resPrint;
2165 $toprightmenu .= $result;
2169 if (isModEnabled(
'modulebuilder')) {
2170 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2172 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2175 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2182 if (isset($_POST) && is_array($_POST)) {
2183 foreach ($_POST as $key => $value) {
2184 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2185 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2188 if (!is_array($value)) {
2189 if ($value !==
'') {
2190 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2193 foreach ($value as $value2) {
2194 if (($value2 !==
'') && (!is_array($value2))) {
2195 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2201 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2202 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2204 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2207 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2212 $langs->load(
"help");
2219 if (empty($helppagename)) {
2220 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2222 $helppresent =
'helppresent';
2227 $helpbaseurl = $arrayres[
'helpbaseurl'];
2228 $helppage = $arrayres[
'helppage'];
2229 $mode = $arrayres[
'mode'];
2232 if ($helpbaseurl && $helppage) {
2234 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2235 if ($mode ==
'wiki') {
2236 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2238 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2240 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2243 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2244 if ($mode ==
'wiki') {
2246 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2249 $text .= sprintf($helpbaseurl, $helppage);
2252 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2253 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2256 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2261 $langs->load(
'admin');
2262 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2268 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2270 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2275 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2278 $toprightmenu .=
'</div>';
2282 $toprightmenu .=
'<div class="login_block_user">';
2285 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2290 $toprightmenu .=
'</div>';
2292 $toprightmenu .=
'</div>'.
"\n";
2295 print $toprightmenu;
2302 print
'<div style="clear: both;"></div>';
2303 print
"<!-- End top horizontal menu -->\n\n";
2306 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2307 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2321 global $langs,
$conf, $db, $hookmanager, $user, $mysoc;
2323 global $menumanager, $form;
2326 if (
$conf->browser->name ==
'textbrowser') {
2330 $langs->load(
'companies');
2332 $userImage = $userDropDownImage =
'';
2333 if (!empty($user->photo) || isModEnabled(
'gravatar')) {
2334 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2335 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2337 $nophoto =
'/public/theme/common/user_anonymous.png';
2338 if ($user->gender ==
'man') {
2339 $nophoto =
'/public/theme/common/user_man.png';
2341 if ($user->gender ==
'woman') {
2342 $nophoto =
'/public/theme/common/user_woman.png';
2345 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2346 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2350 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2351 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2353 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2355 while ($idprofcursor < 10) {
2357 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2358 if ($idprofcursor == 1) {
2359 $constkeyforprofid =
'MAIN_INFO_SIREN';
2361 if ($idprofcursor == 2) {
2362 $constkeyforprofid =
'MAIN_INFO_SIRET';
2364 if ($idprofcursor == 3) {
2365 $constkeyforprofid =
'MAIN_INFO_APE';
2367 if ($idprofcursor == 4) {
2368 $constkeyforprofid =
'MAIN_INFO_RCS';
2370 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2375 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid),
'1').
'</span>';
2379 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2380 if (isModEnabled(
'multicurrency')) {
2381 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
$conf->currency.
'</span>';
2383 $dropdownBody .=
'</div>';
2385 $dropdownBody .=
'<br>';
2386 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2387 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2390 if (!empty($user->admin)) {
2391 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2394 if (!empty($user->socid)) {
2395 $thirdpartystatic =
new Societe($db);
2396 $thirdpartystatic->fetch($user->socid);
2397 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2398 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2400 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2401 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2402 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2403 $dropdownBody .=
'<br>';
2405 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2406 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2408 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2410 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2411 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2412 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2413 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2415 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2417 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2419 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2420 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2421 $dropdownBody .=
' <span class="opacitymedium">('.$_SESSION[
'dol_tz_string'].
')</span>';
2426 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.ucfirst(
$conf->browser->name).($conf->browser->version ?
' '.$conf->browser->version :
'');
2427 $dropdownBody .= $form->textwithpicto(
'',
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']), 1,
'help',
'valignmiddle', 0, 3,
'useragent');
2428 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
$conf->browser->layout;
2429 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2430 if (
$conf->browser->layout ==
'phone') {
2431 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2433 if (!empty($_SESSION[
"disablemodules"])) {
2434 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2436 $dropdownBody .=
'</div>';
2439 $parameters = array(
'user' => $user,
'langs' => $langs);
2440 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2441 if (is_numeric($result)) {
2443 $dropdownBody .= $hookmanager->resPrint;
2445 $dropdownBody = $hookmanager->resPrint;
2449 if (empty($urllogout)) {
2450 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2455 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2456 if (
$conf->browser->name ==
'chrome') {
2457 $stringforfirstkey .=
' ALT +';
2458 } elseif (
$conf->browser->name ==
'firefox') {
2459 $stringforfirstkey .=
' ALT + SHIFT +';
2461 $stringforfirstkey .=
' CTL +';
2465 $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>';
2466 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2467 $jsonopen =
"closeTopMenuLoginDropdown()";
2468 $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');
2469 $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>';
2471 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2472 if (!empty($user->admin)) {
2473 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2477 $appli = constant(
'DOL_APPLICATION_TITLE');
2480 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2482 $appli .=
" ".DOL_VERSION;
2486 $btnUser =
'<!-- div for user link -->
2487 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2488 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2489 '.$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>' :
'').
'
2491 <div class="dropdown-menu">
2493 <div class="user-header">
2494 '.$userDropDownImage.
'
2496 '.$profilName.
'<br>';
2498 if ($user->datelastlogin) {
2499 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2500 if ($user->datepreviouslogin) {
2501 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2504 $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>';
2505 if ($user->datepreviouslogin) {
2506 $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>';
2514 <!-- Menu Body user-->
2515 <div class="user-body">'.$dropdownBody.
'</div>
2518 <div class="user-footer">
2519 <div class="pull-left">
2522 <div class="pull-left">
2523 '.$virtuelcardLink.
'
2525 <div class="pull-right">
2528 <div class="clearboth"></div>
2534 $btnUser =
'<!-- div for user link text browser -->
2535 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2536 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2537 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2542 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2544 <!-- Code to show/hide the user drop-down -->
2546 function closeTopMenuLoginDropdown() {
2547 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2549 jQuery("#topmenu-login-dropdown").removeClass("open");
2551 jQuery(document).ready(function() {
2552 jQuery(document).on("click", function(event) {
2553 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2554 /* console.log("click close login - we click outside"); */
2555 closeTopMenuLoginDropdown();
2562 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2563 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2564 event.preventDefault();
2565 jQuery("#topmenu-login-dropdown").toggleClass("open");
2568 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2569 console.log("Click on #topmenulogincompanyinfo-btn");
2570 if (!jQuery("#topmenuloginmoreinfo").is(\':hidden\')) {
2571 jQuery("#topmenuloginmoreinfo").slideToggle();
2573 jQuery("#topmenulogincompanyinfo").slideToggle();
2576 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2577 console.log("Click on #topmenuloginmoreinfo-btn");
2578 if (!jQuery("#topmenulogincompanyinfo").is(\':hidden\')) {
2579 jQuery("#topmenulogincompanyinfo").slideToggle();
2581 jQuery("#topmenuloginmoreinfo").slideToggle();
2601 global
$conf, $langs;
2612 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2613 if (
$conf->browser->os ===
'macintosh') {
2614 $stringforfirstkey .=
' CTL +';
2616 if (
$conf->browser->name ==
'chrome') {
2617 $stringforfirstkey .=
' ALT +';
2618 } elseif (
$conf->browser->name ==
'firefox') {
2619 $stringforfirstkey .=
' ALT + SHIFT +';
2621 $stringforfirstkey .=
' CTL +';
2625 if (!empty(
$conf->use_javascript_ajax)) {
2626 $html .=
'<!-- div for quick add link -->
2627 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2628 <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>
2631 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2633 <!-- Code to show/hide the user drop-down for the quick add -->
2635 jQuery(document).ready(function() {
2636 jQuery(document).on("click", function(event) {
2637 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2638 /* console.log("click close quick add - we click outside"); */
2640 $("#topmenu-quickadd-dropdown").removeClass("open");
2643 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2644 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2645 openQuickAddDropDown(event);
2649 $(document).keydown(function(event){
2650 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2651 if (ostype ===
"macintosh") {
2652 if ( event.which === 65 && event.ctrlKey ) {
2653 console.log(\
'control + a : trigger open quick add dropdown\');
2654 openQuickAddDropDown(event);
2657 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2658 console.log(\'control + shift + a : trigger open quick add dropdown\');
2659 openQuickAddDropDown(event);
2664 var openQuickAddDropDown = function(event) {
2665 event.preventDefault();
2666 $("#topmenu-quickadd-dropdown").toggleClass("open");
2686 global
$conf, $langs;
2697 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2698 if (
$conf->browser->os ===
'macintosh') {
2699 $stringforfirstkey .=
' CTL +';
2701 if (
$conf->browser->name ==
'chrome') {
2702 $stringforfirstkey .=
' ALT +';
2703 } elseif (
$conf->browser->name ==
'firefox') {
2704 $stringforfirstkey .=
' ALT + SHIFT +';
2706 $stringforfirstkey .=
' CTL +';
2711 if (!empty(
$conf->use_javascript_ajax)) {
2712 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2717 $html .=
'<!-- div for link to upload file -->
2718 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2719 <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>
2735 global $user, $langs, $hookmanager;
2740 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2741 "title" =>
"MenuNewMember@members",
2742 "name" =>
"Adherent@members",
2743 "picto" =>
"object_member",
2744 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2748 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2749 "title" =>
"MenuNewThirdParty@companies",
2750 "name" =>
"ThirdParty@companies",
2751 "picto" =>
"object_company",
2752 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2756 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2757 "title" =>
"NewContactAddress@companies",
2758 "name" =>
"Contact@companies",
2759 "picto" =>
"object_contact",
2760 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2764 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2765 "title" =>
"NewPropal@propal",
2766 "name" =>
"Proposal@propal",
2767 "picto" =>
"object_propal",
2768 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2773 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2774 "title" =>
"NewOrder@orders",
2775 "name" =>
"Order@orders",
2776 "picto" =>
"object_order",
2777 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2781 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2782 "title" =>
"NewBill@bills",
2783 "name" =>
"Bill@bills",
2784 "picto" =>
"object_bill",
2785 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2789 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2790 "title" =>
"NewContractSubscription@contracts",
2791 "name" =>
"Contract@contracts",
2792 "picto" =>
"object_contract",
2793 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2797 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2798 "title" =>
"SupplierProposalNew@supplier_proposal",
2799 "name" =>
"SupplierProposal@supplier_proposal",
2800 "picto" =>
"supplier_proposal",
2801 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2805 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2806 "title" =>
"NewSupplierOrderShort@orders",
2807 "name" =>
"SupplierOrder@orders",
2808 "picto" =>
"supplier_order",
2809 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2813 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2814 "title" =>
"NewBill@bills",
2815 "name" =>
"SupplierBill@bills",
2816 "picto" =>
"supplier_invoice",
2817 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2821 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2822 "title" =>
"NewTicket@ticket",
2823 "name" =>
"Ticket@ticket",
2824 "picto" =>
"ticket",
2825 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2829 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2830 "title" =>
"NewIntervention@interventions",
2831 "name" =>
"Intervention@interventions",
2832 "picto" =>
"intervention",
2833 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2837 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2838 "title" =>
"NewProduct@products",
2839 "name" =>
"Product@products",
2840 "picto" =>
"object_product",
2841 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2845 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2846 "title" =>
"NewService@products",
2847 "name" =>
"Service@products",
2848 "picto" =>
"object_service",
2849 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2853 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2854 "title" =>
"AddUser@users",
2855 "name" =>
"User@users",
2857 "activation" => $user->hasRight(
"user",
"user",
"write"),
2863 $dropDownQuickAddHtml =
'';
2867 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2869 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2872 $parameters = array();
2873 $hook_items = $items;
2874 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2875 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2876 if ($reshook == 0) {
2877 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2879 $items = $hookmanager->resArray;
2883 $position = array();
2884 foreach ($items[
'items'] as $key => $row) {
2885 $position[$key] = $row[
'position'];
2887 $array1_sort_order = SORT_ASC;
2888 array_multisort($position, $array1_sort_order, $items[
'items']);
2891 foreach ($items[
'items'] as $item) {
2892 if (!$item[
'activation']) {
2895 $langs->load(explode(
'@', $item[
'title'])[1]);
2896 $langs->load(explode(
'@', $item[
'name'])[1]);
2897 $dropDownQuickAddHtml .=
'
2898 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2899 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2904 $dropDownQuickAddHtml .=
'</div>';
2906 $dropDownQuickAddHtml .=
'</div>';
2908 return $dropDownQuickAddHtml;
2918 global $langs,
$conf, $user;
2923 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2934 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2935 if (
$conf->browser->os ===
'macintosh') {
2936 $stringforfirstkey .=
' CTL +';
2938 if (
$conf->browser->name ==
'chrome') {
2939 $stringforfirstkey .=
' ALT +';
2940 } elseif (
$conf->browser->name ==
'firefox') {
2941 $stringforfirstkey .=
' ALT + SHIFT +';
2943 $stringforfirstkey .=
' CTL +';
2947 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2948 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2949 $langs->load(
"bookmarks");
2952 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2956 $html .=
'<!-- div for bookmark link -->
2957 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2958 <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>
2959 <div class="dropdown-menu">
2965 <!-- Code to show/hide the bookmark drop-down -->
2967 jQuery(document).ready(function() {
2968 jQuery(document).on("click", function(event) {
2969 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2970 /* console.log("close bookmark dropdown - we click outside"); */
2972 $("#topmenu-bookmark-dropdown").removeClass("open");
2976 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2977 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2978 openBookMarkDropDown(event);
2982 jQuery(document).keydown(function(event) {
2983 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2984 if (ostype ===
"macintosh") {
2985 if ( event.which === 66 && event.ctrlKey ) {
2986 console.log(
"Click on control + b : trigger open bookmark dropdown");
2987 openBookMarkDropDown(event);
2990 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2991 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2992 openBookMarkDropDown(event);
2997 var openBookMarkDropDown =
function(event) {
2998 console.log(
"toggle #topmenu-bookmark-dropdown and force focus");
2999 event.preventDefault();
3000 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3001 jQuery(
"#top-bookmark-search-input").focus();
3017function top_menu_search()
3019 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3024 $arrayresult = array();
3025 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3027 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3028 // accesskey is for Mac: CTRL + key for all browsers
3029 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3030 if ($conf->browser->name == 'chrome
') {
3031 $stringforfirstkey .= ' ALT +
';
3032 } elseif ($conf->browser->name == 'firefox
') {
3033 $stringforfirstkey .= ' ALT + SHIFT +
';
3035 $stringforfirstkey .= ' CTL +
';
3038 $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">
';
3040 $defaultAction = '';
3041 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3042 // Menu with all searchable items
3043 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3044 foreach ($arrayresult as $keyItem => $item) {
3045 if (empty($defaultAction)) {
3046 $defaultAction = $item['url
'];
3048 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3049 $buttonList .= $item['text
'];
3050 $buttonList .= '</
button>
';
3052 $buttonList .= '</div>
';
3054 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3057 <!-- search input -->
3058 <div
class=
"dropdown-header search-dropdown-header">
3064 <!--
Menu Body search -->
3065 <div
class=
"dropdown-body search-dropdown-body">
3070 $dropDownHtml .= '</form>
';
3072 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3073 // accesskey is for Mac: CTRL + key for all browsers
3074 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3075 if ($conf->browser->name == 'chrome
') {
3076 $stringforfirstkey .= ' ALT +
';
3077 } elseif ($conf->browser->name == 'firefox
') {
3078 $stringforfirstkey .= ' ALT + SHIFT +
';
3080 $stringforfirstkey .= ' CTL +
';
3083 $html .= '<!-- div
for Global Search -->
3084 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3085 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3086 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3088 <div
class=
"dropdown-menu dropdown-search">
3094 <!-- Code to show/hide the
user drop-down -->
3096 jQuery(document).ready(
function() {
3099 jQuery(
"#top-global-search-input").keydown(
function (e) {
3100 if (e.keyCode == 13 || e.keyCode == 40) {
3101 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3102 if (inputs[inputs.index(this) + 1] != null) {
3103 console.log(
"Force focus after keydow on #top-global-search-input");
3104 inputs[inputs.index(this) + 1].focus();
3105 if (e.keyCode == 13){
3106 inputs[inputs.index(this) + 1].trigger(
"click");
3116 jQuery(document).keydown(
function(e) {
3118 var $focused = $(
":focus");
3119 if($focused.length && $focused.hasClass(
"global-search-item")){
3122 if (e.keyCode == 38) {
3124 console.log(
"Force focus after keycode 38");
3125 $focused.prev().focus();
3129 if (e.keyCode == 40) {
3131 console.log(
"Force focus after keycode 40");
3132 $focused.next().focus();
3139 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3140 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3141 jQuery(
"#top-menu-action-search").submit();
3145 jQuery(document).on(
"click",
function(event) {
3146 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3147 console.log(
"click close search - we click outside");
3149 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3154 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3155 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3156 openGlobalSearchDropDown();
3160 jQuery(document).keydown(
function(e){
3161 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3162 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3163 openGlobalSearchDropDown();
3165 if ( e.which === 70 && e.alKey ) {
3166 console.log(\'alt + f : trigger open global-search dropdown\');
3167 openGlobalSearchDropDown();
3171 var openGlobalSearchDropDown = function() {
3172 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3173 jQuery("#top-global-search-input").focus();
3197function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3199 global $user,
$conf, $langs, $db, $form;
3200 global $hookmanager, $menumanager;
3204 if (!empty($menu_array_before)) {
3205 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);
3208 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3210 $hookmanager->initHooks(array(
'leftblock'));
3212 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3215 if (!is_object($form)) {
3216 $form =
new Form($db);
3221 if (
$conf->browser->layout ==
'phone') {
3222 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3226 $arrayresult = array();
3227 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3232 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3233 if (
$conf->browser->name ==
'chrome') {
3234 $stringforfirstkey .=
' ALT +';
3235 } elseif (
$conf->browser->name ==
'firefox') {
3236 $stringforfirstkey .=
' ALT + SHIFT +';
3238 $stringforfirstkey .=
' CTL +';
3242 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3243 $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');
3245 if (is_array($arrayresult)) {
3247 foreach ($arrayresult as $key => $val) {
3248 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3254 $parameters = array(
'searchform' => $searchform);
3255 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3256 if (empty($reshook)) {
3257 $searchform .= $hookmanager->resPrint;
3259 $searchform = $hookmanager->resPrint;
3264 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3265 $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>';
3267 $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>';
3268 $searchform .=
'<script>
3269 jQuery(document).ready(function () {
3270 jQuery("#divsearchforms1").click(function(){
3271 jQuery("#divsearchforms2").toggle();
3275 $searchform .=
'</div>';
3279 $searchform .=
'<script>
3280 jQuery(document).keydown(function(e){
3281 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3282 console.log(\'control + shift + f : trigger open global-search dropdown\');
3283 openGlobalSearchDropDown();
3285 if( (e.which === 83 || e.which === 115) && e.altKey ){
3286 console.log(\'alt + s : trigger open global-search dropdown\');
3287 openGlobalSearchDropDown();
3291 var openGlobalSearchDropDown = function() {
3292 jQuery("#searchselectcombo").select2(\'open\');
3298 print
'<!-- Begin left menu -->'.
"\n";
3300 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3304 $menumanager->menu_array = $menu_array_before;
3306 $menumanager->menu_array_after = $menu_array_after;
3309 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3312 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3317 print
"<!-- Begin Help Block-->\n";
3318 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3322 $doliurl =
'https://www.dolibarr.org';
3324 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3325 $doliurl =
'https://www.dolibarr.fr';
3327 if (preg_match(
'/es/i', $langs->defaultlang)) {
3328 $doliurl =
'https://www.dolibarr.es';
3330 if (preg_match(
'/de/i', $langs->defaultlang)) {
3331 $doliurl =
'https://www.dolibarr.de';
3333 if (preg_match(
'/it/i', $langs->defaultlang)) {
3334 $doliurl =
'https://www.dolibarr.it';
3336 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3337 $doliurl =
'https://www.dolibarr.gr';
3340 $appli = constant(
'DOL_APPLICATION_TITLE');
3343 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3345 $appli .=
" ".DOL_VERSION;
3353 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3355 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3357 print
'<span class="help">';
3365 print
'</div>'.
"\n";
3370 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3373 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3374 $bugbaseurl .=
'&title=';
3375 $bugbaseurl .= urlencode(
"Bug: ");
3376 $bugbaseurl .=
'&body=';
3377 $bugbaseurl .= urlencode(
"# Instructions\n");
3378 $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");
3379 $bugbaseurl .= urlencode(
"*Please:*\n");
3380 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3381 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3382 $bugbaseurl .= urlencode(
"\n");
3383 $bugbaseurl .= urlencode(
"\n");
3384 $bugbaseurl .= urlencode(
"# Bug\n");
3385 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3386 $bugbaseurl .= urlencode(
"\n");
3387 $bugbaseurl .= urlencode(
"## Environment\n");
3388 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3389 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3390 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3391 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3392 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3393 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3394 $bugbaseurl .= urlencode(
"\n");
3395 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3396 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3397 $bugbaseurl .= urlencode(
"\n");
3398 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3399 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3400 $bugbaseurl .= urlencode(
"\n");
3401 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3402 $bugbaseurl .= urlencode(
"[*Files*]\n");
3403 $bugbaseurl .= urlencode(
"\n");
3405 $bugbaseurl .= urlencode(
"\n");
3406 $bugbaseurl .= urlencode(
"## Report\n");
3414 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3415 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3416 if (empty($reshook)) {
3417 $bugbaseurl .= $hookmanager->resPrint;
3419 $bugbaseurl = $hookmanager->resPrint;
3422 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3423 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3428 print
"<!-- End Help Block-->\n";
3432 print
"<!-- End left menu -->\n";
3436 $parameters = array();
3437 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3438 print $hookmanager->resPrint;
3440 print
'</div></div> <!-- End side-nav id-left -->';
3444 print
'<!-- Begin right area -->'.
"\n";
3446 if (empty($leftmenuwithoutmainarea)) {
3460 global
$conf, $langs, $hookmanager;
3462 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3463 print
'<div id="id-right">';
3468 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3470 $hookmanager->initHooks(array(
'main'));
3471 $parameters = array();
3472 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3473 print $hookmanager->resPrint;
3476 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3481 $parameters = array();
3482 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3483 if (empty($reshook)) {
3484 print
'<!-- Begin show mysoc info header -->'.
"\n";
3485 print
'<div id="mysoc-info-header">'.
"\n";
3486 print
'<table class="centpercent div-table-responsive">'.
"\n";
3488 print
'<tr><td rowspan="0" class="width20p">';
3490 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'))).
'">';
3492 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3493 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3505 print
'</table>'.
"\n";
3506 print
'</div>'.
"\n";
3507 print
'<!-- End show mysoc info header -->'.
"\n";
3526 if (preg_match(
'/^http/i', $helppagename)) {
3528 $helpbaseurl =
'%s';
3529 $helppage = $helppagename;
3534 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3535 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3536 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3537 $helppage = $reg[1];
3540 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3541 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3542 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3543 $helppage = $reg[1];
3546 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3547 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3548 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3549 $helppage = $reg[1];
3552 if (empty($helppage)) {
3553 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3554 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3555 $helppage = $reg[1];
3560 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3580function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3582 global $langs, $user;
3585 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3586 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3587 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3588 if ($showtitlebefore) {
3589 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3591 $ret .=
'<div class="tagtd">';
3592 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3593 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3594 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3595 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3596 $ret .=
' placeholder="'.strip_tags($title).
'"';
3597 $ret .= ($autofocus ?
' autofocus' :
'');
3598 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3599 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3600 $ret .=
'<span class="fa fa-search"></span>';
3601 $ret .=
'</button>';
3603 $ret .=
"</form>\n";
3608if (!function_exists(
"llxFooter")) {
3622 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3624 global
$conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3625 global $delayedhtmlcontent;
3626 global $contextpage, $page, $limit, $mode;
3627 global $dolibarr_distrib;
3629 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3633 $parameters = array();
3634 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3635 if (empty($reshook)) {
3636 $llxfooter .= $hookmanager->resPrint;
3637 } elseif ($reshook > 0) {
3638 $llxfooter = $hookmanager->resPrint;
3649 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3651 foreach ($user->lastsearch_values_tmp as $key => $val) {
3652 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3653 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3654 if (empty($val[
'sortfield'])) {
3655 unset($val[
'sortfield']);
3657 if (empty($val[
'sortorder'])) {
3658 unset($val[
'sortorder']);
3660 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3661 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3662 unset($_SESSION[
'lastsearch_values_'.$key]);
3668 $relativepathstring = $_SERVER[
"PHP_SELF"];
3670 if (constant(
'DOL_URL_ROOT')) {
3671 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3673 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3674 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3675 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3676 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3677 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3678 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3679 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3681 if (!empty($contextpage)) {
3682 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3684 if (!empty($page) && $page > 0) {
3685 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3687 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3688 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3690 if (!empty($mode)) {
3691 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3694 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3695 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3696 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3697 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3703 if (
$conf->use_javascript_ajax) {
3704 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3705 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3708 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3709 print
'<div class="error">'.$msg.
'</div>';
3717 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3719 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3720 print
'</div> <!-- End div id-right -->'.
"\n";
3723 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3724 print
'</div> <!-- End div id-container -->'.
"\n";
3729 print
'<!-- '.$comment.
' -->'.
"\n";
3734 if (!empty($delayedhtmlcontent)) {
3735 print $delayedhtmlcontent;
3738 if (!empty(
$conf->use_javascript_ajax)) {
3739 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3740 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3745 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3746 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3749 jQuery(document).ready(
function () {
3750 $(
'a.documentpreview').click(
function() {
3751 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3752 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3755 , element:
'<?php echo dol_escape_js($object->element) ?>'
3756 , action:
'DOC_PREVIEW'
3757 , token:
'<?php echo currentToken(); ?>'
3761 $(
'a.documentdownload').click(
function() {
3762 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3763 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3766 , element:
'<?php echo dol_escape_js($object->element) ?>'
3767 , action:
'DOC_DOWNLOAD'
3768 , token:
'<?php echo currentToken(); ?>'
3779 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3780 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3783 print
"\n<!-- A div to allow uiblock by dolBlockUI(message) -->\n";
3784 print
'<div id="dol-block-ui" style="display: none;"><div class="message">Loading...</div></div>'.
"\n";
3789 $forceping =
GETPOST(
'forceping',
'alpha');
3790 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3792 $hash_unique_id =
dol_hash(
'dolibarr'.
$conf->file->instance_unique_id,
'sha256');
3798 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3799 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3800 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3804 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
3806 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3808 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";
3809 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3810 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
3812 $distrib =
'standard';
3813 if (isset($_SERVER[
"SERVER_ADMIN"]) && $_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3814 $distrib =
'doliwamp';
3816 if (!empty($dolibarr_distrib)) {
3817 $distrib = $dolibarr_distrib;
3821 jQuery(document).ready(
function (tmp) {
3822 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
3825 url:
"<?php echo $url_for_ping ?>",
3829 hash_algo:
'dol_hash-sha256',
3830 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3831 action:
'dolibarrping',
3832 version:
'<?php echo (float) DOL_VERSION; ?>',
3833 entity:
'<?php echo (int) $conf->entity; ?>',
3834 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3835 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3836 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3837 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3838 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
3839 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3840 token:
'notrequired'
3842 success:
function (data,
status, xhr) {
3843 console.log(
"Ping ok");
3846 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3849 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3852 error:
function (data,
status,xhr) {
3853 console.log(
"Ping ko: " + data);
3856 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3859 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3869 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3870 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3877 $parameters = array();
3878 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters,
$object, $action);
3880 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.