42 $micro_start_time = 0;
43 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
44 list($usec, $sec) = explode(
" ", microtime());
45 $micro_start_time = ((
float) $usec + (
float) $sec);
48 if (defined(
'XDEBUGCOVERAGE')) {
49 xdebug_start_code_coverage();
63 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
66 if (preg_match(
'/^x/i', $newstringnumentity)) {
67 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
71 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
72 return chr((
int) $newstringnumentity);
75 return '&#'.$matches[1];
96 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
98 $val = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
102 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
103 $val = preg_replace(
'/[\r\n]/',
'', $val);
104 }
while ($oldval != $val);
115 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
118 if ($newval != $val) {
125 if ($type == 1 || $type == 3) {
126 $inj += preg_match(
'/delete\s+from/i', $val);
127 $inj += preg_match(
'/create\s+table/i', $val);
128 $inj += preg_match(
'/insert\s+into/i', $val);
129 $inj += preg_match(
'/select\s+from/i', $val);
130 $inj += preg_match(
'/into\s+(outfile|dumpfile)/i', $val);
131 $inj += preg_match(
'/user\s*\(/i', $val);
132 $inj += preg_match(
'/information_schema/i', $val);
133 $inj += preg_match(
'/<svg/i', $val);
134 $inj += preg_match(
'/update[^&].*set.+=/i', $val);
135 $inj += preg_match(
'/union.+select/i', $val);
138 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s+by|concat|count|from|union/i', $val);
141 $inj += preg_match(
'/updatexml\(/i', $val);
142 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
143 $inj += preg_match(
'/\s@@/', $val);
146 $inj += preg_match(
'/<\/textarea/i', $val);
152 $inj += preg_match(
'/<audio/i', $val);
153 $inj += preg_match(
'/<embed/i', $val);
154 $inj += preg_match(
'/<iframe/i', $val);
155 $inj += preg_match(
'/<object/i', $val);
156 $inj += preg_match(
'/<script/i', $val);
157 $inj += preg_match(
'/Set\.constructor/i', $val);
158 if (!defined(
'NOSTYLECHECK')) {
159 $inj += preg_match(
'/<style/i', $val);
161 $inj += preg_match(
'/base\s+href/si', $val);
162 $inj += preg_match(
'/=data:/si', $val);
164 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)([a-z]*)\s*=/i', $val);
165 $inj += preg_match(
'/on(abort|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $val);
166 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $val);
167 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\s*=/i', $val);
168 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)\s*=/i', $val);
169 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $val);
171 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\s*=/i', $val);
174 $tmpval = preg_replace(
'/<[^<]+>/',
'', $val);
176 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)([a-z]*)\s*=/i', $tmpval);
177 $inj += preg_match(
'/on(abort|afterprint|animation|auxclick|beforecopy|beforecut|beforeprint|beforeunload|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)\s*=/i', $tmpval);
178 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)\s*=/i', $tmpval);
179 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)\s*=/i', $tmpval);
180 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)\s*=/i', $tmpval);
181 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)\s*=/i', $tmpval);
183 $inj += preg_match(
'/on(repeat|begin|finish|beforeinput)\s*=/i', $tmpval);
186 $inj += preg_match(
'/:|:|:/i', $val);
187 $inj += preg_match(
'/javascript\s*:/i', $val);
188 $inj += preg_match(
'/vbscript\s*:/i', $val);
190 if ($type == 1 || $type == 3) {
191 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
192 $inj += preg_match(
'/"/i', $val);
195 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
210 if (is_array($var)) {
211 foreach ($var as $key => $value) {
216 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
217 $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');
220 if (function_exists(
'error_log')) {
221 error_log($errormessage);
235 if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
236 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
239 if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
240 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
245 if (!empty($_SERVER[
"PHP_SELF"])) {
246 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
250 if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
254 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
258 if (!defined(
'NOSCANPOSTFORINJECTION')) {
263 if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
264 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
269 require_once
'filefunc.inc.php';
274 if (!empty($_POST[
"DOL_AUTOSET_COOKIE"])) {
275 $tmpautoset = explode(
':', $_POST[
"DOL_AUTOSET_COOKIE"], 2);
276 $tmplist = explode(
',', $tmpautoset[1]);
277 $cookiearrayvalue = array();
278 foreach ($tmplist as $tmpkey) {
279 $postkey = $tmpautoset[0].
'_'.$tmpkey;
281 if (!empty($_POST[$postkey])) {
282 $cookiearrayvalue[$tmpkey] = $_POST[$postkey];
285 $cookiename = $tmpautoset[0];
286 $cookievalue = json_encode($cookiearrayvalue);
288 if (PHP_VERSION_ID < 70300) {
289 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
292 $cookieparams = array(
293 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
296 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
300 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
302 if (empty($cookievalue)) {
303 unset($_COOKIE[$cookiename]);
309 if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
310 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
316 $prefix = dol_getprefix(
'');
317 $sessionname =
'DOLSESSID_'.$prefix;
318 $sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
319 if (!empty($_COOKIE[$sessiontimeout])) {
320 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
325 if (!defined(
'NOSESSION')) {
326 if (PHP_VERSION_ID < 70300) {
327 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
true);
330 $sessioncookieparams = array(
334 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false :
true),
338 session_set_cookie_params($sessioncookieparams);
340 session_name($sessionname);
347 require_once
'master.inc.php';
350 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
352 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
354 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
356 } elseif (defined(
'NOREQUIREDB')) {
358 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
360 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
364 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
365 print
'Sorry, your application is offline.'.
"\n";
366 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";
367 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
368 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
370 print
'Sorry, your application is offline. Only administrator user "'.$conf->global->MAIN_ONLY_LOGIN_ALLOWED.
'" is allowed to connect for the moment.'.
"\n";
371 $nexturl = DOL_URL_ROOT.
'/';
372 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
380 register_shutdown_function(
'dol_shutdown');
383 if (
isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
385 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
387 $renderer = $debugbar->getRenderer();
388 if (empty($conf->global->MAIN_HTML_HEADER)) {
389 $conf->global->MAIN_HTML_HEADER =
'';
391 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
393 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
397 if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
399 $conf->browser->name = $tmp[
'browsername'];
400 $conf->browser->os = $tmp[
'browseros'];
401 $conf->browser->version = $tmp[
'browserversion'];
402 $conf->browser->layout = $tmp[
'layout'];
405 if ($conf->browser->layout ==
'phone') {
406 $conf->dol_no_mouse_hover = 1;
411 if (
GETPOST(
'theme',
'aZ09')) {
412 $conf->theme =
GETPOST(
'theme',
'aZ09');
413 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
417 if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
418 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
423 if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on')) {
425 if (is_numeric($conf->file->main_force_https)) {
426 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
427 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
428 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
432 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
436 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
441 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
442 header(
"Location: ".$newurl);
445 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);
449 if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
450 $listofip = explode(
',', $dolibarr_main_restrict_ip);
452 foreach ($listofip as $ip) {
454 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
460 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
466 if (!defined(
'NOREQUIREHTML')) {
467 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
469 if (!defined(
'NOREQUIREAJAX')) {
470 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
474 if (!empty($conf->global->MAIN_NOT_INSTALLED) || !empty($conf->global->MAIN_NOT_UPGRADED)) {
475 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
476 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
480 if ((!empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
481 || (empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && !empty($conf->global->MAIN_VERSION_LAST_INSTALL) && ($conf->global->MAIN_VERSION_LAST_INSTALL != DOL_VERSION))) {
482 $versiontocompare = empty($conf->global->MAIN_VERSION_LAST_UPGRADE) ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
483 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
484 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
485 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
486 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
488 if (empty($conf->global->MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE) || $rescomp < 3) {
490 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
491 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
498 if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
500 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
502 if (isset($_SESSION[
'newtoken'])) {
503 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
506 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
508 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
509 $_SESSION[
'newtoken'] = $token;
510 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
518 if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
520 $sensitiveget =
false;
523 if (
GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'file_manager',
'presend',
'presend_addmessage'))) {
524 $sensitiveget =
true;
528 $arrayofactiontoforcetokencheck = array(
530 'doprev',
'donext',
'dvprev',
'dvnext',
534 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
535 $sensitiveget =
true;
537 if (preg_match(
'/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
538 $sensitiveget =
true;
545 $_SERVER[
'REQUEST_METHOD'] ==
'POST' ||
551 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
552 if (
GETPOST(
'uploadform',
'int')) {
553 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
554 $langs->loadLangs(array(
"errors",
"install"));
555 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
556 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
559 http_response_code(403);
560 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
561 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);
562 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";
564 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);
565 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";
566 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";
567 if (!empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
568 print
" instead of ".$conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN;
570 print
" into setup).\n";
577 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
580 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);
583 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings');
585 if (isset($_POST[
'id'])) {
586 $savid = ((int) $_POST[
'id']);
591 unset($_GET[
'confirm']);
592 unset($_GET[
'action']);
593 unset($_GET[
'confirmmassaction']);
594 unset($_GET[
'massaction']);
595 unset($_GET[
'token']);
597 $_POST[
'id'] = ((int) $savid);
606 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
608 if (!empty($_SESSION[
"disablemodules"])) {
609 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal');
611 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
612 foreach ($disabled_modules as $module) {
614 if (empty($conf->$module)) {
615 $conf->$module =
new stdClass();
617 $conf->$module->enabled =
false;
618 foreach ($modulepartkeys as $modulepartkey) {
619 unset($conf->modules_parts[$modulepartkey][$module]);
621 if ($module ==
'fournisseur') {
622 $conf->supplier_order->enabled = 0;
623 $conf->supplier_invoice->enabled = 0;
630 $modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
631 if (is_array($modulepart) && count($modulepart) > 0) {
632 foreach ($conf->modules as $module) {
633 if (in_array($module, $modulepart)) {
634 $conf->modulepart = $module;
644 if (!defined(
'NOLOGIN')) {
648 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
649 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
652 if (empty($dolibarr_main_authentication)) {
653 $dolibarr_main_authentication =
'http,dolibarr';
656 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
657 $dolibarr_auto_user =
'auto';
661 $authmode = explode(
',', $dolibarr_main_authentication);
664 if (!count($authmode)) {
665 $langs->load(
'main');
666 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
673 $resultFetchUser =
'';
675 if (!isset($_SESSION[
"dol_login"])) {
677 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
679 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
680 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
681 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
682 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
683 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
684 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
685 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
686 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
687 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
688 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
692 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
693 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
694 dol_syslog(
"Call index page from another url than demo page (call is done from page ".$_SERVER[
'HTTP_REFERER'].
")");
696 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
697 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
698 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
699 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
700 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
701 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
702 header(
"Location: ".$url);
709 $hookmanager->initHooks(array(
'login'));
710 $parameters = array();
711 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
718 if ($test &&
GETPOST(
"username",
"alpha", 2) && !empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA) && !isset($_SESSION[
'dol_bypass_antispam'])) {
719 $sessionkey =
'dol_antispam_value';
720 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
724 dol_syslog(
'Bad value for code, connexion refused');
726 $langs->loadLangs(array(
'main',
'errors'));
728 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
732 $user->trigger_mesg =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
735 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
743 $hookmanager->initHooks(array(
'login'));
744 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
745 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
754 $allowedmethodtopostusername = 2;
755 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
756 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
758 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_\-]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
759 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
760 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
763 $goontestloop =
false;
764 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
765 $goontestloop =
true;
767 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
768 $goontestloop =
true;
770 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername) || !empty($_COOKIE[
'login_dolibarr']) ||
GETPOST(
'openid_mode',
'alpha', 1)) {
771 $goontestloop =
true;
774 if (!is_object($langs)) {
775 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
777 $langcode = (
GETPOST(
'lang',
'aZ09', 1) ?
GETPOST(
'lang',
'aZ09', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ?
'auto' : $conf->global->MAIN_LANG_DEFAULT));
778 if (defined(
'MAIN_LANG_DEFAULT')) {
779 $langcode = constant(
'MAIN_LANG_DEFAULT');
781 $langs->setDefaultLang($langcode);
788 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
790 if ($login ===
'--bad-login-validity--') {
797 $dol_authmode = $conf->authmode;
798 $dol_tz = $_POST[
"tz"];
799 $dol_tz_string = $_POST[
"tz_string"];
800 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
801 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
802 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
805 if (isset($_POST[
"dst_first"]) && isset($_POST[
"dst_second"])) {
806 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
810 if ($datenow >= $datefirst && $datenow < $datesecond) {
818 dol_syslog(
'Bad password, connexion refused', LOG_DEBUG);
820 $langs->loadLangs(array(
'main',
'errors'));
824 if (empty($_SESSION[
"dol_loginmesg"])) {
825 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
829 $user->trigger_mesg = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
832 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
840 $hookmanager->initHooks(array(
'login'));
841 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
842 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
852 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
854 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_INFO);
855 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
856 return 'ERROR_NOT_LOGGED';
858 if ($_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
859 http_response_code(401);
861 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
866 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
867 if ($resultFetchUser <= 0) {
868 dol_syslog(
'User not found, connexion refused');
870 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
871 session_name($sessionname);
874 if ($resultFetchUser == 0) {
876 $langs->loadLangs(array(
'main',
'errors'));
878 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
880 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
882 if ($resultFetchUser < 0) {
883 $_SESSION[
"dol_loginmesg"] = $user->error;
885 $user->trigger_mesg = $user->error;
889 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
898 $hookmanager->initHooks(array(
'login'));
899 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
900 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
905 $paramsurl = array();
906 if (
GETPOST(
'textbrowser',
'int')) {
907 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
910 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
913 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
915 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
919 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
920 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
925 $login = $_SESSION[
"dol_login"];
926 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
927 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
929 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
930 if ($resultFetchUser <= 0) {
932 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
934 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false :
true),
true);
935 session_name($sessionname);
938 if ($resultFetchUser == 0) {
940 $langs->loadLangs(array(
'main',
'errors'));
942 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
944 $user->trigger_mesg =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
946 if ($resultFetchUser < 0) {
947 $_SESSION[
"dol_loginmesg"] = $user->error;
949 $user->trigger_mesg = $user->error;
953 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
961 $hookmanager->initHooks(array(
'login'));
962 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
963 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
968 $paramsurl = array();
969 if (
GETPOST(
'textbrowser',
'int')) {
970 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
973 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
976 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
978 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
982 $hookmanager->initHooks(array(
'main'));
985 if (!empty($_GET[
'save_lastsearch_values'])) {
986 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
987 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
989 if (constant(
'DOL_URL_ROOT')) {
990 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
992 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
993 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
997 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
998 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
999 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1001 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1002 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1003 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1005 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1006 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1007 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1009 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1010 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1011 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1013 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1014 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1015 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1020 $reshook = $hookmanager->executeHooks(
'updateSession', array(), $user, $action);
1029 if (!isset($_SESSION[
"dol_login"])) {
1034 $_SESSION[
"dol_login"] = $user->login;
1035 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1036 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1037 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1038 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1039 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1040 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1041 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1042 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1043 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1045 $_SESSION[
"dol_entity"] = $conf->entity;
1047 if (!empty($dol_hide_topmenu)) {
1048 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1050 if (!empty($dol_hide_leftmenu)) {
1051 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1053 if (!empty($dol_optimize_smallscreen)) {
1054 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1056 if (!empty($dol_no_mouse_hover)) {
1057 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1059 if (!empty($dol_use_jmobile)) {
1060 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1063 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1067 $user->update_last_login_date();
1069 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1072 $user->trigger_mesg = $loginfo;
1075 $result = $user->call_trigger(
'USER_LOGIN', $user);
1083 $hookmanager->initHooks(array(
'login'));
1084 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1085 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1093 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1100 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (empty($conf->global->MAIN_LANDING_PAGE) ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->conf->MAIN_LANDING_PAGE);
1101 if (!empty($landingpage)) {
1103 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1104 header(
'Location: '.$newpath);
1113 $user->rights->user->user->lire = 1;
1114 $user->rights->user->user->creer = 1;
1115 $user->rights->user->user->password = 1;
1116 $user->rights->user->user->supprimer = 1;
1117 $user->rights->user->self->creer = 1;
1118 $user->rights->user->self->password = 1;
1121 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1122 if (empty($user->rights->user->user_advance)) {
1123 $user->rights->user->user_advance =
new stdClass();
1125 if (empty($user->rights->user->self_advance)) {
1126 $user->rights->user->self_advance =
new stdClass();
1128 if (empty($user->rights->user->group_advance)) {
1129 $user->rights->user->group_advance =
new stdClass();
1132 $user->rights->user->user_advance->readperms = 1;
1133 $user->rights->user->user_advance->write = 1;
1134 $user->rights->user->self_advance->readperms = 1;
1135 $user->rights->user->self_advance->writeperms = 1;
1136 $user->rights->user->group_advance->read = 1;
1137 $user->rights->user->group_advance->readperms = 1;
1138 $user->rights->user->group_advance->write = 1;
1139 $user->rights->user->group_advance->delete = 1;
1148 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1149 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1151 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1152 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1156 if (empty($conf->global->MAIN_FORCETHEME) && !empty($user->conf->MAIN_THEME)) {
1157 $conf->theme = $user->conf->MAIN_THEME;
1158 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1162 if (!empty($user) && method_exists($user,
'loadDefaultValues')) {
1163 $user->loadDefaultValues();
1169 if (
GETPOST(
'theme',
'aZ09')) {
1170 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1171 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1176 $conf->use_javascript_ajax = 0;
1178 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1179 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1184 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1185 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1189 $conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1192 if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1193 $conf->dol_hide_leftmenu = 1;
1195 if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1196 $conf->dol_hide_topmenu = 1;
1198 if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1199 $conf->dol_optimize_smallscreen = 1;
1201 if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1202 $conf->dol_no_mouse_hover = 1;
1204 if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1205 $conf->dol_use_jmobile = 1;
1207 if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1208 $conf->dol_no_mouse_hover = 1;
1210 if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1211 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1212 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400)
1214 $conf->dol_optimize_smallscreen = 1;
1217 if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1218 $conf->theme =
'eldy';
1219 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1222 if (!defined(
'NOREQUIRETRAN')) {
1223 if (!
GETPOST(
'lang',
'aZ09')) {
1225 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1228 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1229 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1235 if (!defined(
'NOLOGIN')) {
1238 if (!$user->login) {
1243 if ($user->statut < 1) {
1245 $langs->loadLangs(array(
"errors",
"other"));
1246 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1255 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
' - action='.
GETPOST(
'action',
'aZ09').
', massaction='.
GETPOST(
'massaction',
'aZ09').(defined(
'NOTOKENRENEWAL') ?
' NOTOKENRENEWAL='.constant(
'NOTOKENRENEWAL') :
''), LOG_NOTICE);
1260 if (!defined(
'NOREQUIRETRAN')) {
1262 $langs->loadLangs(array(
'main',
'dict'));
1266 $bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1267 $bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1268 $bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1269 $bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1272 $mesg =
''; $warning =
''; $error = 0;
1274 $mesgs = array(); $warnings = array(); $errors = array();
1277 if (empty($conf->browser->firefox)) {
1278 define(
'ROWS_1', 1);
1279 define(
'ROWS_2', 2);
1280 define(
'ROWS_3', 3);
1281 define(
'ROWS_4', 4);
1282 define(
'ROWS_5', 5);
1283 define(
'ROWS_6', 6);
1284 define(
'ROWS_7', 7);
1285 define(
'ROWS_8', 8);
1286 define(
'ROWS_9', 9);
1288 define(
'ROWS_1', 0);
1289 define(
'ROWS_2', 1);
1290 define(
'ROWS_3', 2);
1291 define(
'ROWS_4', 3);
1292 define(
'ROWS_5', 4);
1293 define(
'ROWS_6', 5);
1294 define(
'ROWS_7', 6);
1295 define(
'ROWS_8', 7);
1296 define(
'ROWS_9', 8);
1299 $heightforframes = 50;
1302 if (!defined(
'NOREQUIREMENU')) {
1303 if (empty($user->socid)) {
1304 $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);
1307 $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);
1311 $file_menu = $conf->standard_menu;
1312 if (
GETPOST(
'menu',
'alpha')) {
1313 $file_menu =
GETPOST(
'menu',
'alpha');
1315 if (!class_exists(
'MenuManager')) {
1317 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1318 foreach ($dirmenus as $dirmenu) {
1320 if (class_exists(
'MenuManager')) {
1324 if (!class_exists(
'MenuManager')) {
1325 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1326 $file_menu =
'eldy_menu.php';
1327 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1330 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1331 $menumanager->loadMenu();
1338 if (!function_exists(
"llxHeader")) {
1359 function llxHeader($head =
'', $title =
'',
$help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1364 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1366 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1368 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1370 if ($mainmenu !=
'website') {
1371 $tmpcsstouse = $morecssonbody;
1375 if (!empty($conf->global->MAIN_OPTIMIZEFORCOLORBLIND)) {
1376 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1379 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1382 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1383 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring,
$help_url);
1386 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1391 if ($replacemainareaby) {
1392 print $replacemainareaby;
1409 global $db, $conf, $hookmanager;
1411 if ($contenttype ==
'text/html') {
1412 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1414 header(
"Content-Type: ".$contenttype);
1418 header(
"X-Content-Type-Options: nosniff");
1419 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1420 header(
"X-Frame-Options: SAMEORIGIN");
1422 header(
"X-Frame-Options: ALLOWALL");
1425 if (!defined(
'FORCECSP')) {
1432 $contentsecuritypolicy = empty($conf->global->MAIN_HTTP_CONTENT_SECURITY_POLICY) ?
'' : $conf->global->MAIN_HTTP_CONTENT_SECURITY_POLICY;
1434 if (!is_object($hookmanager)) {
1435 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1438 $hookmanager->initHooks(array(
"main"));
1440 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy);
1441 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1443 $contentsecuritypolicy = $hookmanager->resPrint;
1445 $contentsecuritypolicy .= $hookmanager->resPrint;
1448 if (!empty($contentsecuritypolicy)) {
1457 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1459 } elseif (constant(
'FORCECSP')) {
1460 header(
"Content-Security-Policy: ".constant(
'FORCECSP'));
1462 if ($forcenocache) {
1463 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1482 function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1484 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1488 if (empty($conf->css)) {
1489 $conf->css =
'/theme/eldy/style.css.php';
1492 print
'<!doctype html>'.
"\n";
1494 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1497 if (empty($disablehead)) {
1498 if (!is_object($hookmanager)) {
1501 $hookmanager->initHooks(array(
"main"));
1503 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
1507 if (
GETPOST(
'dol_basehref',
'alpha')) {
1508 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1512 print
'<meta charset="utf-8">'.
"\n";
1513 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1514 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1515 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1517 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1520 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1521 if (!empty($mysoc->logo_squarred_mini)) {
1522 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1524 if (!empty($conf->global->MAIN_FAVICON_URL)) {
1525 $favicon = $conf->global->MAIN_FAVICON_URL;
1527 if (empty($conf->dol_use_jmobile)) {
1528 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1536 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1537 if (!empty($manifest)) {
1538 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1541 if (!empty($conf->global->THEME_ELDY_TOPMENU_BACK1)) {
1543 print
'<meta name="theme-color" content="rgb('.$conf->global->THEME_ELDY_TOPMENU_BACK1.
')">'.
"\n";
1547 if (
GETPOST(
'autorefresh',
'int') > 0) {
1548 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1552 $appli = constant(
'DOL_APPLICATION_TITLE');
1553 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1554 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1559 if ($title && !empty($conf->global->MAIN_HTML_TITLE) && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1567 $parameters = array(
'title'=>$titletoshow);
1568 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1570 $titletoshow = $hookmanager->resPrint;
1572 $titletoshow .= $hookmanager->resPrint;
1580 if (
GETPOST(
'version',
'int')) {
1581 $ext =
'version='.GETPOST(
'version',
'int');
1584 if (
GETPOST(
'dol_resetcache')) {
1585 dolibarr_set_const($db,
"MAIN_IHM_PARAMS_REV", ((
int) $conf->global->MAIN_IHM_PARAMS_REV) + 1,
'chaine', 0,
'', $conf->entity);
1588 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').
'&userid='.$user->id.
'&entity='.$conf->entity;
1590 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1592 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1595 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1598 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1601 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1604 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1607 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1610 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1613 if (!empty($conf->global->MAIN_ENABLE_FONT_ROBOTO)) {
1614 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1615 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1618 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1619 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1620 $jquerytheme =
'base';
1621 if (!empty($conf->global->MAIN_USE_JQUERY_THEME)) {
1622 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1624 if (constant(
'JS_JQUERY_UI')) {
1625 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1627 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1629 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1630 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1632 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1633 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1634 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1638 if (!defined(
'DISABLE_FONT_AWSOME')) {
1639 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1640 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1641 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/common/fontawesome-5/css/v4-shims.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1644 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1648 if (!empty($conf->modules_parts[
'theme'])) {
1649 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1652 $themesubdir = $reldir;
1659 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1660 if (!empty($conf->global->MAIN_FIX_FLASH_ON_CHROME)) {
1661 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";
1665 if (!empty($conf->modules_parts[
'css'])) {
1666 $arraycss = (array) $conf->modules_parts[
'css'];
1667 foreach ($arraycss as $modcss => $filescss) {
1668 $filescss = (array) $filescss;
1669 foreach ($filescss as $cssfile) {
1670 if (empty($cssfile)) {
1671 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1675 if ($urlforcss && $urlforcss !=
'/') {
1676 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1678 if (!preg_match(
'/\.css$/i', $cssfile)) {
1683 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1689 if (is_array($arrayofcss)) {
1690 foreach ($arrayofcss as $cssfile) {
1691 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1692 $urltofile = $cssfile;
1696 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1698 if (!preg_match(
'/\.css$/i', $cssfile)) {
1706 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1708 print
'<!-- Includes JS for JQuery -->'.
"\n";
1709 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1710 print
'<script src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1712 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1714 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1715 print
'<script src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1717 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1720 if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1721 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1724 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1725 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1728 if (empty($disableforlogin) && (empty($conf->global->MAIN_JS_GRAPH) || $conf->global->MAIN_JS_GRAPH ==
'chart') && !defined(
'DISABLE_JS_GRAPH')) {
1729 print
'<script src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1733 if (!empty($conf->global->MAIN_USE_JQUERY_JEDITABLE) && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1734 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1735 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1736 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1737 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1738 print
'<script>'.
"\n";
1739 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1740 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1741 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1742 print 'var placeholderInPlace = \
' \';'.
"\n";
1743 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1744 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1745 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1746 print
'var withInPlace = 300;';
1747 print
'</script>'.
"\n";
1748 print
'<script src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1749 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1752 if (!empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
1753 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1754 print
'<script src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1756 if (!defined(
'DISABLE_SELECT2') && (!empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1758 $tmpplugin = empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1759 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1761 if (!defined(
'DISABLE_MULTISELECT')) {
1762 print
'<script src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1766 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
1768 if (empty($disableforlogin) && (
isModEnabled(
'fckeditor') && (empty($conf->global->FCKEDITOR_EDITORNAME) || $conf->global->FCKEDITOR_EDITORNAME ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
1769 print
'<!-- Includes JS for CKEditor -->'.
"\n";
1770 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
1771 $jsckeditor =
'ckeditor.js';
1772 if (constant(
'JS_CKEDITOR')) {
1774 $pathckeditor = constant(
'JS_CKEDITOR');
1777 print
'/* enable ckeditor by main.inc.php */';
1778 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
1779 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
1780 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
1781 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";
1782 print
'</script>'.
"\n";
1783 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1785 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
1786 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
1788 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
1790 print
'</script>'.
"\n";
1794 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
1795 $enablebrowsernotif =
false;
1796 if (
isModEnabled(
'agenda') && !empty($conf->global->AGENDA_REMINDER_BROWSER)) {
1797 $enablebrowsernotif =
true;
1799 if ($conf->browser->layout ==
'phone') {
1800 $enablebrowsernotif =
false;
1802 if ($enablebrowsernotif) {
1803 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
1804 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1809 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
1810 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
1813 if (!empty($conf->modules_parts[
'js'])) {
1814 $arrayjs = (array) $conf->modules_parts[
'js'];
1815 foreach ($arrayjs as $modjs => $filesjs) {
1816 $filesjs = (array) $filesjs;
1817 foreach ($filesjs as $jsfile) {
1820 if ($urlforjs && $urlforjs !=
'/') {
1821 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n".
'<script src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1823 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
1829 if (is_array($arrayofjs)) {
1830 print
'<!-- Includes JS added by page -->'.
"\n";
1831 foreach ($arrayofjs as $jsfile) {
1832 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
1833 print
'<script src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1835 print
'<script src="'.dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
1842 if (!empty($conf->global->ALLOW_THEME_JS)) {
1843 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
1844 if (file_exists($theme_js)) {
1845 print
'<script src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1849 if (!empty($head)) {
1852 if (!empty($conf->global->MAIN_HTML_HEADER)) {
1853 print $conf->global->MAIN_HTML_HEADER.
"\n";
1856 $parameters = array();
1857 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
1858 print $hookmanager->resPrint;
1860 print
"</head>\n\n";
1863 $conf->headerdone = 1;
1883 function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $helppagename =
'')
1885 global $user, $conf, $langs, $db;
1886 global $dolibarr_main_authentication, $dolibarr_main_demo;
1887 global $hookmanager, $menumanager;
1892 $hookmanager->initHooks(array(
'toprightmenu'));
1897 if (empty($conf->headerdone)) {
1898 $disablenofollow = 0;
1899 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
1900 print
'<body id="mainbody">';
1906 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
1908 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
1912 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
1914 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
1917 print
'<div id="tmenu_tooltip'.(empty($conf->global->MAIN_MENU_INVERT) ?
'' :
'invert').
'" class="tmenu">'.
"\n";
1918 $menumanager->atarget = $target;
1919 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
1923 $appli = constant(
'DOL_APPLICATION_TITLE');
1924 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1925 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1926 if (preg_match(
'/\d\.\d/', $appli)) {
1927 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
1928 $appli .=
" (".DOL_VERSION.
")";
1931 $appli .=
" ".DOL_VERSION;
1934 $appli .=
" ".DOL_VERSION;
1938 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
1942 $logouthtmltext =
'';
1943 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1945 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
1946 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
1948 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
1949 $logouttext .=
img_picto($langs->trans(
'Logout'),
'sign-out',
'',
false, 0, 0,
'',
'atoplogin');
1950 $logouttext .=
'</a>';
1952 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
1953 $logouttext .=
img_picto($langs->trans(
'Logout'),
'sign-out',
'',
false, 0, 0,
'',
'atoplogin opacitymedium');
1957 print
'<div class="login_block usedropdown">'.
"\n";
1959 $toprightmenu .=
'<div class="login_block_other">';
1962 $parameters = array();
1963 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
1964 if (is_numeric($result)) {
1966 $toprightmenu .= $hookmanager->resPrint;
1968 $toprightmenu = $hookmanager->resPrint;
1971 $toprightmenu .= $result;
1976 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
1978 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
1980 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
1984 if (empty($conf->global->MAIN_PRINT_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1987 if (isset($_POST) && is_array($_POST)) {
1988 foreach ($_POST as $key => $value) {
1989 if ($key !==
'action' && $key !==
'password' && !is_array($value)) {
1990 $qs .=
'&'.$key.
'='.urlencode($value);
1994 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
1995 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
1997 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
1999 $toprightmenu .=
$form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2003 if (empty($conf->global->MAIN_HELP_DISABLELINK) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2004 $langs->load(
"help");
2011 if (empty($helppagename)) {
2012 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios';
2014 $helppresent =
'helppresent';
2019 $helpbaseurl = $arrayres[
'helpbaseurl'];
2020 $helppage = $arrayres[
'helppage'];
2021 $mode = $arrayres[
'mode'];
2024 if ($helpbaseurl && $helppage) {
2026 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2027 if ($mode ==
'wiki') {
2028 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2030 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2032 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2035 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2036 if ($mode ==
'wiki') {
2037 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2039 $text .= sprintf($helpbaseurl, $helppage);
2042 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2043 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2045 $toprightmenu .=
$form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2049 if (!empty($conf->global->MAIN_SHOWDATABASENAMEINHELPPAGESLINK)) {
2050 $langs->load(
'admin');
2051 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2055 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2056 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2057 $toprightmenu .=
$form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2061 $toprightmenu .=
$form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2063 $toprightmenu .=
'</div>';
2067 $toprightmenu .=
'<div class="login_block_user">';
2071 $toprightmenu .=
'<div class="inline-block nowrap"><div class="inline-block login_block_elem login_block_elem_name" style="padding: 0px;">';
2073 if (!empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2078 if (!empty($conf->global->MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN)) {
2089 $toprightmenu .=
'</div></div>';
2091 $toprightmenu .=
'</div>'.
"\n";
2094 print $toprightmenu;
2101 print
'<div style="clear: both;"></div>';
2102 print
"<!-- End top horizontal menu -->\n\n";
2105 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2106 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2120 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2121 global $dolibarr_main_authentication, $dolibarr_main_demo;
2122 global $menumanager;
2124 $langs->load(
'companies');
2126 $userImage = $userDropDownImage =
'';
2127 if (!empty($user->photo)) {
2128 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2129 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2131 $nophoto =
'/public/theme/common/user_anonymous.png';
2132 if ($user->gender ==
'man') {
2133 $nophoto =
'/public/theme/common/user_man.png';
2135 if ($user->gender ==
'woman') {
2136 $nophoto =
'/public/theme/common/user_woman.png';
2139 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2140 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2144 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2145 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2147 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2150 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2153 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2156 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2159 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2162 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2166 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2168 $dropdownBody .=
'</div>';
2170 $dropdownBody .=
'<br>';
2171 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2172 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2175 if (!empty($user->admin)) {
2176 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2178 if (!empty($user->socid)) {
2179 $thirdpartystatic =
new Societe($db);
2180 $thirdpartystatic->fetch($user->socid);
2181 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2182 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2184 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2185 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2186 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2187 $dropdownBody .=
'<br>';
2189 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2190 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2191 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2192 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2194 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2195 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2196 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2197 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2198 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2200 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2202 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2203 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2204 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2209 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')';
2210 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2211 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2212 if ($conf->browser->layout ==
'phone') {
2213 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2215 if (!empty($_SESSION[
"disablemodules"])) {
2216 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2218 $dropdownBody .=
'</div>';
2221 $parameters = array(
'user'=>$user,
'langs' => $langs);
2222 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2223 if (is_numeric($result)) {
2225 $dropdownBody .= $hookmanager->resPrint;
2227 $dropdownBody = $hookmanager->resPrint;
2231 if (empty($urllogout)) {
2232 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2234 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" ><i class="fa fa-sign-out-alt"></i> '.$langs->trans(
"Logout").
'</a>';
2235 $profilLink =
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="button-top-menu-dropdown" ><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2238 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2240 if (!empty($user->admin)) {
2241 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2245 $appli = constant(
'DOL_APPLICATION_TITLE');
2246 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2247 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2248 if (preg_match(
'/\d\.\d/', $appli)) {
2249 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2250 $appli .=
" (".DOL_VERSION.
")";
2253 $appli .=
" ".DOL_VERSION;
2256 $appli .=
" ".DOL_VERSION;
2259 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2260 $btnUser =
'<!-- div for user link -->
2261 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2262 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a" data-toggle="dropdown">
2263 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2265 <div class="dropdown-menu">
2267 <div class="user-header">
2268 '.$userDropDownImage.
'
2270 '.$profilName.
'<br>';
2271 if ($user->datelastlogin) {
2272 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2273 if ($user->datepreviouslogin) {
2274 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2277 $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>';
2278 if ($user->datepreviouslogin) {
2279 $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>';
2288 <div class="user-body">'.$dropdownBody.
'</div>
2291 <div class="user-footer">
2292 <div class="pull-left">
2295 <div class="pull-right">
2298 <div style="clear:both;"></div>
2304 $btnUser =
'<!-- div for user link -->
2305 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2306 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'">
2308 <span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone">'.
dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>
2313 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2315 <!-- Code to show/hide the user drop-down -->
2317 $( document ).ready(function() {
2318 $(document).on("click", function(event) {
2319 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2320 //console.log("close login dropdown");
2322 $("#topmenu-login-dropdown").removeClass("open");
2327 if ($conf->theme !=
'md') {
2329 $("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2330 console.log("toggle login dropdown");
2331 event.preventDefault();
2332 $("#topmenu-login-dropdown").toggleClass("open");
2335 $("#topmenulogincompanyinfo-btn").on("click", function() {
2336 console.log("Clik on topmenulogincompanyinfo-btn");
2337 $("#topmenulogincompanyinfo").slideToggle();
2340 $("#topmenuloginmoreinfo-btn").on("click", function() {
2341 console.log("Clik on topmenuloginmoreinfo-btn");
2342 $("#topmenuloginmoreinfo").slideToggle();
2366 $html .=
'<!-- div for quick add link -->
2367 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2368 <a class="dropdown-toggle login-dropdown-a" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$langs->trans(
'QuickAddMenuShortCut').
')"><i class="fa fa-plus-circle"></i></a>
2372 <!-- Code to show/hide the user drop-down -->
2374 $( document ).ready(function() {
2375 $(document).on("click", function(event) {
2376 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2378 $("#topmenu-quickadd-dropdown").removeClass("open");
2381 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2382 openQuickAddDropDown();
2385 $(document).keydown(function(e){
2386 if( e.which === 76 && e.ctrlKey && e.shiftKey ){
2387 console.log(\'control + shift + l : trigger open quick add dropdown\');
2388 openQuickAddDropDown();
2393 var openQuickAddDropDown = function() {
2394 event.preventDefault();
2395 $("#topmenu-quickadd-dropdown").toggleClass("open");
2396 //$("#top-quickadd-search-input").focus();
2411 global $conf, $user, $langs, $hookmanager;
2416 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2417 "title" =>
"MenuNewMember@members",
2418 "name" =>
"Adherent@members",
2419 "picto" =>
"object_member",
2420 "activation" => !empty($conf->adherent->enabled) && $user->rights->adherent->creer,
2424 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2425 "title" =>
"MenuNewThirdParty@companies",
2426 "name" =>
"ThirdParty@companies",
2427 "picto" =>
"object_company",
2428 "activation" => !empty($conf->societe->enabled) && $user->rights->societe->creer,
2432 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2433 "title" =>
"NewContactAddress@companies",
2434 "name" =>
"Contact@companies",
2435 "picto" =>
"object_contact",
2436 "activation" => !empty($conf->societe->enabled) && $user->rights->societe->contact->creer,
2440 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2441 "title" =>
"NewPropal@propal",
2442 "name" =>
"Proposal@propal",
2443 "picto" =>
"object_propal",
2444 "activation" => !empty($conf->propal->enabled) && $user->rights->propale->creer,
2449 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2450 "title" =>
"NewOrder@orders",
2451 "name" =>
"Order@orders",
2452 "picto" =>
"object_order",
2453 "activation" => !empty($conf->commande->enabled) && $user->rights->commande->creer,
2457 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2458 "title" =>
"NewBill@bills",
2459 "name" =>
"Bill@bills",
2460 "picto" =>
"object_bill",
2461 "activation" =>
isModEnabled(
'facture') && $user->rights->facture->creer,
2465 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2466 "title" =>
"NewContractSubscription@contracts",
2467 "name" =>
"Contract@contracts",
2468 "picto" =>
"object_contract",
2469 "activation" => !empty($conf->contrat->enabled) && $user->rights->contrat->creer,
2473 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2474 "title" =>
"SupplierProposalNew@supplier_proposal",
2475 "name" =>
"SupplierProposal@supplier_proposal",
2476 "picto" =>
"supplier_proposal",
2477 "activation" => !empty($conf->supplier_proposal->enabled) && $user->rights->supplier_proposal->creer,
2481 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2482 "title" =>
"NewSupplierOrderShort@orders",
2483 "name" =>
"SupplierOrder@orders",
2484 "picto" =>
"supplier_order",
2485 "activation" => (!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->rights->fournisseur->commande->creer) || (!empty($conf->supplier_order->enabled) && $user->rights->supplier_order->creer),
2489 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2490 "title" =>
"NewBill@bills",
2491 "name" =>
"SupplierBill@bills",
2492 "picto" =>
"supplier_invoice",
2493 "activation" => (!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->rights->fournisseur->facture->creer) || (!empty($conf->supplier_invoice->enabled) && $user->rights->supplier_invoice->creer),
2497 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2498 "title" =>
"NewProduct@products",
2499 "name" =>
"Product@products",
2500 "picto" =>
"object_product",
2501 "activation" => !empty($conf->product->enabled) && $user->rights->produit->creer,
2505 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2506 "title" =>
"NewService@products",
2507 "name" =>
"Service@products",
2508 "picto" =>
"object_service",
2509 "activation" => !empty($conf->service->enabled) && $user->rights->service->creer,
2513 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2514 "title" =>
"AddUser@users",
2515 "name" =>
"User@users",
2517 "activation" => $user->rights->user->user->creer,
2523 $dropDownQuickAddHtml =
'';
2526 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2527 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2530 $parameters = array();
2531 $hook_items = $items;
2532 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2533 if (is_numeric($reshook) && !empty($hookmanager->results) && is_array($hookmanager->results)) {
2534 if ($reshook == 0) {
2535 $items[
'items'] = array_merge($items[
'items'], $hookmanager->results);
2537 $items = $hookmanager->results;
2541 $position = array();
2542 foreach ($items[
'items'] as $key => $row) {
2543 $position[$key] = $row[
'position'];
2545 $array1_sort_order = SORT_ASC;
2546 array_multisort($position, $array1_sort_order, $items[
'items']);
2549 foreach ($items[
'items'] as $item) {
2550 if (!$item[
'activation']) {
2553 $langs->load(explode(
'@', $item[
'title'])[1]);
2554 $langs->load(explode(
'@', $item[
'name'])[1]);
2555 $dropDownQuickAddHtml .=
'
2556 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2557 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2561 $dropDownQuickAddHtml .=
'</div>';
2562 $dropDownQuickAddHtml .=
'</div>';
2564 return $dropDownQuickAddHtml;
2574 global $langs, $conf, $db, $user;
2579 if (empty($conf->bookmark->enabled) || empty($user->rights->bookmark->lire)) {
2583 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2584 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2585 $langs->load(
"bookmarks");
2587 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2588 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2592 $html .=
'<!-- div for bookmark link -->
2593 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2594 <a class="dropdown-toggle login-dropdown-a" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.$langs->trans(
'BookmarksMenuShortCut').
')"><i class="fa fa-star"></i></a>
2595 <div class="dropdown-menu">
2601 <!-- Code to show/hide the bookmark drop-down -->
2603 $( document ).ready(function() {
2604 $(document).on("click", function(event) {
2605 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2606 //console.log("close bookmark dropdown - we click outside");
2608 $("#topmenu-bookmark-dropdown").removeClass("open");
2612 $("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2613 console.log("toggle bookmark dropdown");
2614 openBookMarkDropDown();
2618 $(document).keydown(function(e){
2619 if( e.which === 77 && e.ctrlKey && e.shiftKey ){
2620 console.log(\'control + shift + m : trigger open bookmark dropdown\');
2621 openBookMarkDropDown();
2626 var openBookMarkDropDown = function() {
2627 event.preventDefault();
2628 $("#topmenu-bookmark-dropdown").toggleClass("open");
2629 $("#top-bookmark-search-input").focus();
2647 global $langs, $conf, $db, $user, $hookmanager;
2652 $arrayresult =
null;
2653 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2655 $defaultAction =
'';
2656 $buttonList =
'<div class="dropdown-global-search-button-list" >';
2658 foreach ($arrayresult as $keyItem => $item) {
2659 if (empty($defaultAction)) {
2660 $defaultAction = $item[
'url'];
2662 $buttonList .=
'<button class="dropdown-item global-search-item" data-target="'.dol_escape_htmltag($item[
'url']).
'" >';
2663 $buttonList .= $item[
'text'];
2664 $buttonList .=
'</button>';
2666 $buttonList .=
'</div>';
2669 $searchInput =
'<input name="sall" id="top-global-search-input" class="dropdown-search-input" placeholder="'.$langs->trans(
'Search').
'" autocomplete="off" >';
2671 $dropDownHtml =
'<form id="top-menu-action-search" name="actionsearch" method="GET" action="'.$defaultAction.
'" >';
2674 <!-- search input -->
2675 <div class="dropdown-header search-dropdown-header">
2682 <div class="dropdown-body search-dropdown-body">
2687 $dropDownHtml .=
'</form>';
2690 $html .=
'<!-- div for Global Search -->
2691 <div id="topmenu-global-search-dropdown" class="atoplogin dropdown inline-block">
2692 <a class="dropdown-toggle login-dropdown-a" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Search').
' ('.$langs->trans(
'SearchMenuShortCut').
')">
2693 <i class="fa fa-search" ></i>
2695 <div class="dropdown-menu dropdown-search">
2701 <!-- Code to show/hide the user drop-down -->
2703 $( document ).ready(function() {
2705 // prevent submiting form on press ENTER
2706 $("#top-global-search-input").keydown(function (e) {
2707 if (e.keyCode == 13) {
2708 var inputs = $(this).parents("form").eq(0).find(":button");
2709 if (inputs[inputs.index(this) + 1] != null) {
2710 inputs[inputs.index(this) + 1].focus();
2718 $(document).keydown(function(e) {
2719 // Get the focused element:
2720 var $focused = $(":focus");
2721 if($focused.length && $focused.hasClass("global-search-item")){
2723 // UP - move to the previous line
2724 if (e.keyCode == 38) {
2726 $focused.prev().focus();
2729 // DOWN - move to the next line
2730 if (e.keyCode == 40) {
2732 $focused.next().focus();
2738 // submit form action
2739 $(".dropdown-global-search-button-list .global-search-item").on("click", function(event) {
2740 $("#top-menu-action-search").attr("action", $(this).data("target"));
2741 $("#top-menu-action-search").submit();
2745 $(document).on("click", function(event) {
2746 if (!$(event.target).closest("#topmenu-global-search-dropdown").length) {
2747 console.log("click close search - we click outside");
2749 $("#topmenu-global-search-dropdown").removeClass("open");
2754 $("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) {
2755 console.log("toggle search dropdown");
2756 openGlobalSearchDropDown();
2760 $(document).keydown(function(e){
2761 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
2762 console.log(\'control + shift + f : trigger open global-search dropdown\');
2763 openGlobalSearchDropDown();
2768 var openGlobalSearchDropDown = function() {
2769 $("#topmenu-global-search-dropdown").toggleClass("open");
2770 $("#top-global-search-input").focus();
2794 function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after =
'', $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
2796 global $user, $conf, $langs, $db,
$form;
2797 global $hookmanager, $menumanager;
2801 if (!empty($menu_array_before)) {
2802 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);
2805 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2807 $hookmanager->initHooks(array(
'searchform',
'leftblock'));
2809 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
2811 if ($conf->browser->layout ==
'phone') {
2812 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
2817 if (!is_object(
$form)) {
2821 if (empty($conf->global->MAIN_USE_TOP_MENU_SEARCH_DROPDOWN)) {
2823 $arrayresult =
null;
2824 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
2826 if ($conf->use_javascript_ajax && empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
2827 $searchform .=
$form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'', 1, 0, (empty($conf->global->MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY) ? 1 : 0),
'vmenusearchselectcombo', 1, $langs->trans(
"Search"), 1);
2829 if (is_array($arrayresult)) {
2830 foreach ($arrayresult as $key => $val) {
2831 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'sall', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
2837 $parameters = array(
'searchform' => $searchform);
2838 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
2839 if (empty($reshook)) {
2840 $searchform .= $hookmanager->resPrint;
2842 $searchform = $hookmanager->resPrint;
2846 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) || empty($conf->use_javascript_ajax)) {
2847 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
2848 $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>';
2849 } elseif ($conf->use_javascript_ajax && !empty($conf->global->MAIN_USE_OLD_SEARCH_FORM)) {
2850 $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>';
2851 $searchform .=
'<script>
2852 jQuery(document).ready(function () {
2853 jQuery("#divsearchforms1").click(function(){
2854 jQuery("#divsearchforms2").toggle();
2858 $searchform .=
'</div>';
2863 print
'<!-- Begin left menu -->'.
"\n";
2865 print
'<div class="vmenu"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) ?
'' :
' title="Left menu"').
'>'.
"\n\n";
2868 $menumanager->menu_array = $menu_array_before;
2869 $menumanager->menu_array_after = $menu_array_after;
2870 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
2874 print
"<!-- Begin Help Block-->\n";
2875 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
2878 if (!empty($conf->global->MAIN_SHOW_VERSION)) {
2879 $doliurl =
'https://www.dolibarr.org';
2881 if (preg_match(
'/fr/i', $langs->defaultlang)) {
2882 $doliurl =
'https://www.dolibarr.fr';
2884 if (preg_match(
'/es/i', $langs->defaultlang)) {
2885 $doliurl =
'https://www.dolibarr.es';
2887 if (preg_match(
'/de/i', $langs->defaultlang)) {
2888 $doliurl =
'https://www.dolibarr.de';
2890 if (preg_match(
'/it/i', $langs->defaultlang)) {
2891 $doliurl =
'https://www.dolibarr.it';
2893 if (preg_match(
'/gr/i', $langs->defaultlang)) {
2894 $doliurl =
'https://www.dolibarr.gr';
2897 $appli = constant(
'DOL_APPLICATION_TITLE');
2898 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2899 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
2900 if (preg_match(
'/\d\.\d/', $appli)) {
2901 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2902 $appli .=
" (".DOL_VERSION.
")";
2905 $appli .=
" ".DOL_VERSION;
2908 $appli .=
" ".DOL_VERSION;
2910 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
2912 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
2914 print
'<span class="help">';
2922 print
'</div>'.
"\n";
2926 if (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
2927 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
2929 if ($conf->global->MAIN_BUGTRACK_ENABLELINK ==
'github') {
2930 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
2931 $bugbaseurl .=
'&title=';
2932 $bugbaseurl .= urlencode(
"Bug: ");
2933 $bugbaseurl .=
'&body=';
2934 $bugbaseurl .= urlencode(
"# Instructions\n");
2935 $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");
2936 $bugbaseurl .= urlencode(
"*Please:*\n");
2937 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
2938 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
2939 $bugbaseurl .= urlencode(
"\n");
2940 $bugbaseurl .= urlencode(
"\n");
2941 $bugbaseurl .= urlencode(
"# Bug\n");
2942 $bugbaseurl .= urlencode(
"[*Short description*]\n");
2943 $bugbaseurl .= urlencode(
"\n");
2944 $bugbaseurl .= urlencode(
"## Environment\n");
2945 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
2946 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
2947 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
2948 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
2949 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
2950 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
2951 $bugbaseurl .= urlencode(
"\n");
2952 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
2953 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
2954 $bugbaseurl .= urlencode(
"\n");
2955 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
2956 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
2957 $bugbaseurl .= urlencode(
"\n");
2958 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
2959 $bugbaseurl .= urlencode(
"[*Files*]\n");
2960 $bugbaseurl .= urlencode(
"\n");
2962 $bugbaseurl .= urlencode(
"\n");
2963 $bugbaseurl .= urlencode(
"## Report\n");
2964 } elseif (!empty($conf->global->MAIN_BUGTRACK_ENABLELINK)) {
2965 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
2971 $parameters = array(
'bugbaseurl' => $bugbaseurl);
2972 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
2973 if (empty($reshook)) {
2974 $bugbaseurl .= $hookmanager->resPrint;
2976 $bugbaseurl = $hookmanager->resPrint;
2979 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
2980 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'">'.$langs->trans(
"FindBug").
'</a>';
2985 print
"<!-- End Help Block-->\n";
2989 print
"<!-- End left menu -->\n";
2993 $parameters = array();
2994 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
2995 print $hookmanager->resPrint;
2997 print
'</div></div> <!-- End side-nav id-left -->';
3001 print
'<!-- Begin right area -->'.
"\n";
3003 if (empty($leftmenuwithoutmainarea)) {
3017 global $conf, $langs, $hookmanager;
3019 if (empty($conf->dol_hide_leftmenu)) {
3020 print
'<div id="id-right">';
3025 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3027 $hookmanager->initHooks(array(
'main'));
3028 $parameters = array();
3029 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3030 print $hookmanager->resPrint;
3032 if (!empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) {
3033 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3037 if (!empty($conf->global->SHOW_SOCINFO_ON_PRINT) &&
GETPOST(
'optioncss',
'aZ09') ==
'print' && empty(
GETPOST(
'disable_show_socinfo_on_print',
'az09'))) {
3038 $parameters = array();
3039 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3040 if (empty($reshook)) {
3041 print
'<!-- Begin show mysoc info header -->'.
"\n";
3042 print
'<div id="mysoc-info-header">'.
"\n";
3043 print
'<table class="centpercent div-table-responsive">'.
"\n";
3045 print
'<tr><td rowspan="0" class="width20p">';
3046 if ($conf->global->MAIN_SHOW_LOGO && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && !empty($conf->global->MAIN_INFO_SOCIETE_LOGO)) {
3047 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)).
'">';
3049 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3050 print
'<tr><td class="titre bold">'.dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_NOM).
'</td></tr>'.
"\n";
3051 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";
3052 if (!empty($conf->global->MAIN_INFO_SOCIETE_TEL)) {
3053 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Phone").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_TEL).
'</td></tr>';
3055 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
3056 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Email").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL).
'</td></tr>';
3058 if (!empty($conf->global->MAIN_INFO_SOCIETE_WEB)) {
3059 print
'<tr><td style="padding-left: 1em" class="small">'.$langs->trans(
"Web").
' : '.
dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_WEB).
'</td></tr>';
3062 print
'</table>'.
"\n";
3063 print
'</div>'.
"\n";
3064 print
'<!-- End show mysoc info header -->'.
"\n";
3083 if (preg_match(
'/^http/i', $helppagename)) {
3085 $helpbaseurl =
'%s';
3086 $helppage = $helppagename;
3091 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3092 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3093 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3094 $helppage = $reg[1];
3097 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3098 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3099 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3100 $helppage = $reg[1];
3103 if (empty($helppage)) {
3104 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3105 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3106 $helppage = $reg[1];
3111 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3131 function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3133 global $conf, $langs, $user;
3136 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3137 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3138 $ret .=
'<input type="hidden" name="mode" value="search">';
3139 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3140 if ($showtitlebefore) {
3141 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3143 $ret .=
'<div class="tagtd">';
3144 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3145 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3146 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3147 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3148 $ret .=
' placeholder="'.strip_tags($title).
'"';
3149 $ret .= ($autofocus ?
' autofocus' :
'');
3150 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3151 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3152 $ret .=
'<span class="fa fa-search"></span>';
3153 $ret .=
'</button>';
3155 $ret .=
"</form>\n";
3160 if (!function_exists(
"llxFooter")) {
3171 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3173 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager;
3174 global $delayedhtmlcontent;
3175 global $contextpage, $page, $limit, $mode;
3176 global $dolibarr_distrib;
3178 $ext =
'layout='.$conf->browser->layout.
'&version='.urlencode(DOL_VERSION);
3185 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3187 foreach ($user->lastsearch_values_tmp as $key => $val) {
3188 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3189 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3190 if (empty($val[
'sortfield'])) {
3191 unset($val[
'sortfield']);
3193 if (empty($val[
'sortorder'])) {
3194 unset($val[
'sortorder']);
3196 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3197 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3198 unset($_SESSION[
'lastsearch_values_'.$key]);
3204 $relativepathstring = $_SERVER[
"PHP_SELF"];
3206 if (constant(
'DOL_URL_ROOT')) {
3207 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3209 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3210 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3211 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3212 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3213 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3214 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3215 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3217 if (!empty($contextpage)) {
3218 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3220 if (!empty($page) && $page > 0) {
3221 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3223 if (!empty($limit) && $limit != $conf->liste_limit) {
3224 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3226 if (!empty($mode)) {
3227 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3230 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3231 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3232 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3233 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3237 if (!empty($conf->global->MAIN_CORE_ERROR)) {
3239 if ($conf->use_javascript_ajax) {
3240 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3241 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3244 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3245 print
'<div class="error">'.$msg.
'</div>';
3253 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3255 if (empty($conf->dol_hide_leftmenu)) {
3256 print
'</div> <!-- End div id-right -->'.
"\n";
3259 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3260 print
'</div> <!-- End div id-container -->'.
"\n";
3265 print
'<!-- '.$comment.
' -->'.
"\n";
3270 if (!empty($delayedhtmlcontent)) {
3271 print $delayedhtmlcontent;
3274 if (!empty($conf->use_javascript_ajax)) {
3275 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3276 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3280 if (!empty($conf->blockedlog->enabled) && is_object($object) && !empty($object->id) && $object->id > 0 && $object->statut > 0) {
3281 if (in_array($object->element, array(
'facture'))) {
3282 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3285 jQuery(document).ready(
function () {
3286 $(
'a.documentpreview').click(
function() {
3287 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3289 id:<?php echo $object->id; ?>
3290 , element:
'<?php echo $object->element ?>'
3291 , action:
'DOC_PREVIEW'
3292 , token:
'<?php echo currentToken(); ?>'
3296 $(
'a.documentdownload').click(
function() {
3297 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3299 id:<?php echo $object->id; ?>
3300 , element:
'<?php echo $object->element ?>'
3301 , action:
'DOC_DOWNLOAD'
3302 , token:
'<?php echo currentToken(); ?>'
3313 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3314 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3318 $forceping =
GETPOST(
'forceping',
'alpha');
3319 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3321 $hash_unique_id = md5(
'dolibarr'.$conf->file->instance_unique_id);
3323 if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
3324 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && ($conf->global->MAIN_FIRST_PING_OK_ID !=
'disabled'))
3327 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3328 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3329 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3332 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) {
3333 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3335 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3337 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";
3338 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3339 $url_for_ping = (empty($conf->global->MAIN_URL_FOR_PING) ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3341 $distrib =
'standard';
3342 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3343 $distrib =
'doliwamp';
3345 if (!empty($dolibarr_distrib)) {
3346 $distrib = $dolibarr_distrib;
3350 jQuery(document).ready(
function (tmp) {
3351 console.log(
"Try Ping with hash_unique_id is md5('dolibarr'+instance_unique_id)");
3354 url:
"<?php echo $url_for_ping ?>",
3359 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3360 action:
'dolibarrping',
3361 version:
'<?php echo (float) DOL_VERSION; ?>',
3362 entity:
'<?php echo (int) $conf->entity; ?>',
3363 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3364 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3365 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3366 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3367 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3368 token:
'notrequired'
3370 success:
function (data, status, xhr) {
3371 console.log(
"Ping ok");
3374 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3377 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3380 error:
function (data,status,xhr) {
3381 console.log(
"Ping ko: " + data);
3384 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3387 data: { hash_algo:
'md5', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3397 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3398 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3400 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3405 $reshook = $hookmanager->executeHooks(
'beforeBodyClose');
3407 print $hookmanager->resPrint;