45if (!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|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $val);
174 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $val);
175 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\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)[a-z]*\s*=/i', $val);
177 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $val);
179 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\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|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $tmpval);
186 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $tmpval);
187 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\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)[a-z]*\s*=/i', $tmpval);
189 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $tmpval);
191 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\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);
247if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
248 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
251if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
252 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
257if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
258 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
262if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
266 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
270if (!defined(
'NOSCANPOSTFORINJECTION')) {
275if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
276 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
280require_once
'filefunc.inc.php';
292if (!empty($_POST[
"DOL_AUTOSET_COOKIE"])) {
293 $tmpautoset = explode(
':', $_POST[
"DOL_AUTOSET_COOKIE"], 2);
294 $tmplist = explode(
',', $tmpautoset[1]);
295 $cookiearrayvalue = array();
296 foreach ($tmplist as $tmpkey) {
297 $postkey = $tmpautoset[0].
'_'.$tmpkey;
299 if (!empty($_POST[$postkey])) {
300 $cookiearrayvalue[$tmpkey] = $_POST[$postkey];
303 $cookiename = $tmpautoset[0];
304 $cookievalue = json_encode($cookiearrayvalue);
306 if (PHP_VERSION_ID < 70300) {
307 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/', null, ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true), true);
310 $cookieparams = array(
311 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
314 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true),
318 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
320 if (empty($cookievalue)) {
321 unset($_COOKIE[$cookiename]);
327if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
328 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
334$prefix = dol_getprefix(
'');
335$sessionname =
'DOLSESSID_'.$prefix;
336$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
337if (!empty($_COOKIE[$sessiontimeout])) {
338 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
343if (!defined(
'NOSESSION')) {
344 if (PHP_VERSION_ID < 70300) {
345 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true), true);
348 $sessioncookieparams = array(
352 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true),
356 session_set_cookie_params($sessioncookieparams);
358 session_name($sessionname);
365require_once
'master.inc.php';
368if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
370 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
372 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
374 } elseif (defined(
'NOREQUIREDB')) {
376 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
378 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
382 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
383 print
'Sorry, your application is offline.'.
"\n";
384 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";
385 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.newToken();
386 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
388 print
'Sorry, your application is offline. Only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
389 $nexturl = DOL_URL_ROOT.
'/';
390 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
398register_shutdown_function(
'dol_shutdown');
401if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
403 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
405 $renderer = $debugbar->getRenderer();
406 if (empty($conf->global->MAIN_HTML_HEADER)) {
407 $conf->global->MAIN_HTML_HEADER =
'';
409 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
411 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
415if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
417 $conf->browser->name = $tmp[
'browsername'];
418 $conf->browser->os = $tmp[
'browseros'];
419 $conf->browser->version = $tmp[
'browserversion'];
420 $conf->browser->ua = $tmp[
'browserua'];
421 $conf->browser->layout = $tmp[
'layout'];
424 if ($conf->browser->layout ==
'phone') {
425 $conf->dol_no_mouse_hover = 1;
431 $conf->theme =
GETPOST(
'theme',
'aZ09');
432 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
436if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
437 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
442if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on') && !defined(
'NOHTTPSREDIRECT')) {
444 if (is_numeric($conf->file->main_force_https)) {
445 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
446 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
447 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
451 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
455 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
460 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
461 header(
"Location: ".$newurl);
464 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);
468if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
469 $listofip = explode(
',', $dolibarr_main_restrict_ip);
471 foreach ($listofip as $ip) {
473 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
479 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
485if (!defined(
'NOREQUIREHTML')) {
486 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
488if (!defined(
'NOREQUIREAJAX')) {
489 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
493if (!empty($conf->global->MAIN_NOT_INSTALLED) || !empty($conf->global->MAIN_NOT_UPGRADED)) {
494 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
495 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
499if ((!empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
500 || (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && !empty($conf->global->MAIN_VERSION_LAST_INSTALL) && ($conf->global->MAIN_VERSION_LAST_INSTALL != DOL_VERSION))) {
501 $versiontocompare = empty($conf->global->MAIN_VERSION_LAST_UPGRADE) ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
502 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
503 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
504 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
505 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
507 if (empty($conf->global->MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE) || $rescomp < 3) {
509 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
510 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
517if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
519 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
521 if (isset($_SESSION[
'newtoken'])) {
522 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
525 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
529 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
530 $_SESSION[
'newtoken'] = $token;
531 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
539if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
541 $sensitiveget =
false;
542 if ((GETPOSTISSET(
'massaction') ||
GETPOST(
'action',
'aZ09')) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
544 if (GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'specimen'))) {
545 $sensitiveget =
true;
549 $arrayofactiontoforcetokencheck = array(
551 'doprev',
'donext',
'dvprev',
'dvnext',
552 'freezone',
'install',
555 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
556 $sensitiveget =
true;
559 if (preg_match(
'/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
560 $sensitiveget =
true;
567 $_SERVER[
'REQUEST_METHOD'] ==
'POST' ||
569 GETPOSTISSET(
'massaction') ||
570 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
573 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
575 if (
GETPOST(
'uploadform',
'int')) {
576 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
577 $langs->loadLangs(array(
"errors",
"install"));
578 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
579 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
581 http_response_code(403);
582 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
583 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);
584 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";
586 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);
587 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";
588 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";
589 if (!empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
590 print
" instead of ".$conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN;
592 print
" into setup).\n";
599 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
601 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
602 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);
605 if (!defined(
'NOTOKENRENEWAL')) {
607 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
610 if (isset($_POST[
'id'])) {
611 $savid = ((int) $_POST[
'id']);
614 unset($_GET[
'confirm']);
615 unset($_GET[
'action']);
616 unset($_GET[
'confirmmassaction']);
617 unset($_GET[
'massaction']);
618 unset($_GET[
'token']);
620 $_POST[
'id'] = ((int) $savid);
623 $_GET[
'errorcode'] =
'InvalidToken';
631 if (GETPOSTISSET(
'disablemodules')) {
632 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
634 if (!empty($_SESSION[
"disablemodules"])) {
635 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
637 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
638 foreach ($disabled_modules as $module) {
640 if (empty($conf->$module)) {
641 $conf->$module =
new stdClass();
644 $conf->$module->enabled =
false;
646 foreach ($modulepartkeys as $modulepartkey) {
647 unset($conf->modules_parts[$modulepartkey][$module]);
649 if ($module ==
'fournisseur') {
650 $conf->supplier_order->enabled = 0;
651 $conf->supplier_invoice->enabled = 0;
659$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
660if (is_array($modulepart) && count($modulepart) > 0) {
661 foreach ($conf->modules as $module) {
662 if (in_array($module, $modulepart)) {
663 $modulepart = $module;
668if (is_array($modulepart)) {
677if (!defined(
'NOLOGIN')) {
681 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
682 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
685 if (empty($dolibarr_main_authentication)) {
686 $dolibarr_main_authentication =
'dolibarr';
689 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
690 $dolibarr_auto_user =
'auto';
694 $authmode = explode(
',', $dolibarr_main_authentication);
697 if (!count($authmode)) {
698 $langs->load(
'main');
699 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
706 $resultFetchUser =
'';
708 if (!isset($_SESSION[
"dol_login"])) {
710 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
712 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
713 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
714 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
715 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
716 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
717 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
718 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
719 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
720 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
721 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
726 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
727 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFER']).
")");
729 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
730 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
731 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
732 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
733 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
734 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
735 header(
"Location: ".$url);
742 $hookmanager->initHooks(array(
'login'));
743 $parameters = array();
744 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
751 if ($test &&
GETPOST(
"username",
"alpha", 2) && !empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA) && !isset($_SESSION[
'dol_bypass_antispam'])) {
752 $sessionkey =
'dol_antispam_value';
753 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
757 dol_syslog(
'Bad value for code, connexion refused');
759 $langs->loadLangs(array(
'main',
'errors'));
761 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
765 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
768 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
776 $hookmanager->initHooks(array(
'login'));
777 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
778 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
787 $allowedmethodtopostusername = 3;
788 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
789 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
792 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
793 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
794 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
797 $goontestloop =
false;
798 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
799 $goontestloop =
true;
801 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
802 $goontestloop =
true;
804 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
805 $goontestloop =
true;
807 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
808 $goontestloop =
true;
810 if (
GETPOST(
'beforeoauthloginredirect',
'int') ||
GETPOST(
'afteroauthloginreturn')) {
811 $goontestloop =
true;
813 if (!empty($_COOKIE[
'login_dolibarr'])) {
814 $goontestloop =
true;
817 if (!is_object($langs)) {
818 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
820 $langcode = (
GETPOST(
'lang',
'aZ09', 1) ?
GETPOST(
'lang',
'aZ09', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ?
'auto' : $conf->global->MAIN_LANG_DEFAULT));
821 if (defined(
'MAIN_LANG_DEFAULT')) {
822 $langcode = constant(
'MAIN_LANG_DEFAULT');
824 $langs->setDefaultLang($langcode);
831 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
833 if ($login ===
'--bad-login-validity--') {
840 $dol_authmode = $conf->authmode;
841 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
842 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
843 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
844 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
845 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
848 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
849 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
850 if ($dol_dst_first && $dol_dst_second) {
851 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
855 if ($datenow >= $datefirst && $datenow < $datesecond) {
859 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
860 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
865 dol_syslog(
'Bad password, connexion refused', LOG_DEBUG);
867 $langs->loadLangs(array(
'main',
'errors'));
871 if (empty($_SESSION[
"dol_loginmesg"])) {
872 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
876 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
879 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
887 $hookmanager->initHooks(array(
'login'));
888 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
889 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
899 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
901 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);
902 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
907 return 'ERROR_NOT_LOGGED';
909 if ($_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
910 http_response_code(401);
912 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
917 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
918 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
919 dol_syslog(
'User not found or not valid, connexion refused');
921 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
922 session_name($sessionname);
925 if ($resultFetchUser == 0) {
927 $langs->loadLangs(array(
'main',
'errors'));
929 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
931 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
932 } elseif ($resultFetchUser < 0) {
933 $_SESSION[
"dol_loginmesg"] = $user->error;
935 $user->context[
'audit'] = $user->error;
938 $langs->loadLangs(array(
'main',
'errors'));
940 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
942 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
946 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
955 $hookmanager->initHooks(array(
'login'));
956 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
957 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
962 $paramsurl = array();
963 if (
GETPOST(
'textbrowser',
'int')) {
964 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
967 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
970 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
972 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
976 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
977 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
982 $login = $_SESSION[
"dol_login"];
983 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
984 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
986 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
990 if ($resultFetchUser <= 0
991 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
992 || ($user->status != $user::STATUS_ENABLED)
993 || ($user->isNotIntoValidityDateRange())) {
994 if ($resultFetchUser <= 0) {
996 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
997 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
999 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
1000 } elseif ($user->status != $user::STATUS_ENABLED) {
1005 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], curren date is ".
dol_now());
1008 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
1009 session_name($sessionname);
1012 if ($resultFetchUser == 0) {
1013 $langs->loadLangs(array(
'main',
'errors'));
1015 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1017 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1018 } elseif ($resultFetchUser < 0) {
1019 $_SESSION[
"dol_loginmesg"] = $user->error;
1021 $user->context[
'audit'] = $user->error;
1023 $langs->loadLangs(array(
'main',
'errors'));
1025 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1027 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1031 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1039 $hookmanager->initHooks(array(
'login'));
1040 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1041 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1046 $paramsurl = array();
1047 if (
GETPOST(
'textbrowser',
'int')) {
1048 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1051 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1053 if (
GETPOST(
'lang',
'aZ09')) {
1054 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1056 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1060 $hookmanager->initHooks(array(
'main'));
1063 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1064 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1065 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1067 if (constant(
'DOL_URL_ROOT')) {
1068 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1070 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1071 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1075 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1076 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1077 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1079 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1080 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1081 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1083 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1084 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1085 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1087 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1088 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1089 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1091 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1092 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1093 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1096 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1097 if (empty($_SESSION[
'pageforbacktolist'])) {
1098 $pageforbacktolistarray = array();
1100 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1102 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1103 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1104 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1105 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1110 $parameters = array();
1111 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1120 if (!isset($_SESSION[
"dol_login"])) {
1125 $_SESSION[
"dol_login"] = $user->login;
1126 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1127 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1128 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1129 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1130 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1131 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1132 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1133 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1134 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1135 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1137 $_SESSION[
"dol_entity"] = $conf->entity;
1139 if (!empty($dol_hide_topmenu)) {
1140 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1142 if (!empty($dol_hide_leftmenu)) {
1143 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1145 if (!empty($dol_optimize_smallscreen)) {
1146 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1148 if (!empty($dol_no_mouse_hover)) {
1149 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1151 if (!empty($dol_use_jmobile)) {
1152 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1155 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1159 $user->update_last_login_date();
1161 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1162 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1165 $user->context[
'audit'] = $loginfo;
1166 $user->context[
'authentication_method'] = $dol_authmode;
1169 $result = $user->call_trigger(
'USER_LOGIN', $user);
1177 $hookmanager->initHooks(array(
'login'));
1178 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1179 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1187 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1194 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (empty($conf->global->MAIN_LANDING_PAGE) ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->
conf->MAIN_LANDING_PAGE);
1195 if (!empty($landingpage)) {
1197 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1198 header(
'Location: '.$newpath);
1207 $user->rights->user->user->lire = 1;
1208 $user->rights->user->user->creer = 1;
1209 $user->rights->user->user->password = 1;
1210 $user->rights->user->user->supprimer = 1;
1211 $user->rights->user->self->creer = 1;
1212 $user->rights->user->self->password = 1;
1215 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1216 if (empty($user->rights->user->user_advance)) {
1217 $user->rights->user->user_advance =
new stdClass();
1219 if (empty($user->rights->user->self_advance)) {
1220 $user->rights->user->self_advance =
new stdClass();
1222 if (empty($user->rights->user->group_advance)) {
1223 $user->rights->user->group_advance =
new stdClass();
1226 $user->rights->user->user_advance->readperms = 1;
1227 $user->rights->user->user_advance->write = 1;
1228 $user->rights->user->self_advance->readperms = 1;
1229 $user->rights->user->self_advance->writeperms = 1;
1230 $user->rights->user->group_advance->read = 1;
1231 $user->rights->user->group_advance->readperms = 1;
1232 $user->rights->user->group_advance->write = 1;
1233 $user->rights->user->group_advance->delete = 1;
1242 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1243 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1245 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1246 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1250 if (empty($conf->global->MAIN_FORCETHEME) && !empty($user->conf->MAIN_THEME)) {
1251 $conf->theme = $user->conf->MAIN_THEME;
1252 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1256 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1257 $user->loadDefaultValues();
1263if (
GETPOST(
'theme',
'aZ09')) {
1264 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1265 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1270 $conf->use_javascript_ajax = 0;
1272 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1273 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1278if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1279 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1283$conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1286if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1287 $conf->dol_hide_leftmenu = 1;
1289if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1290 $conf->dol_hide_topmenu = 1;
1292if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1293 $conf->dol_optimize_smallscreen = 1;
1295if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1296 $conf->dol_no_mouse_hover = 1;
1298if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1299 $conf->dol_use_jmobile = 1;
1302if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1303 $conf->dol_no_mouse_hover = 1;
1307if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1308 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1309 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1310 || !empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
1312 $conf->dol_optimize_smallscreen = 1;
1314 if (isset($conf->global->PRODUIT_DESC_IN_FORM) && $conf->global->PRODUIT_DESC_IN_FORM == 1) {
1315 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1319if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1320 $conf->theme =
'eldy';
1321 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1324if (!defined(
'NOREQUIRETRAN')) {
1325 if (!
GETPOST(
'lang',
'aZ09')) {
1327 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1330 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1331 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1337if (!defined(
'NOLOGIN')) {
1340 if (!$user->login) {
1345 if ($user->statut < 1) {
1347 $langs->loadLangs(array(
"errors",
"other"));
1348 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1356dol_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);
1361if (!defined(
'NOREQUIRETRAN')) {
1363 $langs->loadLangs(array(
'main',
'dict'));
1367$bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1368$bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1369$bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1370$bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1373$mesg =
''; $warning =
''; $error = 0;
1375$mesgs = array(); $warnings = array(); $errors = array();
1378if (empty($conf->browser->firefox)) {
1379 define(
'ROWS_1', 1);
1380 define(
'ROWS_2', 2);
1381 define(
'ROWS_3', 3);
1382 define(
'ROWS_4', 4);
1383 define(
'ROWS_5', 5);
1384 define(
'ROWS_6', 6);
1385 define(
'ROWS_7', 7);
1386 define(
'ROWS_8', 8);
1387 define(
'ROWS_9', 9);
1389 define(
'ROWS_1', 0);
1390 define(
'ROWS_2', 1);
1391 define(
'ROWS_3', 2);
1392 define(
'ROWS_4', 3);
1393 define(
'ROWS_5', 4);
1394 define(
'ROWS_6', 5);
1395 define(
'ROWS_7', 6);
1396 define(
'ROWS_8', 7);
1397 define(
'ROWS_9', 8);
1400$heightforframes = 50;
1403if (!defined(
'NOREQUIREMENU')) {
1404 if (empty($user->socid)) {
1405 $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);
1408 $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);
1412 $file_menu = $conf->standard_menu;
1413 if (
GETPOST(
'menu',
'alpha')) {
1414 $file_menu =
GETPOST(
'menu',
'alpha');
1416 if (!class_exists(
'MenuManager')) {
1418 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1419 foreach ($dirmenus as $dirmenu) {
1421 if (class_exists(
'MenuManager')) {
1425 if (!class_exists(
'MenuManager')) {
1426 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1427 $file_menu =
'eldy_menu.php';
1428 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1431 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1435if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1436 $message =
GETPOST(
'seteventmessages',
'alpha');
1437 $messages = explode(
',', $message);
1438 foreach ($messages as $key => $msg) {
1439 $tmp = explode(
':', $msg);
1446if (!function_exists(
"llxHeader")) {
1467 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1469 global $conf, $hookmanager;
1472 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1474 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1476 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1478 if ($mainmenu !=
'website') {
1479 $tmpcsstouse = $morecssonbody;
1483 if (!empty($conf->global->MAIN_OPTIMIZEFORCOLORBLIND)) {
1484 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1487 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1489 $parameters = array(
'help_url' => $help_url);
1490 $reshook = $hookmanager->executeHooks(
'changeHelpURL', $parameters);
1492 $help_url = $hookmanager->resPrint;
1496 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1497 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1500 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1501 left_menu(array(), $help_url,
'',
'', 1, $title, 1);
1505 if ($replacemainareaby) {
1506 print $replacemainareaby;
1523 global $db, $conf, $hookmanager;
1525 if ($contenttype ==
'text/html') {
1526 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1528 header(
"Content-Type: ".$contenttype);
1534 header(
"X-Content-Type-Options: nosniff");
1537 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1538 header(
"X-Frame-Options: SAMEORIGIN");
1540 header(
"X-Frame-Options: ALLOWALL");
1547 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1562 if (!is_object($hookmanager)) {
1563 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1566 $hookmanager->initHooks(array(
"main"));
1568 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'reportonly');
1569 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1571 $contentsecuritypolicy = $hookmanager->resPrint;
1573 $contentsecuritypolicy .= $hookmanager->resPrint;
1576 if (!empty($contentsecuritypolicy)) {
1577 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1580 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1584 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1599 if (!is_object($hookmanager)) {
1600 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1603 $hookmanager->initHooks(array(
"main"));
1605 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'active');
1606 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1608 $contentsecuritypolicy = $hookmanager->resPrint;
1610 $contentsecuritypolicy .= $hookmanager->resPrint;
1613 if (!empty($contentsecuritypolicy)) {
1614 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1617 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1623 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1626 header(
"Referrer-Policy: ".$referrerpolicy);
1629 if ($forcenocache) {
1630 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1652function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1654 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1658 if (empty($conf->css)) {
1659 $conf->css =
'/theme/eldy/style.css.php';
1662 print
'<!doctype html>'.
"\n";
1664 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1667 if (empty($disablehead)) {
1668 if (!is_object($hookmanager)) {
1669 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1672 $hookmanager->initHooks(array(
"main"));
1674 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
1678 if (
GETPOST(
'dol_basehref',
'alpha')) {
1679 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1683 print
'<meta charset="utf-8">'.
"\n";
1684 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1685 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1686 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1687 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1688 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1690 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1693 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1694 if (!empty($mysoc->logo_squarred_mini)) {
1695 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1700 if (empty($conf->dol_use_jmobile)) {
1701 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1709 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1710 if (!empty($manifest)) {
1711 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1714 if (!empty($conf->global->THEME_ELDY_TOPMENU_BACK1)) {
1716 print
'<meta name="theme-color" content="rgb('.$conf->global->THEME_ELDY_TOPMENU_BACK1.
')">'.
"\n";
1720 if (
GETPOST(
'autorefresh',
'int') > 0) {
1721 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1725 $appli = constant(
'DOL_APPLICATION_TITLE');
1726 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1727 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1732 if ($title && !empty($conf->global->MAIN_HTML_TITLE) && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1740 $parameters = array(
'title'=>$titletoshow);
1741 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1743 $titletoshow = $hookmanager->resPrint;
1745 $titletoshow .= $hookmanager->resPrint;
1753 if (
GETPOST(
'version',
'int')) {
1754 $ext =
'version='.GETPOST(
'version',
'int');
1757 if (
GETPOST(
'dol_resetcache')) {
1758 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1762 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1764 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1765 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1766 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1768 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1769 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1771 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1772 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1774 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1775 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1777 if (GETPOSTISSET(
'dol_use_jmobile')) {
1778 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1780 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1781 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1783 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1784 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1787 if (!empty($conf->global->MAIN_ENABLE_FONT_ROBOTO)) {
1788 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1789 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1792 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1793 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1794 $jquerytheme =
'base';
1795 if (!empty($conf->global->MAIN_USE_JQUERY_THEME)) {
1796 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1798 if (constant(
'JS_JQUERY_UI')) {
1799 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1801 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1803 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1804 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1806 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1807 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1808 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1812 if (!defined(
'DISABLE_FONT_AWSOME')) {
1813 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1814 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1815 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/v4-shims.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1818 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1822 if (!empty($conf->modules_parts[
'theme'])) {
1823 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1826 $themesubdir = $reldir;
1833 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1834 if (!empty($conf->global->MAIN_FIX_FLASH_ON_CHROME)) {
1835 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";
1839 if (!empty($conf->modules_parts[
'css'])) {
1840 $arraycss = (array) $conf->modules_parts[
'css'];
1841 foreach ($arraycss as $modcss => $filescss) {
1842 $filescss = (array) $filescss;
1843 foreach ($filescss as $cssfile) {
1844 if (empty($cssfile)) {
1845 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1849 if ($urlforcss && $urlforcss !=
'/') {
1850 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1852 if (!preg_match(
'/\.css$/i', $cssfile)) {
1857 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1863 if (is_array($arrayofcss)) {
1864 foreach ($arrayofcss as $cssfile) {
1865 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1866 $urltofile = $cssfile;
1870 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1872 if (!preg_match(
'/\.css$/i', $cssfile)) {
1882 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1886 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1888 print
'<!-- Includes JS for JQuery -->'.
"\n";
1889 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1890 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1892 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1894 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1895 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1897 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1900 if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1901 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1904 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1905 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1908 if (empty($disableforlogin) && (empty($conf->global->MAIN_JS_GRAPH) || $conf->global->MAIN_JS_GRAPH ==
'chart') && !defined(
'DISABLE_JS_GRAPH')) {
1909 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1913 if (!empty($conf->global->MAIN_USE_JQUERY_JEDITABLE) && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1914 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1915 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1916 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1917 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1918 print
'<script>'.
"\n";
1919 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1920 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1921 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1922 print 'var placeholderInPlace = \
' \';'.
"\n";
1923 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1924 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1925 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1926 print
'var withInPlace = 300;';
1927 print
'</script>'.
"\n";
1928 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1929 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1932 if (!empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1933 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1934 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1936 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1938 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1939 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1941 if (!defined(
'DISABLE_MULTISELECT')) {
1942 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1946 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1948 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (empty($conf->global->FCKEDITOR_EDITORNAME) || $conf->global->FCKEDITOR_EDITORNAME ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1949 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1950 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1951 $jsckeditor =
'ckeditor.js';
1952 if (constant(
'JS_CKEDITOR')) {
1954 $pathckeditor = constant(
'JS_CKEDITOR');
1956 print
'<script nonce="'.getNonce().
'">';
1957 print
'/* enable ckeditor by main.inc.php */';
1958 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1959 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1960 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1961 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";
1962 print
'</script>'.
"\n";
1963 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1965 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1966 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1968 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1970 print
'</script>'.
"\n";
1974 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1975 $enablebrowsernotif =
false;
1976 if (isModEnabled(
'agenda') && !empty($conf->global->AGENDA_REMINDER_BROWSER)) {
1977 $enablebrowsernotif =
true;
1979 if ($conf->browser->layout ==
'phone') {
1980 $enablebrowsernotif =
false;
1982 if ($enablebrowsernotif) {
1983 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1984 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1989 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1990 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1993 if (!empty($conf->modules_parts[
'js'])) {
1994 $arrayjs = (array) $conf->modules_parts[
'js'];
1995 foreach ($arrayjs as $modjs => $filesjs) {
1996 $filesjs = (array) $filesjs;
1997 foreach ($filesjs as $jsfile) {
2000 if ($urlforjs && $urlforjs !=
'/') {
2001 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2002 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2004 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2010 if (is_array($arrayofjs)) {
2011 print
'<!-- Includes JS added by page -->'.
"\n";
2012 foreach ($arrayofjs as $jsfile) {
2013 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2014 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2016 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2023 if (!empty($conf->global->ALLOW_THEME_JS)) {
2024 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2025 if (file_exists($theme_js)) {
2026 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2030 if (!empty($head)) {
2033 if (!empty($conf->global->MAIN_HTML_HEADER)) {
2034 print $conf->global->MAIN_HTML_HEADER.
"\n";
2037 $parameters = array();
2038 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2039 print $hookmanager->resPrint;
2041 print
"</head>\n\n";
2044 $conf->headerdone = 1;
2064function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $helppagename =
'')
2066 global $user, $conf, $langs, $db;
2068 global $hookmanager, $menumanager;
2073 $hookmanager->initHooks(array(
'toprightmenu'));
2078 if (empty($conf->headerdone)) {
2079 $disablenofollow = 0;
2080 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2081 print
'<body id="mainbody">';
2087 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2088 if (!isset($form) || !is_object($form)) {
2089 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2090 $form =
new Form($db);
2093 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2095 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
2098 print
'<div id="tmenu_tooltip'.(empty($conf->global->MAIN_MENU_INVERT) ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2099 $menumanager->atarget = $target;
2100 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
2104 $appli = constant(
'DOL_APPLICATION_TITLE');
2105 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2106 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2107 if (preg_match(
'/\d\.\d/', $appli)) {
2108 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2109 $appli .=
" (".DOL_VERSION.
")";
2112 $appli .=
" ".DOL_VERSION;
2115 $appli .=
" ".DOL_VERSION;
2119 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2123 $logouthtmltext =
'';
2124 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2126 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2127 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2129 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2130 if ($conf->browser->name ==
'chrome') {
2131 $stringforfirstkey .=
' ALT +';
2132 } elseif ($conf->browser->name ==
'firefox') {
2133 $stringforfirstkey .=
' ALT + SHIFT +';
2135 $stringforfirstkey .=
' CTL +';
2138 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.newToken().
'">';
2139 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle');
2140 $logouttext .=
'</a>';
2142 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2143 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2147 print
'<div class="login_block usedropdown">'.
"\n";
2149 $toprightmenu .=
'<div class="login_block_other">';
2152 $parameters = array();
2153 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2154 if (is_numeric($result)) {
2156 $toprightmenu .= $hookmanager->resPrint;
2158 $toprightmenu = $hookmanager->resPrint;
2161 $toprightmenu .= $result;
2165 if (isModEnabled(
'modulebuilder')) {
2166 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2168 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2170 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2174 if (empty($conf->global->MAIN_PRINT_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2177 if (isset($_POST) && is_array($_POST)) {
2178 foreach ($_POST as $key => $value) {
2179 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2180 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2183 if (!is_array($value)) {
2184 if ($value !==
'') {
2185 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2188 foreach ($value as $value2) {
2189 if (($value2 !==
'') && (!is_array($value2))) {
2190 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2196 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2197 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2199 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2201 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2205 if (empty($conf->global->MAIN_HELP_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2206 $langs->load(
"help");
2213 if (empty($helppagename)) {
2214 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2216 $helppresent =
'helppresent';
2221 $helpbaseurl = $arrayres[
'helpbaseurl'];
2222 $helppage = $arrayres[
'helppage'];
2223 $mode = $arrayres[
'mode'];
2226 if ($helpbaseurl && $helppage) {
2228 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2229 if ($mode ==
'wiki') {
2230 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2232 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2234 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2237 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2238 if ($mode ==
'wiki') {
2239 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2241 $text .= sprintf($helpbaseurl, $helppage);
2244 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2245 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2247 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2251 if (!empty($conf->global->MAIN_SHOWDATABASENAMEINHELPPAGESLINK)) {
2252 $langs->load(
'admin');
2253 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2257 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2258 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2259 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2263 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2265 $toprightmenu .=
'</div>';
2269 $toprightmenu .=
'<div class="login_block_user">';
2273 $toprightmenu .=
'<div class="inline-block nowrap"><div class="inline-block login_block_elem login_block_elem_name" style="padding: 0px;">';
2275 if (!empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2280 if (!empty($conf->global->MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN)) {
2291 $toprightmenu .=
'</div></div>';
2293 $toprightmenu .=
'</div>'.
"\n";
2296 print $toprightmenu;
2303 print
'<div style="clear: both;"></div>';
2304 print
"<!-- End top horizontal menu -->\n\n";
2307 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2308 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2322 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2324 global $menumanager;
2326 $langs->load(
'companies');
2328 $userImage = $userDropDownImage =
'';
2329 if (!empty($user->photo)) {
2330 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2331 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2333 $nophoto =
'/public/theme/common/user_anonymous.png';
2334 if ($user->gender ==
'man') {
2335 $nophoto =
'/public/theme/common/user_man.png';
2337 if ($user->gender ==
'woman') {
2338 $nophoto =
'/public/theme/common/user_woman.png';
2341 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2342 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2346 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2347 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2349 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2350 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2353 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2356 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2359 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2362 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2365 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2369 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2370 if (isModEnabled(
'multicurrency')) {
2371 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2373 $dropdownBody .=
'</div>';
2375 $dropdownBody .=
'<br>';
2376 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2377 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2380 if (!empty($user->admin)) {
2381 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2383 if (!empty($user->socid)) {
2384 $thirdpartystatic =
new Societe($db);
2385 $thirdpartystatic->fetch($user->socid);
2386 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2387 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2389 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2390 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2391 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2392 $dropdownBody .=
'<br>';
2394 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2395 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2396 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2397 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2399 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2400 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2401 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2402 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2403 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2405 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2407 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2408 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2409 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2414 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')';
2415 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2416 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2417 if ($conf->browser->layout ==
'phone') {
2418 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2420 if (!empty($_SESSION[
"disablemodules"])) {
2421 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2423 $dropdownBody .=
'</div>';
2426 $parameters = array(
'user'=>$user,
'langs' => $langs);
2427 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2428 if (is_numeric($result)) {
2430 $dropdownBody .= $hookmanager->resPrint;
2432 $dropdownBody = $hookmanager->resPrint;
2436 if (empty($urllogout)) {
2437 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.newToken();
2442 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2443 if ($conf->browser->name ==
'chrome') {
2444 $stringforfirstkey .=
' ALT +';
2445 } elseif ($conf->browser->name ==
'firefox') {
2446 $stringforfirstkey .=
' ALT + SHIFT +';
2448 $stringforfirstkey .=
' CTL +';
2452 $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>';
2453 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2454 $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');
2455 $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>';
2457 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2458 if (!empty($user->admin)) {
2459 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2463 $appli = constant(
'DOL_APPLICATION_TITLE');
2464 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2465 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2466 if (preg_match(
'/\d\.\d/', $appli)) {
2467 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2468 $appli .=
" (".DOL_VERSION.
")";
2471 $appli .=
" ".DOL_VERSION;
2474 $appli .=
" ".DOL_VERSION;
2477 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2478 $btnUser =
'<!-- div for user link -->
2479 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2480 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a" data-toggle="dropdown">
2481 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2483 <div class="dropdown-menu">
2485 <div class="user-header">
2486 '.$userDropDownImage.
'
2488 '.$profilName.
'<br>';
2489 if ($user->datelastlogin) {
2490 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2491 if ($user->datepreviouslogin) {
2492 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2495 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock"></i> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser').
'</small><br>';
2496 if ($user->datepreviouslogin) {
2497 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock opacitymedium"></i> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser').
'</small><br>';
2505 <!-- Menu Body user-->
2506 <div class="user-body">'.$dropdownBody.
'</div>
2509 <div class="user-footer">
2510 <div class="pull-left">
2513 <div class="pull-left">
2514 '.$virtuelcardLink.
'
2516 <div class="pull-right">
2519 <div class="clearboth"></div>
2525 $btnUser =
'<!-- div for user link -->
2526 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2527 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'">
2529 <span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone">'.
dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>
2534 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2536 <!-- Code to show/hide the user drop-down -->
2538 function closeTopMenuLoginDropdown() {
2539 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2541 jQuery("#topmenu-login-dropdown").removeClass("open");
2543 jQuery(document).ready(function() {
2544 jQuery(document).on("click", function(event) {
2545 // console.log("Click somewhere on screen");
2546 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2547 closeTopMenuLoginDropdown();
2553 if ($conf->theme !=
'md') {
2555 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2556 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2557 event.preventDefault();
2558 jQuery("#topmenu-login-dropdown").toggleClass("open");
2561 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2562 console.log("Clik on #topmenulogincompanyinfo-btn");
2563 jQuery("#topmenulogincompanyinfo").slideToggle();
2566 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2567 console.log("Clik on #topmenuloginmoreinfo-btn");
2568 jQuery("#topmenuloginmoreinfo").slideToggle();
2588 global $conf, $langs;
2594 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2595 if ($conf->browser->os ===
'macintosh') {
2596 $stringforfirstkey .=
' CTL +';
2598 if ($conf->browser->name ==
'chrome') {
2599 $stringforfirstkey .=
' ALT +';
2600 } elseif ($conf->browser->name ==
'firefox') {
2601 $stringforfirstkey .=
' ALT + SHIFT +';
2603 $stringforfirstkey .=
' CTL +';
2607 $html .=
'<!-- div for quick add link -->
2608 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2609 <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>
2613 <!-- Code to show/hide the user drop-down -->
2615 jQuery(document).ready(function() {
2616 jQuery(document).on("click", function(event) {
2617 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2619 $("#topmenu-quickadd-dropdown").removeClass("open");
2622 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2623 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2624 openQuickAddDropDown(event);
2628 $(document).keydown(function(event){
2629 var ostype = "'.$conf->browser->os.
'";
2630 if (ostype === "macintosh") {
2631 if ( event.which === 65 && event.ctrlKey ) {
2632 console.log(\'control + a : trigger open quick add dropdown\');
2633 openQuickAddDropDown(event);
2636 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2637 console.log(\'control + shift + a : trigger open quick add dropdown\');
2638 openQuickAddDropDown(event);
2643 var openQuickAddDropDown = function(event) {
2644 event.preventDefault();
2645 $("#topmenu-quickadd-dropdown").toggleClass("open");
2646 //$("#top-quickadd-search-input").focus();
2661 global $conf, $user, $langs, $hookmanager;
2666 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2667 "title" =>
"MenuNewMember@members",
2668 "name" =>
"Adherent@members",
2669 "picto" =>
"object_member",
2670 "activation" => isModEnabled(
'adherent') && $user->hasRight(
"adherent",
"write"),
2674 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2675 "title" =>
"MenuNewThirdParty@companies",
2676 "name" =>
"ThirdParty@companies",
2677 "picto" =>
"object_company",
2678 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2682 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2683 "title" =>
"NewContactAddress@companies",
2684 "name" =>
"Contact@companies",
2685 "picto" =>
"object_contact",
2686 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2690 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2691 "title" =>
"NewPropal@propal",
2692 "name" =>
"Proposal@propal",
2693 "picto" =>
"object_propal",
2694 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2699 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2700 "title" =>
"NewOrder@orders",
2701 "name" =>
"Order@orders",
2702 "picto" =>
"object_order",
2703 "activation" => isModEnabled(
'commande') && $user->hasRight(
"commande",
"write"),
2707 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2708 "title" =>
"NewBill@bills",
2709 "name" =>
"Bill@bills",
2710 "picto" =>
"object_bill",
2711 "activation" => isModEnabled(
'facture') && $user->hasRight(
"facture",
"write"),
2715 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2716 "title" =>
"NewContractSubscription@contracts",
2717 "name" =>
"Contract@contracts",
2718 "picto" =>
"object_contract",
2719 "activation" => isModEnabled(
'contrat') && $user->hasRight(
"contrat",
"write"),
2723 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2724 "title" =>
"SupplierProposalNew@supplier_proposal",
2725 "name" =>
"SupplierProposal@supplier_proposal",
2726 "picto" =>
"supplier_proposal",
2727 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2731 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2732 "title" =>
"NewSupplierOrderShort@orders",
2733 "name" =>
"SupplierOrder@orders",
2734 "picto" =>
"supplier_order",
2735 "activation" => (isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2739 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2740 "title" =>
"NewBill@bills",
2741 "name" =>
"SupplierBill@bills",
2742 "picto" =>
"supplier_invoice",
2743 "activation" => (isModEnabled(
"fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2747 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2748 "title" =>
"NewTicket@ticket",
2749 "name" =>
"Ticket@ticket",
2750 "picto" =>
"ticket",
2751 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2755 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2756 "title" =>
"NewIntervention@interventions",
2757 "name" =>
"Intervention@interventions",
2758 "picto" =>
"intervention",
2759 "activation" => isModEnabled(
'ficheinter') && $user->hasRight(
"ficheinter",
"creer"),
2763 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2764 "title" =>
"NewProduct@products",
2765 "name" =>
"Product@products",
2766 "picto" =>
"object_product",
2767 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2771 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2772 "title" =>
"NewService@products",
2773 "name" =>
"Service@products",
2774 "picto" =>
"object_service",
2775 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2779 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2780 "title" =>
"AddUser@users",
2781 "name" =>
"User@users",
2783 "activation" => $user->hasRight(
"user",
"user",
"write"),
2789 $dropDownQuickAddHtml =
'';
2792 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2793 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2796 $parameters = array();
2797 $hook_items = $items;
2798 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2799 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2800 if ($reshook == 0) {
2801 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2803 $items = $hookmanager->resArray;
2807 $position = array();
2808 foreach ($items[
'items'] as $key => $row) {
2809 $position[$key] = $row[
'position'];
2811 $array1_sort_order = SORT_ASC;
2812 array_multisort($position, $array1_sort_order, $items[
'items']);
2815 foreach ($items[
'items'] as $item) {
2816 if (!$item[
'activation']) {
2819 $langs->load(explode(
'@', $item[
'title'])[1]);
2820 $langs->load(explode(
'@', $item[
'name'])[1]);
2821 $dropDownQuickAddHtml .=
'
2822 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2823 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2827 $dropDownQuickAddHtml .=
'</div>';
2828 $dropDownQuickAddHtml .=
'</div>';
2830 return $dropDownQuickAddHtml;
2840 global $langs, $conf, $db, $user;
2845 if (!isModEnabled(
'bookmark') || empty($user->rights->bookmark->lire)) {
2851 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2852 if ($conf->browser->os ===
'macintosh') {
2853 $stringforfirstkey .=
' CTL +';
2855 if ($conf->browser->name ==
'chrome') {
2856 $stringforfirstkey .=
' ALT +';
2857 } elseif ($conf->browser->name ==
'firefox') {
2858 $stringforfirstkey .=
' ALT + SHIFT +';
2860 $stringforfirstkey .=
' CTL +';
2864 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2865 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2866 $langs->load(
"bookmarks");
2868 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2869 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2873 $html .=
'<!-- div for bookmark link -->
2874 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2875 <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>
2876 <div class="dropdown-menu">
2882 <!-- Code to show/hide the bookmark drop-down -->
2884 jQuery(document).ready(function() {
2885 jQuery(document).on("click", function(event) {
2886 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2887 //console.log("close bookmark dropdown - we click outside");
2889 $("#topmenu-bookmark-dropdown").removeClass("open");
2893 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2894 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2895 openBookMarkDropDown(event);
2899 jQuery(document).keydown(function(event) {
2900 var ostype = "'.$conf->browser->os.
'";
2901 if (ostype === "macintosh") {
2902 if ( event.which === 66 && event.ctrlKey ) {
2903 console.log("Click on control + b : trigger open bookmark dropdown");
2904 openBookMarkDropDown(event);
2907 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2908 console.log("Click on control + shift + b : trigger open bookmark dropdown");
2909 openBookMarkDropDown(event);
2914 var openBookMarkDropDown = function(event) {
2915 event.preventDefault();
2916 jQuery("#topmenu-bookmark-dropdown").toggleClass("open");
2917 jQuery("#top-bookmark-search-input").focus();
2935 global $langs, $conf, $db, $user, $hookmanager;
2940 $arrayresult =
null;
2941 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2945 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2946 if ($conf->browser->name ==
'chrome') {
2947 $stringforfirstkey .=
' ALT +';
2948 } elseif ($conf->browser->name ==
'firefox') {
2949 $stringforfirstkey .=
' ALT + SHIFT +';
2951 $stringforfirstkey .=
' CTL +';
2954 $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">';
2956 $defaultAction =
'';
2957 $buttonList =
'<div class="dropdown-global-search-button-list" >';
2959 foreach ($arrayresult as $keyItem => $item) {
2960 if (empty($defaultAction)) {
2961 $defaultAction = $item[
'url'];
2963 $buttonList .=
'<button class="dropdown-item global-search-item tdoverflowmax300" data-target="'.dol_escape_htmltag($item[
'url']).
'" >';
2964 $buttonList .= $item[
'text'];
2965 $buttonList .=
'</button>';
2967 $buttonList .=
'</div>';
2969 $dropDownHtml =
'<form id="top-menu-action-search" name="actionsearch" method="GET" action="'.$defaultAction.
'">';
2972 <!-- search input -->
2973 <div class="dropdown-header search-dropdown-header">
2979 <!-- Menu Body search -->
2980 <div class="dropdown-body search-dropdown-body">
2985 $dropDownHtml .=
'</form>';
2989 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2990 if ($conf->browser->name ==
'chrome') {
2991 $stringforfirstkey .=
' ALT +';
2992 } elseif ($conf->browser->name ==
'firefox') {
2993 $stringforfirstkey .=
' ALT + SHIFT +';
2995 $stringforfirstkey .=
' CTL +';
2998 $html .=
'<!-- div for Global Search -->
2999 <div id="topmenu-global-search-dropdown" class="atoplogin dropdown inline-block">
3000 <a accesskey="s" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Search').
' ('.$stringforfirstkey.
' s)">
3001 <i class="fa fa-search" ></i>
3003 <div class="dropdown-menu dropdown-search">
3009 <!-- Code to show/hide the user drop-down -->
3011 jQuery(document).ready(function() {
3013 // prevent submiting form on press ENTER
3014 jQuery("#top-global-search-input").keydown(function (e) {
3015 if (e.keyCode == 13) {
3016 var inputs = $(this).parents("form").eq(0).find(":button");
3017 if (inputs[inputs.index(this) + 1] != null) {
3018 inputs[inputs.index(this) + 1].focus();
3026 jQuery(document).keydown(function(e) {
3027 // Get the focused element:
3028 var $focused = $(":focus");
3029 if($focused.length && $focused.hasClass("global-search-item")){
3031 // UP - move to the previous line
3032 if (e.keyCode == 38) {
3034 $focused.prev().focus();
3037 // DOWN - move to the next line
3038 if (e.keyCode == 40) {
3040 $focused.next().focus();
3046 // submit form action
3047 jQuery(".dropdown-global-search-button-list .global-search-item").on("click", function(event) {
3048 jQuery("#top-menu-action-search").attr("action", $(this).data("target"));
3049 jQuery("#top-menu-action-search").submit();
3053 jQuery(document).on("click", function(event) {
3054 if (!$(event.target).closest("#topmenu-global-search-dropdown").length) {
3055 console.log("click close search - we click outside");
3057 jQuery("#topmenu-global-search-dropdown").removeClass("open");
3062 jQuery("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) {
3063 console.log("click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3064 openGlobalSearchDropDown();
3068 jQuery(document).keydown(function(e){
3069 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3070 console.log(\'control + shift + f : trigger open global-search dropdown\');
3071 openGlobalSearchDropDown();
3073 if ( e.which === 70 && e.alKey ) {
3074 console.log(\'alt + f : trigger open global-search dropdown\');
3075 openGlobalSearchDropDown();
3079 var openGlobalSearchDropDown = function() {
3080 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3081 jQuery("#top-global-search-input").focus();
3105function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after =
'', $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3107 global $user, $conf, $langs, $db, $form;
3108 global $hookmanager, $menumanager;
3112 if (!empty($menu_array_before)) {
3113 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);
3116 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3118 $hookmanager->initHooks(array(
'leftblock'));
3120 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3123 if (!is_object($form)) {
3124 $form =
new Form($db);
3127 if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
3129 if ($conf->browser->layout ==
'phone') {
3130 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3134 $arrayresult = array();
3135 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3137 if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3140 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3141 if ($conf->browser->name ==
'chrome') {
3142 $stringforfirstkey .=
' ALT +';
3143 } elseif ($conf->browser->name ==
'firefox') {
3144 $stringforfirstkey .=
' ALT + SHIFT +';
3146 $stringforfirstkey .=
' CTL +';
3149 $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');
3151 if (is_array($arrayresult)) {
3152 foreach ($arrayresult as $key => $val) {
3153 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3159 $parameters = array(
'searchform' => $searchform);
3160 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3161 if (empty($reshook)) {
3162 $searchform .= $hookmanager->resPrint;
3164 $searchform = $hookmanager->resPrint;
3168 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) || empty($conf->use_javascript_ajax)) {
3169 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3170 $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>';
3171 } elseif ($conf->use_javascript_ajax && !empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
3172 $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>';
3173 $searchform .=
'<script>
3174 jQuery(document).ready(function () {
3175 jQuery("#divsearchforms1").click(function(){
3176 jQuery("#divsearchforms2").toggle();
3180 $searchform .=
'</div>';
3184 $searchform .=
'<script>
3185 jQuery(document).keydown(function(e){
3186 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3187 console.log(\'control + shift + f : trigger open global-search dropdown\');
3188 openGlobalSearchDropDown();
3190 if( (e.which === 83 || e.which === 115) && e.altKey ){
3191 console.log(\'alt + s : trigger open global-search dropdown\');
3192 openGlobalSearchDropDown();
3196 var openGlobalSearchDropDown = function() {
3197 jQuery("#searchselectcombo").select2(\'open\');
3203 print
'<!-- Begin left menu -->'.
"\n";
3205 print
'<div class="vmenu"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ?
'' :
' title="Left menu"').
'>'.
"\n\n";
3208 $menumanager->menu_array = $menu_array_before;
3209 $menumanager->menu_array_after = $menu_array_after;
3210 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
3214 print
"<!-- Begin Help Block-->\n";
3215 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3218 if (!empty($conf->global->MAIN_SHOW_VERSION)) {
3219 $doliurl =
'https://www.dolibarr.org';
3221 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3222 $doliurl =
'https://www.dolibarr.fr';
3224 if (preg_match(
'/es/i', $langs->defaultlang)) {
3225 $doliurl =
'https://www.dolibarr.es';
3227 if (preg_match(
'/de/i', $langs->defaultlang)) {
3228 $doliurl =
'https://www.dolibarr.de';
3230 if (preg_match(
'/it/i', $langs->defaultlang)) {
3231 $doliurl =
'https://www.dolibarr.it';
3233 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3234 $doliurl =
'https://www.dolibarr.gr';
3237 $appli = constant(
'DOL_APPLICATION_TITLE');
3238 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
3239 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
3240 if (preg_match(
'/\d\.\d/', $appli)) {
3241 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3242 $appli .=
" (".DOL_VERSION.
")";
3245 $appli .=
" ".DOL_VERSION;
3248 $appli .=
" ".DOL_VERSION;
3250 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3252 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3254 print
'<span class="help">';
3262 print
'</div>'.
"\n";
3266 if (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3267 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3269 if ($conf->global->MAIN_BUGTRACK_ENABLELINK ==
'github') {
3270 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3271 $bugbaseurl .=
'&title=';
3272 $bugbaseurl .= urlencode(
"Bug: ");
3273 $bugbaseurl .=
'&body=';
3274 $bugbaseurl .= urlencode(
"# Instructions\n");
3275 $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");
3276 $bugbaseurl .= urlencode(
"*Please:*\n");
3277 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3278 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3279 $bugbaseurl .= urlencode(
"\n");
3280 $bugbaseurl .= urlencode(
"\n");
3281 $bugbaseurl .= urlencode(
"# Bug\n");
3282 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3283 $bugbaseurl .= urlencode(
"\n");
3284 $bugbaseurl .= urlencode(
"## Environment\n");
3285 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3286 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3287 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3288 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3289 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3290 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3291 $bugbaseurl .= urlencode(
"\n");
3292 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3293 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3294 $bugbaseurl .= urlencode(
"\n");
3295 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3296 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3297 $bugbaseurl .= urlencode(
"\n");
3298 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
3299 $bugbaseurl .= urlencode(
"[*Files*]\n");
3300 $bugbaseurl .= urlencode(
"\n");
3302 $bugbaseurl .= urlencode(
"\n");
3303 $bugbaseurl .= urlencode(
"## Report\n");
3304 } elseif (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
3305 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
3311 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3312 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3313 if (empty($reshook)) {
3314 $bugbaseurl .= $hookmanager->resPrint;
3316 $bugbaseurl = $hookmanager->resPrint;
3319 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3320 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3325 print
"<!-- End Help Block-->\n";
3329 print
"<!-- End left menu -->\n";
3333 $parameters = array();
3334 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3335 print $hookmanager->resPrint;
3337 print
'</div></div> <!-- End side-nav id-left -->';
3341 print
'<!-- Begin right area -->'.
"\n";
3343 if (empty($leftmenuwithoutmainarea)) {
3357 global $conf, $langs, $hookmanager;
3359 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3360 print
'<div id="id-right">';
3365 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3367 $hookmanager->initHooks(array(
'main'));
3368 $parameters = array();
3369 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3370 print $hookmanager->resPrint;
3372 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
3373 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3377 if (!empty($conf->global->SHOW_SOCINFO_ON_PRINT) &&
GETPOST(
'optioncss',
'aZ09') ==
'print' && empty(
GETPOST(
'disable_show_socinfo_on_print',
'az09'))) {
3378 $parameters = array();
3379 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3380 if (empty($reshook)) {
3381 print
'<!-- Begin show mysoc info header -->'.
"\n";
3382 print
'<div id="mysoc-info-header">'.
"\n";
3383 print
'<table class="centpercent div-table-responsive">'.
"\n";
3385 print
'<tr><td rowspan="0" class="width20p">';
3386 if ($conf->global->MAIN_SHOW_LOGO && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($conf->global->MAIN_INFO_SOCIETE_LOGO)) {
3387 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)).
'">';
3389 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3390 print
'<tr><td class="titre bold">'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_NOM).
'</td></tr>'.
"\n";
3391 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";
3392 if (!empty($conf->global->MAIN_INFO_SOCIETE_TEL)) {
3393 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Phone").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TEL).
'</td></tr>';
3395 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
3396 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Email").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL).
'</td></tr>';
3398 if (!empty($conf->global->MAIN_INFO_SOCIETE_WEB)) {
3399 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Web").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_WEB).
'</td></tr>';
3402 print
'</table>'.
"\n";
3403 print
'</div>'.
"\n";
3404 print
'<!-- End show mysoc info header -->'.
"\n";
3423 if (preg_match(
'/^http/i', $helppagename)) {
3425 $helpbaseurl =
'%s';
3426 $helppage = $helppagename;
3431 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3432 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3433 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3434 $helppage = $reg[1];
3437 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3438 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3439 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3440 $helppage = $reg[1];
3443 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3444 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3445 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3446 $helppage = $reg[1];
3449 if (empty($helppage)) {
3450 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3451 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3452 $helppage = $reg[1];
3457 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3477function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3479 global $langs, $user;
3482 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3483 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3484 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3485 if ($showtitlebefore) {
3486 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3488 $ret .=
'<div class="tagtd">';
3489 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3490 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3491 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3492 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3493 $ret .=
' placeholder="'.strip_tags($title).
'"';
3494 $ret .= ($autofocus ?
' autofocus' :
'');
3495 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3496 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3497 $ret .=
'<span class="fa fa-search"></span>';
3498 $ret .=
'</button>';
3500 $ret .=
"</form>\n";
3505if (!function_exists(
"llxFooter")) {
3516 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3518 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager;
3519 global $delayedhtmlcontent;
3520 global $contextpage, $page, $limit, $mode;
3521 global $dolibarr_distrib;
3523 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3527 $parameters = array();
3528 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters, $object, $action);
3529 if (empty($reshook)) {
3530 $llxfooter .= $hookmanager->resPrint;
3531 } elseif ($reshook > 0) {
3532 $llxfooter = $hookmanager->resPrint;
3543 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3545 foreach ($user->lastsearch_values_tmp as $key => $val) {
3546 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3547 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3548 if (empty($val[
'sortfield'])) {
3549 unset($val[
'sortfield']);
3551 if (empty($val[
'sortorder'])) {
3552 unset($val[
'sortorder']);
3554 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3555 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3556 unset($_SESSION[
'lastsearch_values_'.$key]);
3562 $relativepathstring = $_SERVER[
"PHP_SELF"];
3564 if (constant(
'DOL_URL_ROOT')) {
3565 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3567 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3568 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3569 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3570 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3571 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3572 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3573 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3575 if (!empty($contextpage)) {
3576 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3578 if (!empty($page) && $page > 0) {
3579 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3581 if (!empty($limit) && $limit != $conf->liste_limit) {
3582 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3584 if (!empty($mode)) {
3585 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3588 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3589 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3590 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3591 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3595 if (!empty($conf->global->MAIN_CORE_ERROR)) {
3597 if ($conf->use_javascript_ajax) {
3598 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3599 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3602 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3603 print
'<div class="error">'.$msg.
'</div>';
3611 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3613 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3614 print
'</div> <!-- End div id-right -->'.
"\n";
3617 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3618 print
'</div> <!-- End div id-container -->'.
"\n";
3623 print
'<!-- '.$comment.
' -->'.
"\n";
3628 if (!empty($delayedhtmlcontent)) {
3629 print $delayedhtmlcontent;
3632 if (!empty($conf->use_javascript_ajax)) {
3633 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3634 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3638 if (isModEnabled(
'blockedlog') && is_object($object) && !empty($object->id) && $object->id > 0) {
3639 if (in_array($object->element, array(
'facture')) && $object->statut > 0) {
3640 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3643 jQuery(document).ready(
function () {
3644 $(
'a.documentpreview').click(
function() {
3645 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3647 id:<?php echo $object->id; ?>
3648 , element:
'<?php echo $object->element ?>'
3649 , action:
'DOC_PREVIEW'
3650 , token:
'<?php echo currentToken(); ?>'
3654 $(
'a.documentdownload').click(
function() {
3655 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3657 id:<?php echo $object->id; ?>
3658 , element:
'<?php echo $object->element ?>'
3659 , action:
'DOC_DOWNLOAD'
3660 , token:
'<?php echo currentToken(); ?>'
3671 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3672 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3676 $forceping =
GETPOST(
'forceping',
'alpha');
3677 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3679 $hash_unique_id = md5(
'dolibarr'.$conf->file->instance_unique_id);
3681 if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
3682 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && ($conf->global->MAIN_FIRST_PING_OK_ID !=
'disabled'))
3685 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3686 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3687 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3690 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) {
3691 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3693 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3695 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";
3696 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3697 $url_for_ping = (empty($conf->global->MAIN_URL_FOR_PING) ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3699 $distrib =
'standard';
3700 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3701 $distrib =
'doliwamp';
3703 if (!empty($dolibarr_distrib)) {
3704 $distrib = $dolibarr_distrib;
3708 jQuery(document).ready(
function (tmp) {
3709 console.log(
"Try Ping with hash_unique_id is md5('dolibarr'+instance_unique_id)");
3712 url:
"<?php echo $url_for_ping ?>",
3717 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3718 action:
'dolibarrping',
3719 version:
'<?php echo (float) DOL_VERSION; ?>',
3720 entity:
'<?php echo (int) $conf->entity; ?>',
3721 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3722 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3723 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3724 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3725 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3726 token:
'notrequired'
3728 success:
function (data, status, xhr) {
3729 console.log(
"Ping ok");
3732 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3735 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3738 error:
function (data,status,xhr) {
3739 console.log(
"Ping ko: " + data);
3742 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3745 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3755 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3756 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3758 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3763 $parameters = array();
3764 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
3766 print $hookmanager->resPrint;
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.
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).
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)
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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...
conf($dolibarr_main_document_root)
Load conf file (file must exists)
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(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
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.
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
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.
global $dolibarr_main_demo
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.