44 $micro_start_time = 0;
45 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
46 list($usec, $sec) = explode(
" ", microtime());
47 $micro_start_time = ((
float) $usec + (
float) $sec);
50 if (defined(
'XDEBUGCOVERAGE')) {
51 xdebug_start_code_coverage();
65 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
68 if (preg_match(
'/^x/i', $newstringnumentity)) {
69 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
73 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
74 return chr((
int) $newstringnumentity);
77 return '&#'.$matches[1];
101 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
103 $val = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
108 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
109 $val = preg_replace(
'/[\r\n\t]/',
'', $val);
110 }
while ($oldval != $val);
121 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
124 if ($newval != $val) {
131 if ($type == 1 || $type == 3) {
133 $inj += preg_match(
'/delete\s*from/i', $val);
134 $inj += preg_match(
'/create\s*table/i', $val);
135 $inj += preg_match(
'/insert\s*into/i', $val);
136 $inj += preg_match(
'/select\s*from/i', $val);
137 $inj += preg_match(
'/into\s*(outfile|dumpfile)/i', $val);
138 $inj += preg_match(
'/user\s*\(/i', $val);
139 $inj += preg_match(
'/information_schema/i', $val);
140 $inj += preg_match(
'/<svg/i', $val);
141 $inj += preg_match(
'/update[^&=\w].*set.+=/i', $val);
142 $inj += preg_match(
'/union.+select/i', $val);
146 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s*by|concat|count|from|union/i', $val);
149 $inj += preg_match(
'/updatexml\(/i', $val);
150 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
151 $inj += preg_match(
'/\s@@/', $val);
154 $inj += preg_match(
'/<\/textarea/i', $val);
160 $inj += preg_match(
'/<audio/i', $val);
161 $inj += preg_match(
'/<embed/i', $val);
162 $inj += preg_match(
'/<iframe/i', $val);
163 $inj += preg_match(
'/<object/i', $val);
164 $inj += preg_match(
'/<script/i', $val);
165 $inj += preg_match(
'/Set\.constructor/i', $val);
166 if (!defined(
'NOSTYLECHECK')) {
167 $inj += preg_match(
'/<style/i', $val);
169 $inj += preg_match(
'/base\s+href/si', $val);
170 $inj += preg_match(
'/=data:/si', $val);
172 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)([a-z]*)\s*=/i', $val);
173 $inj += preg_match(
'/on(abort|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $val);
174 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $val);
175 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\s*=/i', $val);
176 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)\s*=/i', $val);
177 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $val);
179 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\s*=/i', $val);
182 $tmpval = preg_replace(
'/<[^<]+>/',
'', $val);
184 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)([a-z]*)\s*=/i', $tmpval);
185 $inj += preg_match(
'/on(abort|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $tmpval);
186 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $tmpval);
187 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\s*=/i', $tmpval);
188 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)\s*=/i', $tmpval);
189 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $tmpval);
191 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\s*=/i', $tmpval);
194 $inj += preg_match(
'/:|:|:/i', $val);
195 $inj += preg_match(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i', $val);
196 $inj += preg_match(
'/vbscript\s*:/i', $val);
198 if ($type == 1 || $type == 3) {
199 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
200 $inj += preg_match(
'/"/i', $val);
203 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
218 if (is_array($var)) {
219 foreach ($var as $key => $value) {
224 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
225 $errormessage =
'Access refused to '.htmlentities($ip, ENT_COMPAT,
'UTF-8').
' by SQL or Script injection protection in main.inc.php - GETPOST type='.htmlentities($type, ENT_COMPAT,
'UTF-8').
' paramkey='.htmlentities($key, ENT_COMPAT,
'UTF-8').
' paramvalue='.htmlentities($value, ENT_COMPAT,
'UTF-8').
' page='.htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT,
'UTF-8');
228 if (function_exists(
'error_log')) {
229 error_log($errormessage);
247 if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
248 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
251 if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
252 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
257 if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
258 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
262 if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
266 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
270 if (!defined(
'NOSCANPOSTFORINJECTION')) {
275 if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
276 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
280 require_once
'filefunc.inc.php';
285 if (!empty($_POST[
"DOL_AUTOSET_COOKIE"])) {
286 $tmpautoset = explode(
':', $_POST[
"DOL_AUTOSET_COOKIE"], 2);
287 $tmplist = explode(
',', $tmpautoset[1]);
288 $cookiearrayvalue = array();
289 foreach ($tmplist as $tmpkey) {
290 $postkey = $tmpautoset[0].
'_'.$tmpkey;
292 if (!empty($_POST[$postkey])) {
293 $cookiearrayvalue[$tmpkey] = $_POST[$postkey];
296 $cookiename = $tmpautoset[0];
297 $cookievalue = json_encode($cookiearrayvalue);
299 if (PHP_VERSION_ID < 70300) {
300 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
303 $cookieparams = array(
304 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
307 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
311 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
313 if (empty($cookievalue)) {
314 unset($_COOKIE[$cookiename]);
320 if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
321 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
327 $prefix = dol_getprefix(
'');
328 $sessionname =
'DOLSESSID_'.$prefix;
329 $sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
330 if (!empty($_COOKIE[$sessiontimeout])) {
331 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
336 if (!defined(
'NOSESSION')) {
337 if (PHP_VERSION_ID < 70300) {
338 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
341 $sessioncookieparams = array(
345 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
349 session_set_cookie_params($sessioncookieparams);
351 session_name($sessionname);
358 require_once
'master.inc.php';
361 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
363 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
365 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
367 } elseif (defined(
'NOREQUIREDB')) {
369 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
371 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
375 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
376 print
'Sorry, your application is offline.'.
"\n";
377 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
378 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
379 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
381 print
'Sorry, your application is offline. Only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
382 $nexturl = DOL_URL_ROOT.
'/';
383 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
391 register_shutdown_function(
'dol_shutdown');
394 if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
396 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
398 $renderer = $debugbar->getRenderer();
399 if (empty($conf->global->MAIN_HTML_HEADER)) {
400 $conf->global->MAIN_HTML_HEADER =
'';
402 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
404 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
408 if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
410 $conf->browser->name = $tmp[
'browsername'];
411 $conf->browser->os = $tmp[
'browseros'];
412 $conf->browser->version = $tmp[
'browserversion'];
413 $conf->browser->ua = $tmp[
'browserua'];
414 $conf->browser->layout = $tmp[
'layout'];
417 if ($conf->browser->layout ==
'phone') {
418 $conf->dol_no_mouse_hover = 1;
423 if (
GETPOST(
'theme',
'aZ09')) {
424 $conf->theme =
GETPOST(
'theme',
'aZ09');
425 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
429 if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
430 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
435 if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on')) {
437 if (is_numeric($conf->file->main_force_https)) {
438 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
439 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
440 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
444 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
448 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
453 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
454 header(
"Location: ".$newurl);
457 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);
461 if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
462 $listofip = explode(
',', $dolibarr_main_restrict_ip);
464 foreach ($listofip as $ip) {
466 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
472 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
478 if (!defined(
'NOREQUIREHTML')) {
479 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
481 if (!defined(
'NOREQUIREAJAX')) {
482 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
486 if (!empty($conf->global->MAIN_NOT_INSTALLED) || !empty($conf->global->MAIN_NOT_UPGRADED)) {
487 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
488 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
492 if ((!empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
493 || (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && !empty($conf->global->MAIN_VERSION_LAST_INSTALL) && ($conf->global->MAIN_VERSION_LAST_INSTALL != DOL_VERSION))) {
494 $versiontocompare = empty($conf->global->MAIN_VERSION_LAST_UPGRADE) ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
496 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
497 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
498 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
500 if (empty($conf->global->MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE) || $rescomp < 3) {
502 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
503 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
510 if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
512 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
514 if (isset($_SESSION[
'newtoken'])) {
515 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
518 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
522 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
523 $_SESSION[
'newtoken'] = $token;
524 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
532 if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
534 $sensitiveget =
false;
537 if (
GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'specimen'))) {
538 $sensitiveget =
true;
542 $arrayofactiontoforcetokencheck = array(
544 'doprev',
'donext',
'dvprev',
'dvnext',
545 'freezone',
'install',
548 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
549 $sensitiveget =
true;
552 if (preg_match(
'/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save|sepa)/',
GETPOST(
'action',
'aZ09'))) {
553 $sensitiveget =
true;
560 $_SERVER[
'REQUEST_METHOD'] ==
'POST' ||
566 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
568 if (
GETPOST(
'uploadform',
'int')) {
569 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
570 $langs->loadLangs(array(
"errors",
"install"));
571 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
572 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
574 http_response_code(403);
575 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
576 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);
577 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";
579 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);
580 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";
581 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";
582 if (!empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
583 print
" instead of ".$conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN;
585 print
" into setup).\n";
592 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
595 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 - referer=".(empty($_SERVER[
'HTTP_REFERER'])?
'':$_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
598 if (!defined(
'NOTOKENRENEWAL')) {
600 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
603 if (isset($_POST[
'id'])) {
604 $savid = ((int) $_POST[
'id']);
607 unset($_GET[
'confirm']);
608 unset($_GET[
'action']);
609 unset($_GET[
'confirmmassaction']);
610 unset($_GET[
'massaction']);
611 unset($_GET[
'token']);
613 $_POST[
'id'] = ((int) $savid);
616 $_GET[
'errorcode'] =
'InvalidToken';
624 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
626 if (!empty($_SESSION[
"disablemodules"])) {
627 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal');
629 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
630 foreach ($disabled_modules as $module) {
632 if (empty($conf->$module)) {
633 $conf->$module =
new stdClass();
635 $conf->$module->enabled =
false;
636 foreach ($modulepartkeys as $modulepartkey) {
637 unset($conf->modules_parts[$modulepartkey][$module]);
639 if ($module ==
'fournisseur') {
640 $conf->supplier_order->enabled = 0;
641 $conf->supplier_invoice->enabled = 0;
648 $modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
649 if (is_array($modulepart) && count($modulepart) > 0) {
650 foreach ($conf->modules as $module) {
651 if (in_array($module, $modulepart)) {
652 $modulepart = $module;
657 if (is_array($modulepart)) {
666 if (!defined(
'NOLOGIN')) {
670 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
671 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
674 if (empty($dolibarr_main_authentication)) {
675 $dolibarr_main_authentication =
'dolibarr';
678 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
679 $dolibarr_auto_user =
'auto';
683 $authmode = explode(
',', $dolibarr_main_authentication);
686 if (!count($authmode)) {
687 $langs->load(
'main');
688 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
695 $resultFetchUser =
'';
697 if (!isset($_SESSION[
"dol_login"])) {
699 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
701 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
702 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
703 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
704 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
705 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
706 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
707 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
708 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
709 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
710 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
714 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
715 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
716 dol_syslog(
"Call index page from another url than demo page (call is done from page ".$_SERVER[
'HTTP_REFERER'].
")");
718 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
719 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
720 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
721 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
722 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
723 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
724 header(
"Location: ".$url);
731 $hookmanager->initHooks(array(
'login'));
732 $parameters = array();
733 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
740 if ($test &&
GETPOST(
"username",
"alpha", 2) && !empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA) && !isset($_SESSION[
'dol_bypass_antispam'])) {
741 $sessionkey =
'dol_antispam_value';
742 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
746 dol_syslog(
'Bad value for code, connexion refused');
748 $langs->loadLangs(array(
'main',
'errors'));
750 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
754 $user->trigger_mesg =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
757 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
765 $hookmanager->initHooks(array(
'login'));
766 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
767 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
776 $allowedmethodtopostusername = 3;
777 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
778 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
781 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
782 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
783 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
786 $goontestloop =
false;
787 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
788 $goontestloop =
true;
790 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
791 $goontestloop =
true;
793 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
794 $goontestloop =
true;
796 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
797 $goontestloop =
true;
799 if (
GETPOST(
'beforeoauthloginredirect',
'int') ||
GETPOST(
'afteroauthloginreturn')) {
800 $goontestloop =
true;
802 if (!empty($_COOKIE[
'login_dolibarr'])) {
803 $goontestloop =
true;
806 if (!is_object($langs)) {
807 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
809 $langcode = (
GETPOST(
'lang',
'aZ09', 1) ?
GETPOST(
'lang',
'aZ09', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ?
'auto' : $conf->global->MAIN_LANG_DEFAULT));
810 if (defined(
'MAIN_LANG_DEFAULT')) {
811 $langcode = constant(
'MAIN_LANG_DEFAULT');
813 $langs->setDefaultLang($langcode);
820 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
822 if ($login ===
'--bad-login-validity--') {
829 $dol_authmode = $conf->authmode;
830 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
831 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
832 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
833 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
834 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
837 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
838 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
839 if ($dol_dst_first && $dol_dst_second) {
840 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
844 if ($datenow >= $datefirst && $datenow < $datesecond) {
852 dol_syslog(
'Bad password, connexion refused', LOG_DEBUG);
854 $langs->loadLangs(array(
'main',
'errors'));
858 if (empty($_SESSION[
"dol_loginmesg"])) {
859 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
863 $user->trigger_mesg = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
866 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
874 $hookmanager->initHooks(array(
'login'));
875 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
876 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
886 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
888 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);
889 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
894 return 'ERROR_NOT_LOGGED';
896 if ($_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
897 http_response_code(401);
899 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
904 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
905 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
906 dol_syslog(
'User not found or not valid, connexion refused');
908 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
909 session_name($sessionname);
912 if ($resultFetchUser == 0) {
914 $langs->loadLangs(array(
'main',
'errors'));
916 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
918 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
919 } elseif ($resultFetchUser < 0) {
920 $_SESSION[
"dol_loginmesg"] = $user->error;
922 $user->trigger_mesg = $user->error;
925 $langs->loadLangs(array(
'main',
'errors'));
927 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
929 $user->trigger_mesg = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
933 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
942 $hookmanager->initHooks(array(
'login'));
943 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
944 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
949 $paramsurl = array();
950 if (
GETPOST(
'textbrowser',
'int')) {
951 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
954 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
957 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
959 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
963 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
964 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
969 $login = $_SESSION[
"dol_login"];
970 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
971 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
973 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
977 if ($resultFetchUser <= 0
978 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
979 || ($user->status != $user::STATUS_ENABLED)
980 || ($user->isNotIntoValidityDateRange())) {
981 if ($resultFetchUser <= 0) {
983 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
984 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
986 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
987 } elseif ($user->status != $user::STATUS_ENABLED) {
992 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], curren date is ".
dol_now());
995 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
996 session_name($sessionname);
999 if ($resultFetchUser == 0) {
1000 $langs->loadLangs(array(
'main',
'errors'));
1002 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1004 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1005 } elseif ($resultFetchUser < 0) {
1006 $_SESSION[
"dol_loginmesg"] = $user->error;
1008 $user->trigger_mesg = $user->error;
1010 $langs->loadLangs(array(
'main',
'errors'));
1012 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1014 $user->trigger_mesg =
'ErrorUserSessionWasInvalidated - login='.$login;
1018 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1026 $hookmanager->initHooks(array(
'login'));
1027 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1028 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1033 $paramsurl = array();
1034 if (
GETPOST(
'textbrowser',
'int')) {
1035 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1038 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1040 if (
GETPOST(
'lang',
'aZ09')) {
1041 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1043 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1047 $hookmanager->initHooks(array(
'main'));
1050 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1051 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1052 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1054 if (constant(
'DOL_URL_ROOT')) {
1055 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1057 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1058 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1062 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1063 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1064 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1066 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1067 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1068 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1070 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1071 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1072 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1074 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1075 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1076 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1078 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1079 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1080 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1085 $parameters = array();
1086 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1095 if (!isset($_SESSION[
"dol_login"])) {
1100 $_SESSION[
"dol_login"] = $user->login;
1101 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1102 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1103 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1104 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1105 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1106 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1107 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1108 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1109 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1110 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1112 $_SESSION[
"dol_entity"] = $conf->entity;
1114 if (!empty($dol_hide_topmenu)) {
1115 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1117 if (!empty($dol_hide_leftmenu)) {
1118 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1120 if (!empty($dol_optimize_smallscreen)) {
1121 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1123 if (!empty($dol_no_mouse_hover)) {
1124 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1126 if (!empty($dol_use_jmobile)) {
1127 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1130 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1134 $user->update_last_login_date();
1136 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1139 $user->trigger_mesg = $loginfo;
1142 $result = $user->call_trigger(
'USER_LOGIN', $user);
1150 $hookmanager->initHooks(array(
'login'));
1151 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1152 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1160 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1167 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (empty($conf->global->MAIN_LANDING_PAGE) ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->conf->MAIN_LANDING_PAGE);
1168 if (!empty($landingpage)) {
1170 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1171 header(
'Location: '.$newpath);
1180 $user->rights->user->user->lire = 1;
1181 $user->rights->user->user->creer = 1;
1182 $user->rights->user->user->password = 1;
1183 $user->rights->user->user->supprimer = 1;
1184 $user->rights->user->self->creer = 1;
1185 $user->rights->user->self->password = 1;
1188 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1189 if (empty($user->rights->user->user_advance)) {
1190 $user->rights->user->user_advance =
new stdClass();
1192 if (empty($user->rights->user->self_advance)) {
1193 $user->rights->user->self_advance =
new stdClass();
1195 if (empty($user->rights->user->group_advance)) {
1196 $user->rights->user->group_advance =
new stdClass();
1199 $user->rights->user->user_advance->readperms = 1;
1200 $user->rights->user->user_advance->write = 1;
1201 $user->rights->user->self_advance->readperms = 1;
1202 $user->rights->user->self_advance->writeperms = 1;
1203 $user->rights->user->group_advance->read = 1;
1204 $user->rights->user->group_advance->readperms = 1;
1205 $user->rights->user->group_advance->write = 1;
1206 $user->rights->user->group_advance->delete = 1;
1215 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1216 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1218 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1219 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1223 if (empty($conf->global->MAIN_FORCETHEME) && !empty($user->conf->MAIN_THEME)) {
1224 $conf->theme = $user->conf->MAIN_THEME;
1225 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1229 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1230 $user->loadDefaultValues();
1236 if (
GETPOST(
'theme',
'aZ09')) {
1237 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1238 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1243 $conf->use_javascript_ajax = 0;
1245 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1246 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1251 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1252 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1256 $conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1259 if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1260 $conf->dol_hide_leftmenu = 1;
1262 if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1263 $conf->dol_hide_topmenu = 1;
1265 if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1266 $conf->dol_optimize_smallscreen = 1;
1268 if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1269 $conf->dol_no_mouse_hover = 1;
1271 if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1272 $conf->dol_use_jmobile = 1;
1275 if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1276 $conf->dol_no_mouse_hover = 1;
1280 if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1281 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1282 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1283 || !empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
1285 $conf->dol_optimize_smallscreen = 1;
1287 if (isset($conf->global->PRODUIT_DESC_IN_FORM) && $conf->global->PRODUIT_DESC_IN_FORM == 1) {
1288 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1292 if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1293 $conf->theme =
'eldy';
1294 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1297 if (!defined(
'NOREQUIRETRAN')) {
1298 if (!
GETPOST(
'lang',
'aZ09')) {
1300 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1303 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1304 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1310 if (!defined(
'NOLOGIN')) {
1313 if (!$user->login) {
1318 if ($user->statut < 1) {
1320 $langs->loadLangs(array(
"errors",
"other"));
1321 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1329 dol_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);
1334 if (!defined(
'NOREQUIRETRAN')) {
1336 $langs->loadLangs(array(
'main',
'dict'));
1340 $bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1341 $bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1342 $bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1343 $bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1346 $mesg =
''; $warning =
''; $error = 0;
1348 $mesgs = array(); $warnings = array(); $errors = array();
1351 if (empty($conf->browser->firefox)) {
1352 define(
'ROWS_1', 1);
1353 define(
'ROWS_2', 2);
1354 define(
'ROWS_3', 3);
1355 define(
'ROWS_4', 4);
1356 define(
'ROWS_5', 5);
1357 define(
'ROWS_6', 6);
1358 define(
'ROWS_7', 7);
1359 define(
'ROWS_8', 8);
1360 define(
'ROWS_9', 9);
1362 define(
'ROWS_1', 0);
1363 define(
'ROWS_2', 1);
1364 define(
'ROWS_3', 2);
1365 define(
'ROWS_4', 3);
1366 define(
'ROWS_5', 4);
1367 define(
'ROWS_6', 5);
1368 define(
'ROWS_7', 6);
1369 define(
'ROWS_8', 7);
1370 define(
'ROWS_9', 8);
1373 $heightforframes = 50;
1376 if (!defined(
'NOREQUIREMENU')) {
1377 if (empty($user->socid)) {
1378 $conf->standard_menu = (empty($conf->global->MAIN_MENU_STANDARD_FORCED) ? (empty($conf->global->MAIN_MENU_STANDARD) ?
'eldy_menu.php' : $conf->global->MAIN_MENU_STANDARD) : $conf->global->MAIN_MENU_STANDARD_FORCED);
1381 $conf->standard_menu = (empty($conf->global->MAIN_MENUFRONT_STANDARD_FORCED) ? (empty($conf->global->MAIN_MENUFRONT_STANDARD) ?
'eldy_menu.php' : $conf->global->MAIN_MENUFRONT_STANDARD) : $conf->global->MAIN_MENUFRONT_STANDARD_FORCED);
1385 $file_menu = $conf->standard_menu;
1386 if (
GETPOST(
'menu',
'alpha')) {
1387 $file_menu =
GETPOST(
'menu',
'alpha');
1389 if (!class_exists(
'MenuManager')) {
1391 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1392 foreach ($dirmenus as $dirmenu) {
1394 if (class_exists(
'MenuManager')) {
1398 if (!class_exists(
'MenuManager')) {
1399 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1400 $file_menu =
'eldy_menu.php';
1401 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1404 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1405 $menumanager->loadMenu();
1408 if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1409 $message =
GETPOST(
'seteventmessages',
'alpha');
1410 $messages = explode(
',', $message);
1411 foreach ($messages as $key => $msg) {
1412 $tmp = explode(
':', $msg);
1419 if (!function_exists(
"llxHeader")) {
1440 function llxHeader($head =
'', $title =
'',
$help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1442 global $conf, $hookmanager;
1445 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1447 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1449 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1451 if ($mainmenu !=
'website') {
1452 $tmpcsstouse = $morecssonbody;
1456 if (!empty($conf->global->MAIN_OPTIMIZEFORCOLORBLIND)) {
1457 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1460 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1462 $parameters = array(
'help_url' =>
$help_url);
1463 $reshook = $hookmanager->executeHooks(
'changeHelpURL', $parameters);
1469 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1470 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring,
$help_url);
1473 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1478 if ($replacemainareaby) {
1479 print $replacemainareaby;
1496 global $db, $conf, $hookmanager;
1498 if ($contenttype ==
'text/html') {
1499 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1501 header(
"Content-Type: ".$contenttype);
1507 header(
"X-Content-Type-Options: nosniff");
1510 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1511 header(
"X-Frame-Options: SAMEORIGIN");
1513 header(
"X-Frame-Options: ALLOWALL");
1520 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1535 if (!is_object($hookmanager)) {
1536 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1539 $hookmanager->initHooks(array(
"main"));
1541 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'reportonly');
1542 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1544 $contentsecuritypolicy = $hookmanager->resPrint;
1546 $contentsecuritypolicy .= $hookmanager->resPrint;
1549 if (!empty($contentsecuritypolicy)) {
1550 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1553 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1557 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1572 if (!is_object($hookmanager)) {
1573 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1576 $hookmanager->initHooks(array(
"main"));
1578 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'active');
1579 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1581 $contentsecuritypolicy = $hookmanager->resPrint;
1583 $contentsecuritypolicy .= $hookmanager->resPrint;
1586 if (!empty($contentsecuritypolicy)) {
1587 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1590 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1596 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1599 header(
"Referrer-Policy: ".$referrerpolicy);
1602 if ($forcenocache) {
1603 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1625 function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1627 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1631 if (empty($conf->css)) {
1632 $conf->css =
'/theme/eldy/style.css.php';
1635 print
'<!doctype html>'.
"\n";
1637 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1640 if (empty($disablehead)) {
1641 if (!is_object($hookmanager)) {
1642 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1645 $hookmanager->initHooks(array(
"main"));
1647 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
1651 if (
GETPOST(
'dol_basehref',
'alpha')) {
1652 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1656 print
'<meta charset="utf-8">'.
"\n";
1657 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1658 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1659 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1660 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1661 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1663 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1666 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1667 if (!empty($mysoc->logo_squarred_mini)) {
1668 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1673 if (empty($conf->dol_use_jmobile)) {
1674 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1682 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1683 if (!empty($manifest)) {
1684 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1687 if (!empty($conf->global->THEME_ELDY_TOPMENU_BACK1)) {
1689 print
'<meta name="theme-color" content="rgb('.$conf->global->THEME_ELDY_TOPMENU_BACK1.
')">'.
"\n";
1693 if (
GETPOST(
'autorefresh',
'int') > 0) {
1694 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1698 $appli = constant(
'DOL_APPLICATION_TITLE');
1699 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1700 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1705 if ($title && !empty($conf->global->MAIN_HTML_TITLE) && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1713 $parameters = array(
'title'=>$titletoshow);
1714 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1716 $titletoshow = $hookmanager->resPrint;
1718 $titletoshow .= $hookmanager->resPrint;
1726 if (
GETPOST(
'version',
'int')) {
1727 $ext =
'version='.GETPOST(
'version',
'int');
1730 if (
GETPOST(
'dol_resetcache')) {
1731 dolibarr_set_const($db,
"MAIN_IHM_PARAMS_REV", ((
int) $conf->global->MAIN_IHM_PARAMS_REV) + 1,
'chaine', 0,
'', $conf->entity);
1734 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1736 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1738 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1741 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1744 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1747 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1750 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1753 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1756 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1759 if (!empty($conf->global->MAIN_ENABLE_FONT_ROBOTO)) {
1760 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1761 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1764 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1765 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1766 $jquerytheme =
'base';
1767 if (!empty($conf->global->MAIN_USE_JQUERY_THEME)) {
1768 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1770 if (constant(
'JS_JQUERY_UI')) {
1771 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1773 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1775 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1776 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1778 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1779 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1780 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1784 if (!defined(
'DISABLE_FONT_AWSOME')) {
1785 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1786 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1787 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/v4-shims.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1790 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1794 if (!empty($conf->modules_parts[
'theme'])) {
1795 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1798 $themesubdir = $reldir;
1805 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1806 if (!empty($conf->global->MAIN_FIX_FLASH_ON_CHROME)) {
1807 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";
1811 if (!empty($conf->modules_parts[
'css'])) {
1812 $arraycss = (array) $conf->modules_parts[
'css'];
1813 foreach ($arraycss as $modcss => $filescss) {
1814 $filescss = (array) $filescss;
1815 foreach ($filescss as $cssfile) {
1816 if (empty($cssfile)) {
1817 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1821 if ($urlforcss && $urlforcss !=
'/') {
1822 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1824 if (!preg_match(
'/\.css$/i', $cssfile)) {
1829 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1835 if (is_array($arrayofcss)) {
1836 foreach ($arrayofcss as $cssfile) {
1837 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1838 $urltofile = $cssfile;
1842 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1844 if (!preg_match(
'/\.css$/i', $cssfile)) {
1854 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1858 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1860 print
'<!-- Includes JS for JQuery -->'.
"\n";
1861 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1862 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1864 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1866 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1867 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1869 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1872 if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1873 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1876 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1877 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1880 if (empty($disableforlogin) && (empty($conf->global->MAIN_JS_GRAPH) || $conf->global->MAIN_JS_GRAPH ==
'chart') && !defined(
'DISABLE_JS_GRAPH')) {
1881 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1885 if (!empty($conf->global->MAIN_USE_JQUERY_JEDITABLE) && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1886 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1887 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1888 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1889 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1890 print
'<script>'.
"\n";
1891 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1892 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1893 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1894 print 'var placeholderInPlace = \
' \';'.
"\n";
1895 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1896 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1897 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1898 print
'var withInPlace = 300;';
1899 print
'</script>'.
"\n";
1900 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1901 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1904 if (!empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1905 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1906 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1908 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1910 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1911 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1913 if (!defined(
'DISABLE_MULTISELECT')) {
1914 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1918 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1920 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') && (empty($conf->global->FCKEDITOR_EDITORNAME) || $conf->global->FCKEDITOR_EDITORNAME ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1921 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1922 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1923 $jsckeditor =
'ckeditor.js';
1924 if (constant(
'JS_CKEDITOR')) {
1926 $pathckeditor = constant(
'JS_CKEDITOR');
1928 print
'<script nonce="'.getNonce().
'">';
1929 print
'/* enable ckeditor by main.inc.php */';
1930 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1931 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1932 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1933 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";
1934 print
'</script>'.
"\n";
1935 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1937 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1938 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1940 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1942 print
'</script>'.
"\n";
1946 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1947 $enablebrowsernotif =
false;
1948 if (
isModEnabled(
'agenda') && !empty($conf->global->AGENDA_REMINDER_BROWSER)) {
1949 $enablebrowsernotif =
true;
1951 if ($conf->browser->layout ==
'phone') {
1952 $enablebrowsernotif =
false;
1954 if ($enablebrowsernotif) {
1955 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1956 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1961 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1962 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1965 if (!empty($conf->modules_parts[
'js'])) {
1966 $arrayjs = (array) $conf->modules_parts[
'js'];
1967 foreach ($arrayjs as $modjs => $filesjs) {
1968 $filesjs = (array) $filesjs;
1969 foreach ($filesjs as $jsfile) {
1972 if ($urlforjs && $urlforjs !=
'/') {
1973 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
1974 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1976 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1982 if (is_array($arrayofjs)) {
1983 print
'<!-- Includes JS added by page -->'.
"\n";
1984 foreach ($arrayofjs as $jsfile) {
1985 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1986 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1988 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1995 if (!empty($conf->global->ALLOW_THEME_JS)) {
1996 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
1997 if (file_exists($theme_js)) {
1998 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2002 if (!empty($head)) {
2005 if (!empty($conf->global->MAIN_HTML_HEADER)) {
2006 print $conf->global->MAIN_HTML_HEADER.
"\n";
2009 $parameters = array();
2010 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2011 print $hookmanager->resPrint;
2013 print
"</head>\n\n";
2016 $conf->headerdone = 1;
2036 function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $helppagename =
'')
2038 global $user, $conf, $langs, $db;
2039 global $dolibarr_main_authentication, $dolibarr_main_demo;
2040 global $hookmanager, $menumanager;
2045 $hookmanager->initHooks(array(
'toprightmenu'));
2050 if (empty($conf->headerdone)) {
2051 $disablenofollow = 0;
2052 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2053 print
'<body id="mainbody">';
2059 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2061 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2065 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2067 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
2070 print
'<div id="tmenu_tooltip'.(empty($conf->global->MAIN_MENU_INVERT) ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2071 $menumanager->atarget = $target;
2072 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
2076 $appli = constant(
'DOL_APPLICATION_TITLE');
2077 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2078 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2079 if (preg_match(
'/\d\.\d/', $appli)) {
2080 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2081 $appli .=
" (".DOL_VERSION.
")";
2084 $appli .=
" ".DOL_VERSION;
2087 $appli .=
" ".DOL_VERSION;
2091 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2095 $logouthtmltext =
'';
2096 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2098 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2099 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2101 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2102 if ($conf->browser->name ==
'chrome') {
2103 $stringforfirstkey .=
' ALT +';
2104 } elseif ($conf->browser->name ==
'firefox') {
2105 $stringforfirstkey .=
' ALT + SHIFT +';
2107 $stringforfirstkey .=
' CTL +';
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',
'',
false, 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',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2119 print
'<div class="login_block usedropdown">'.
"\n";
2121 $toprightmenu .=
'<div class="login_block_other">';
2124 $parameters = array();
2125 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2126 if (is_numeric($result)) {
2128 $toprightmenu .= $hookmanager->resPrint;
2130 $toprightmenu = $hookmanager->resPrint;
2133 $toprightmenu .= $result;
2138 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2140 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2142 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2146 if (empty($conf->global->MAIN_PRINT_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2149 if (isset($_POST) && is_array($_POST)) {
2150 foreach ($_POST as $key => $value) {
2151 if ($key !==
'action' && $key !==
'password' && !is_array($value)) {
2152 $qs .=
'&'.$key.
'='.urlencode($value);
2156 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2157 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2159 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2161 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2165 if (empty($conf->global->MAIN_HELP_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2166 $langs->load(
"help");
2173 if (empty($helppagename)) {
2174 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2176 $helppresent =
'helppresent';
2181 $helpbaseurl = $arrayres[
'helpbaseurl'];
2182 $helppage = $arrayres[
'helppage'];
2183 $mode = $arrayres[
'mode'];
2186 if ($helpbaseurl && $helppage) {
2188 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2189 if ($mode ==
'wiki') {
2190 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2192 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2194 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2197 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2198 if ($mode ==
'wiki') {
2199 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2201 $text .= sprintf($helpbaseurl, $helppage);
2204 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2205 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2207 $toprightmenu .=
$form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2211 if (!empty($conf->global->MAIN_SHOWDATABASENAMEINHELPPAGESLINK)) {
2212 $langs->load(
'admin');
2213 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2217 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2218 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2219 $toprightmenu .=
$form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2223 $toprightmenu .=
$form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2225 $toprightmenu .=
'</div>';
2229 $toprightmenu .=
'<div class="login_block_user">';
2233 $toprightmenu .=
'<div class="inline-block nowrap"><div class="inline-block login_block_elem login_block_elem_name" style="padding: 0px;">';
2235 if (!empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2240 if (!empty($conf->global->MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN)) {
2251 $toprightmenu .=
'</div></div>';
2253 $toprightmenu .=
'</div>'.
"\n";
2256 print $toprightmenu;
2263 print
'<div style="clear: both;"></div>';
2264 print
"<!-- End top horizontal menu -->\n\n";
2267 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2268 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2282 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2283 global $dolibarr_main_authentication, $dolibarr_main_demo;
2284 global $menumanager;
2286 $langs->load(
'companies');
2288 $userImage = $userDropDownImage =
'';
2289 if (!empty($user->photo)) {
2290 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2291 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2293 $nophoto =
'/public/theme/common/user_anonymous.png';
2294 if ($user->gender ==
'man') {
2295 $nophoto =
'/public/theme/common/user_man.png';
2297 if ($user->gender ==
'woman') {
2298 $nophoto =
'/public/theme/common/user_woman.png';
2301 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2302 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2306 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2307 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2309 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2310 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2313 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2316 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2319 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2322 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2325 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2329 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2331 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2333 $dropdownBody .=
'</div>';
2335 $dropdownBody .=
'<br>';
2336 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2337 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2340 if (!empty($user->admin)) {
2341 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2343 if (!empty($user->socid)) {
2344 $thirdpartystatic =
new Societe($db);
2345 $thirdpartystatic->fetch($user->socid);
2346 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2347 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2349 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2350 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2351 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2352 $dropdownBody .=
'<br>';
2354 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2355 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2356 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2357 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2359 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2360 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2361 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2362 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2363 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2365 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2367 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2368 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2369 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2374 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')';
2375 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2376 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2377 if ($conf->browser->layout ==
'phone') {
2378 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2380 if (!empty($_SESSION[
"disablemodules"])) {
2381 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2383 $dropdownBody .=
'</div>';
2386 $parameters = array(
'user'=>$user,
'langs' => $langs);
2387 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2388 if (is_numeric($result)) {
2390 $dropdownBody .= $hookmanager->resPrint;
2392 $dropdownBody = $hookmanager->resPrint;
2396 if (empty($urllogout)) {
2397 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2402 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2403 if ($conf->browser->name ==
'chrome') {
2404 $stringforfirstkey .=
' ALT +';
2405 } elseif ($conf->browser->name ==
'firefox') {
2406 $stringforfirstkey .=
' ALT + SHIFT +';
2408 $stringforfirstkey .=
' CTL +';
2412 $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>';
2413 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2414 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->trans(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.$stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.$stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover',
"closeTopMenuLoginDropdown()",
'',
'v');
2415 $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 padingright"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2417 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2418 if (!empty($user->admin)) {
2419 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2423 $appli = constant(
'DOL_APPLICATION_TITLE');
2424 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2425 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2426 if (preg_match(
'/\d\.\d/', $appli)) {
2427 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2428 $appli .=
" (".DOL_VERSION.
")";
2431 $appli .=
" ".DOL_VERSION;
2434 $appli .=
" ".DOL_VERSION;
2437 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2438 $btnUser =
'<!-- div for user link -->
2439 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2440 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a" data-toggle="dropdown">
2441 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2443 <div class="dropdown-menu">
2445 <div class="user-header">
2446 '.$userDropDownImage.
'
2448 '.$profilName.
'<br>';
2449 if ($user->datelastlogin) {
2450 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2451 if ($user->datepreviouslogin) {
2452 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2455 $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>';
2456 if ($user->datepreviouslogin) {
2457 $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>';
2465 <!-- Menu Body user-->
2466 <div class="user-body">'.$dropdownBody.
'</div>
2469 <div class="user-footer">
2470 <div class="pull-left">
2473 <div class="pull-left">
2474 '.$virtuelcardLink.
'
2476 <div class="pull-right">
2479 <div class="clearboth"></div>
2485 $btnUser =
'<!-- div for user link -->
2486 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2487 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'">
2489 <span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone">'.
dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>
2494 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2496 <!-- Code to show/hide the user drop-down -->
2498 function closeTopMenuLoginDropdown() {
2499 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2501 jQuery("#topmenu-login-dropdown").removeClass("open");
2503 jQuery(document).ready(function() {
2504 jQuery(document).on("click", function(event) {
2505 // console.log("Click somewhere on screen");
2506 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2507 closeTopMenuLoginDropdown();
2511 jQuery(".butAction.dropdown-toggle").on("click", function(event) {
2512 console.log("Click on .butAction.dropdown-toggle");
2513 var parentholder = jQuery(".butAction.dropdown-toggle").closest(".dropdown");
2514 var offset = parentholder.offset();
2515 var widthdocument = $(document).width();
2516 var left = offset.left;
2517 var right = widthdocument - offset.left - parentholder.width();
2518 var widthpopup = parentholder.children(".dropdown-content").width();
2519 console.log("left="+left+" right="+right+" width="+widthpopup+" widthdocument="+widthdocument);
2520 if (widthpopup + right >= widthdocument) {
2523 parentholder.toggleClass("open");
2524 parentholder.children(".dropdown-content").css({"right": right+"px", "left": "auto"});
2529 if ($conf->theme !=
'md') {
2531 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2532 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2533 event.preventDefault();
2534 jQuery("#topmenu-login-dropdown").toggleClass("open");
2537 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2538 console.log("Clik on #topmenulogincompanyinfo-btn");
2539 jQuery("#topmenulogincompanyinfo").slideToggle();
2542 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2543 console.log("Clik on #topmenuloginmoreinfo-btn");
2544 jQuery("#topmenuloginmoreinfo").slideToggle();
2564 global $conf, $langs;
2570 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2571 if ($conf->browser->name ==
'chrome') {
2572 $stringforfirstkey .=
' ALT +';
2573 } elseif ($conf->browser->name ==
'firefox') {
2574 $stringforfirstkey .=
' ALT + SHIFT +';
2576 $stringforfirstkey .=
' CTL +';
2579 $html .=
'<!-- div for quick add link -->
2580 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2581 <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>
2585 <!-- Code to show/hide the user drop-down -->
2587 jQuery(document).ready(function() {
2588 jQuery(document).on("click", function(event) {
2589 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2591 $("#topmenu-quickadd-dropdown").removeClass("open");
2594 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2595 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2596 openQuickAddDropDown(event);
2600 $(document).keydown(function(event){
2601 if ( event.which === 76 && event.ctrlKey && event.shiftKey ){
2602 console.log(\'control + shift + l : trigger open quick add dropdown\');
2603 openQuickAddDropDown(event);
2607 var openQuickAddDropDown = function(event) {
2608 event.preventDefault();
2609 $("#topmenu-quickadd-dropdown").toggleClass("open");
2610 //$("#top-quickadd-search-input").focus();
2625 global $conf, $user, $langs, $hookmanager;
2630 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2631 "title" =>
"MenuNewMember@members",
2632 "name" =>
"Adherent@members",
2633 "picto" =>
"object_member",
2634 "activation" =>
isModEnabled(
'adherent') && $user->hasRight(
"adherent",
"write"),
2638 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2639 "title" =>
"MenuNewThirdParty@companies",
2640 "name" =>
"ThirdParty@companies",
2641 "picto" =>
"object_company",
2642 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2646 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2647 "title" =>
"NewContactAddress@companies",
2648 "name" =>
"Contact@companies",
2649 "picto" =>
"object_contact",
2650 "activation" =>
isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2654 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2655 "title" =>
"NewPropal@propal",
2656 "name" =>
"Proposal@propal",
2657 "picto" =>
"object_propal",
2658 "activation" =>
isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2663 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2664 "title" =>
"NewOrder@orders",
2665 "name" =>
"Order@orders",
2666 "picto" =>
"object_order",
2667 "activation" =>
isModEnabled(
'commande') && $user->hasRight(
"commande",
"write"),
2671 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2672 "title" =>
"NewBill@bills",
2673 "name" =>
"Bill@bills",
2674 "picto" =>
"object_bill",
2675 "activation" =>
isModEnabled(
'facture') && $user->hasRight(
"facture",
"write"),
2679 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2680 "title" =>
"NewContractSubscription@contracts",
2681 "name" =>
"Contract@contracts",
2682 "picto" =>
"object_contract",
2683 "activation" =>
isModEnabled(
'contrat') && $user->hasRight(
"contrat",
"write"),
2687 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2688 "title" =>
"SupplierProposalNew@supplier_proposal",
2689 "name" =>
"SupplierProposal@supplier_proposal",
2690 "picto" =>
"supplier_proposal",
2691 "activation" =>
isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2695 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2696 "title" =>
"NewSupplierOrderShort@orders",
2697 "name" =>
"SupplierOrder@orders",
2698 "picto" =>
"supplier_order",
2699 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"commande",
"write")) || (
isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2703 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2704 "title" =>
"NewBill@bills",
2705 "name" =>
"SupplierBill@bills",
2706 "picto" =>
"supplier_invoice",
2707 "activation" => (
isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"facture",
"write")) || (
isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2711 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2712 "title" =>
"NewTicket@ticket",
2713 "name" =>
"Ticket@ticket",
2714 "picto" =>
"ticket",
2715 "activation" =>
isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2719 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2720 "title" =>
"NewIntervention@interventions",
2721 "name" =>
"Intervention@interventions",
2722 "picto" =>
"intervention",
2723 "activation" =>
isModEnabled(
'ficheinter') && $user->hasRight(
"ficheinter",
"creer"),
2727 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2728 "title" =>
"NewProduct@products",
2729 "name" =>
"Product@products",
2730 "picto" =>
"object_product",
2731 "activation" =>
isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2735 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2736 "title" =>
"NewService@products",
2737 "name" =>
"Service@products",
2738 "picto" =>
"object_service",
2739 "activation" =>
isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2743 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2744 "title" =>
"AddUser@users",
2745 "name" =>
"User@users",
2747 "activation" => $user->hasRight(
"user",
"user",
"write"),
2753 $dropDownQuickAddHtml =
'';
2756 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2757 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2760 $parameters = array();
2761 $hook_items = $items;
2762 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2763 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2764 if ($reshook == 0) {
2765 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2767 $items = $hookmanager->resArray;
2771 $position = array();
2772 foreach ($items[
'items'] as $key => $row) {
2773 $position[$key] = $row[
'position'];
2775 $array1_sort_order = SORT_ASC;
2776 array_multisort($position, $array1_sort_order, $items[
'items']);
2779 foreach ($items[
'items'] as $item) {
2780 if (!$item[
'activation']) {
2783 $langs->load(explode(
'@', $item[
'title'])[1]);
2784 $langs->load(explode(
'@', $item[
'name'])[1]);
2785 $dropDownQuickAddHtml .=
'
2786 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2787 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2791 $dropDownQuickAddHtml .=
'</div>';
2792 $dropDownQuickAddHtml .=
'</div>';
2794 return $dropDownQuickAddHtml;
2804 global $langs, $conf, $db, $user;
2809 if (!
isModEnabled(
'bookmark') || empty($user->rights->bookmark->lire)) {
2815 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2816 if ($conf->browser->name ==
'chrome') {
2817 $stringforfirstkey .=
' ALT +';
2818 } elseif ($conf->browser->name ==
'firefox') {
2819 $stringforfirstkey .=
' ALT + SHIFT +';
2821 $stringforfirstkey .=
' CTL +';
2824 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2825 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2826 $langs->load(
"bookmarks");
2828 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2829 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2833 $html .=
'<!-- div for bookmark link -->
2834 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2835 <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>
2836 <div class="dropdown-menu">
2842 <!-- Code to show/hide the bookmark drop-down -->
2844 jQuery(document).ready(function() {
2845 jQuery(document).on("click", function(event) {
2846 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2847 //console.log("close bookmark dropdown - we click outside");
2849 $("#topmenu-bookmark-dropdown").removeClass("open");
2853 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2854 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2855 openBookMarkDropDown(event);
2859 jQuery(document).keydown(function(event){
2860 if( event.which === 77 && event.ctrlKey && event.shiftKey ){
2861 console.log("Click on control + shift + m : trigger open bookmark dropdown");
2862 openBookMarkDropDown(event);
2866 var openBookMarkDropDown = function(event) {
2867 event.preventDefault();
2868 jQuery("#topmenu-bookmark-dropdown").toggleClass("open");
2869 jQuery("#top-bookmark-search-input").focus();
2887 global $langs, $conf, $db, $user, $hookmanager;
2892 $arrayresult =
null;
2893 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2897 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2898 if ($conf->browser->name ==
'chrome') {
2899 $stringforfirstkey .=
' ALT +';
2900 } elseif ($conf->browser->name ==
'firefox') {
2901 $stringforfirstkey .=
' ALT + SHIFT +';
2903 $stringforfirstkey .=
' CTL +';
2906 $searchInput =
'<input 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">';
2908 $defaultAction =
'';
2909 $buttonList =
'<div class="dropdown-global-search-button-list" >';
2911 foreach ($arrayresult as $keyItem => $item) {
2912 if (empty($defaultAction)) {
2913 $defaultAction = $item[
'url'];
2915 $buttonList .=
'<button class="dropdown-item global-search-item tdoverflowmax300" data-target="'.dol_escape_htmltag($item[
'url']).
'" >';
2916 $buttonList .= $item[
'text'];
2917 $buttonList .=
'</button>';
2919 $buttonList .=
'</div>';
2921 $dropDownHtml =
'<form id="top-menu-action-search" name="actionsearch" method="GET" action="'.$defaultAction.
'">';
2924 <!-- search input -->
2925 <div class="dropdown-header search-dropdown-header">
2931 <!-- Menu Body search -->
2932 <div class="dropdown-body search-dropdown-body">
2937 $dropDownHtml .=
'</form>';
2941 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2942 if ($conf->browser->name ==
'chrome') {
2943 $stringforfirstkey .=
' ALT +';
2944 } elseif ($conf->browser->name ==
'firefox') {
2945 $stringforfirstkey .=
' ALT + SHIFT +';
2947 $stringforfirstkey .=
' CTL +';
2950 $html .=
'<!-- div for Global Search -->
2951 <div id="topmenu-global-search-dropdown" class="atoplogin dropdown inline-block">
2952 <a accesskey="s" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Search').
' ('.$stringforfirstkey.
' s)">
2953 <i class="fa fa-search" ></i>
2955 <div class="dropdown-menu dropdown-search">
2961 <!-- Code to show/hide the user drop-down -->
2963 jQuery(document).ready(function() {
2965 // prevent submiting form on press ENTER
2966 jQuery("#top-global-search-input").keydown(function (e) {
2967 if (e.keyCode == 13) {
2968 var inputs = $(this).parents("form").eq(0).find(":button");
2969 if (inputs[inputs.index(this) + 1] != null) {
2970 inputs[inputs.index(this) + 1].focus();
2978 jQuery(document).keydown(function(e) {
2979 // Get the focused element:
2980 var $focused = $(":focus");
2981 if($focused.length && $focused.hasClass("global-search-item")){
2983 // UP - move to the previous line
2984 if (e.keyCode == 38) {
2986 $focused.prev().focus();
2989 // DOWN - move to the next line
2990 if (e.keyCode == 40) {
2992 $focused.next().focus();
2998 // submit form action
2999 jQuery(".dropdown-global-search-button-list .global-search-item").on("click", function(event) {
3000 jQuery("#top-menu-action-search").attr("action", $(this).data("target"));
3001 jQuery("#top-menu-action-search").submit();
3005 jQuery(document).on("click", function(event) {
3006 if (!$(event.target).closest("#topmenu-global-search-dropdown").length) {
3007 console.log("click close search - we click outside");
3009 jQuery("#topmenu-global-search-dropdown").removeClass("open");
3014 jQuery("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) {
3015 console.log("click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3016 openGlobalSearchDropDown();
3020 jQuery(document).keydown(function(e){
3021 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3022 console.log(\'control + shift + f : trigger open global-search dropdown\');
3023 openGlobalSearchDropDown();
3025 if ( e.which === 70 && e.alKey ) {
3026 console.log(\'alt + f : trigger open global-search dropdown\');
3027 openGlobalSearchDropDown();
3031 var openGlobalSearchDropDown = function() {
3032 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3033 jQuery("#top-global-search-input").focus();
3057 function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after =
'', $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3059 global $user, $conf, $langs, $db,
$form;
3060 global $hookmanager, $menumanager;
3064 if (!empty($menu_array_before)) {
3065 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);
3068 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3070 $hookmanager->initHooks(array(
'leftblock'));
3072 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3075 if (!is_object(
$form)) {
3079 if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
3081 if ($conf->browser->layout ==
'phone') {
3082 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3086 $arrayresult = array();
3087 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3089 if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3092 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3093 if ($conf->browser->name ==
'chrome') {
3094 $stringforfirstkey .=
' ALT +';
3095 } elseif ($conf->browser->name ==
'firefox') {
3096 $stringforfirstkey .=
' ALT + SHIFT +';
3098 $stringforfirstkey .=
' CTL +';
3101 $searchform .=
$form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (empty($conf->global->MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY) ? 1 : 0),
'vmenusearchselectcombo', 1, $langs->trans(
"Search"), 1, $stringforfirstkey.
' s');
3103 if (is_array($arrayresult)) {
3104 foreach ($arrayresult as $key => $val) {
3105 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3111 $parameters = array(
'searchform' => $searchform);
3112 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3113 if (empty($reshook)) {
3114 $searchform .= $hookmanager->resPrint;
3116 $searchform = $hookmanager->resPrint;
3120 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) || empty($conf->use_javascript_ajax)) {
3121 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3122 $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>';
3123 } elseif ($conf->use_javascript_ajax && !empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3124 $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>';
3125 $searchform .=
'<script>
3126 jQuery(document).ready(function () {
3127 jQuery("#divsearchforms1").click(function(){
3128 jQuery("#divsearchforms2").toggle();
3132 $searchform .=
'</div>';
3136 $searchform .=
'<script>
3137 jQuery(document).keydown(function(e){
3138 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3139 console.log(\'control + shift + f : trigger open global-search dropdown\');
3140 openGlobalSearchDropDown();
3142 if( (e.which === 83 || e.which === 115) && e.altKey ){
3143 console.log(\'alt + s : trigger open global-search dropdown\');
3144 openGlobalSearchDropDown();
3148 var openGlobalSearchDropDown = function() {
3149 jQuery("#searchselectcombo").select2(\'open\');
3155 print
'<!-- Begin left menu -->'.
"\n";
3157 print
'<div class="vmenu"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ?
'' :
' title="Left menu"').
'>'.
"\n\n";
3160 $menumanager->menu_array = $menu_array_before;
3161 $menumanager->menu_array_after = $menu_array_after;
3162 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
3166 print
"<!-- Begin Help Block-->\n";
3167 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3170 if (!empty($conf->global->MAIN_SHOW_VERSION)) {
3171 $doliurl =
'https://www.dolibarr.org';
3173 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3174 $doliurl =
'https://www.dolibarr.fr';
3176 if (preg_match(
'/es/i', $langs->defaultlang)) {
3177 $doliurl =
'https://www.dolibarr.es';
3179 if (preg_match(
'/de/i', $langs->defaultlang)) {
3180 $doliurl =
'https://www.dolibarr.de';
3182 if (preg_match(
'/it/i', $langs->defaultlang)) {
3183 $doliurl =
'https://www.dolibarr.it';
3185 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3186 $doliurl =
'https://www.dolibarr.gr';
3189 $appli = constant(
'DOL_APPLICATION_TITLE');
3190 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
3191 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
3192 if (preg_match(
'/\d\.\d/', $appli)) {
3193 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3194 $appli .=
" (".DOL_VERSION.
")";
3197 $appli .=
" ".DOL_VERSION;
3200 $appli .=
" ".DOL_VERSION;
3202 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3204 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3206 print
'<span class="help">';
3214 print
'</div>'.
"\n";
3218 if (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3219 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3221 if ($conf->global->MAIN_BUGTRACK_ENABLELINK ==
'github') {
3222 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3223 $bugbaseurl .=
'&title=';
3224 $bugbaseurl .= urlencode(
"Bug: ");
3225 $bugbaseurl .=
'&body=';
3226 $bugbaseurl .= urlencode(
"# Instructions\n");
3227 $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");
3228 $bugbaseurl .= urlencode(
"*Please:*\n");
3229 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3230 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3231 $bugbaseurl .= urlencode(
"\n");
3232 $bugbaseurl .= urlencode(
"\n");
3233 $bugbaseurl .= urlencode(
"# Bug\n");
3234 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3235 $bugbaseurl .= urlencode(
"\n");
3236 $bugbaseurl .= urlencode(
"## Environment\n");
3237 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3238 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3239 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3240 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3241 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3242 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3243 $bugbaseurl .= urlencode(
"\n");
3244 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3245 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3246 $bugbaseurl .= urlencode(
"\n");
3247 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3248 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3249 $bugbaseurl .= urlencode(
"\n");
3250 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
3251 $bugbaseurl .= urlencode(
"[*Files*]\n");
3252 $bugbaseurl .= urlencode(
"\n");
3254 $bugbaseurl .= urlencode(
"\n");
3255 $bugbaseurl .= urlencode(
"## Report\n");
3256 } elseif (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3257 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
3263 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3264 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3265 if (empty($reshook)) {
3266 $bugbaseurl .= $hookmanager->resPrint;
3268 $bugbaseurl = $hookmanager->resPrint;
3271 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3272 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3277 print
"<!-- End Help Block-->\n";
3281 print
"<!-- End left menu -->\n";
3285 $parameters = array();
3286 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3287 print $hookmanager->resPrint;
3289 print
'</div></div> <!-- End side-nav id-left -->';
3293 print
'<!-- Begin right area -->'.
"\n";
3295 if (empty($leftmenuwithoutmainarea)) {
3309 global $conf, $langs, $hookmanager;
3311 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3312 print
'<div id="id-right">';
3317 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3319 $hookmanager->initHooks(array(
'main'));
3320 $parameters = array();
3321 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3322 print $hookmanager->resPrint;
3324 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
3325 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3329 if (!empty($conf->global->SHOW_SOCINFO_ON_PRINT) &&
GETPOST(
'optioncss',
'aZ09') ==
'print' && empty(
GETPOST(
'disable_show_socinfo_on_print',
'az09'))) {
3330 $parameters = array();
3331 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3332 if (empty($reshook)) {
3333 print
'<!-- Begin show mysoc info header -->'.
"\n";
3334 print
'<div id="mysoc-info-header">'.
"\n";
3335 print
'<table class="centpercent div-table-responsive">'.
"\n";
3337 print
'<tr><td rowspan="0" class="width20p">';
3338 if ($conf->global->MAIN_SHOW_LOGO && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($conf->global->MAIN_INFO_SOCIETE_LOGO)) {
3339 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($conf->global->MAIN_INFO_SOCIETE_LOGO)).
'">';
3341 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3342 print
'<tr><td class="titre bold">'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_NOM).
'</td></tr>'.
"\n";
3343 print
'<tr><td>'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_ADDRESS).
'<br>'.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_ZIP).
' '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TOWN).
'</td></tr>'.
"\n";
3344 if (!empty($conf->global->MAIN_INFO_SOCIETE_TEL)) {
3345 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Phone").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TEL).
'</td></tr>';
3347 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
3348 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Email").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL).
'</td></tr>';
3350 if (!empty($conf->global->MAIN_INFO_SOCIETE_WEB)) {
3351 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Web").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_WEB).
'</td></tr>';
3354 print
'</table>'.
"\n";
3355 print
'</div>'.
"\n";
3356 print
'<!-- End show mysoc info header -->'.
"\n";
3375 if (preg_match(
'/^http/i', $helppagename)) {
3377 $helpbaseurl =
'%s';
3378 $helppage = $helppagename;
3383 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3384 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3385 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3386 $helppage = $reg[1];
3389 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3390 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3391 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3392 $helppage = $reg[1];
3395 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3396 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3397 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3398 $helppage = $reg[1];
3401 if (empty($helppage)) {
3402 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3403 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3404 $helppage = $reg[1];
3409 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3429 function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3431 global $conf, $langs, $user;
3434 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3435 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3436 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3437 if ($showtitlebefore) {
3438 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3440 $ret .=
'<div class="tagtd">';
3441 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3442 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3443 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3444 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3445 $ret .=
' placeholder="'.strip_tags($title).
'"';
3446 $ret .= ($autofocus ?
' autofocus' :
'');
3447 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3448 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3449 $ret .=
'<span class="fa fa-search"></span>';
3450 $ret .=
'</button>';
3452 $ret .=
"</form>\n";
3457 if (!function_exists(
"llxFooter")) {
3468 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3470 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager;
3471 global $delayedhtmlcontent;
3472 global $contextpage, $page, $limit, $mode;
3473 global $dolibarr_distrib;
3475 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3479 $parameters = array();
3480 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters, $object, $action);
3481 if (empty($reshook)) {
3482 $llxfooter .= $hookmanager->resPrint;
3483 } elseif ($reshook > 0) {
3484 $llxfooter = $hookmanager->resPrint;
3495 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3497 foreach ($user->lastsearch_values_tmp as $key => $val) {
3498 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3499 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3500 if (empty($val[
'sortfield'])) {
3501 unset($val[
'sortfield']);
3503 if (empty($val[
'sortorder'])) {
3504 unset($val[
'sortorder']);
3506 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3507 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3508 unset($_SESSION[
'lastsearch_values_'.$key]);
3514 $relativepathstring = $_SERVER[
"PHP_SELF"];
3516 if (constant(
'DOL_URL_ROOT')) {
3517 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3519 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3520 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3521 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3522 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3523 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3524 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3525 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3527 if (!empty($contextpage)) {
3528 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3530 if (!empty($page) && $page > 0) {
3531 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3533 if (!empty($limit) && $limit != $conf->liste_limit) {
3534 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3536 if (!empty($mode)) {
3537 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3540 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3541 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3542 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3543 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3547 if (!empty($conf->global->MAIN_CORE_ERROR)) {
3549 if ($conf->use_javascript_ajax) {
3550 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3551 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3554 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3555 print
'<div class="error">'.$msg.
'</div>';
3563 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3565 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3566 print
'</div> <!-- End div id-right -->'.
"\n";
3569 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3570 print
'</div> <!-- End div id-container -->'.
"\n";
3575 print
'<!-- '.$comment.
' -->'.
"\n";
3580 if (!empty($delayedhtmlcontent)) {
3581 print $delayedhtmlcontent;
3584 if (!empty($conf->use_javascript_ajax)) {
3585 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3586 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3590 if (
isModEnabled(
'blockedlog') && is_object($object) && !empty($object->id) && $object->id > 0) {
3591 if (in_array($object->element, array(
'facture')) && $object->statut > 0) {
3592 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3595 jQuery(document).ready(
function () {
3596 $(
'a.documentpreview').click(
function() {
3597 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3599 id:<?php echo $object->id; ?>
3600 , element:
'<?php echo $object->element ?>'
3601 , action:
'DOC_PREVIEW'
3602 , token:
'<?php echo currentToken(); ?>'
3606 $(
'a.documentdownload').click(
function() {
3607 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3609 id:<?php echo $object->id; ?>
3610 , element:
'<?php echo $object->element ?>'
3611 , action:
'DOC_DOWNLOAD'
3612 , token:
'<?php echo currentToken(); ?>'
3623 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3624 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3628 $forceping =
GETPOST(
'forceping',
'alpha');
3629 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3631 $hash_unique_id = md5(
'dolibarr'.$conf->file->instance_unique_id);
3633 if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
3634 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && ($conf->global->MAIN_FIRST_PING_OK_ID !=
'disabled'))
3637 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3638 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3639 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3642 if (!empty($conf->global->MAIN_LAST_PING_KO_DATE) && substr($conf->global->MAIN_LAST_PING_KO_DATE, 0, 6) ==
dol_print_date(
dol_now(),
'%Y%m') && !$forceping) {
3643 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3645 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3647 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";
3648 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3649 $url_for_ping = (empty($conf->global->MAIN_URL_FOR_PING) ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3651 $distrib =
'standard';
3652 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3653 $distrib =
'doliwamp';
3655 if (!empty($dolibarr_distrib)) {
3656 $distrib = $dolibarr_distrib;
3660 jQuery(document).ready(
function (tmp) {
3661 console.log(
"Try Ping with hash_unique_id is md5('dolibarr'+instance_unique_id)");
3664 url:
"<?php echo $url_for_ping ?>",
3669 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3670 action:
'dolibarrping',
3671 version:
'<?php echo (float) DOL_VERSION; ?>',
3672 entity:
'<?php echo (int) $conf->entity; ?>',
3673 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3674 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3675 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3676 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3677 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3678 token:
'notrequired'
3680 success:
function (data, status, xhr) {
3681 console.log(
"Ping ok");
3684 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3687 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3690 error:
function (data,status,xhr) {
3691 console.log(
"Ping ko: " + data);
3694 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3697 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3707 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3708 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3710 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3715 $parameters = array();
3716 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
3718 print $hookmanager->resPrint;
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
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).
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
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...
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
isHTTPS()
Return if we are using a HTTPS connexion 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-...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1, $separ=' ')
Format profIDs according to country.
getBrowserInfo($user_agent)
Return information about user browser.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated 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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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...
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after='', $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
top_menu_quickadd()
Build the tooltip on top menu quick add.
analyseVarsForSqlAndScriptsInjection(&$var, $type)
Return true if security check on parameters are OK, false otherwise.
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...
if(!empty($_SERVER['MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
main_area($title='')
Begin main area.
if(!defined('NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Ouput html header of a page.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu_search()
Build the tooltip on top menu tsearch.
printDropdownQuickadd()
Generate list of quickadd items.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
div float
Buy price without taxes.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successfull.
dol_hash($chain, $type='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.