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|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';
373if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
374 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
375 $tmplist = explode(
',', $tmpautoset[1]);
376 $cookiearrayvalue = array();
377 foreach ($tmplist as $tmpkey) {
378 $postkey = $tmpautoset[0].
'_'.$tmpkey;
381 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
384 $cookiename = $tmpautoset[0];
385 $cookievalue = json_encode($cookiearrayvalue);
387 if (PHP_VERSION_ID < 70300) {
388 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
'', ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true), true);
391 $cookieparams = array(
392 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
395 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true),
399 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
401 if (empty($cookievalue)) {
402 unset($_COOKIE[$cookiename]);
408if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
409 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
415$prefix = dol_getprefix(
'');
416$sessionname =
'DOLSESSID_'.$prefix;
417$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
418if (!empty($_COOKIE[$sessiontimeout])) {
419 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
424if (!defined(
'NOSESSION')) {
425 if (PHP_VERSION_ID < 70300) {
426 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true), true);
429 $sessioncookieparams = array(
433 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true),
437 session_set_cookie_params($sessioncookieparams);
439 session_name($sessionname);
446require_once
'master.inc.php';
454 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
456 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
458 } elseif (defined(
'NOREQUIREDB')) {
460 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
462 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
466 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
467 print
'Sorry, your application is offline.'.
"\n";
468 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator user "' .
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED').
'" is allowed to connect for the moment.'.
"\n";
469 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
470 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
472 print
'Sorry, your application is offline. Only administrator user "' .
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED').
'" is allowed to connect for the moment.'.
"\n";
473 $nexturl = DOL_URL_ROOT.
'/';
474 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
482register_shutdown_function(
'dol_shutdown');
485if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
487 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
489 $renderer = $debugbar->getJavascriptRenderer();
491 $conf->global->MAIN_HTML_HEADER =
'';
493 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
495 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
499if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
501 $conf->browser->name = $tmp[
'browsername'];
502 $conf->browser->os = $tmp[
'browseros'];
503 $conf->browser->version = $tmp[
'browserversion'];
504 $conf->browser->ua = $tmp[
'browserua'];
505 $conf->browser->layout = $tmp[
'layout'];
508 if ($conf->browser->layout ==
'phone') {
509 $conf->dol_no_mouse_hover = 1;
515 $conf->theme =
GETPOST(
'theme',
'aZ09');
516 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
520if (
GETPOSTINT(
'textbrowser') || (!empty($conf->browser->name) && $conf->browser->name ==
'textbrowser')) {
521 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
526if (!empty($conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
528 if (is_numeric($conf->file->main_force_https)) {
529 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
530 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
531 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
535 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
539 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
544 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
545 header(
"Location: ".$newurl);
548 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);
552if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
553 $listofip = explode(
',', $dolibarr_main_restrict_ip);
555 foreach ($listofip as $ip) {
557 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
563 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
569if (!defined(
'NOREQUIREHTML')) {
570 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
572if (!defined(
'NOREQUIREAJAX')) {
573 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
578 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
579 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
583$checkifupgraderequired =
false;
585 $checkifupgraderequired =
true;
588 $checkifupgraderequired =
true;
590if ($checkifupgraderequired) {
592 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
593 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
594 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
595 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
597 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
599 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
600 if (php_sapi_name() ===
"cli") {
601 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
603 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
611if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
613 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
615 if (isset($_SESSION[
'newtoken'])) {
616 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
619 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
623 $token =
dol_hash(uniqid((
string) mt_rand(),
false),
'md5');
624 $_SESSION[
'newtoken'] = $token;
625 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
633if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
635 $sensitiveget =
false;
636 if ((GETPOSTISSET(
'massaction') ||
GETPOST(
'action',
'aZ09')) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
638 if (GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editcontract',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'reconcile',
'specimen'))) {
639 $sensitiveget =
true;
643 $arrayofactiontoforcetokencheck = array(
645 'doprev',
'donext',
'dvprev',
'dvnext',
646 'freezone',
'install',
649 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
650 $sensitiveget =
true;
653 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
654 $sensitiveget =
true;
661 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
663 GETPOSTISSET(
'massaction') ||
664 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
667 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
670 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
671 $langs->loadLangs(array(
"errors",
"install"));
672 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
673 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
675 http_response_code(403);
676 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
677 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);
678 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";
680 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);
681 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";
682 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";
686 print
" into setup).\n";
693 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
695 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
696 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);
699 if (!defined(
'NOTOKENRENEWAL')) {
701 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
704 if (isset($_POST[
'id'])) {
705 $savid = ((int) $_POST[
'id']);
708 unset($_GET[
'confirm']);
709 unset($_GET[
'action']);
710 unset($_GET[
'confirmmassaction']);
711 unset($_GET[
'massaction']);
712 unset($_GET[
'token']);
714 $_POST[
'id'] = ((int) $savid);
717 $_GET[
'errorcode'] =
'InvalidToken';
726 if (GETPOSTISSET(
'disablemodules')) {
727 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
729 if (!empty($_SESSION[
"disablemodules"])) {
730 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
732 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
733 foreach ($disabled_modules as $module) {
735 if (empty($conf->$module)) {
739 $conf->$module->enabled =
false;
741 foreach ($modulepartkeys as $modulepartkey) {
742 unset($conf->modules_parts[$modulepartkey][$module]);
744 if ($module ==
'fournisseur') {
745 $conf->supplier_order->enabled = 0;
746 $conf->supplier_invoice->enabled = 0;
754$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
755if (is_array($modulepart) && count($modulepart) > 0) {
756 foreach ($conf->modules as $module) {
757 if (in_array($module, $modulepart)) {
758 $modulepart = $module;
763if (is_array($modulepart)) {
774if (!defined(
'NOLOGIN')) {
778 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
779 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
782 if (empty($dolibarr_main_authentication)) {
783 $dolibarr_main_authentication =
'dolibarr';
786 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
787 $dolibarr_auto_user =
'auto';
791 $authmode = explode(
',', $dolibarr_main_authentication);
794 if (!count($authmode)) {
795 $langs->load(
'main');
796 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
803 $resultFetchUser =
'';
805 if (!isset($_SESSION[
"dol_login"])) {
807 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
809 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
811 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
812 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
813 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
814 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
815 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
816 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
817 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
818 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
822 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
823 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
825 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
826 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
827 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
828 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
829 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
830 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
831 header(
"Location: ".$url);
838 $hookmanager->initHooks(array(
'login'));
839 $parameters = array();
840 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
847 if ($test &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
848 $sessionkey =
'dol_antispam_value';
849 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
853 dol_syslog(
'Bad value for code, connection refused', LOG_NOTICE);
855 $langs->loadLangs(array(
'main',
'errors'));
857 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
861 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
864 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
872 $hookmanager->initHooks(array(
'login'));
873 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
874 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
883 $allowedmethodtopostusername = 3;
884 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
885 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
888 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
889 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
890 $entitytotest = (
GETPOSTINT(
'entity') ?
GETPOSTINT(
'entity') : (!empty($conf->entity) ? $conf->entity : 1));
893 $goontestloop =
false;
894 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
895 $goontestloop =
true;
897 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
898 $goontestloop =
true;
900 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
901 $goontestloop =
true;
903 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
904 $goontestloop =
true;
906 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
907 $goontestloop =
true;
909 if (!empty($_COOKIE[
'login_dolibarr'])) {
910 $goontestloop =
true;
913 if (!is_object($langs)) {
914 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
917 if (defined(
'MAIN_LANG_DEFAULT')) {
918 $langcode = constant(
'MAIN_LANG_DEFAULT');
920 $langs->setDefaultLang($langcode);
926 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
929 $oauthmodetotestarray = array(
'google');
930 foreach ($oauthmodetotestarray as $oauthmodetotest) {
931 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
933 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn')) {
937 dol_syslog(
"User did not click on link for OAuth or is not on the OAuth return, so we disable check using ".$oauthmodetotest);
938 foreach ($authmode as $tmpkey => $tmpval) {
939 if ($tmpval == $oauthmodetotest.
'oauth') {
940 unset($authmode[$tmpkey]);
949 if ($login ===
'--bad-login-validity--') {
956 $dol_authmode = $conf->authmode;
957 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
958 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
959 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
960 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
961 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
964 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
965 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
966 if ($dol_dst_first && $dol_dst_second) {
967 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
971 if ($datenow >= $datefirst && $datenow < $datesecond) {
975 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
976 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
981 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
983 $langs->loadLangs(array(
'main',
'errors'));
987 if (empty($_SESSION[
"dol_loginmesg"])) {
988 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
992 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
995 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1003 $hookmanager->initHooks(array(
'login'));
1004 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1005 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1015 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
1017 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);
1018 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
1023 return 'ERROR_NOT_LOGGED';
1025 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
1026 http_response_code(401);
1028 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
1033 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
1034 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
1035 dol_syslog(
'User not found or not valid, connection refused');
1037 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
1038 session_name($sessionname);
1041 if ($resultFetchUser == 0) {
1043 $langs->loadLangs(array(
'main',
'errors'));
1045 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1047 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1048 } elseif ($resultFetchUser < 0) {
1049 $_SESSION[
"dol_loginmesg"] = $user->error;
1051 $user->context[
'audit'] = $user->error;
1054 $langs->loadLangs(array(
'main',
'errors'));
1056 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
1058 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
1062 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1071 $hookmanager->initHooks(array(
'login'));
1072 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1073 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1078 $paramsurl = array();
1080 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1083 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1085 if (
GETPOST(
'lang',
'aZ09')) {
1086 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1088 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1092 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1093 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1098 $login = $_SESSION[
"dol_login"];
1099 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
1100 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
1102 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
1106 if ($resultFetchUser <= 0
1107 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
1108 || ($user->status != $user::STATUS_ENABLED)
1109 || ($user->isNotIntoValidityDateRange())) {
1110 if ($resultFetchUser <= 0) {
1112 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
1113 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
1115 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
1116 } elseif ($user->status != $user::STATUS_ENABLED) {
1121 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
1124 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
1125 session_name($sessionname);
1128 if ($resultFetchUser == 0) {
1129 $langs->loadLangs(array(
'main',
'errors'));
1131 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1133 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1134 } elseif ($resultFetchUser < 0) {
1135 $_SESSION[
"dol_loginmesg"] = $user->error;
1137 $user->context[
'audit'] = $user->error;
1139 $langs->loadLangs(array(
'main',
'errors'));
1141 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1143 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1147 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1155 $hookmanager->initHooks(array(
'login'));
1156 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1157 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1162 $paramsurl = array();
1164 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1167 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1169 if (
GETPOST(
'lang',
'aZ09')) {
1170 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1173 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1177 $hookmanager->initHooks(array(
'main'));
1180 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1181 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1182 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1184 if (constant(
'DOL_URL_ROOT')) {
1185 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1187 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1188 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1192 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1193 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1194 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1196 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1197 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1198 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1200 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1201 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1202 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1204 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1205 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1206 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1208 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1209 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1210 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1213 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1214 if (empty($_SESSION[
'pageforbacktolist'])) {
1215 $pageforbacktolistarray = array();
1217 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1219 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1220 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1221 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1222 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1227 $parameters = array();
1228 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1237 if (!isset($_SESSION[
"dol_login"])) {
1242 $_SESSION[
"dol_login"] = $user->login;
1243 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1244 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1245 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1246 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1247 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1248 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1249 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1250 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1251 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1252 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1254 $_SESSION[
"dol_entity"] = $conf->entity;
1256 if (!empty($dol_hide_topmenu)) {
1257 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1259 if (!empty($dol_hide_leftmenu)) {
1260 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1262 if (!empty($dol_optimize_smallscreen)) {
1263 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1265 if (!empty($dol_no_mouse_hover)) {
1266 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1268 if (!empty($dol_use_jmobile)) {
1269 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1272 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1276 $user->update_last_login_date();
1278 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1279 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1282 $user->context[
'audit'] = $loginfo;
1283 $user->context[
'authentication_method'] = $dol_authmode;
1286 $result = $user->call_trigger(
'USER_LOGIN', $user);
1294 $hookmanager->initHooks(array(
'login'));
1295 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1296 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1304 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1311 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (!
getDolGlobalString(
'MAIN_LANDING_PAGE') ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->
conf->MAIN_LANDING_PAGE);
1312 if (!empty($landingpage)) {
1314 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1315 header(
'Location: '.$newpath);
1324 $user->rights->user->user->lire = 1;
1325 $user->rights->user->user->creer = 1;
1326 $user->rights->user->user->password = 1;
1327 $user->rights->user->user->supprimer = 1;
1328 $user->rights->user->self->creer = 1;
1329 $user->rights->user->self->password = 1;
1333 if (!$user->hasRight(
'user',
'user_advance')) {
1334 $user->rights->user->user_advance =
new stdClass();
1336 if (!$user->hasRight(
'user',
'self_advance')) {
1337 $user->rights->user->self_advance =
new stdClass();
1339 if (!$user->hasRight(
'user',
'group_advance')) {
1340 $user->rights->user->group_advance =
new stdClass();
1343 $user->rights->user->user_advance->readperms = 1;
1344 $user->rights->user->user_advance->write = 1;
1345 $user->rights->user->self_advance->readperms = 1;
1346 $user->rights->user->self_advance->writeperms = 1;
1347 $user->rights->user->group_advance->read = 1;
1348 $user->rights->user->group_advance->readperms = 1;
1349 $user->rights->user->group_advance->write = 1;
1350 $user->rights->user->group_advance->delete = 1;
1359 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1360 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1362 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1363 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1368 $conf->theme = $user->conf->MAIN_THEME;
1369 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1373 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1374 $user->loadDefaultValues();
1380if (
GETPOST(
'theme',
'aZ09')) {
1381 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1382 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1387 $conf->use_javascript_ajax = 0;
1389 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1390 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1395if (!
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1396 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1398 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1405$conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1408if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1409 $conf->dol_hide_leftmenu = 1;
1411if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1412 $conf->dol_hide_topmenu = 1;
1414if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1415 $conf->dol_optimize_smallscreen = 1;
1417if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1418 $conf->dol_no_mouse_hover = 1;
1420if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1421 $conf->dol_use_jmobile = 1;
1424if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1425 $conf->dol_no_mouse_hover = 1;
1429if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1430 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1431 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1434 $conf->dol_optimize_smallscreen = 1;
1437 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1441if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1442 $conf->theme =
'eldy';
1443 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1446if (!defined(
'NOREQUIRETRAN')) {
1447 if (!
GETPOST(
'lang',
'aZ09')) {
1449 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1452 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1453 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1459if (!defined(
'NOLOGIN')) {
1462 if (!$user->login) {
1467 if ($user->statut < 1) {
1469 $langs->loadLangs(array(
"errors",
"other"));
1470 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1478dol_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);
1483if (!defined(
'NOREQUIRETRAN')) {
1485 $langs->loadLangs(array(
'main',
'dict'));
1489$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1490$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1491$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1492$bctag = array(0 =>
'class="impair tagtr"', 1 =>
'class="pair tagtr"');
1504if (empty($conf->browser->firefox)) {
1505 define(
'ROWS_1', 1);
1506 define(
'ROWS_2', 2);
1507 define(
'ROWS_3', 3);
1508 define(
'ROWS_4', 4);
1509 define(
'ROWS_5', 5);
1510 define(
'ROWS_6', 6);
1511 define(
'ROWS_7', 7);
1512 define(
'ROWS_8', 8);
1513 define(
'ROWS_9', 9);
1515 define(
'ROWS_1', 0);
1516 define(
'ROWS_2', 1);
1517 define(
'ROWS_3', 2);
1518 define(
'ROWS_4', 3);
1519 define(
'ROWS_5', 4);
1520 define(
'ROWS_6', 5);
1521 define(
'ROWS_7', 6);
1522 define(
'ROWS_8', 7);
1523 define(
'ROWS_9', 8);
1526$heightforframes = 50;
1529if (!defined(
'NOREQUIREMENU')) {
1530 if (empty($user->socid)) {
1531 $conf->standard_menu = (!
getDolGlobalString(
'MAIN_MENU_STANDARD_FORCED') ? (!
getDolGlobalString(
'MAIN_MENU_STANDARD') ?
'eldy_menu.php' : $conf->global->MAIN_MENU_STANDARD) : $conf->global->MAIN_MENU_STANDARD_FORCED);
1534 $conf->standard_menu = (!
getDolGlobalString(
'MAIN_MENUFRONT_STANDARD_FORCED') ? (!
getDolGlobalString(
'MAIN_MENUFRONT_STANDARD') ?
'eldy_menu.php' : $conf->global->MAIN_MENUFRONT_STANDARD) : $conf->global->MAIN_MENUFRONT_STANDARD_FORCED);
1538 $file_menu = $conf->standard_menu;
1539 if (
GETPOST(
'menu',
'alpha')) {
1540 $file_menu =
GETPOST(
'menu',
'alpha');
1542 if (!class_exists(
'MenuManager')) {
1544 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1545 foreach ($dirmenus as $dirmenu) {
1547 if (class_exists(
'MenuManager')) {
1551 if (!class_exists(
'MenuManager')) {
1552 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1553 $file_menu =
'eldy_menu.php';
1554 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1557 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1561if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1562 $message =
GETPOST(
'seteventmessages',
'alpha');
1563 $messages = explode(
',', $message);
1564 foreach ($messages as $key => $msg) {
1565 $tmp = explode(
':', $msg);
1572if (!function_exists(
"llxHeader")) {
1593 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1595 global $conf, $hookmanager;
1597 $parameters = array(
1599 'title' => & $title,
1600 'help_url' => & $help_url,
1601 'target' => & $target,
1602 'disablejs' => & $disablejs,
1603 'disablehead' => & $disablehead,
1604 'arrayofjs' => & $arrayofjs,
1605 'arrayofcss' => & $arrayofcss,
1606 'morequerystring' => & $morequerystring,
1607 'morecssonbody' => & $morecssonbody,
1608 'replacemainareaby' => & $replacemainareaby,
1609 'disablenofollow' => & $disablenofollow,
1610 'disablenoindex' => & $disablenoindex
1613 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1615 print $hookmanager->resPrint;
1620 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1622 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1624 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1626 if ($mainmenu !=
'website') {
1627 $tmpcsstouse = $morecssonbody;
1632 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1635 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1638 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1639 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1642 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1643 left_menu(array(), $help_url,
'',
'', 1, $title, 1);
1647 if ($replacemainareaby) {
1648 print $replacemainareaby;
1665 global $db, $conf, $hookmanager;
1667 if ($contenttype ==
'text/html') {
1668 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1670 header(
"Content-Type: ".$contenttype);
1676 header(
"X-Content-Type-Options: nosniff");
1679 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1680 header(
"X-Frame-Options: SAMEORIGIN");
1682 header(
"X-Frame-Options: ALLOWALL");
1686 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1687 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1688 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1689 header(
'Vary: Origin');
1696 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1711 if (!is_object($hookmanager)) {
1712 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1715 $hookmanager->initHooks(array(
"main"));
1717 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1718 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1720 $contentsecuritypolicy = $hookmanager->resPrint;
1722 $contentsecuritypolicy .= $hookmanager->resPrint;
1725 if (!empty($contentsecuritypolicy)) {
1726 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1729 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1733 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1748 if (!is_object($hookmanager)) {
1749 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1752 $hookmanager->initHooks(array(
"main"));
1754 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1755 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1757 $contentsecuritypolicy = $hookmanager->resPrint;
1759 $contentsecuritypolicy .= $hookmanager->resPrint;
1762 if (!empty($contentsecuritypolicy)) {
1763 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1766 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1773 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1776 header(
"Referrer-Policy: ".$referrerpolicy);
1779 if ($forcenocache) {
1780 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1802function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1804 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1808 if (empty($conf->css)) {
1809 $conf->css =
'/theme/eldy/style.css.php';
1812 print
'<!doctype html>'.
"\n";
1814 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1817 if (empty($disablehead)) {
1818 if (!is_object($hookmanager)) {
1819 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1822 $hookmanager->initHooks(array(
"main"));
1824 $ext =
'layout='.(empty($conf->browser->layout) ?
'' : $conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1828 if (
GETPOST(
'dol_basehref',
'alpha')) {
1829 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1833 print
'<meta charset="utf-8">'.
"\n";
1834 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1835 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1836 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1837 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1838 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1840 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1843 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1844 if (!empty($mysoc->logo_squarred_mini)) {
1845 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1850 if (empty($conf->dol_use_jmobile)) {
1851 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1855 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1856 $parameters = array(
'manifest' => $manifest);
1857 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1859 $manifest = $hookmanager->resPrint;
1861 $manifest .= $hookmanager->resPrint;
1863 if (!empty($manifest)) {
1864 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1869 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1874 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1878 $appli = constant(
'DOL_APPLICATION_TITLE');
1893 $parameters = array(
'title' => $titletoshow);
1894 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1896 $titletoshow = $hookmanager->resPrint;
1898 $titletoshow .= $hookmanager->resPrint;
1907 $ext =
'version='.GETPOSTINT(
'version');
1910 if (
GETPOST(
'dol_resetcache')) {
1911 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1915 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1917 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1918 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1919 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1921 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1922 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1924 if (GETPOSTISSET(
'dol_openinpopup')) {
1925 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1927 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1928 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
1930 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1931 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
1933 if (GETPOSTISSET(
'dol_use_jmobile')) {
1934 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
1935 $conf->dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile');
1937 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1938 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
1940 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1941 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
1945 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1946 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1949 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1950 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1951 $jquerytheme =
'base';
1955 if (constant(
'JS_JQUERY_UI')) {
1956 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1958 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1960 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1961 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1963 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1964 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1965 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1969 if (!defined(
'DISABLE_FONT_AWSOME')) {
1970 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1971 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1972 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1975 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1979 if (!empty($conf->modules_parts[
'theme'])) {
1980 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1983 $themesubdir = $reldir;
1990 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1992 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";
1997 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
1998 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
2002 if (!empty($conf->modules_parts[
'css'])) {
2003 $arraycss = (array) $conf->modules_parts[
'css'];
2004 foreach ($arraycss as $modcss => $filescss) {
2005 $filescss = (array) $filescss;
2006 foreach ($filescss as $cssfile) {
2007 if (empty($cssfile)) {
2008 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
2012 if ($urlforcss && $urlforcss !=
'/') {
2013 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
2015 if (!preg_match(
'/\.css$/i', $cssfile)) {
2020 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
2026 if (is_array($arrayofcss)) {
2027 foreach ($arrayofcss as $cssfile) {
2028 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
2029 $urltofile = $cssfile;
2033 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2035 if (!preg_match(
'/\.css$/i', $cssfile)) {
2045 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2049 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
2051 print
'<!-- Includes JS for JQuery -->'.
"\n";
2052 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2053 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2055 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2057 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2058 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2060 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2063 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2064 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2067 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2068 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2072 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2076 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
2077 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
2078 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2079 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2080 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2081 print
'<script>'.
"\n";
2082 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
2083 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
2084 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
2085 print 'var placeholderInPlace = \
' \';'.
"\n";
2086 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
2087 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
2088 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
2089 print
'var withInPlace = 300;';
2090 print
'</script>'.
"\n";
2091 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2092 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2095 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
2096 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2097 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2099 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2101 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
2102 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2104 if (!defined(
'DISABLE_MULTISELECT')) {
2105 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2109 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
2111 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
2112 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2113 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
2114 $jsckeditor =
'ckeditor.js';
2115 if (constant(
'JS_CKEDITOR')) {
2117 $pathckeditor = constant(
'JS_CKEDITOR');
2119 print
'<script nonce="'.getNonce().
'">';
2120 print
'/* enable ckeditor by main.inc.php */';
2121 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2122 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2123 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2124 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";
2125 print
'</script>'.
"\n";
2126 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2128 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2129 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2131 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2133 print
'</script>'.
"\n";
2137 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2138 $enablebrowsernotif =
false;
2140 $enablebrowsernotif =
true;
2142 if ($conf->browser->layout ==
'phone') {
2143 $enablebrowsernotif =
false;
2145 if ($enablebrowsernotif) {
2146 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2147 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2152 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2153 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2157 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2158 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2162 if (!empty($conf->modules_parts[
'js'])) {
2163 $arrayjs = (array) $conf->modules_parts[
'js'];
2164 foreach ($arrayjs as $modjs => $filesjs) {
2165 $filesjs = (array) $filesjs;
2166 foreach ($filesjs as $jsfile) {
2169 if ($urlforjs && $urlforjs !=
'/') {
2170 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2171 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2173 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2179 if (is_array($arrayofjs)) {
2180 print
'<!-- Includes JS added by page -->'.
"\n";
2181 foreach ($arrayofjs as $jsfile) {
2182 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2183 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2185 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2193 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2194 if (file_exists($theme_js)) {
2195 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2199 if (!empty($head)) {
2206 $parameters = array();
2207 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2208 print $hookmanager->resPrint;
2210 print
"</head>\n\n";
2213 $conf->headerdone = 1;
2233function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2235 global $user, $conf, $langs, $db, $form;
2237 global $hookmanager, $menumanager;
2242 $hookmanager->initHooks(array(
'toprightmenu'));
2247 if (empty($conf->headerdone)) {
2248 $disablenofollow = 0;
2249 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2250 print
'<body id="mainbody">';
2256 if ((empty($conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2257 if (!isset($form) || !is_object($form)) {
2258 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2259 $form =
new Form($db);
2262 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2264 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2267 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2268 $menumanager->atarget = $target;
2269 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2273 $appli = constant(
'DOL_APPLICATION_TITLE');
2276 if (preg_match(
'/\d\.\d/', $appli)) {
2277 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2278 $appli .=
" (".DOL_VERSION.
")";
2281 $appli .=
" ".DOL_VERSION;
2284 $appli .=
" ".DOL_VERSION;
2288 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2292 $logouthtmltext =
'';
2295 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2296 if ($conf->browser->name ==
'chrome') {
2297 $stringforfirstkey .=
' ALT +';
2298 } elseif ($conf->browser->name ==
'firefox') {
2299 $stringforfirstkey .=
' ALT + SHIFT +';
2301 $stringforfirstkey .=
' CTL +';
2303 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2304 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2305 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2306 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle');
2307 $logouttext .=
'</a>';
2309 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2310 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2314 print
'<div class="login_block usedropdown">'.
"\n";
2316 $toprightmenu .=
'<div class="login_block_other">';
2319 $parameters = array();
2320 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2321 if (is_numeric($result)) {
2323 $toprightmenu .= $hookmanager->resPrint;
2325 $toprightmenu = $hookmanager->resPrint;
2328 $toprightmenu .= $result;
2332 if (isModEnabled(
'modulebuilder')) {
2333 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2335 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2338 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2345 if (isset($_POST) && is_array($_POST)) {
2346 foreach ($_POST as $key => $value) {
2347 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2348 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2351 if (!is_array($value)) {
2352 if ($value !==
'') {
2353 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2356 foreach ($value as $value2) {
2357 if (($value2 !==
'') && (!is_array($value2))) {
2358 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2364 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2365 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2367 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2370 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2375 $langs->load(
"help");
2382 if (empty($helppagename)) {
2383 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2385 $helppresent =
'helppresent';
2390 $helpbaseurl = $arrayres[
'helpbaseurl'];
2391 $helppage = $arrayres[
'helppage'];
2392 $mode = $arrayres[
'mode'];
2395 if ($helpbaseurl && $helppage) {
2397 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2398 if ($mode ==
'wiki') {
2399 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2401 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2403 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2406 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2407 if ($mode ==
'wiki') {
2409 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2412 $text .= sprintf($helpbaseurl, $helppage);
2415 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2416 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2419 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2424 $langs->load(
'admin');
2425 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2430 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2432 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2436 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2438 $toprightmenu .=
'</div>';
2442 $toprightmenu .=
'<div class="login_block_user">';
2446 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2464 $toprightmenu .=
'</div>';
2466 $toprightmenu .=
'</div>'.
"\n";
2469 print $toprightmenu;
2476 print
'<div style="clear: both;"></div>';
2477 print
"<!-- End top horizontal menu -->\n\n";
2480 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2481 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2495 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2497 global $menumanager;
2499 $langs->load(
'companies');
2501 $userImage = $userDropDownImage =
'';
2502 if (!empty($user->photo)) {
2503 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2504 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2506 $nophoto =
'/public/theme/common/user_anonymous.png';
2507 if ($user->gender ==
'man') {
2508 $nophoto =
'/public/theme/common/user_man.png';
2510 if ($user->gender ==
'woman') {
2511 $nophoto =
'/public/theme/common/user_woman.png';
2514 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2515 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2519 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2520 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2522 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2524 while ($idprofcursor < 10) {
2526 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2527 if ($idprofcursor == 1) {
2528 $constkeyforprofid =
'MAIN_INFO_SIREN';
2530 if ($idprofcursor == 2) {
2531 $constkeyforprofid =
'MAIN_INFO_SIRET';
2533 if ($idprofcursor == 3) {
2534 $constkeyforprofid =
'MAIN_INFO_APE';
2536 if ($idprofcursor == 4) {
2537 $constkeyforprofid =
'MAIN_INFO_RCS';
2539 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2544 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid), 1).
'</span>';
2548 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2549 if (isModEnabled(
'multicurrency')) {
2550 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2552 $dropdownBody .=
'</div>';
2554 $dropdownBody .=
'<br>';
2555 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2556 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2559 if (!empty($user->admin)) {
2560 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2562 if (!empty($user->socid)) {
2563 $thirdpartystatic =
new Societe($db);
2564 $thirdpartystatic->fetch($user->socid);
2565 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2566 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2568 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2569 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2570 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2571 $dropdownBody .=
'<br>';
2573 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2574 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2576 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2578 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2579 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2580 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2581 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2582 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2584 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2586 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2587 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2588 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2593 $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>';
2594 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2595 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2596 if ($conf->browser->layout ==
'phone') {
2597 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2599 if (!empty($_SESSION[
"disablemodules"])) {
2600 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2602 $dropdownBody .=
'</div>';
2605 $parameters = array(
'user' => $user,
'langs' => $langs);
2606 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2607 if (is_numeric($result)) {
2609 $dropdownBody .= $hookmanager->resPrint;
2611 $dropdownBody = $hookmanager->resPrint;
2615 if (empty($urllogout)) {
2616 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2621 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2622 if ($conf->browser->name ==
'chrome') {
2623 $stringforfirstkey .=
' ALT +';
2624 } elseif ($conf->browser->name ==
'firefox') {
2625 $stringforfirstkey .=
' ALT + SHIFT +';
2627 $stringforfirstkey .=
' CTL +';
2631 $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>';
2632 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2633 $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');
2634 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt padingright"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2636 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2637 if (!empty($user->admin)) {
2638 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2642 $appli = constant(
'DOL_APPLICATION_TITLE');
2645 if (preg_match(
'/\d\.\d/', $appli)) {
2646 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2647 $appli .=
" (".DOL_VERSION.
")";
2650 $appli .=
" ".DOL_VERSION;
2653 $appli .=
" ".DOL_VERSION;
2657 $btnUser =
'<!-- div for user link -->
2658 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2659 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2660 '.$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>' :
'').
'
2662 <div class="dropdown-menu">
2664 <div class="user-header">
2665 '.$userDropDownImage.
'
2667 '.$profilName.
'<br>';
2668 if ($user->datelastlogin) {
2669 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2670 if ($user->datepreviouslogin) {
2671 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2674 $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>';
2675 if ($user->datepreviouslogin) {
2676 $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>';
2684 <!-- Menu Body user-->
2685 <div class="user-body">'.$dropdownBody.
'</div>
2688 <div class="user-footer">
2689 <div class="pull-left">
2692 <div class="pull-left">
2693 '.$virtuelcardLink.
'
2695 <div class="pull-right">
2698 <div class="clearboth"></div>
2704 $btnUser =
'<!-- div for user link text browser -->
2705 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2706 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2707 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2712 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2714 <!-- Code to show/hide the user drop-down -->
2716 function closeTopMenuLoginDropdown() {
2717 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2719 jQuery("#topmenu-login-dropdown").removeClass("open");
2721 jQuery(document).ready(function() {
2722 jQuery(document).on("click", function(event) {
2723 // console.log("Click somewhere on screen");
2724 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2725 closeTopMenuLoginDropdown();
2733 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2734 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2735 event.preventDefault();
2736 jQuery("#topmenu-login-dropdown").toggleClass("open");
2739 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2740 console.log("Click on #topmenulogincompanyinfo-btn");
2741 jQuery("#topmenulogincompanyinfo").slideToggle();
2744 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2745 console.log("Click on #topmenuloginmoreinfo-btn");
2746 jQuery("#topmenuloginmoreinfo").slideToggle();
2766 global $conf, $langs;
2777 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2778 if ($conf->browser->os ===
'macintosh') {
2779 $stringforfirstkey .=
' CTL +';
2781 if ($conf->browser->name ==
'chrome') {
2782 $stringforfirstkey .=
' ALT +';
2783 } elseif ($conf->browser->name ==
'firefox') {
2784 $stringforfirstkey .=
' ALT + SHIFT +';
2786 $stringforfirstkey .=
' CTL +';
2790 if (!empty($conf->use_javascript_ajax)) {
2791 $html .=
'<!-- div for quick add link -->
2792 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2793 <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>
2796 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2798 <!-- Code to show/hide the user drop-down for the quick add -->
2800 jQuery(document).ready(function() {
2801 jQuery(document).on("click", function(event) {
2802 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2804 $("#topmenu-quickadd-dropdown").removeClass("open");
2807 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2808 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2809 openQuickAddDropDown(event);
2813 $(document).keydown(function(event){
2814 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2815 if (ostype ===
"macintosh") {
2816 if ( event.which === 65 && event.ctrlKey ) {
2817 console.log(\
'control + a : trigger open quick add dropdown\');
2818 openQuickAddDropDown(event);
2821 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2822 console.log(\'control + shift + a : trigger open quick add dropdown\');
2823 openQuickAddDropDown(event);
2828 var openQuickAddDropDown = function(event) {
2829 event.preventDefault();
2830 $("#topmenu-quickadd-dropdown").toggleClass("open");
2831 //$("#top-quickadd-search-input").focus();
2849 global $user, $langs, $hookmanager;
2854 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2855 "title" =>
"MenuNewMember@members",
2856 "name" =>
"Adherent@members",
2857 "picto" =>
"object_member",
2858 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
2862 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2863 "title" =>
"MenuNewThirdParty@companies",
2864 "name" =>
"ThirdParty@companies",
2865 "picto" =>
"object_company",
2866 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2870 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2871 "title" =>
"NewContactAddress@companies",
2872 "name" =>
"Contact@companies",
2873 "picto" =>
"object_contact",
2874 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2878 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2879 "title" =>
"NewPropal@propal",
2880 "name" =>
"Proposal@propal",
2881 "picto" =>
"object_propal",
2882 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2887 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2888 "title" =>
"NewOrder@orders",
2889 "name" =>
"Order@orders",
2890 "picto" =>
"object_order",
2891 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
2895 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2896 "title" =>
"NewBill@bills",
2897 "name" =>
"Bill@bills",
2898 "picto" =>
"object_bill",
2899 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
2903 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2904 "title" =>
"NewContractSubscription@contracts",
2905 "name" =>
"Contract@contracts",
2906 "picto" =>
"object_contract",
2907 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
2911 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2912 "title" =>
"SupplierProposalNew@supplier_proposal",
2913 "name" =>
"SupplierProposal@supplier_proposal",
2914 "picto" =>
"supplier_proposal",
2915 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2919 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2920 "title" =>
"NewSupplierOrderShort@orders",
2921 "name" =>
"SupplierOrder@orders",
2922 "picto" =>
"supplier_order",
2923 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2927 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2928 "title" =>
"NewBill@bills",
2929 "name" =>
"SupplierBill@bills",
2930 "picto" =>
"supplier_invoice",
2931 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2935 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2936 "title" =>
"NewTicket@ticket",
2937 "name" =>
"Ticket@ticket",
2938 "picto" =>
"ticket",
2939 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2943 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2944 "title" =>
"NewIntervention@interventions",
2945 "name" =>
"Intervention@interventions",
2946 "picto" =>
"intervention",
2947 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
2951 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2952 "title" =>
"NewProduct@products",
2953 "name" =>
"Product@products",
2954 "picto" =>
"object_product",
2955 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2959 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2960 "title" =>
"NewService@products",
2961 "name" =>
"Service@products",
2962 "picto" =>
"object_service",
2963 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2967 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2968 "title" =>
"AddUser@users",
2969 "name" =>
"User@users",
2971 "activation" => $user->hasRight(
"user",
"user",
"write"),
2977 $dropDownQuickAddHtml =
'';
2980 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2981 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2984 $parameters = array();
2985 $hook_items = $items;
2986 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2987 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2988 if ($reshook == 0) {
2989 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2991 $items = $hookmanager->resArray;
2995 $position = array();
2996 foreach ($items[
'items'] as $key => $row) {
2997 $position[$key] = $row[
'position'];
2999 $array1_sort_order = SORT_ASC;
3000 array_multisort($position, $array1_sort_order, $items[
'items']);
3003 foreach ($items[
'items'] as $item) {
3004 if (!$item[
'activation']) {
3007 $langs->load(explode(
'@', $item[
'title'])[1]);
3008 $langs->load(explode(
'@', $item[
'name'])[1]);
3009 $dropDownQuickAddHtml .=
'
3010 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3011 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3015 $dropDownQuickAddHtml .=
'</div>';
3016 $dropDownQuickAddHtml .=
'</div>';
3018 return $dropDownQuickAddHtml;
3028 global $langs, $conf, $db, $user;
3033 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3039 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3040 if ($conf->browser->os ===
'macintosh') {
3041 $stringforfirstkey .=
' CTL +';
3043 if ($conf->browser->name ==
'chrome') {
3044 $stringforfirstkey .=
' ALT +';
3045 } elseif ($conf->browser->name ==
'firefox') {
3046 $stringforfirstkey .=
' ALT + SHIFT +';
3048 $stringforfirstkey .=
' CTL +';
3052 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
3053 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3054 $langs->load(
"bookmarks");
3057 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3061 $html .=
'<!-- div for bookmark link -->
3062 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3063 <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>
3064 <div class="dropdown-menu">
3070 <!-- Code to show/hide the bookmark drop-down -->
3072 jQuery(document).ready(function() {
3073 jQuery(document).on("click", function(event) {
3074 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3075 //console.log("close bookmark dropdown - we click outside");
3077 $("#topmenu-bookmark-dropdown").removeClass("open");
3081 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3082 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3083 openBookMarkDropDown(event);
3087 jQuery(document).keydown(function(event) {
3088 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
3089 if (ostype ===
"macintosh") {
3090 if ( event.which === 66 && event.ctrlKey ) {
3091 console.log(
"Click on control + b : trigger open bookmark dropdown");
3092 openBookMarkDropDown(event);
3095 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3096 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3097 openBookMarkDropDown(event);
3102 var openBookMarkDropDown =
function(event) {
3103 event.preventDefault();
3104 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3105 jQuery(
"#top-bookmark-search-input").focus();
3121function top_menu_search()
3123 global $langs, $conf, $db, $user, $hookmanager;
3128 $arrayresult = array();
3129 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3131 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3132 // accesskey is for Mac: CTRL + key for all browsers
3133 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3134 if ($conf->browser->name == 'chrome
') {
3135 $stringforfirstkey .= ' ALT +
';
3136 } elseif ($conf->browser->name == 'firefox
') {
3137 $stringforfirstkey .= ' ALT + SHIFT +
';
3139 $stringforfirstkey .= ' CTL +
';
3142 $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">
';
3144 $defaultAction = '';
3145 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3146 // Menu with all searchable items
3147 foreach ($arrayresult as $keyItem => $item) {
3148 if (empty($defaultAction)) {
3149 $defaultAction = $item['url
'];
3151 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3152 $buttonList .= $item['text
'];
3153 $buttonList .= '</
button>
';
3155 $buttonList .= '</div>
';
3157 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3160 <!-- search input -->
3161 <div
class=
"dropdown-header search-dropdown-header">
3167 <!--
Menu Body search -->
3168 <div
class=
"dropdown-body search-dropdown-body">
3173 $dropDownHtml .= '</form>
';
3175 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3176 // accesskey is for Mac: CTRL + key for all browsers
3177 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3178 if ($conf->browser->name == 'chrome
') {
3179 $stringforfirstkey .= ' ALT +
';
3180 } elseif ($conf->browser->name == 'firefox
') {
3181 $stringforfirstkey .= ' ALT + SHIFT +
';
3183 $stringforfirstkey .= ' CTL +
';
3186 $html .= '<!-- div
for Global Search -->
3187 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3188 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3189 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3191 <div
class=
"dropdown-menu dropdown-search">
3197 <!-- Code to show/hide the
user drop-down -->
3199 jQuery(document).ready(
function() {
3202 jQuery(
"#top-global-search-input").keydown(
function (e) {
3203 if (e.keyCode == 13 || e.keyCode == 40) {
3204 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3205 if (inputs[inputs.index(this) + 1] != null) {
3206 inputs[inputs.index(this) + 1].focus();
3207 if (e.keyCode == 13){
3208 inputs[inputs.index(this) + 1].trigger(
"click");
3218 jQuery(document).keydown(
function(e) {
3220 var $focused = $(
":focus");
3221 if($focused.length && $focused.hasClass(
"global-search-item")){
3224 if (e.keyCode == 38) {
3226 $focused.prev().focus();
3230 if (e.keyCode == 40) {
3232 $focused.next().focus();
3239 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3240 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3241 jQuery(
"#top-menu-action-search").submit();
3245 jQuery(document).on(
"click",
function(event) {
3246 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3247 console.log(
"click close search - we click outside");
3249 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3254 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3255 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3256 openGlobalSearchDropDown();
3260 jQuery(document).keydown(
function(e){
3261 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3262 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3263 openGlobalSearchDropDown();
3265 if ( e.which === 70 && e.alKey ) {
3266 console.log(\'alt + f : trigger open global-search dropdown\');
3267 openGlobalSearchDropDown();
3271 var openGlobalSearchDropDown = function() {
3272 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3273 jQuery("#top-global-search-input").focus();
3297function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3299 global $user, $conf, $langs, $db, $form;
3300 global $hookmanager, $menumanager;
3304 if (!empty($menu_array_before)) {
3305 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);
3308 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3310 $hookmanager->initHooks(array(
'leftblock'));
3312 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3315 if (!is_object($form)) {
3316 $form =
new Form($db);
3321 if ($conf->browser->layout ==
'phone') {
3322 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3326 $arrayresult = array();
3327 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3332 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3333 if ($conf->browser->name ==
'chrome') {
3334 $stringforfirstkey .=
' ALT +';
3335 } elseif ($conf->browser->name ==
'firefox') {
3336 $stringforfirstkey .=
' ALT + SHIFT +';
3338 $stringforfirstkey .=
' CTL +';
3342 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3343 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (!
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 1 : 0),
'vmenusearchselectcombo', 1, $textsearch, 1, $stringforfirstkey.
' s');
3345 if (is_array($arrayresult)) {
3346 foreach ($arrayresult as $key => $val) {
3347 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3353 $parameters = array(
'searchform' => $searchform);
3354 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3355 if (empty($reshook)) {
3356 $searchform .= $hookmanager->resPrint;
3358 $searchform = $hookmanager->resPrint;
3362 if (
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') || empty($conf->use_javascript_ajax)) {
3363 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3364 $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>';
3365 } elseif ($conf->use_javascript_ajax &&
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3366 $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>';
3367 $searchform .=
'<script>
3368 jQuery(document).ready(function () {
3369 jQuery("#divsearchforms1").click(function(){
3370 jQuery("#divsearchforms2").toggle();
3374 $searchform .=
'</div>';
3378 $searchform .=
'<script>
3379 jQuery(document).keydown(function(e){
3380 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3381 console.log(\'control + shift + f : trigger open global-search dropdown\');
3382 openGlobalSearchDropDown();
3384 if( (e.which === 83 || e.which === 115) && e.altKey ){
3385 console.log(\'alt + s : trigger open global-search dropdown\');
3386 openGlobalSearchDropDown();
3390 var openGlobalSearchDropDown = function() {
3391 jQuery("#searchselectcombo").select2(\'open\');
3397 print
'<!-- Begin left menu -->'.
"\n";
3399 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3402 $menumanager->menu_array = $menu_array_before;
3403 $menumanager->menu_array_after = $menu_array_after;
3404 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3408 print
"<!-- Begin Help Block-->\n";
3409 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3413 $doliurl =
'https://www.dolibarr.org';
3415 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3416 $doliurl =
'https://www.dolibarr.fr';
3418 if (preg_match(
'/es/i', $langs->defaultlang)) {
3419 $doliurl =
'https://www.dolibarr.es';
3421 if (preg_match(
'/de/i', $langs->defaultlang)) {
3422 $doliurl =
'https://www.dolibarr.de';
3424 if (preg_match(
'/it/i', $langs->defaultlang)) {
3425 $doliurl =
'https://www.dolibarr.it';
3427 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3428 $doliurl =
'https://www.dolibarr.gr';
3431 $appli = constant(
'DOL_APPLICATION_TITLE');
3435 if (preg_match(
'/\d\.\d/', $appli)) {
3436 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3437 $appli .=
" (".DOL_VERSION.
")";
3440 $appli .=
" ".DOL_VERSION;
3443 $appli .=
" ".DOL_VERSION;
3445 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3447 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3449 print
'<span class="help">';
3457 print
'</div>'.
"\n";
3462 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3465 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3466 $bugbaseurl .=
'&title=';
3467 $bugbaseurl .= urlencode(
"Bug: ");
3468 $bugbaseurl .=
'&body=';
3469 $bugbaseurl .= urlencode(
"# Instructions\n");
3470 $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");
3471 $bugbaseurl .= urlencode(
"*Please:*\n");
3472 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3473 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3474 $bugbaseurl .= urlencode(
"\n");
3475 $bugbaseurl .= urlencode(
"\n");
3476 $bugbaseurl .= urlencode(
"# Bug\n");
3477 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3478 $bugbaseurl .= urlencode(
"\n");
3479 $bugbaseurl .= urlencode(
"## Environment\n");
3480 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3481 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3482 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3483 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3484 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3485 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3486 $bugbaseurl .= urlencode(
"\n");
3487 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3488 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3489 $bugbaseurl .= urlencode(
"\n");
3490 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3491 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3492 $bugbaseurl .= urlencode(
"\n");
3493 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3494 $bugbaseurl .= urlencode(
"[*Files*]\n");
3495 $bugbaseurl .= urlencode(
"\n");
3497 $bugbaseurl .= urlencode(
"\n");
3498 $bugbaseurl .= urlencode(
"## Report\n");
3506 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3507 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3508 if (empty($reshook)) {
3509 $bugbaseurl .= $hookmanager->resPrint;
3511 $bugbaseurl = $hookmanager->resPrint;
3514 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3515 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3520 print
"<!-- End Help Block-->\n";
3524 print
"<!-- End left menu -->\n";
3528 $parameters = array();
3529 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3530 print $hookmanager->resPrint;
3532 print
'</div></div> <!-- End side-nav id-left -->';
3536 print
'<!-- Begin right area -->'.
"\n";
3538 if (empty($leftmenuwithoutmainarea)) {
3552 global $conf, $langs, $hookmanager;
3554 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3555 print
'<div id="id-right">';
3560 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3562 $hookmanager->initHooks(array(
'main'));
3563 $parameters = array();
3564 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3565 print $hookmanager->resPrint;
3568 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0, 1,
'warning maintenancemode');
3573 $parameters = array();
3574 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3575 if (empty($reshook)) {
3576 print
'<!-- Begin show mysoc info header -->'.
"\n";
3577 print
'<div id="mysoc-info-header">'.
"\n";
3578 print
'<table class="centpercent div-table-responsive">'.
"\n";
3580 print
'<tr><td rowspan="0" class="width20p">';
3582 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'))).
'">';
3584 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3585 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3597 print
'</table>'.
"\n";
3598 print
'</div>'.
"\n";
3599 print
'<!-- End show mysoc info header -->'.
"\n";
3618 if (preg_match(
'/^http/i', $helppagename)) {
3620 $helpbaseurl =
'%s';
3621 $helppage = $helppagename;
3626 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3627 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3628 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3629 $helppage = $reg[1];
3632 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3633 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3634 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3635 $helppage = $reg[1];
3638 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3639 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3640 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3641 $helppage = $reg[1];
3644 if (empty($helppage)) {
3645 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3646 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3647 $helppage = $reg[1];
3652 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3672function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3674 global $langs, $user;
3677 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3678 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3679 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3680 if ($showtitlebefore) {
3681 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3683 $ret .=
'<div class="tagtd">';
3684 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3685 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3686 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3687 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3688 $ret .=
' placeholder="'.strip_tags($title).
'"';
3689 $ret .= ($autofocus ?
' autofocus' :
'');
3690 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3691 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3692 $ret .=
'<span class="fa fa-search"></span>';
3693 $ret .=
'</button>';
3695 $ret .=
"</form>\n";
3700if (!function_exists(
"llxFooter")) {
3711 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3713 global $conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3714 global $delayedhtmlcontent;
3715 global $contextpage, $page, $limit, $mode;
3716 global $dolibarr_distrib;
3718 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3722 $parameters = array();
3723 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3724 if (empty($reshook)) {
3725 $llxfooter .= $hookmanager->resPrint;
3726 } elseif ($reshook > 0) {
3727 $llxfooter = $hookmanager->resPrint;
3738 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3740 foreach ($user->lastsearch_values_tmp as $key => $val) {
3741 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3742 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3743 if (empty($val[
'sortfield'])) {
3744 unset($val[
'sortfield']);
3746 if (empty($val[
'sortorder'])) {
3747 unset($val[
'sortorder']);
3749 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3750 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3751 unset($_SESSION[
'lastsearch_values_'.$key]);
3757 $relativepathstring = $_SERVER[
"PHP_SELF"];
3759 if (constant(
'DOL_URL_ROOT')) {
3760 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3762 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3763 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3764 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3765 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3766 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3767 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3768 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3770 if (!empty($contextpage)) {
3771 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3773 if (!empty($page) && $page > 0) {
3774 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3776 if (!empty($limit) && $limit != $conf->liste_limit) {
3777 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3779 if (!empty($mode)) {
3780 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3783 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3784 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3785 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3786 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3792 if ($conf->use_javascript_ajax) {
3793 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3794 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3797 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3798 print
'<div class="error">'.$msg.
'</div>';
3806 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3808 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3809 print
'</div> <!-- End div id-right -->'.
"\n";
3812 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3813 print
'</div> <!-- End div id-container -->'.
"\n";
3818 print
'<!-- '.$comment.
' -->'.
"\n";
3823 if (!empty($delayedhtmlcontent)) {
3824 print $delayedhtmlcontent;
3827 if (!empty($conf->use_javascript_ajax)) {
3828 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3829 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3834 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3835 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3838 jQuery(document).ready(
function () {
3839 $(
'a.documentpreview').click(
function() {
3840 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
3841 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3844 , element:
'<?php echo dol_escape_js($object->element) ?>'
3845 , action:
'DOC_PREVIEW'
3846 , token:
'<?php echo currentToken(); ?>'
3850 $(
'a.documentdownload').click(
function() {
3851 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
3852 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3855 , element:
'<?php echo dol_escape_js($object->element) ?>'
3856 , action:
'DOC_DOWNLOAD'
3857 , token:
'<?php echo currentToken(); ?>'
3868 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3869 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3873 $forceping =
GETPOST(
'forceping',
'alpha');
3874 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3876 $hash_unique_id =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256');
3879 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && (
getDolGlobalString(
'MAIN_FIRST_PING_OK_ID') !=
'disabled'))
3882 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3883 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3884 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3888 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
3890 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3892 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";
3893 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3894 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
3896 $distrib =
'standard';
3897 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3898 $distrib =
'doliwamp';
3900 if (!empty($dolibarr_distrib)) {
3901 $distrib = $dolibarr_distrib;
3905 jQuery(document).ready(
function (tmp) {
3906 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
3909 url:
"<?php echo $url_for_ping ?>",
3913 hash_algo:
'dol_hash-sha256',
3914 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3915 action:
'dolibarrping',
3916 version:
'<?php echo (float) DOL_VERSION; ?>',
3917 entity:
'<?php echo (int) $conf->entity; ?>',
3918 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3919 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3920 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3921 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3922 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
3923 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3924 token:
'notrequired'
3926 success:
function (data,
status, xhr) {
3927 console.log(
"Ping ok");
3930 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3933 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3936 error:
function (data,
status,xhr) {
3937 console.log(
"Ping ko: " + data);
3940 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3943 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3953 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3954 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3956 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3961 $parameters = array();
3962 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
3964 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays).
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
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()
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
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-...
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.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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 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_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.
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.
printDropdownQuickadd()
Generate list of quickadd items.
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 $dolibarr_main_demo
$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)
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.