46if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
47 list($usec, $sec) = explode(
" ", microtime());
48 $micro_start_time = ((float) $usec + (
float) $sec);
51 if (defined(
'XDEBUGCOVERAGE')) {
52 xdebug_start_code_coverage();
64 $arrayofcommonemoji = array(
65 'misc' => array(
'2600',
'26FF'),
66 'ding' => array(
'2700',
'27BF'),
67 '????' => array(
'9989',
'9989'),
68 'vars' => array(
'FE00',
'FE0F'),
69 'pict' => array(
'1F300',
'1F5FF'),
70 'emot' => array(
'1F600',
'1F64F'),
71 'tran' => array(
'1F680',
'1F6FF'),
72 'flag' => array(
'1F1E0',
'1F1FF'),
73 'supp' => array(
'1F900',
'1F9FF'),
76 return $arrayofcommonemoji;
88 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
91 if (preg_match(
'/^x/i', $newstringnumentity)) {
92 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
94 $newstringnumentity = (int) $newstringnumentity;
98 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
99 return chr((
int) $newstringnumentity);
104 foreach ($arrayofemojis as $valarray) {
105 if ($newstringnumentity >= hexdec($valarray[0]) && $newstringnumentity <= hexdec($valarray[1])) {
107 return html_entity_decode($matches[0], ENT_COMPAT | ENT_HTML5,
'UTF-8');
111 return '&#'.$matches[1];
135 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
137 $val = preg_replace_callback(
138 '/&#(x?[0-9][0-9a-f]+;?)/i',
143 static function ($m) {
151 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
152 $val = preg_replace(
'/[\r\n\t]/',
'', $val);
153 }
while ($oldval != $val);
164 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
167 if ($newval != $val) {
174 if ($type == 1 || $type == 3) {
176 $inj += preg_match(
'/delete\s*from/i', $val);
177 $inj += preg_match(
'/create\s*table/i', $val);
178 $inj += preg_match(
'/insert\s*into/i', $val);
179 $inj += preg_match(
'/select\s*from/i', $val);
180 $inj += preg_match(
'/into\s*(outfile|dumpfile)/i', $val);
181 $inj += preg_match(
'/user\s*\(/i', $val);
182 $inj += preg_match(
'/information_schema/i', $val);
183 $inj += preg_match(
'/<svg/i', $val);
184 $inj += preg_match(
'/update[^&=\w].*set.+=/i', $val);
185 $inj += preg_match(
'/union.+select/i', $val);
189 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s*by|concat|count|from|union/i', $val);
192 $inj += preg_match(
'/updatexml\(/i', $val);
193 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
194 $inj += preg_match(
'/\s@@/', $val);
197 $inj += preg_match(
'/<\/textarea/i', $val);
203 $inj += preg_match(
'/<audio/i', $val);
204 $inj += preg_match(
'/<embed/i', $val);
205 $inj += preg_match(
'/<iframe/i', $val);
206 $inj += preg_match(
'/<object/i', $val);
207 $inj += preg_match(
'/<script/i', $val);
208 $inj += preg_match(
'/Set\.constructor/i', $val);
209 if (!defined(
'NOSTYLECHECK')) {
210 $inj += preg_match(
'/<style/i', $val);
212 $inj += preg_match(
'/base\s+href/si', $val);
213 $inj += preg_match(
'/=data:/si', $val);
216 $inj += preg_match(
'/on(mouse|content|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $val);
217 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $val);
218 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $val);
219 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $val);
220 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $val);
221 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $val);
223 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $val);
227 $tmpval = preg_replace(
'/<[^<]*>/',
'', $val);
230 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $tmpval);
231 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $tmpval);
232 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $tmpval);
233 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $tmpval);
234 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $tmpval);
235 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $tmpval);
237 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $tmpval);
240 $inj += preg_match(
'/:|:|:/i', $val);
241 $inj += preg_match(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i', $val);
242 $inj += preg_match(
'/vbscript\s*:/i', $val);
244 if ($type == 1 || $type == 3) {
245 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
246 $inj += preg_match(
'/"/i', $val);
249 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
265 if (is_array($var)) {
266 foreach ($var as $key => $value) {
268 if ($type === 0 && defined(
'NOSCANPOSTFORINJECTION') && is_array(constant(
'NOSCANPOSTFORINJECTION')) && in_array($key, constant(
'NOSCANPOSTFORINJECTION'))) {
275 http_response_code(403);
278 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
281 $errormessage =
'Access refused to '.htmlentities($ip, ENT_COMPAT,
'UTF-8').
' by SQL or Script injection protection in main.inc.php:analyseVarsForSqlAndScriptsInjection type='.htmlentities((
string) $type, ENT_COMPAT,
'UTF-8');
284 $errormessage2 =
'page='.htmlentities((empty($_SERVER[
"REQUEST_URI"]) ?
'' : $_SERVER[
"REQUEST_URI"]), ENT_COMPAT,
'UTF-8');
285 $errormessage2 .=
' paramtype='.htmlentities((
string) $type, ENT_COMPAT,
'UTF-8');
286 $errormessage2 .=
' paramkey='.htmlentities($key, ENT_COMPAT,
'UTF-8');
287 $errormessage2 .=
' paramvalue='.htmlentities($value, ENT_COMPAT,
'UTF-8');
291 print
'Try to go back, fix data of your form and resubmit it. You can contact also your technical support.';
293 print
"\n".
'<!--'.
"\n";
294 print $errormessage2;
298 if (function_exists(
'error_log')) {
299 error_log($errormessage.
' '.substr($errormessage2, 2000));
306 if (class_exists(
'PHPUnit\Framework\TestSuite')) {
307 $message = $errormessage.
' '.substr($errormessage2, 2000);
308 throw new Exception(
"Security injection exception: $message");
328if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
329 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
332if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
333 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
338if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
339 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
343if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
347 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
351if (!defined(
'NOSCANPOSTFORINJECTION') || is_array(constant(
'NOSCANPOSTFORINJECTION'))) {
356if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
357 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
361require_once
'filefunc.inc.php';
381if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
382 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
383 $tmplist = explode(
',', $tmpautoset[1]);
384 $cookiearrayvalue = array();
385 foreach ($tmplist as $tmpkey) {
386 $postkey = $tmpautoset[0].
'_'.$tmpkey;
389 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
392 $cookiename = $tmpautoset[0];
393 $cookievalue = json_encode($cookiearrayvalue);
395 if (PHP_VERSION_ID < 70300) {
396 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
399 $cookieparams = array(
400 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
403 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
407 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
409 if (empty($cookievalue)) {
410 unset($_COOKIE[$cookiename]);
416if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
417 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
423$prefix = dol_getprefix(
'');
424$sessionname =
'DOLSESSID_'.$prefix;
425$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
426if (!empty($_COOKIE[$sessiontimeout])) {
427 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
432if (!defined(
'NOSESSION')) {
433 if (PHP_VERSION_ID < 70300) {
434 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
437 $sessioncookieparams = array(
441 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
445 session_set_cookie_params($sessioncookieparams);
447 session_name($sessionname);
454require_once
'master.inc.php';
462 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
464 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
466 } elseif (defined(
'NOREQUIREDB')) {
468 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
470 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
474 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
475 print
'Sorry, your application is offline.'.
"\n";
476 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
477 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
478 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
480 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
481 $nexturl = DOL_URL_ROOT.
'/';
482 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
490register_shutdown_function(
'dol_shutdown');
493if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
495 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
497 $renderer = $debugbar->getJavascriptRenderer();
499 $conf->global->MAIN_HTML_HEADER =
'';
501 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
503 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
504 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
508if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
510 $conf->browser->name = $tmp[
'browsername'];
511 $conf->browser->os = $tmp[
'browseros'];
512 $conf->browser->version = $tmp[
'browserversion'];
513 $conf->browser->ua = $tmp[
'browserua'];
514 $conf->browser->layout = $tmp[
'layout'];
517 if (
$conf->browser->layout ==
'phone') {
518 $conf->dol_no_mouse_hover = 1;
525 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
529if (
GETPOSTINT(
'textbrowser') || (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'textbrowser')) {
530 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
535if (!empty(
$conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
537 if (is_numeric(
$conf->file->main_force_https)) {
538 if (
$conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
539 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
540 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
545 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
549 $newurl =
$conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
554 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
555 header(
"Location: ".$newurl);
558 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);
562if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
563 $listofip = explode(
',', $dolibarr_main_restrict_ip);
565 foreach ($listofip as $ip) {
567 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
573 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
579if (!defined(
'NOREQUIREHTML')) {
580 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
582if (!defined(
'NOREQUIREAJAX')) {
583 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
588 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
589 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
593$checkifupgraderequired =
false;
595 $checkifupgraderequired =
true;
598 $checkifupgraderequired =
true;
600if ($checkifupgraderequired) {
602 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
603 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
604 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
605 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
607 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
609 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
610 if (php_sapi_name() ===
"cli") {
611 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
613 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
621if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
623 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
625 if (isset($_SESSION[
'newtoken'])) {
626 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
629 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
633 $token =
dol_hash(uniqid((
string) mt_rand(),
false),
'md5');
634 $_SESSION[
'newtoken'] = $token;
635 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
643if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
644 $tmpaction =
GETPOST(
'action',
'aZ09');
646 $sensitiveget =
false;
647 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
650 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, array(
'create',
'create2',
'createsite',
'createcard',
'edit',
'editcontract',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'reconcile',
'specimen')))) {
651 $sensitiveget =
true;
655 $arrayofactiontoforcetokencheck = array(
657 'doprev',
'donext',
'dvprev',
'dvnext',
658 'freezone',
'install',
661 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
662 $sensitiveget =
true;
665 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
666 $sensitiveget =
true;
673 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
675 GETPOSTISSET(
'massaction') ||
676 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
679 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
682 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
683 $langs->loadLangs(array(
"errors",
"install"));
684 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
685 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
687 http_response_code(403);
688 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
689 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);
690 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";
692 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);
693 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";
694 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";
698 print
" into setup).\n";
705 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
707 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
708 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (invalid token), so we disable POST and some GET parameters - referrer=".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
711 if (!defined(
'NOTOKENRENEWAL')) {
713 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
716 if (isset($_POST[
'id'])) {
717 $savid = ((int) $_POST[
'id']);
720 unset($_GET[
'confirm']);
721 unset($_GET[
'action']);
722 unset($_GET[
'confirmmassaction']);
723 unset($_GET[
'massaction']);
724 unset($_GET[
'token']);
726 $_POST[
'id'] = ((int) $savid);
729 $_GET[
'errorcode'] =
'InvalidToken';
735if (!empty($dolibarr_main_demo)) {
737 if (GETPOSTISSET(
'disablemodules')) {
738 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
740 if (!empty($_SESSION[
"disablemodules"])) {
741 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
743 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
744 foreach ($disabled_modules as $module) {
746 if (empty(
$conf->$module)) {
750 $conf->$module->enabled =
false;
751 unset(
$conf->modules[$module]);
753 foreach ($modulepartkeys as $modulepartkey) {
754 unset(
$conf->modules_parts[$modulepartkey][$module]);
756 if ($module ==
'fournisseur') {
757 $conf->supplier_order->enabled = 0;
758 $conf->supplier_invoice->enabled = 0;
759 unset(
$conf->modules[
'supplier_order']);
760 unset(
$conf->modules[
'supplier_invoice']);
768$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
769if (is_array($modulepart) && count($modulepart) > 0) {
770 foreach (
$conf->modules as $module) {
771 if (in_array($module, $modulepart)) {
772 $modulepart = $module;
777if (is_array($modulepart)) {
788if (!defined(
'NOLOGIN')) {
792 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
793 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
796 if (empty($dolibarr_main_authentication)) {
797 $dolibarr_main_authentication =
'dolibarr';
800 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
801 $dolibarr_auto_user =
'auto';
805 $authmode = explode(
',', $dolibarr_main_authentication);
808 if (!count($authmode)) {
809 $langs->load(
'main');
810 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
817 $resultFetchUser =
'';
819 $dol_authmode =
null;
821 if (!isset($_SESSION[
"dol_login"])) {
823 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
825 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
827 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
828 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
829 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
830 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
831 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
832 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
833 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
834 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
837 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
838 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
839 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
841 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
842 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
843 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
844 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
845 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
846 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
847 header(
"Location: ".$url);
854 $hookmanager->initHooks(array(
'login'));
855 $parameters = array();
856 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
863 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
867 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
871 $dirModCaptcha = array_merge(array(
'main' =>
'/core/modules/security/captcha/'), isset(
$conf->modules_parts[
'captcha']) && is_array(
$conf->modules_parts[
'captcha']) ?
$conf->modules_parts[
'captcha'] : array());
872 $fullpathclassfile =
'';
873 foreach ($dirModCaptcha as $dir) {
874 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
875 if ($fullpathclassfile) {
881 if ($fullpathclassfile) {
882 include_once $fullpathclassfile;
886 $classname =
"modCaptcha".ucfirst($captcha);
887 if (class_exists($classname)) {
889 $captchaobj =
new $classname($db,
$conf, $langs, $user);
890 '@phan-var-force ModeleCaptcha $captchaobj';
892 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
893 $ok = $captchaobj->validateCodeAfterLoginSubmit();
895 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
900 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
905 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
912 dol_syslog(
'Bad value for code, connection refused', LOG_NOTICE);
914 $langs->loadLangs(array(
'main',
'errors'));
916 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
920 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
923 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
931 $hookmanager->initHooks(array(
'login'));
932 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
933 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
942 $allowedmethodtopostusername = 3;
943 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
944 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
947 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
948 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
952 $goontestloop =
false;
953 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
954 $goontestloop =
true;
956 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
957 $goontestloop =
true;
959 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
960 $goontestloop =
true;
962 if (
GETPOST(
'openid_mode',
'alpha')) {
963 $goontestloop =
true;
965 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
966 $goontestloop =
true;
968 if (!empty($_COOKIE[
'login_dolibarr'])) {
969 $goontestloop =
true;
972 if (!is_object($langs)) {
973 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
976 if (defined(
'MAIN_LANG_DEFAULT')) {
977 $langcode = constant(
'MAIN_LANG_DEFAULT');
979 $langs->setDefaultLang($langcode);
985 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
988 $oauthmodetotestarray = array(
'google');
989 foreach ($oauthmodetotestarray as $oauthmodetotest) {
990 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
993 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn')) {
996 dol_syslog(
"User did not click on link for OAuth, or is not on the OAuth return, so we disable check using ".$oauthmodetotest);
997 foreach ($authmode as $tmpkey => $tmpval) {
998 if ($tmpval == $oauthmodetotest.
'oauth') {
999 unset($authmode[$tmpkey]);
1008 if ($login ===
'--bad-login-validity--') {
1013 $dol_authmode =
$conf->authmode;
1014 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
1015 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
1016 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
1017 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
1018 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
1021 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
1022 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
1023 if ($dol_dst_first && $dol_dst_second) {
1024 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
1028 if ($datenow >= $datefirst && $datenow < $datesecond) {
1032 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
1033 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
1038 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
1040 $langs->loadLangs(array(
'main',
'errors'));
1044 if (empty($_SESSION[
"dol_loginmesg"])) {
1045 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
1049 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
1052 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1060 $hookmanager->initHooks(array(
'login'));
1061 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1062 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1072 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
1074 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" - action=".
GETPOST(
'action',
'aZ09').
" - actionlogin=".
GETPOST(
'actionlogin',
'aZ09').
" - showing the login form and exit", LOG_NOTICE);
1075 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
1080 return 'ERROR_NOT_LOGGED';
1082 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
1083 http_response_code(401);
1087 dol_loginfunction($langs,
$conf, (!empty($mysoc) ? $mysoc :
''));
1092 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
1093 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
1094 dol_syslog(
'User not found or not valid, connection refused');
1096 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
1097 session_name($sessionname);
1100 if ($resultFetchUser == 0) {
1102 $langs->loadLangs(array(
'main',
'errors'));
1104 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1106 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1107 } elseif ($resultFetchUser < 0) {
1108 $_SESSION[
"dol_loginmesg"] = $user->error;
1110 $user->context[
'audit'] = $user->error;
1113 $langs->loadLangs(array(
'main',
'errors'));
1115 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
1117 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
1121 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1130 $hookmanager->initHooks(array(
'login'));
1131 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1132 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1137 $paramsurl = array();
1139 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1142 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1144 if (
GETPOST(
'lang',
'aZ09')) {
1145 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1147 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1151 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1152 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1157 $login = $_SESSION[
"dol_login"];
1158 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
1159 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
1161 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
1165 if ($resultFetchUser <= 0
1166 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
1167 || ($user->status != $user::STATUS_ENABLED)
1168 || ($user->isNotIntoValidityDateRange())) {
1169 if ($resultFetchUser <= 0) {
1171 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
1172 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
1174 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
1175 } elseif ($user->status != $user::STATUS_ENABLED) {
1180 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
1183 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
1184 session_name($sessionname);
1187 if ($resultFetchUser == 0) {
1188 $langs->loadLangs(array(
'main',
'errors'));
1190 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1192 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1193 } elseif ($resultFetchUser < 0) {
1194 $_SESSION[
"dol_loginmesg"] = $user->error;
1196 $user->context[
'audit'] = $user->error;
1198 $langs->loadLangs(array(
'main',
'errors'));
1200 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1202 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1206 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1214 $hookmanager->initHooks(array(
'login'));
1215 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1216 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1221 $paramsurl = array();
1223 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1226 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1228 if (
GETPOST(
'lang',
'aZ09')) {
1229 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1232 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1236 $hookmanager->initHooks(array(
'main'));
1239 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1240 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1241 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1243 if (constant(
'DOL_URL_ROOT')) {
1244 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1246 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1247 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1251 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1252 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1253 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1255 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1256 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1257 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1259 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1260 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1261 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1263 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1264 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1265 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1267 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1268 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1269 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1272 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1273 if (empty($_SESSION[
'pageforbacktolist'])) {
1274 $pageforbacktolistarray = array();
1276 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1278 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1279 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1280 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1281 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1286 $parameters = array();
1287 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1296 if (!isset($_SESSION[
"dol_login"])) {
1301 $_SESSION[
"dol_login"] = $user->login;
1302 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1303 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1304 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1305 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1306 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1307 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1308 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1309 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1310 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1311 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1313 $_SESSION[
"dol_entity"] =
$conf->entity;
1315 if (!empty($dol_hide_topmenu)) {
1316 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1318 if (!empty($dol_hide_leftmenu)) {
1319 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1321 if (!empty($dol_optimize_smallscreen)) {
1322 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1324 if (!empty($dol_no_mouse_hover)) {
1325 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1327 if (!empty($dol_use_jmobile)) {
1328 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1331 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1335 $user->update_last_login_date();
1337 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1338 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1341 $user->context[
'audit'] = $loginfo;
1342 $user->context[
'authentication_method'] = $dol_authmode;
1345 $result = $user->call_trigger(
'USER_LOGIN', $user);
1353 $hookmanager->initHooks(array(
'login'));
1354 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1355 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1363 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1370 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (!
getDolGlobalString(
'MAIN_LANDING_PAGE') ?
'' :
$conf->global->MAIN_LANDING_PAGE) : $user->
conf->MAIN_LANDING_PAGE);
1371 if (!empty($landingpage)) {
1373 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1374 header(
'Location: '.$newpath);
1383 $user->rights->user->user->lire = 1;
1384 $user->rights->user->user->creer = 1;
1385 $user->rights->user->user->password = 1;
1386 $user->rights->user->user->supprimer = 1;
1387 $user->rights->user->self->creer = 1;
1388 $user->rights->user->self->password = 1;
1392 if (!$user->hasRight(
'user',
'user_advance')) {
1393 $user->rights->user->user_advance =
new stdClass();
1395 if (!$user->hasRight(
'user',
'self_advance')) {
1396 $user->rights->user->self_advance =
new stdClass();
1398 if (!$user->hasRight(
'user',
'group_advance')) {
1399 $user->rights->user->group_advance =
new stdClass();
1402 $user->rights->user->user_advance->readperms = 1;
1403 $user->rights->user->user_advance->write = 1;
1404 $user->rights->user->self_advance->readperms = 1;
1405 $user->rights->user->self_advance->writeperms = 1;
1406 $user->rights->user->group_advance->read = 1;
1407 $user->rights->user->group_advance->readperms = 1;
1408 $user->rights->user->group_advance->write = 1;
1409 $user->rights->user->group_advance->delete = 1;
1418 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1421 if ((
int)
$conf->liste_limit <= 0) {
1423 $conf->liste_limit = 15;
1424 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1425 $conf->liste_limit = 8;
1426 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1427 $conf->liste_limit = 10;
1428 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1429 $conf->liste_limit = 20;
1433 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1440 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1444 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1445 $user->loadDefaultValues();
1451if (
GETPOST(
'theme',
'aZ09')) {
1453 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1458 $conf->use_javascript_ajax = 0;
1469 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1479if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1480 $conf->dol_hide_leftmenu = 1;
1482if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1483 $conf->dol_hide_topmenu = 1;
1485if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1486 $conf->dol_optimize_smallscreen = 1;
1488if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1489 $conf->dol_no_mouse_hover = 1;
1491if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1492 $conf->dol_use_jmobile = 1;
1495if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1496 $conf->dol_no_mouse_hover = 1;
1500if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1501 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1502 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1505 $conf->dol_optimize_smallscreen = 1;
1508 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1512if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1513 $conf->theme =
'eldy';
1514 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1517if (!defined(
'NOREQUIRETRAN')) {
1518 if (!
GETPOST(
'lang',
'aZ09')) {
1520 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1523 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1524 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1530if (!defined(
'NOLOGIN')) {
1533 if (!$user->login) {
1538 if ($user->statut < 1) {
1540 $langs->loadLangs(array(
"errors",
"other"));
1541 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1546 $user->loadRights();
1549dol_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);
1554if (!defined(
'NOREQUIRETRAN')) {
1556 $langs->loadLangs(array(
'main',
'dict'));
1560$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1561$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1562$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1563$bctag = array(0 =>
'class="impair tagtr"', 1 =>
'class="pair tagtr"');
1575if (empty(
$conf->browser->firefox)) {
1576 define(
'ROWS_1', 1);
1577 define(
'ROWS_2', 2);
1578 define(
'ROWS_3', 3);
1579 define(
'ROWS_4', 4);
1580 define(
'ROWS_5', 5);
1581 define(
'ROWS_6', 6);
1582 define(
'ROWS_7', 7);
1583 define(
'ROWS_8', 8);
1584 define(
'ROWS_9', 9);
1586 define(
'ROWS_1', 0);
1587 define(
'ROWS_2', 1);
1588 define(
'ROWS_3', 2);
1589 define(
'ROWS_4', 3);
1590 define(
'ROWS_5', 4);
1591 define(
'ROWS_6', 5);
1592 define(
'ROWS_7', 6);
1593 define(
'ROWS_8', 7);
1594 define(
'ROWS_9', 8);
1597$heightforframes = 50;
1600if (!defined(
'NOREQUIREMENU')) {
1601 if (empty($user->socid)) {
1609 $file_menu =
$conf->standard_menu;
1610 if (
GETPOST(
'menu',
'alpha')) {
1611 $file_menu =
GETPOST(
'menu',
'alpha');
1614 if (!class_exists(
'MenuManager')) {
1616 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1617 foreach ($dirmenus as $dirmenu) {
1619 if (class_exists(
'MenuManager')) {
1623 if (!class_exists(
'MenuManager')) {
1624 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1625 $file_menu =
'eldy_menu.php';
1626 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1630 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1635if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1636 $message =
GETPOST(
'seteventmessages',
'alpha');
1637 $messages = explode(
',', $message);
1638 foreach ($messages as $key => $msg) {
1639 $tmp = explode(
':', $msg);
1646if (!function_exists(
"llxHeader")) {
1668 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1670 global
$conf, $hookmanager;
1672 $parameters = array(
1674 'title' => & $title,
1675 'help_url' => & $help_url,
1676 'target' => & $target,
1677 'disablejs' => & $disablejs,
1678 'disablehead' => & $disablehead,
1679 'arrayofjs' => & $arrayofjs,
1680 'arrayofcss' => & $arrayofcss,
1681 'morequerystring' => & $morequerystring,
1682 'morecssonbody' => & $morecssonbody,
1683 'replacemainareaby' => & $replacemainareaby,
1684 'disablenofollow' => & $disablenofollow,
1685 'disablenoindex' => & $disablenoindex
1688 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1690 print $hookmanager->resPrint;
1695 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1697 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1699 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1701 if ($mainmenu !=
'website') {
1702 $tmpcsstouse = $morecssonbody;
1707 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1710 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1713 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1714 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1717 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1718 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1722 if ($replacemainareaby) {
1723 print $replacemainareaby;
1741 global $db,
$conf, $hookmanager;
1743 if ($contenttype ==
'text/html') {
1744 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1746 header(
"Content-Type: ".$contenttype);
1752 header(
"X-Content-Type-Options: nosniff");
1755 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1756 header(
"X-Frame-Options: SAMEORIGIN");
1758 header(
"X-Frame-Options: ALLOWALL");
1762 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1763 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1764 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1765 header(
'Vary: Origin');
1772 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1787 if (!is_object($hookmanager)) {
1788 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1791 $hookmanager->initHooks(array(
"main"));
1793 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1794 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1796 $contentsecuritypolicy = $hookmanager->resPrint;
1798 $contentsecuritypolicy .= $hookmanager->resPrint;
1801 if (!empty($contentsecuritypolicy)) {
1802 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1805 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1809 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1824 if (!is_object($hookmanager)) {
1825 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1828 $hookmanager->initHooks(array(
"main"));
1830 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1831 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1833 $contentsecuritypolicy = $hookmanager->resPrint;
1835 $contentsecuritypolicy .= $hookmanager->resPrint;
1838 if (!empty($contentsecuritypolicy)) {
1839 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1842 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1849 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1852 header(
"Referrer-Policy: ".$referrerpolicy);
1855 if ($forcenocache) {
1856 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1878function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1880 global $db,
$conf, $langs, $user, $mysoc, $hookmanager;
1884 if (empty(
$conf->css)) {
1885 $conf->css =
'/theme/eldy/style.css.php';
1888 print
'<!doctype html>'.
"\n";
1890 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1893 if (empty($disablehead)) {
1894 if (!is_object($hookmanager)) {
1895 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1898 $hookmanager->initHooks(array(
"main"));
1900 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1904 if (
GETPOST(
'dol_basehref',
'alpha')) {
1905 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1909 print
'<meta charset="utf-8">'.
"\n";
1910 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1911 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1912 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1913 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1914 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1916 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1919 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1920 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1921 if (!empty($mysoc->logo_squarred_mini)) {
1922 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1927 if (empty(
$conf->dol_use_jmobile)) {
1928 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1929 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1933 $manifest = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/manifest.json.php';
1934 $parameters = array(
'manifest' => $manifest);
1935 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1937 $manifest = $hookmanager->resPrint;
1939 $manifest .= $hookmanager->resPrint;
1941 if (!empty($manifest)) {
1942 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1947 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1952 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1956 $appli = constant(
'DOL_APPLICATION_TITLE');
1959 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1972 $parameters = array(
'title' => $titletoshow);
1973 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1975 $titletoshow = $hookmanager->resPrint;
1977 $titletoshow .= $hookmanager->resPrint;
1986 $ext =
'version='.GETPOSTINT(
'version');
1989 if (
GETPOST(
'dol_resetcache')) {
1990 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1994 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1996 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1997 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1998 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
2000 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
2001 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
2003 if (GETPOSTISSET(
'dol_openinpopup')) {
2004 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
2006 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
2007 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
2009 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
2010 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
2012 if (GETPOSTISSET(
'dol_use_jmobile')) {
2013 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
2016 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
2017 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
2019 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
2020 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
2024 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
2025 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
2028 if (!defined(
'DISABLE_JQUERY') && !$disablejs &&
$conf->use_javascript_ajax) {
2029 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
2030 $jquerytheme =
'base';
2034 if (constant(
'JS_JQUERY_UI')) {
2035 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2037 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2039 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
2040 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2042 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2043 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') :
$conf->global->MAIN_USE_JQUERY_MULTISELECT;
2044 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2048 if (!defined(
'DISABLE_FONT_AWSOME')) {
2049 print
'<!-- Includes CSS for font awesome -->'.
"\n";
2050 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
2051 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2054 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
2058 if (!empty(
$conf->modules_parts[
'theme'])) {
2059 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
2062 $themesubdir = $reldir;
2069 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
2071 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";
2076 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
2077 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
2081 if (!empty(
$conf->modules_parts[
'css'])) {
2082 $arraycss = (array)
$conf->modules_parts[
'css'];
2083 foreach ($arraycss as $modcss => $filescss) {
2084 $filescss = (array) $filescss;
2085 foreach ($filescss as $cssfile) {
2086 if (empty($cssfile)) {
2087 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
2091 if ($urlforcss && $urlforcss !=
'/') {
2092 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
2094 if (!preg_match(
'/\.css$/i', $cssfile)) {
2099 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
2105 if (is_array($arrayofcss)) {
2106 foreach ($arrayofcss as $cssfile) {
2107 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
2108 $urltofile = $cssfile;
2112 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2114 if (!preg_match(
'/\.css$/i', $cssfile)) {
2124 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2128 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty(
$conf->use_javascript_ajax)) {
2130 print
'<!-- Includes JS for JQuery -->'.
"\n";
2131 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2132 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2134 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2136 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2137 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2139 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2142 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2143 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2146 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2147 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2151 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2155 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
2156 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
2157 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2158 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2159 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2160 print
'<script>'.
"\n";
2161 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
2162 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
2163 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
2164 print 'var placeholderInPlace = \
' \';'.
"\n";
2165 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
2166 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
2167 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".
$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
2168 print
'var withInPlace = 300;';
2169 print
'</script>'.
"\n";
2170 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2171 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2174 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
2175 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2176 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2178 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2180 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') :
$conf->global->MAIN_USE_JQUERY_MULTISELECT;
2181 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2183 if (!defined(
'DISABLE_MULTISELECT')) {
2184 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2188 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2190 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
2191 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2192 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
2193 $jsckeditor =
'ckeditor.js';
2194 if (constant(
'JS_CKEDITOR')) {
2196 $pathckeditor = constant(
'JS_CKEDITOR');
2198 print
'<script nonce="'.getNonce().
'">';
2199 print
'/* enable ckeditor by main.inc.php */';
2200 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2201 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2202 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2203 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";
2204 print
'</script>'.
"\n";
2205 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2207 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2208 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2210 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2212 print
'</script>'.
"\n";
2216 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2217 $enablebrowsernotif =
false;
2219 $enablebrowsernotif =
true;
2221 if (
$conf->browser->layout ==
'phone') {
2222 $enablebrowsernotif =
false;
2224 if ($enablebrowsernotif) {
2225 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2226 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2231 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2232 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2236 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2237 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2241 if (!empty(
$conf->modules_parts[
'js'])) {
2242 $arrayjs = (array)
$conf->modules_parts[
'js'];
2243 foreach ($arrayjs as $modjs => $filesjs) {
2244 $filesjs = (array) $filesjs;
2245 foreach ($filesjs as $jsfile) {
2248 if ($urlforjs && $urlforjs !=
'/') {
2249 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2250 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2252 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2258 if (is_array($arrayofjs)) {
2259 print
'<!-- Includes JS added by page -->'.
"\n";
2260 foreach ($arrayofjs as $jsfile) {
2261 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2262 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2264 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2273 if (file_exists($theme_js)) {
2274 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2278 if (!empty($head)) {
2285 $parameters = array();
2286 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2287 print $hookmanager->resPrint;
2289 print
"</head>\n\n";
2292 $conf->headerdone = 1;
2312function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2314 global $user,
$conf, $langs, $db, $form;
2315 global $dolibarr_main_authentication, $dolibarr_main_demo;
2316 global $hookmanager, $menumanager;
2321 $hookmanager->initHooks(array(
'toprightmenu'));
2326 if (empty(
$conf->headerdone)) {
2327 $disablenofollow = 0;
2328 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2329 print
'<body id="mainbody">';
2335 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2336 if (!isset($form) || !is_object($form)) {
2337 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2338 $form =
new Form($db);
2341 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2343 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2346 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2348 $menumanager->atarget = $target;
2350 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2354 $appli = constant(
'DOL_APPLICATION_TITLE');
2357 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2359 $appli .=
" ".DOL_VERSION;
2363 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2367 $logouthtmltext =
'';
2370 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2371 if (
$conf->browser->name ==
'chrome') {
2372 $stringforfirstkey .=
' ALT +';
2373 } elseif (
$conf->browser->name ==
'firefox') {
2374 $stringforfirstkey .=
' ALT + SHIFT +';
2376 $stringforfirstkey .=
' CTL +';
2378 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2379 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2380 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2381 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2382 $logouttext .=
'</a>';
2384 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2385 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2390 print
'<div class="login_block usedropdown">'.
"\n";
2394 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2397 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2417 $toprightmenu .=
'</div>';
2419 $toprightmenu .=
'</div>'.
"\n";
2423 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2426 $parameters = array();
2427 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2428 if (is_numeric($result)) {
2430 $toprightmenu .= $hookmanager->resPrint;
2432 $toprightmenu = $hookmanager->resPrint;
2435 $toprightmenu .= $result;
2439 if (isModEnabled(
'modulebuilder')) {
2440 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2442 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2445 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2452 if (isset($_POST) && is_array($_POST)) {
2453 foreach ($_POST as $key => $value) {
2454 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2455 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2458 if (!is_array($value)) {
2459 if ($value !==
'') {
2460 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2463 foreach ($value as $value2) {
2464 if (($value2 !==
'') && (!is_array($value2))) {
2465 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2471 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2472 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2474 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2477 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2482 $langs->load(
"help");
2489 if (empty($helppagename)) {
2490 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2492 $helppresent =
'helppresent';
2497 $helpbaseurl = $arrayres[
'helpbaseurl'];
2498 $helppage = $arrayres[
'helppage'];
2499 $mode = $arrayres[
'mode'];
2502 if ($helpbaseurl && $helppage) {
2504 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2505 if ($mode ==
'wiki') {
2506 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2508 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2510 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2513 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2514 if ($mode ==
'wiki') {
2516 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2519 $text .= sprintf($helpbaseurl, $helppage);
2522 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2523 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2526 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2531 $langs->load(
'admin');
2532 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2538 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2540 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2545 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2548 $toprightmenu .=
'</div>';
2552 $toprightmenu .=
'<div class="login_block_user">';
2555 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2560 $toprightmenu .=
'</div>';
2562 $toprightmenu .=
'</div>'.
"\n";
2565 print $toprightmenu;
2572 print
'<div style="clear: both;"></div>';
2573 print
"<!-- End top horizontal menu -->\n\n";
2576 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2577 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2591 global $langs,
$conf, $db, $hookmanager, $user, $mysoc;
2592 global $dolibarr_main_authentication, $dolibarr_main_demo;
2593 global $menumanager;
2596 if (
$conf->browser->name ==
'textbrowser') {
2600 $langs->load(
'companies');
2602 $userImage = $userDropDownImage =
'';
2603 if (!empty($user->photo)) {
2604 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2605 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2607 $nophoto =
'/public/theme/common/user_anonymous.png';
2608 if ($user->gender ==
'man') {
2609 $nophoto =
'/public/theme/common/user_man.png';
2611 if ($user->gender ==
'woman') {
2612 $nophoto =
'/public/theme/common/user_woman.png';
2615 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2616 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2620 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2621 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2623 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2625 while ($idprofcursor < 10) {
2627 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2628 if ($idprofcursor == 1) {
2629 $constkeyforprofid =
'MAIN_INFO_SIREN';
2631 if ($idprofcursor == 2) {
2632 $constkeyforprofid =
'MAIN_INFO_SIRET';
2634 if ($idprofcursor == 3) {
2635 $constkeyforprofid =
'MAIN_INFO_APE';
2637 if ($idprofcursor == 4) {
2638 $constkeyforprofid =
'MAIN_INFO_RCS';
2640 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2645 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid),
'1').
'</span>';
2649 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2650 if (isModEnabled(
'multicurrency')) {
2651 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
$conf->currency.
'</span>';
2653 $dropdownBody .=
'</div>';
2655 $dropdownBody .=
'<br>';
2656 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2657 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2660 if (!empty($user->admin)) {
2661 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2664 if (!empty($user->socid)) {
2665 $thirdpartystatic =
new Societe($db);
2666 $thirdpartystatic->fetch($user->socid);
2667 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2668 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2670 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2671 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2672 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2673 $dropdownBody .=
'<br>';
2675 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2676 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2678 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2680 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2681 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2682 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2683 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2685 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2687 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2689 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2690 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2691 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2696 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.
$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' <small class="opacitymedium">('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')</small>';
2697 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
$conf->browser->layout;
2698 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2699 if (
$conf->browser->layout ==
'phone') {
2700 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2702 if (!empty($_SESSION[
"disablemodules"])) {
2703 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2705 $dropdownBody .=
'</div>';
2708 $parameters = array(
'user' => $user,
'langs' => $langs);
2709 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2710 if (is_numeric($result)) {
2712 $dropdownBody .= $hookmanager->resPrint;
2714 $dropdownBody = $hookmanager->resPrint;
2718 if (empty($urllogout)) {
2719 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2724 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2725 if (
$conf->browser->name ==
'chrome') {
2726 $stringforfirstkey .=
' ALT +';
2727 } elseif (
$conf->browser->name ==
'firefox') {
2728 $stringforfirstkey .=
' ALT + SHIFT +';
2730 $stringforfirstkey .=
' CTL +';
2734 $profilLink =
'<a accesskey="u" href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"YourUserFile").
' ('.$stringforfirstkey.
' u)').
'"><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2735 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2736 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.$stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.$stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover',
"closeTopMenuLoginDropdown()",
'',
'v');
2737 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt pictofixedwidth"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2739 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2740 if (!empty($user->admin)) {
2741 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2745 $appli = constant(
'DOL_APPLICATION_TITLE');
2748 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2750 $appli .=
" ".DOL_VERSION;
2754 $btnUser =
'<!-- div for user link -->
2755 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2756 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2757 '.$userImage.(empty($user->photo) ?
'<!-- no photo so show also the login --><span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft valignmiddle small">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2759 <div class="dropdown-menu">
2761 <div class="user-header">
2762 '.$userDropDownImage.
'
2764 '.$profilName.
'<br>';
2766 if ($user->datelastlogin) {
2767 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2768 if ($user->datepreviouslogin) {
2769 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2772 $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>';
2773 if ($user->datepreviouslogin) {
2774 $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>';
2782 <!-- Menu Body user-->
2783 <div class="user-body">'.$dropdownBody.
'</div>
2786 <div class="user-footer">
2787 <div class="pull-left">
2790 <div class="pull-left">
2791 '.$virtuelcardLink.
'
2793 <div class="pull-right">
2796 <div class="clearboth"></div>
2802 $btnUser =
'<!-- div for user link text browser -->
2803 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2804 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2805 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2810 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2812 <!-- Code to show/hide the user drop-down -->
2814 function closeTopMenuLoginDropdown() {
2815 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2817 jQuery("#topmenu-login-dropdown").removeClass("open");
2819 jQuery(document).ready(function() {
2820 jQuery(document).on("click", function(event) {
2821 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2822 /* console.log("click close login - we click outside"); */
2823 closeTopMenuLoginDropdown();
2831 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2832 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2833 event.preventDefault();
2834 jQuery("#topmenu-login-dropdown").toggleClass("open");
2837 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2838 console.log("Click on #topmenulogincompanyinfo-btn");
2839 jQuery("#topmenulogincompanyinfo").slideToggle();
2842 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2843 console.log("Click on #topmenuloginmoreinfo-btn");
2844 jQuery("#topmenuloginmoreinfo").slideToggle();
2865 global
$conf, $langs;
2876 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2877 if (
$conf->browser->os ===
'macintosh') {
2878 $stringforfirstkey .=
' CTL +';
2880 if (
$conf->browser->name ==
'chrome') {
2881 $stringforfirstkey .=
' ALT +';
2882 } elseif (
$conf->browser->name ==
'firefox') {
2883 $stringforfirstkey .=
' ALT + SHIFT +';
2885 $stringforfirstkey .=
' CTL +';
2889 if (!empty(
$conf->use_javascript_ajax)) {
2890 $html .=
'<!-- div for quick add link -->
2891 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2892 <a accesskey="a" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$stringforfirstkey.
' a)"><i class="fa fa-plus-circle"></i></a>
2895 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2897 <!-- Code to show/hide the user drop-down for the quick add -->
2899 jQuery(document).ready(function() {
2900 jQuery(document).on("click", function(event) {
2901 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2902 /* console.log("click close quick add - we click outside"); */
2904 $("#topmenu-quickadd-dropdown").removeClass("open");
2907 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2908 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2909 openQuickAddDropDown(event);
2913 $(document).keydown(function(event){
2914 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2915 if (ostype ===
"macintosh") {
2916 if ( event.which === 65 && event.ctrlKey ) {
2917 console.log(\
'control + a : trigger open quick add dropdown\');
2918 openQuickAddDropDown(event);
2921 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2922 console.log(\'control + shift + a : trigger open quick add dropdown\');
2923 openQuickAddDropDown(event);
2928 var openQuickAddDropDown = function(event) {
2929 event.preventDefault();
2930 $("#topmenu-quickadd-dropdown").toggleClass("open");
2931 //$("#top-quickadd-search-input").focus();
2951 global
$conf, $langs;
2962 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2963 if (
$conf->browser->os ===
'macintosh') {
2964 $stringforfirstkey .=
' CTL +';
2966 if (
$conf->browser->name ==
'chrome') {
2967 $stringforfirstkey .=
' ALT +';
2968 } elseif (
$conf->browser->name ==
'firefox') {
2969 $stringforfirstkey .=
' ALT + SHIFT +';
2971 $stringforfirstkey .=
' CTL +';
2976 if (!empty(
$conf->use_javascript_ajax)) {
2977 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2982 $html .=
'<!-- div for link to upload file -->
2983 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2984 <a accesskey="i" class="dropdown-togglex login-dropdown-a nofocusvisible" data-toggle="dropdown" href="'.$urlforuploadpage.
'" title="'.$langs->trans(
'UploadFile').
' ('.$stringforfirstkey.
' i)"><i class="fa fa-upload"></i></a>
3000 global $user, $langs, $hookmanager;
3005 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
3006 "title" =>
"MenuNewMember@members",
3007 "name" =>
"Adherent@members",
3008 "picto" =>
"object_member",
3009 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3013 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3014 "title" =>
"MenuNewThirdParty@companies",
3015 "name" =>
"ThirdParty@companies",
3016 "picto" =>
"object_company",
3017 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3021 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3022 "title" =>
"NewContactAddress@companies",
3023 "name" =>
"Contact@companies",
3024 "picto" =>
"object_contact",
3025 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3029 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3030 "title" =>
"NewPropal@propal",
3031 "name" =>
"Proposal@propal",
3032 "picto" =>
"object_propal",
3033 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3038 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3039 "title" =>
"NewOrder@orders",
3040 "name" =>
"Order@orders",
3041 "picto" =>
"object_order",
3042 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3046 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3047 "title" =>
"NewBill@bills",
3048 "name" =>
"Bill@bills",
3049 "picto" =>
"object_bill",
3050 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3054 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3055 "title" =>
"NewContractSubscription@contracts",
3056 "name" =>
"Contract@contracts",
3057 "picto" =>
"object_contract",
3058 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3062 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3063 "title" =>
"SupplierProposalNew@supplier_proposal",
3064 "name" =>
"SupplierProposal@supplier_proposal",
3065 "picto" =>
"supplier_proposal",
3066 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3070 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3071 "title" =>
"NewSupplierOrderShort@orders",
3072 "name" =>
"SupplierOrder@orders",
3073 "picto" =>
"supplier_order",
3074 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3078 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3079 "title" =>
"NewBill@bills",
3080 "name" =>
"SupplierBill@bills",
3081 "picto" =>
"supplier_invoice",
3082 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3086 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3087 "title" =>
"NewTicket@ticket",
3088 "name" =>
"Ticket@ticket",
3089 "picto" =>
"ticket",
3090 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3094 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3095 "title" =>
"NewIntervention@interventions",
3096 "name" =>
"Intervention@interventions",
3097 "picto" =>
"intervention",
3098 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3102 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3103 "title" =>
"NewProduct@products",
3104 "name" =>
"Product@products",
3105 "picto" =>
"object_product",
3106 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3110 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3111 "title" =>
"NewService@products",
3112 "name" =>
"Service@products",
3113 "picto" =>
"object_service",
3114 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3118 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3119 "title" =>
"AddUser@users",
3120 "name" =>
"User@users",
3122 "activation" => $user->hasRight(
"user",
"user",
"write"),
3128 $dropDownQuickAddHtml =
'';
3132 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3134 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3137 $parameters = array();
3138 $hook_items = $items;
3139 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3140 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3141 if ($reshook == 0) {
3142 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3144 $items = $hookmanager->resArray;
3148 $position = array();
3149 foreach ($items[
'items'] as $key => $row) {
3150 $position[$key] = $row[
'position'];
3152 $array1_sort_order = SORT_ASC;
3153 array_multisort($position, $array1_sort_order, $items[
'items']);
3156 foreach ($items[
'items'] as $item) {
3157 if (!$item[
'activation']) {
3160 $langs->load(explode(
'@', $item[
'title'])[1]);
3161 $langs->load(explode(
'@', $item[
'name'])[1]);
3162 $dropDownQuickAddHtml .=
'
3163 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3164 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3169 $dropDownQuickAddHtml .=
'</div>';
3171 $dropDownQuickAddHtml .=
'</div>';
3173 return $dropDownQuickAddHtml;
3183 global $langs,
$conf, $user;
3188 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3199 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3200 if (
$conf->browser->os ===
'macintosh') {
3201 $stringforfirstkey .=
' CTL +';
3203 if (
$conf->browser->name ==
'chrome') {
3204 $stringforfirstkey .=
' ALT +';
3205 } elseif (
$conf->browser->name ==
'firefox') {
3206 $stringforfirstkey .=
' ALT + SHIFT +';
3208 $stringforfirstkey .=
' CTL +';
3212 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3213 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3214 $langs->load(
"bookmarks");
3217 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3221 $html .=
'<!-- div for bookmark link -->
3222 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3223 <a accesskey="b" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.$stringforfirstkey.
' b)"><i class="fa fa-star"></i></a>
3224 <div class="dropdown-menu">
3230 <!-- Code to show/hide the bookmark drop-down -->
3232 jQuery(document).ready(function() {
3233 jQuery(document).on("click", function(event) {
3234 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3235 /* console.log("close bookmark dropdown - we click outside"); */
3237 $("#topmenu-bookmark-dropdown").removeClass("open");
3241 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3242 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3243 openBookMarkDropDown(event);
3247 jQuery(document).keydown(function(event) {
3248 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3249 if (ostype ===
"macintosh") {
3250 if ( event.which === 66 && event.ctrlKey ) {
3251 console.log(
"Click on control + b : trigger open bookmark dropdown");
3252 openBookMarkDropDown(event);
3255 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3256 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3257 openBookMarkDropDown(event);
3262 var openBookMarkDropDown =
function(event) {
3263 event.preventDefault();
3264 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3265 jQuery(
"#top-bookmark-search-input").focus();
3281function top_menu_search()
3283 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3288 $arrayresult = array();
3289 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3291 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3292 // accesskey is for Mac: CTRL + key for all browsers
3293 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3294 if ($conf->browser->name == 'chrome
') {
3295 $stringforfirstkey .= ' ALT +
';
3296 } elseif ($conf->browser->name == 'firefox
') {
3297 $stringforfirstkey .= ' ALT + SHIFT +
';
3299 $stringforfirstkey .= ' CTL +
';
3302 $searchInput = '<input
type=
"search" name=
"search_all"'.($stringforfirstkey ? ' title=
"'.dol_escape_htmltag($stringforfirstkey.' s').'"' : '').' id=
"top-global-search-input" class=
"dropdown-search-input search_component_input" placeholder=
"'.$langs->trans('Search').'" autocomplete=
"off">
';
3304 $defaultAction = '';
3305 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3306 // Menu with all searchable items
3307 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3308 foreach ($arrayresult as $keyItem => $item) {
3309 if (empty($defaultAction)) {
3310 $defaultAction = $item['url
'];
3312 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3313 $buttonList .= $item['text
'];
3314 $buttonList .= '</
button>
';
3316 $buttonList .= '</div>
';
3318 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3321 <!-- search input -->
3322 <div
class=
"dropdown-header search-dropdown-header">
3328 <!--
Menu Body search -->
3329 <div
class=
"dropdown-body search-dropdown-body">
3334 $dropDownHtml .= '</form>
';
3336 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3337 // accesskey is for Mac: CTRL + key for all browsers
3338 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3339 if ($conf->browser->name == 'chrome
') {
3340 $stringforfirstkey .= ' ALT +
';
3341 } elseif ($conf->browser->name == 'firefox
') {
3342 $stringforfirstkey .= ' ALT + SHIFT +
';
3344 $stringforfirstkey .= ' CTL +
';
3347 $html .= '<!-- div
for Global Search -->
3348 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3349 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3350 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3352 <div
class=
"dropdown-menu dropdown-search">
3358 <!-- Code to show/hide the
user drop-down -->
3360 jQuery(document).ready(
function() {
3363 jQuery(
"#top-global-search-input").keydown(
function (e) {
3364 if (e.keyCode == 13 || e.keyCode == 40) {
3365 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3366 if (inputs[inputs.index(this) + 1] != null) {
3367 inputs[inputs.index(this) + 1].focus();
3368 if (e.keyCode == 13){
3369 inputs[inputs.index(this) + 1].trigger(
"click");
3379 jQuery(document).keydown(
function(e) {
3381 var $focused = $(
":focus");
3382 if($focused.length && $focused.hasClass(
"global-search-item")){
3385 if (e.keyCode == 38) {
3387 $focused.prev().focus();
3391 if (e.keyCode == 40) {
3393 $focused.next().focus();
3400 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3401 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3402 jQuery(
"#top-menu-action-search").submit();
3406 jQuery(document).on(
"click",
function(event) {
3407 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3408 console.log(
"click close search - we click outside");
3410 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3415 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3416 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3417 openGlobalSearchDropDown();
3421 jQuery(document).keydown(
function(e){
3422 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3423 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3424 openGlobalSearchDropDown();
3426 if ( e.which === 70 && e.alKey ) {
3427 console.log(\'alt + f : trigger open global-search dropdown\');
3428 openGlobalSearchDropDown();
3432 var openGlobalSearchDropDown = function() {
3433 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3434 jQuery("#top-global-search-input").focus();
3458function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3460 global $user,
$conf, $langs, $db, $form;
3461 global $hookmanager, $menumanager;
3465 if (!empty($menu_array_before)) {
3466 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);
3469 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3471 $hookmanager->initHooks(array(
'leftblock'));
3473 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3476 if (!is_object($form)) {
3477 $form =
new Form($db);
3482 if (
$conf->browser->layout ==
'phone') {
3483 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3487 $arrayresult = array();
3488 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3493 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3494 if (
$conf->browser->name ==
'chrome') {
3495 $stringforfirstkey .=
' ALT +';
3496 } elseif (
$conf->browser->name ==
'firefox') {
3497 $stringforfirstkey .=
' ALT + SHIFT +';
3499 $stringforfirstkey .=
' CTL +';
3503 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3504 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 0 : 1),
'vmenusearchselectcombo', 1, $textsearch, 1, $stringforfirstkey.
' s');
3506 if (is_array($arrayresult)) {
3508 foreach ($arrayresult as $key => $val) {
3509 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3515 $parameters = array(
'searchform' => $searchform);
3516 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3517 if (empty($reshook)) {
3518 $searchform .= $hookmanager->resPrint;
3520 $searchform = $hookmanager->resPrint;
3525 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3526 $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>';
3528 $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>';
3529 $searchform .=
'<script>
3530 jQuery(document).ready(function () {
3531 jQuery("#divsearchforms1").click(function(){
3532 jQuery("#divsearchforms2").toggle();
3536 $searchform .=
'</div>';
3540 $searchform .=
'<script>
3541 jQuery(document).keydown(function(e){
3542 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3543 console.log(\'control + shift + f : trigger open global-search dropdown\');
3544 openGlobalSearchDropDown();
3546 if( (e.which === 83 || e.which === 115) && e.altKey ){
3547 console.log(\'alt + s : trigger open global-search dropdown\');
3548 openGlobalSearchDropDown();
3552 var openGlobalSearchDropDown = function() {
3553 jQuery("#searchselectcombo").select2(\'open\');
3559 print
'<!-- Begin left menu -->'.
"\n";
3561 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3565 $menumanager->menu_array = $menu_array_before;
3567 $menumanager->menu_array_after = $menu_array_after;
3570 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3573 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3578 print
"<!-- Begin Help Block-->\n";
3579 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3583 $doliurl =
'https://www.dolibarr.org';
3585 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3586 $doliurl =
'https://www.dolibarr.fr';
3588 if (preg_match(
'/es/i', $langs->defaultlang)) {
3589 $doliurl =
'https://www.dolibarr.es';
3591 if (preg_match(
'/de/i', $langs->defaultlang)) {
3592 $doliurl =
'https://www.dolibarr.de';
3594 if (preg_match(
'/it/i', $langs->defaultlang)) {
3595 $doliurl =
'https://www.dolibarr.it';
3597 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3598 $doliurl =
'https://www.dolibarr.gr';
3601 $appli = constant(
'DOL_APPLICATION_TITLE');
3604 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3606 $appli .=
" ".DOL_VERSION;
3614 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3616 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3618 print
'<span class="help">';
3626 print
'</div>'.
"\n";
3631 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3634 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3635 $bugbaseurl .=
'&title=';
3636 $bugbaseurl .= urlencode(
"Bug: ");
3637 $bugbaseurl .=
'&body=';
3638 $bugbaseurl .= urlencode(
"# Instructions\n");
3639 $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");
3640 $bugbaseurl .= urlencode(
"*Please:*\n");
3641 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3642 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3643 $bugbaseurl .= urlencode(
"\n");
3644 $bugbaseurl .= urlencode(
"\n");
3645 $bugbaseurl .= urlencode(
"# Bug\n");
3646 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3647 $bugbaseurl .= urlencode(
"\n");
3648 $bugbaseurl .= urlencode(
"## Environment\n");
3649 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3650 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3651 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3652 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3653 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3654 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3655 $bugbaseurl .= urlencode(
"\n");
3656 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3657 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3658 $bugbaseurl .= urlencode(
"\n");
3659 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3660 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3661 $bugbaseurl .= urlencode(
"\n");
3662 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3663 $bugbaseurl .= urlencode(
"[*Files*]\n");
3664 $bugbaseurl .= urlencode(
"\n");
3666 $bugbaseurl .= urlencode(
"\n");
3667 $bugbaseurl .= urlencode(
"## Report\n");
3675 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3676 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3677 if (empty($reshook)) {
3678 $bugbaseurl .= $hookmanager->resPrint;
3680 $bugbaseurl = $hookmanager->resPrint;
3683 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3684 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3689 print
"<!-- End Help Block-->\n";
3693 print
"<!-- End left menu -->\n";
3697 $parameters = array();
3698 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3699 print $hookmanager->resPrint;
3701 print
'</div></div> <!-- End side-nav id-left -->';
3705 print
'<!-- Begin right area -->'.
"\n";
3707 if (empty($leftmenuwithoutmainarea)) {
3721 global
$conf, $langs, $hookmanager;
3723 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3724 print
'<div id="id-right">';
3729 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3731 $hookmanager->initHooks(array(
'main'));
3732 $parameters = array();
3733 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3734 print $hookmanager->resPrint;
3737 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3742 $parameters = array();
3743 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3744 if (empty($reshook)) {
3745 print
'<!-- Begin show mysoc info header -->'.
"\n";
3746 print
'<div id="mysoc-info-header">'.
"\n";
3747 print
'<table class="centpercent div-table-responsive">'.
"\n";
3749 print
'<tr><td rowspan="0" class="width20p">';
3751 print
'<img id="mysoc-info-header-logo" style="max-width:100%" alt="" src="'.DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/'.
dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_LOGO'))).
'">';
3753 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3754 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3766 print
'</table>'.
"\n";
3767 print
'</div>'.
"\n";
3768 print
'<!-- End show mysoc info header -->'.
"\n";
3787 if (preg_match(
'/^http/i', $helppagename)) {
3789 $helpbaseurl =
'%s';
3790 $helppage = $helppagename;
3795 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3796 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3797 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3798 $helppage = $reg[1];
3801 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3802 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3803 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3804 $helppage = $reg[1];
3807 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3808 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3809 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3810 $helppage = $reg[1];
3813 if (empty($helppage)) {
3814 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3815 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3816 $helppage = $reg[1];
3821 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3841function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3843 global $langs, $user;
3846 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3847 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3848 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3849 if ($showtitlebefore) {
3850 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3852 $ret .=
'<div class="tagtd">';
3853 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3854 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3855 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3856 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3857 $ret .=
' placeholder="'.strip_tags($title).
'"';
3858 $ret .= ($autofocus ?
' autofocus' :
'');
3859 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3860 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3861 $ret .=
'<span class="fa fa-search"></span>';
3862 $ret .=
'</button>';
3864 $ret .=
"</form>\n";
3869if (!function_exists(
"llxFooter")) {
3881 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3883 global
$conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3884 global $delayedhtmlcontent;
3885 global $contextpage, $page, $limit, $mode;
3886 global $dolibarr_distrib;
3888 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3892 $parameters = array();
3893 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3894 if (empty($reshook)) {
3895 $llxfooter .= $hookmanager->resPrint;
3896 } elseif ($reshook > 0) {
3897 $llxfooter = $hookmanager->resPrint;
3908 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3910 foreach ($user->lastsearch_values_tmp as $key => $val) {
3911 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3912 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3913 if (empty($val[
'sortfield'])) {
3914 unset($val[
'sortfield']);
3916 if (empty($val[
'sortorder'])) {
3917 unset($val[
'sortorder']);
3919 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3920 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3921 unset($_SESSION[
'lastsearch_values_'.$key]);
3927 $relativepathstring = $_SERVER[
"PHP_SELF"];
3929 if (constant(
'DOL_URL_ROOT')) {
3930 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3932 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3933 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3934 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3935 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3936 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3937 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3938 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3940 if (!empty($contextpage)) {
3941 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3943 if (!empty($page) && $page > 0) {
3944 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3946 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3947 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3949 if (!empty($mode)) {
3950 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3953 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3954 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3955 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3956 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3962 if (
$conf->use_javascript_ajax) {
3963 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3964 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3967 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3968 print
'<div class="error">'.$msg.
'</div>';
3976 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3978 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3979 print
'</div> <!-- End div id-right -->'.
"\n";
3982 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3983 print
'</div> <!-- End div id-container -->'.
"\n";
3988 print
'<!-- '.$comment.
' -->'.
"\n";
3993 if (!empty($delayedhtmlcontent)) {
3994 print $delayedhtmlcontent;
3997 if (!empty(
$conf->use_javascript_ajax)) {
3998 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3999 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
4004 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
4005 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
4008 jQuery(document).ready(
function () {
4009 $(
'a.documentpreview').click(
function() {
4010 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
4011 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
4014 , element:
'<?php echo dol_escape_js($object->element) ?>'
4015 , action:
'DOC_PREVIEW'
4016 , token:
'<?php echo currentToken(); ?>'
4020 $(
'a.documentdownload').click(
function() {
4021 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
4022 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
4025 , element:
'<?php echo dol_escape_js($object->element) ?>'
4026 , action:
'DOC_DOWNLOAD'
4027 , token:
'<?php echo currentToken(); ?>'
4038 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4039 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4043 $forceping =
GETPOST(
'forceping',
'alpha');
4044 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4046 $hash_unique_id =
dol_hash(
'dolibarr'.
$conf->file->instance_unique_id,
'sha256');
4049 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id !=
$conf->global->MAIN_FIRST_PING_OK_ID) && (
getDolGlobalString(
'MAIN_FIRST_PING_OK_ID') !=
'disabled'))
4052 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4053 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4054 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
4058 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
4060 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4062 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";
4063 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
4064 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
4066 $distrib =
'standard';
4067 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
4068 $distrib =
'doliwamp';
4070 if (!empty($dolibarr_distrib)) {
4071 $distrib = $dolibarr_distrib;
4075 jQuery(document).ready(
function (tmp) {
4076 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
4079 url:
"<?php echo $url_for_ping ?>",
4083 hash_algo:
'dol_hash-sha256',
4084 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
4085 action:
'dolibarrping',
4086 version:
'<?php echo (float) DOL_VERSION; ?>',
4087 entity:
'<?php echo (int) $conf->entity; ?>',
4088 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
4089 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
4090 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
4091 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
4092 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
4093 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
4094 token:
'notrequired'
4096 success:
function (data,
status, xhr) {
4097 console.log(
"Ping ok");
4100 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
4103 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
4106 error:
function (data,
status,xhr) {
4107 console.log(
"Ping ko: " + data);
4110 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
4113 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
4123 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4124 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4131 $parameters = array();
4132 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
4134 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays), to know if a version (a,b,c) is lower than (x,...
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
if(!defined( 'DOL_APPLICATION_TITLE')) if(!defined('DOL_VERSION')) if(!defined( 'EURO')) if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
conf($dolibarr_main_document_root)
Load conf file (file must exists)
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) getArrayOfEmoji()
Return array of Emojis.
top_menu_importfile()
Build the tooltip on top menu quick add.
top_menu_quickadd()
Build the tooltip on top menu quick add.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after=array(), $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
realCharForNumericEntities($matches)
Return the real char for a numeric entities.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
printDropdownQuickadd($mode=0)
Generate list of quickadd items.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
top_menu_search()
Build the tooltip on top menu search.
analyseVarsForSqlAndScriptsInjection(&$var, $type, $stopcode=1)
Return true if security check on parameters are OK, false otherwise.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successful.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.