46if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
47 list($usec, $sec) = explode(
" ", microtime());
48 $micro_start_time = ((float) $usec + (
float) $sec);
51 if (defined(
'XDEBUGCOVERAGE')) {
52 xdebug_start_code_coverage();
64 $arrayofcommonemoji = array(
65 'misc' => array(
'2600',
'26FF'),
66 'ding' => array(
'2700',
'27BF'),
67 '????' => array(
'9989',
'9989'),
68 'vars' => array(
'FE00',
'FE0F'),
69 'pict' => array(
'1F300',
'1F5FF'),
70 'emot' => array(
'1F600',
'1F64F'),
71 'tran' => array(
'1F680',
'1F6FF'),
72 'flag' => array(
'1F1E0',
'1F1FF'),
73 'supp' => array(
'1F900',
'1F9FF'),
76 return $arrayofcommonemoji;
88 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
91 if (preg_match(
'/^x/i', $newstringnumentity)) {
92 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
94 $newstringnumentity = (int) $newstringnumentity;
98 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
99 return chr((
int) $newstringnumentity);
104 foreach ($arrayofemojis as $valarray) {
105 if ($newstringnumentity >= hexdec($valarray[0]) && $newstringnumentity <= hexdec($valarray[1])) {
107 return html_entity_decode($matches[0], ENT_COMPAT | ENT_HTML5,
'UTF-8');
111 return '&#'.$matches[1];
135 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
137 $val = preg_replace_callback(
138 '/&#(x?[0-9][0-9a-f]+;?)/i',
143 static function ($m) {
151 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
152 $val = preg_replace(
'/[\r\n\t]/',
'', $val);
153 }
while ($oldval != $val);
164 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
167 if ($newval != $val) {
174 if ($type == 1 || $type == 3) {
176 $inj += preg_match(
'/delete\s*from/i', $val);
177 $inj += preg_match(
'/create\s*table/i', $val);
178 $inj += preg_match(
'/insert\s*into/i', $val);
179 $inj += preg_match(
'/select\s*from/i', $val);
180 $inj += preg_match(
'/into\s*(outfile|dumpfile)/i', $val);
181 $inj += preg_match(
'/user\s*\(/i', $val);
182 $inj += preg_match(
'/information_schema/i', $val);
183 $inj += preg_match(
'/<svg/i', $val);
184 $inj += preg_match(
'/update[^&=\w].*set.+=/i', $val);
185 $inj += preg_match(
'/union.+select/i', $val);
189 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s*by|concat|count|from|union/i', $val);
192 $inj += preg_match(
'/updatexml\(/i', $val);
193 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
194 $inj += preg_match(
'/\s@@/', $val);
197 $inj += preg_match(
'/<\/textarea/i', $val);
203 $inj += preg_match(
'/<audio/i', $val);
204 $inj += preg_match(
'/<embed/i', $val);
205 $inj += preg_match(
'/<iframe/i', $val);
206 $inj += preg_match(
'/<object/i', $val);
207 $inj += preg_match(
'/<script/i', $val);
208 $inj += preg_match(
'/Set\.constructor/i', $val);
209 if (!defined(
'NOSTYLECHECK')) {
210 $inj += preg_match(
'/<style/i', $val);
212 $inj += preg_match(
'/base\s+href/si', $val);
213 $inj += preg_match(
'/=data:/si', $val);
216 $inj += preg_match(
'/on(mouse|content|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $val);
217 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $val);
218 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $val);
219 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $val);
220 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $val);
221 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $val);
223 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $val);
227 $tmpval = preg_replace(
'/<[^<]*>/',
'', $val);
230 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $tmpval);
231 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $tmpval);
232 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $tmpval);
233 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $tmpval);
234 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $tmpval);
235 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $tmpval);
237 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $tmpval);
240 $inj += preg_match(
'/:|:|:/i', $val);
241 $inj += preg_match(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i', $val);
242 $inj += preg_match(
'/vbscript\s*:/i', $val);
244 if ($type == 1 || $type == 3) {
245 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
246 $inj += preg_match(
'/"/i', $val);
249 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
265 if (is_array($var)) {
266 foreach ($var as $key => $value) {
268 if ($type === 0 && defined(
'NOSCANPOSTFORINJECTION') && is_array(constant(
'NOSCANPOSTFORINJECTION')) && in_array($key, constant(
'NOSCANPOSTFORINJECTION'))) {
275 http_response_code(403);
278 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
281 $errormessage =
'Access refused to '.htmlentities($ip, ENT_COMPAT,
'UTF-8').
' by SQL or Script injection protection in main.inc.php:analyseVarsForSqlAndScriptsInjection type='.htmlentities((
string) $type, ENT_COMPAT,
'UTF-8');
284 $errormessage2 =
'page='.htmlentities((empty($_SERVER[
"REQUEST_URI"]) ?
'' : $_SERVER[
"REQUEST_URI"]), ENT_COMPAT,
'UTF-8');
285 $errormessage2 .=
' paramtype='.htmlentities((
string) $type, ENT_COMPAT,
'UTF-8');
286 $errormessage2 .=
' paramkey='.htmlentities($key, ENT_COMPAT,
'UTF-8');
287 $errormessage2 .=
' paramvalue='.htmlentities($value, ENT_COMPAT,
'UTF-8');
291 print
'Try to go back, fix data of your form and resubmit it. You can contact also your technical support.';
293 print
"\n".
'<!--'.
"\n";
294 print $errormessage2;
298 if (function_exists(
'error_log')) {
299 error_log($errormessage.
' '.substr($errormessage2, 2000));
306 if (class_exists(
'PHPUnit\Framework\TestSuite')) {
307 $message = $errormessage.
' '.substr($errormessage2, 2000);
308 throw new Exception(
"Security injection exception: $message");
328if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
329 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
332if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
333 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
338if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
339 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
343if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
347 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
351if (!defined(
'NOSCANPOSTFORINJECTION') || is_array(constant(
'NOSCANPOSTFORINJECTION'))) {
356if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
357 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
361require_once
'filefunc.inc.php';
374if (
GETPOST(
"DOL_AUTOSET_COOKIE")) {
375 $tmpautoset = explode(
':',
GETPOST(
"DOL_AUTOSET_COOKIE"), 2);
376 $tmplist = explode(
',', $tmpautoset[1]);
377 $cookiearrayvalue = array();
378 foreach ($tmplist as $tmpkey) {
379 $postkey = $tmpautoset[0].
'_'.$tmpkey;
382 $cookiearrayvalue[$tmpkey] =
GETPOST($postkey);
385 $cookiename = $tmpautoset[0];
386 $cookievalue = json_encode($cookiearrayvalue);
388 if (PHP_VERSION_ID < 70300) {
389 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
392 $cookieparams = array(
393 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
396 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
400 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
402 if (empty($cookievalue)) {
403 unset($_COOKIE[$cookiename]);
409if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
410 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
416$prefix = dol_getprefix(
'');
417$sessionname =
'DOLSESSID_'.$prefix;
418$sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
419if (!empty($_COOKIE[$sessiontimeout])) {
420 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
425if (!defined(
'NOSESSION')) {
426 if (PHP_VERSION_ID < 70300) {
427 session_set_cookie_params(0,
'/',
null, !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
true);
430 $sessioncookieparams = array(
434 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() ===
false),
438 session_set_cookie_params($sessioncookieparams);
440 session_name($sessionname);
447require_once
'master.inc.php';
455 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
457 } elseif (isset($_POST[
"username"]) && in_array($_POST[
"username"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
459 } elseif (defined(
'NOREQUIREDB')) {
461 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
463 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
467 if (session_id() && isset($_SESSION[
"dol_login"]) && !in_array($_SESSION[
"dol_login"], explode(
';',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')))) {
468 print
'Sorry, your application is offline.'.
"\n";
469 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
470 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
471 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
473 print
'Sorry, your application is offline. Only administrator users (' . str_replace(
';',
', ',
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')).
') is allowed to connect for the moment.'.
"\n";
474 $nexturl = DOL_URL_ROOT.
'/';
475 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
483register_shutdown_function(
'dol_shutdown');
486if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
488 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
490 $renderer = $debugbar->getJavascriptRenderer();
492 $conf->global->MAIN_HTML_HEADER =
'';
494 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
496 '@phan-var-force array{time:DebugBar\DataCollector\TimeDataCollector} $debugbar';
497 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
501if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
503 $conf->browser->name = $tmp[
'browsername'];
504 $conf->browser->os = $tmp[
'browseros'];
505 $conf->browser->version = $tmp[
'browserversion'];
506 $conf->browser->ua = $tmp[
'browserua'];
507 $conf->browser->layout = $tmp[
'layout'];
510 if (
$conf->browser->layout ==
'phone') {
511 $conf->dol_no_mouse_hover = 1;
518 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
522if (
GETPOSTINT(
'textbrowser') || (!empty(
$conf->browser->name) &&
$conf->browser->name ==
'textbrowser')) {
523 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 2;
528if (!empty(
$conf->file->main_force_https) && !
isHTTPS() && !defined(
'NOHTTPSREDIRECT')) {
530 if (is_numeric(
$conf->file->main_force_https)) {
531 if (
$conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
532 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
533 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
538 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
542 $newurl =
$conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
547 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
548 header(
"Location: ".$newurl);
551 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);
555if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
556 $listofip = explode(
',', $dolibarr_main_restrict_ip);
558 foreach ($listofip as $ip) {
560 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
566 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
572if (!defined(
'NOREQUIREHTML')) {
573 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
575if (!defined(
'NOREQUIREAJAX')) {
576 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
581 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
582 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
586$checkifupgraderequired =
false;
588 $checkifupgraderequired =
true;
591 $checkifupgraderequired =
true;
593if ($checkifupgraderequired) {
595 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
596 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
597 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
598 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
600 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
602 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
603 if (php_sapi_name() ===
"cli") {
604 print
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Try to run upgrade process.\n";
606 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
614if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
616 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
618 if (isset($_SESSION[
'newtoken'])) {
619 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
622 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
626 $token =
dol_hash(uniqid((
string) mt_rand(),
false),
'md5');
627 $_SESSION[
'newtoken'] = $token;
628 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
636if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
637 $tmpaction =
GETPOST(
'action',
'aZ09');
639 $sensitiveget =
false;
640 if ((GETPOSTISSET(
'massaction') || $tmpaction) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
643 if (GETPOSTISSET(
'massaction') || (strpos($tmpaction,
'display') !== 0 && !in_array($tmpaction, array(
'create',
'create2',
'createsite',
'createcard',
'edit',
'editcontract',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'reconcile',
'specimen')))) {
644 $sensitiveget =
true;
648 $arrayofactiontoforcetokencheck = array(
650 'doprev',
'donext',
'dvprev',
'dvnext',
651 'freezone',
'install',
654 if (in_array($tmpaction, $arrayofactiontoforcetokencheck)) {
655 $sensitiveget =
true;
658 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', $tmpaction)) {
659 $sensitiveget =
true;
666 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
668 GETPOSTISSET(
'massaction') ||
669 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
672 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
675 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
676 $langs->loadLangs(array(
"errors",
"install"));
677 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
678 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
680 http_response_code(403);
681 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
682 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);
683 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";
685 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);
686 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";
687 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";
691 print
" into setup).\n";
698 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
700 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
701 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);
704 if (!defined(
'NOTOKENRENEWAL')) {
706 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
709 if (isset($_POST[
'id'])) {
710 $savid = ((int) $_POST[
'id']);
713 unset($_GET[
'confirm']);
714 unset($_GET[
'action']);
715 unset($_GET[
'confirmmassaction']);
716 unset($_GET[
'massaction']);
717 unset($_GET[
'token']);
719 $_POST[
'id'] = ((int) $savid);
722 $_GET[
'errorcode'] =
'InvalidToken';
729if (GETPOSTISSET(
'disablemodules')) {
730 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
732if (!empty($_SESSION[
"disablemodules"])) {
733 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal',
'websitetemplates');
735 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
736 foreach ($disabled_modules as $module) {
738 if (empty(
$conf->$module)) {
742 $conf->$module->enabled =
false;
743 unset(
$conf->modules[$module]);
745 foreach ($modulepartkeys as $modulepartkey) {
746 unset(
$conf->modules_parts[$modulepartkey][$module]);
748 if ($module ==
'fournisseur') {
749 $conf->supplier_order->enabled = 0;
750 $conf->supplier_invoice->enabled = 0;
751 unset(
$conf->modules[
'supplier_order']);
752 unset(
$conf->modules[
'supplier_invoice']);
759$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
760if (is_array($modulepart) && count($modulepart) > 0) {
761 foreach (
$conf->modules as $module) {
762 if (in_array($module, $modulepart)) {
763 $modulepart = $module;
768if (is_array($modulepart)) {
779if (!defined(
'NOLOGIN')) {
783 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
784 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
787 if (empty($dolibarr_main_authentication)) {
788 $dolibarr_main_authentication =
'dolibarr';
791 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
792 $dolibarr_auto_user =
'auto';
796 $authmode = explode(
',', $dolibarr_main_authentication);
799 if (!count($authmode)) {
800 $langs->load(
'main');
801 dol_print_error(
null, $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
808 $resultFetchUser =
'';
810 $dol_authmode =
null;
812 if (!isset($_SESSION[
"dol_login"])) {
814 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
816 $dol_dst_observed =
GETPOSTINT(
"dst_observed", 3);
818 $dol_dst_second =
GETPOSTINT(
"dst_second", 3);
819 $dol_screenwidth =
GETPOSTINT(
"screenwidth", 3);
820 $dol_screenheight =
GETPOSTINT(
"screenheight", 3);
821 $dol_hide_topmenu =
GETPOSTINT(
'dol_hide_topmenu', 3);
822 $dol_hide_leftmenu =
GETPOSTINT(
'dol_hide_leftmenu', 3);
823 $dol_optimize_smallscreen =
GETPOSTINT(
'dol_optimize_smallscreen', 3);
824 $dol_no_mouse_hover =
GETPOSTINT(
'dol_no_mouse_hover', 3);
825 $dol_use_jmobile =
GETPOSTINT(
'dol_use_jmobile', 3);
828 if (!empty($dolibarr_main_demo) && $_SERVER[
'PHP_SELF'] == DOL_URL_ROOT.
'/index.php') {
829 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
830 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFERER']).
")");
832 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
833 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
834 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
835 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
836 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
837 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
838 header(
"Location: ".$url);
845 $hookmanager->initHooks(array(
'login'));
846 $parameters = array();
847 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
854 if ($test &&
GETPOST(
'actionlogin',
'aZ09') ==
'login' &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
858 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
862 $dirModCaptcha = array_merge(array(
'main' =>
'/core/modules/security/captcha/'), isset(
$conf->modules_parts[
'captcha']) && is_array(
$conf->modules_parts[
'captcha']) ?
$conf->modules_parts[
'captcha'] : array());
863 $fullpathclassfile =
'';
864 foreach ($dirModCaptcha as $dir) {
865 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
866 if ($fullpathclassfile) {
872 if ($fullpathclassfile) {
873 include_once $fullpathclassfile;
877 $classname =
"modCaptcha".ucfirst($captcha);
878 if (class_exists($classname)) {
880 $captchaobj =
new $classname($db,
$conf, $langs, $user);
881 '@phan-var-force ModeleCaptcha $captchaobj';
883 if (is_object($captchaobj) && method_exists($captchaobj,
'validateCodeAfterLoginSubmit')) {
884 $ok = $captchaobj->validateCodeAfterLoginSubmit();
886 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method validateCodeAfterLoginSubmit()';
891 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler class '.$classname.
' was not found after the include';
896 $_SESSION[
"dol_loginmesg"] =
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
903 dol_syslog(
'Bad value for code, connection refused', LOG_NOTICE);
905 $langs->loadLangs(array(
'main',
'errors'));
907 $_SESSION[
"dol_loginmesg"] = (empty($_SESSION[
"dol_loginmesg"]) ?
"" : $_SESSION[
"dol_loginmesg"].
"<br>\n").$langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
911 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
914 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
922 $hookmanager->initHooks(array(
'login'));
923 $parameters = array(
'dol_authmode' => $authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
924 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
933 $allowedmethodtopostusername = 3;
934 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
935 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
938 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
939 $passwordtotest =
GETPOST(
'password',
'password', $allowedmethodtopostusername);
943 $goontestloop =
false;
944 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
945 $goontestloop =
true;
947 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
948 $goontestloop =
true;
950 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
951 $goontestloop =
true;
953 if (
GETPOST(
'openid_mode',
'alpha')) {
954 $goontestloop =
true;
956 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
957 $goontestloop =
true;
959 if (!empty($_COOKIE[
'login_dolibarr'])) {
960 $goontestloop =
true;
963 if (!is_object($langs)) {
964 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
967 if (defined(
'MAIN_LANG_DEFAULT')) {
968 $langcode = constant(
'MAIN_LANG_DEFAULT');
970 $langs->setDefaultLang($langcode);
976 if ($test && $goontestloop &&
GETPOST(
'actionlogin',
'aZ09') !=
'disabled' && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
979 $oauthmodetotestarray = array(
'google');
980 foreach ($oauthmodetotestarray as $oauthmodetotest) {
981 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
984 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn')) {
987 dol_syslog(
"User did not click on link for OAuth, or is not on the OAuth return, so we disable check using ".$oauthmodetotest);
988 foreach ($authmode as $tmpkey => $tmpval) {
989 if ($tmpval == $oauthmodetotest.
'oauth') {
990 unset($authmode[$tmpkey]);
999 if ($login ===
'--bad-login-validity--') {
1004 $dol_authmode =
$conf->authmode;
1005 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
1006 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
1007 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
1008 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
1009 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
1012 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
1013 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
1014 if ($dol_dst_first && $dol_dst_second) {
1015 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
1019 if ($datenow >= $datefirst && $datenow < $datesecond) {
1023 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
1024 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
1029 dol_syslog(
'Bad password, connection refused (see a previous notice message for more info)', LOG_NOTICE);
1031 $langs->loadLangs(array(
'main',
'errors'));
1035 if (empty($_SESSION[
"dol_loginmesg"])) {
1036 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
1040 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
1043 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1051 $hookmanager->initHooks(array(
'login'));
1052 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1053 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1063 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
1065 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);
1066 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
1071 return 'ERROR_NOT_LOGGED';
1073 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
1074 http_response_code(401);
1078 dol_loginfunction($langs,
$conf, (!empty($mysoc) ? $mysoc :
''));
1083 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
1084 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
1085 dol_syslog(
'User not found or not valid, connection refused');
1087 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
1088 session_name($sessionname);
1091 if ($resultFetchUser == 0) {
1093 $langs->loadLangs(array(
'main',
'errors'));
1095 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1097 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1098 } elseif ($resultFetchUser < 0) {
1099 $_SESSION[
"dol_loginmesg"] = $user->error;
1101 $user->context[
'audit'] = $user->error;
1104 $langs->loadLangs(array(
'main',
'errors'));
1106 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
1108 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
1112 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1121 $hookmanager->initHooks(array(
'login'));
1122 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1123 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1128 $paramsurl = array();
1130 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1133 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1135 if (
GETPOST(
'lang',
'aZ09')) {
1136 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1138 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1142 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1143 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1148 $login = $_SESSION[
"dol_login"];
1149 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
1150 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
1152 $resultFetchUser = $user->fetch(0, $login,
'', 1, ($entity > 0 ? $entity : -1));
1156 if ($resultFetchUser <= 0
1157 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
1158 || ($user->status != $user::STATUS_ENABLED)
1159 || ($user->isNotIntoValidityDateRange())) {
1160 if ($resultFetchUser <= 0) {
1162 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
1163 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
1165 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
1166 } elseif ($user->status != $user::STATUS_ENABLED) {
1171 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], current date is ".
dol_now());
1174 session_set_cookie_params(0,
'/',
null, !empty($dolibarr_main_force_https),
true);
1175 session_name($sessionname);
1178 if ($resultFetchUser == 0) {
1179 $langs->loadLangs(array(
'main',
'errors'));
1181 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1183 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1184 } elseif ($resultFetchUser < 0) {
1185 $_SESSION[
"dol_loginmesg"] = $user->error;
1187 $user->context[
'audit'] = $user->error;
1189 $langs->loadLangs(array(
'main',
'errors'));
1191 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1193 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1197 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1205 $hookmanager->initHooks(array(
'login'));
1206 $parameters = array(
'dol_authmode' => (
string) $dol_authmode,
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1207 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1212 $paramsurl = array();
1214 $paramsurl[] =
'textbrowser='.GETPOSTINT(
'textbrowser');
1217 $paramsurl[] =
'nojs='.GETPOSTINT(
'nojs');
1219 if (
GETPOST(
'lang',
'aZ09')) {
1220 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1223 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1227 $hookmanager->initHooks(array(
'main'));
1230 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1231 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1232 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1234 if (constant(
'DOL_URL_ROOT')) {
1235 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1237 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1238 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1242 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1243 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1244 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1246 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1247 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1248 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1250 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] !=
$conf->liste_limit) {
1251 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1252 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1254 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1255 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1256 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1258 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1259 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1260 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1263 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1264 if (empty($_SESSION[
'pageforbacktolist'])) {
1265 $pageforbacktolistarray = array();
1267 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1269 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1270 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1271 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1272 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1277 $parameters = array();
1278 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1287 if (!isset($_SESSION[
"dol_login"])) {
1292 $_SESSION[
"dol_login"] = $user->login;
1293 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1294 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1295 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1296 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1297 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1298 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1299 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1300 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1301 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1302 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1304 $_SESSION[
"dol_entity"] =
$conf->entity;
1306 if (!empty($dol_hide_topmenu)) {
1307 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1309 if (!empty($dol_hide_leftmenu)) {
1310 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1312 if (!empty($dol_optimize_smallscreen)) {
1313 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1315 if (!empty($dol_no_mouse_hover)) {
1316 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1318 if (!empty($dol_use_jmobile)) {
1319 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1322 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1326 $user->update_last_login_date();
1328 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1329 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.
$conf->entity;
1332 $user->context[
'audit'] = $loginfo;
1333 $user->context[
'authentication_method'] = $dol_authmode;
1336 $result = $user->call_trigger(
'USER_LOGIN', $user);
1344 $hookmanager->initHooks(array(
'login'));
1345 $parameters = array(
'dol_authmode' => $dol_authmode,
'dol_loginfo' => $loginfo);
1346 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1354 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1361 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (!
getDolGlobalString(
'MAIN_LANDING_PAGE') ?
'' :
$conf->global->MAIN_LANDING_PAGE) : $user->
conf->MAIN_LANDING_PAGE);
1362 if (!empty($landingpage)) {
1364 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1365 header(
'Location: '.$newpath);
1374 $user->rights->user->user->lire = 1;
1375 $user->rights->user->user->creer = 1;
1376 $user->rights->user->user->password = 1;
1377 $user->rights->user->user->supprimer = 1;
1378 $user->rights->user->self->creer = 1;
1379 $user->rights->user->self->password = 1;
1383 if (!$user->hasRight(
'user',
'user_advance')) {
1384 $user->rights->user->user_advance =
new stdClass();
1386 if (!$user->hasRight(
'user',
'self_advance')) {
1387 $user->rights->user->self_advance =
new stdClass();
1389 if (!$user->hasRight(
'user',
'group_advance')) {
1390 $user->rights->user->group_advance =
new stdClass();
1393 $user->rights->user->user_advance->readperms = 1;
1394 $user->rights->user->user_advance->write = 1;
1395 $user->rights->user->self_advance->readperms = 1;
1396 $user->rights->user->self_advance->writeperms = 1;
1397 $user->rights->user->group_advance->read = 1;
1398 $user->rights->user->group_advance->readperms = 1;
1399 $user->rights->user->group_advance->write = 1;
1400 $user->rights->user->group_advance->delete = 1;
1409 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1412 if ((
int)
$conf->liste_limit <= 0) {
1414 $conf->liste_limit = 15;
1415 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
1416 $conf->liste_limit = 8;
1417 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 910) {
1418 $conf->liste_limit = 10;
1419 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
1420 $conf->liste_limit = 20;
1424 if (isset($user->conf->MAIN_CHECKBOX_LEFT_COLUMN)) {
1431 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1435 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1436 $user->loadDefaultValues();
1442if (
GETPOST(
'theme',
'aZ09')) {
1444 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1449 $conf->use_javascript_ajax = 0;
1460 $conf->global->THEME_TOPMENU_DISABLE_IMAGE = 1;
1470if (
GETPOSTINT(
'dol_hide_leftmenu') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1471 $conf->dol_hide_leftmenu = 1;
1473if (
GETPOSTINT(
'dol_hide_topmenu') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1474 $conf->dol_hide_topmenu = 1;
1476if (
GETPOSTINT(
'dol_optimize_smallscreen') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1477 $conf->dol_optimize_smallscreen = 1;
1479if (
GETPOSTINT(
'dol_no_mouse_hover') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1480 $conf->dol_no_mouse_hover = 1;
1482if (
GETPOSTINT(
'dol_use_jmobile') || !empty($_SESSION[
'dol_use_jmobile'])) {
1483 $conf->dol_use_jmobile = 1;
1486if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
1487 $conf->dol_no_mouse_hover = 1;
1491if ((!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone')
1492 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1493 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1496 $conf->dol_optimize_smallscreen = 1;
1499 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1503if (!empty(
$conf->dol_use_jmobile) && in_array(
$conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1504 $conf->theme =
'eldy';
1505 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1508if (!defined(
'NOREQUIRETRAN')) {
1509 if (!
GETPOST(
'lang',
'aZ09')) {
1511 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1514 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1515 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1521if (!defined(
'NOLOGIN')) {
1524 if (!$user->login) {
1529 if ($user->statut < 1) {
1531 $langs->loadLangs(array(
"errors",
"other"));
1532 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1537 $user->loadRights();
1540dol_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);
1545if (!defined(
'NOREQUIRETRAN')) {
1547 $langs->loadLangs(array(
'main',
'dict'));
1551$bc = array(0 =>
'class="impair"', 1 =>
'class="pair"');
1552$bcdd = array(0 =>
'class="drag drop oddeven"', 1 =>
'class="drag drop oddeven"');
1553$bcnd = array(0 =>
'class="nodrag nodrop nohover"', 1 =>
'class="nodrag nodrop nohoverpair"');
1554$bctag = array(0 =>
'class="impair tagtr"', 1 =>
'class="pair tagtr"');
1566if (empty(
$conf->browser->firefox)) {
1567 define(
'ROWS_1', 1);
1568 define(
'ROWS_2', 2);
1569 define(
'ROWS_3', 3);
1570 define(
'ROWS_4', 4);
1571 define(
'ROWS_5', 5);
1572 define(
'ROWS_6', 6);
1573 define(
'ROWS_7', 7);
1574 define(
'ROWS_8', 8);
1575 define(
'ROWS_9', 9);
1577 define(
'ROWS_1', 0);
1578 define(
'ROWS_2', 1);
1579 define(
'ROWS_3', 2);
1580 define(
'ROWS_4', 3);
1581 define(
'ROWS_5', 4);
1582 define(
'ROWS_6', 5);
1583 define(
'ROWS_7', 6);
1584 define(
'ROWS_8', 7);
1585 define(
'ROWS_9', 8);
1588$heightforframes = 50;
1591if (!defined(
'NOREQUIREMENU')) {
1592 if (empty($user->socid)) {
1600 $file_menu =
$conf->standard_menu;
1601 if (
GETPOST(
'menu',
'alpha')) {
1602 $file_menu =
GETPOST(
'menu',
'alpha');
1605 if (!class_exists(
'MenuManager')) {
1607 $dirmenus = array_merge(array(
"/core/menus/"), (array)
$conf->modules_parts[
'menus']);
1608 foreach ($dirmenus as $dirmenu) {
1610 if (class_exists(
'MenuManager')) {
1614 if (!class_exists(
'MenuManager')) {
1615 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1616 $file_menu =
'eldy_menu.php';
1617 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1621 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1626if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1627 $message =
GETPOST(
'seteventmessages',
'alpha');
1628 $messages = explode(
',', $message);
1629 foreach ($messages as $key => $msg) {
1630 $tmp = explode(
':', $msg);
1637if (!function_exists(
"llxHeader")) {
1659 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1661 global
$conf, $hookmanager;
1663 $parameters = array(
1665 'title' => & $title,
1666 'help_url' => & $help_url,
1667 'target' => & $target,
1668 'disablejs' => & $disablejs,
1669 'disablehead' => & $disablehead,
1670 'arrayofjs' => & $arrayofjs,
1671 'arrayofcss' => & $arrayofcss,
1672 'morequerystring' => & $morequerystring,
1673 'morecssonbody' => & $morecssonbody,
1674 'replacemainareaby' => & $replacemainareaby,
1675 'disablenofollow' => & $disablenofollow,
1676 'disablenoindex' => & $disablenoindex
1679 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1681 print $hookmanager->resPrint;
1686 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1688 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1690 if (
$conf->theme ==
'md' && !in_array(
$conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1692 if ($mainmenu !=
'website') {
1693 $tmpcsstouse = $morecssonbody;
1698 $tmpcsstouse .=
' colorblind-'.strip_tags(
getDolGlobalString(
'MAIN_OPTIMIZEFORCOLORBLIND'));
1701 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1704 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1705 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1708 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1709 left_menu(
'', $help_url,
'', array(), 1, $title, 1);
1713 if ($replacemainareaby) {
1714 print $replacemainareaby;
1732 global $db,
$conf, $hookmanager;
1734 if ($contenttype ==
'text/html') {
1735 header(
"Content-Type: text/html; charset=".
$conf->file->character_set_client);
1737 header(
"Content-Type: ".$contenttype);
1743 header(
"X-Content-Type-Options: nosniff");
1746 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1747 header(
"X-Frame-Options: SAMEORIGIN");
1749 header(
"X-Frame-Options: ALLOWALL");
1753 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1754 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1755 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1756 header(
'Vary: Origin');
1763 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1778 if (!is_object($hookmanager)) {
1779 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1782 $hookmanager->initHooks(array(
"main"));
1784 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'reportonly');
1785 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1787 $contentsecuritypolicy = $hookmanager->resPrint;
1789 $contentsecuritypolicy .= $hookmanager->resPrint;
1792 if (!empty($contentsecuritypolicy)) {
1793 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1796 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1800 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1815 if (!is_object($hookmanager)) {
1816 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1819 $hookmanager->initHooks(array(
"main"));
1821 $parameters = array(
'contentsecuritypolicy' => $contentsecuritypolicy,
'mode' =>
'active');
1822 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1824 $contentsecuritypolicy = $hookmanager->resPrint;
1826 $contentsecuritypolicy .= $hookmanager->resPrint;
1829 if (!empty($contentsecuritypolicy)) {
1830 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1833 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1840 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1843 header(
"Referrer-Policy: ".$referrerpolicy);
1846 if ($forcenocache) {
1847 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1869function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1871 global $db,
$conf, $langs, $user, $mysoc, $hookmanager;
1875 if (empty(
$conf->css)) {
1876 $conf->css =
'/theme/eldy/style.css.php';
1879 print
'<!doctype html>'.
"\n";
1881 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1884 if (empty($disablehead)) {
1885 if (!is_object($hookmanager)) {
1886 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1889 $hookmanager->initHooks(array(
"main"));
1891 $ext =
'layout='.(empty(
$conf->browser->layout) ?
'' :
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1895 if (
GETPOST(
'dol_basehref',
'alpha')) {
1896 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1900 print
'<meta charset="utf-8">'.
"\n";
1901 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1902 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1903 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1904 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1905 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1907 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1910 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1911 $appletouchicon = DOL_URL_ROOT.
'/theme/apple-touch-icon.png';
1912 if (!empty($mysoc->logo_squarred_mini)) {
1913 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1918 if (empty(
$conf->dol_use_jmobile)) {
1919 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1920 print
'<link rel="apple-touch-icon" href="'.$appletouchicon.
'"/>'.
"\n";
1924 $manifest = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/manifest.json.php';
1925 $parameters = array(
'manifest' => $manifest);
1926 $resHook = $hookmanager->executeHooks(
'hookSetManifest', $parameters);
1928 $manifest = $hookmanager->resPrint;
1930 $manifest .= $hookmanager->resPrint;
1932 if (!empty($manifest)) {
1933 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1938 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1943 print
'<meta http-equiv="refresh" content="'.GETPOSTINT(
'autorefresh').
'">';
1947 $appli = constant(
'DOL_APPLICATION_TITLE');
1950 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
1963 $parameters = array(
'title' => $titletoshow);
1964 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1966 $titletoshow = $hookmanager->resPrint;
1968 $titletoshow .= $hookmanager->resPrint;
1977 $ext =
'version='.GETPOSTINT(
'version');
1980 if (
GETPOST(
'dol_resetcache')) {
1981 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1985 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.
$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.
$conf->entity;
1987 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1988 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1989 $themeparam .=
'&dol_hide_topmenu='.GETPOSTINT(
'dol_hide_topmenu');
1991 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1992 $themeparam .=
'&dol_hide_leftmenu='.GETPOSTINT(
'dol_hide_leftmenu');
1994 if (GETPOSTISSET(
'dol_openinpopup')) {
1995 $themeparam .=
'&dol_openinpopup='.GETPOST(
'dol_openinpopup',
'aZ09');
1997 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1998 $themeparam .=
'&dol_optimize_smallscreen='.GETPOSTINT(
'dol_optimize_smallscreen');
2000 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
2001 $themeparam .=
'&dol_no_mouse_hover='.GETPOSTINT(
'dol_no_mouse_hover');
2003 if (GETPOSTISSET(
'dol_use_jmobile')) {
2004 $themeparam .=
'&dol_use_jmobile='.GETPOSTINT(
'dol_use_jmobile');
2007 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
2008 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOSTINT(
'THEME_DARKMODEENABLED');
2010 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
2011 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOSTINT(
'THEME_SATURATE_RATIO');
2015 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
2016 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
2019 if (!defined(
'DISABLE_JQUERY') && !$disablejs &&
$conf->use_javascript_ajax) {
2020 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
2021 $jquerytheme =
'base';
2025 if (constant(
'JS_JQUERY_UI')) {
2026 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2028 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2030 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
2031 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2033 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2034 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') :
$conf->global->MAIN_USE_JQUERY_MULTISELECT;
2035 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2039 if (!defined(
'DISABLE_FONT_AWSOME')) {
2040 print
'<!-- Includes CSS for font awesome -->'.
"\n";
2041 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
2042 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
2045 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
2049 if (!empty(
$conf->modules_parts[
'theme'])) {
2050 foreach (
$conf->modules_parts[
'theme'] as $reldir) {
2053 $themesubdir = $reldir;
2060 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
2062 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";
2067 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.css'.($ext ?
'?'.$ext :
'').
"\">\n";
2068 print
'<link rel="stylesheet" href="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.css'.($ext ?
'?'.$ext :
'').
"\">\n";
2072 if (!empty(
$conf->modules_parts[
'css'])) {
2073 $arraycss = (array)
$conf->modules_parts[
'css'];
2074 foreach ($arraycss as $modcss => $filescss) {
2075 $filescss = (array) $filescss;
2076 foreach ($filescss as $cssfile) {
2077 if (empty($cssfile)) {
2078 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
2082 if ($urlforcss && $urlforcss !=
'/') {
2083 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
2085 if (!preg_match(
'/\.css$/i', $cssfile)) {
2090 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
2096 if (is_array($arrayofcss)) {
2097 foreach ($arrayofcss as $cssfile) {
2098 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
2099 $urltofile = $cssfile;
2103 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
2105 if (!preg_match(
'/\.css$/i', $cssfile)) {
2115 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
2119 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty(
$conf->use_javascript_ajax)) {
2121 print
'<!-- Includes JS for JQuery -->'.
"\n";
2122 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
2123 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2125 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2127 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
2128 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2130 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2133 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
2134 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2137 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
2138 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2142 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2146 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
2147 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
2148 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2149 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2150 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2151 print
'<script>'.
"\n";
2152 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
2153 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
2154 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
2155 print 'var placeholderInPlace = \
' \';'.
"\n";
2156 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
2157 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
2158 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".
$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
2159 print
'var withInPlace = 300;';
2160 print
'</script>'.
"\n";
2161 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2162 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2165 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
2166 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2167 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2169 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2171 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ? constant(
'REQUIRE_JQUERY_MULTISELECT') :
$conf->global->MAIN_USE_JQUERY_MULTISELECT;
2172 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2174 if (!defined(
'DISABLE_MULTISELECT')) {
2175 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2179 if (!$disablejs && !empty(
$conf->use_javascript_ajax)) {
2181 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
2182 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2183 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
2184 $jsckeditor =
'ckeditor.js';
2185 if (constant(
'JS_CKEDITOR')) {
2187 $pathckeditor = constant(
'JS_CKEDITOR');
2189 print
'<script nonce="'.getNonce().
'">';
2190 print
'/* enable ckeditor by main.inc.php */';
2191 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2192 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.
$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2193 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2194 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";
2195 print
'</script>'.
"\n";
2196 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2198 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2199 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2201 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2203 print
'</script>'.
"\n";
2207 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2208 $enablebrowsernotif =
false;
2210 $enablebrowsernotif =
true;
2212 if (
$conf->browser->layout ==
'phone') {
2213 $enablebrowsernotif =
false;
2215 if ($enablebrowsernotif) {
2216 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2217 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2222 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2223 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2227 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2228 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/leaflet/leaflet-geoman.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2232 if (!empty(
$conf->modules_parts[
'js'])) {
2233 $arrayjs = (array)
$conf->modules_parts[
'js'];
2234 foreach ($arrayjs as $modjs => $filesjs) {
2235 $filesjs = (array) $filesjs;
2236 foreach ($filesjs as $jsfile) {
2239 if ($urlforjs && $urlforjs !=
'/') {
2240 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2241 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2243 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2249 if (is_array($arrayofjs)) {
2250 print
'<!-- Includes JS added by page -->'.
"\n";
2251 foreach ($arrayofjs as $jsfile) {
2252 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2253 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2255 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2264 if (file_exists($theme_js)) {
2265 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/'.
$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2269 if (!empty($head)) {
2276 $parameters = array();
2277 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2278 print $hookmanager->resPrint;
2280 print
"</head>\n\n";
2283 $conf->headerdone = 1;
2303function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2305 global $user,
$conf, $langs, $db, $form;
2306 global $dolibarr_main_authentication, $dolibarr_main_demo;
2307 global $hookmanager, $menumanager;
2312 $hookmanager->initHooks(array(
'toprightmenu'));
2317 if (empty(
$conf->headerdone)) {
2318 $disablenofollow = 0;
2319 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2320 print
'<body id="mainbody">';
2326 if ((empty(
$conf->dol_hide_topmenu) ||
GETPOSTINT(
'dol_invisible_topmenu')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2327 if (!isset($form) || !is_object($form)) {
2328 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2329 $form =
new Form($db);
2332 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2334 print
'<header id="id-top" class="side-nav-vert'.(GETPOSTINT(
'dol_invisible_topmenu') ?
' hidden' :
'').
'">';
2337 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2339 $menumanager->atarget = $target;
2341 $menumanager->showmenu(
'top', array(
'searchform' => $searchform));
2345 $appli = constant(
'DOL_APPLICATION_TITLE');
2348 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2350 $appli .=
" ".DOL_VERSION;
2354 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2358 $logouthtmltext =
'';
2361 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2362 if (
$conf->browser->name ==
'chrome') {
2363 $stringforfirstkey .=
' ALT +';
2364 } elseif (
$conf->browser->name ==
'firefox') {
2365 $stringforfirstkey .=
' ALT + SHIFT +';
2367 $stringforfirstkey .=
' CTL +';
2369 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2370 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2371 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.
newToken().
'">';
2372 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle');
2373 $logouttext .=
'</a>';
2375 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2376 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'', 0, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2381 print
'<div class="login_block usedropdown">'.
"\n";
2385 $toprightmenu .=
'<div class="login_block_tools valignmiddle">';
2388 $toprightmenu .=
'<div class="inline-block nowrap" style="padding: 0px;">';
2408 $toprightmenu .=
'</div>';
2410 $toprightmenu .=
'</div>'.
"\n";
2414 $toprightmenu .=
'<div class="login_block_other valignmiddle">';
2417 $parameters = array();
2418 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2419 if (is_numeric($result)) {
2421 $toprightmenu .= $hookmanager->resPrint;
2423 $toprightmenu = $hookmanager->resPrint;
2426 $toprightmenu .= $result;
2430 if (isModEnabled(
'modulebuilder')) {
2431 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2433 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2436 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2443 if (isset($_POST) && is_array($_POST)) {
2444 foreach ($_POST as $key => $value) {
2445 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2446 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2449 if (!is_array($value)) {
2450 if ($value !==
'') {
2451 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2454 foreach ($value as $value2) {
2455 if (($value2 !==
'') && (!is_array($value2))) {
2456 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2462 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2463 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2465 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2468 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2473 $langs->load(
"help");
2480 if (empty($helppagename)) {
2481 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2483 $helppresent =
'helppresent';
2488 $helpbaseurl = $arrayres[
'helpbaseurl'];
2489 $helppage = $arrayres[
'helppage'];
2490 $mode = $arrayres[
'mode'];
2493 if ($helpbaseurl && $helppage) {
2495 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2496 if ($mode ==
'wiki') {
2497 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2499 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2501 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2504 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2505 if ($mode ==
'wiki') {
2507 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2510 $text .= sprintf($helpbaseurl, $helppage);
2513 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2514 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2517 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2522 $langs->load(
'admin');
2523 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2529 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2531 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2536 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2539 $toprightmenu .=
'</div>';
2543 $toprightmenu .=
'<div class="login_block_user">';
2546 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2551 $toprightmenu .=
'</div>';
2553 $toprightmenu .=
'</div>'.
"\n";
2556 print $toprightmenu;
2563 print
'<div style="clear: both;"></div>';
2564 print
"<!-- End top horizontal menu -->\n\n";
2567 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
2568 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2582 global $langs,
$conf, $db, $hookmanager, $user, $mysoc;
2583 global $dolibarr_main_authentication, $dolibarr_main_demo;
2584 global $menumanager;
2587 if (
$conf->browser->name ==
'textbrowser') {
2591 $langs->load(
'companies');
2593 $userImage = $userDropDownImage =
'';
2594 if (!empty($user->photo)) {
2595 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2596 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2598 $nophoto =
'/public/theme/common/user_anonymous.png';
2599 if ($user->gender ==
'man') {
2600 $nophoto =
'/public/theme/common/user_man.png';
2602 if ($user->gender ==
'woman') {
2603 $nophoto =
'/public/theme/common/user_woman.png';
2606 $userImage =
'<img class="photo photouserphoto userphoto" alt="" src="'.DOL_URL_ROOT.$nophoto.
'" aria-hidden="true">';
2607 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="" src="'.DOL_URL_ROOT.$nophoto.
'">';
2611 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2612 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2614 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2616 while ($idprofcursor < 10) {
2618 $constkeyforprofid =
'MAIN_INFO_PROFID'.$idprofcursor;
2619 if ($idprofcursor == 1) {
2620 $constkeyforprofid =
'MAIN_INFO_SIREN';
2622 if ($idprofcursor == 2) {
2623 $constkeyforprofid =
'MAIN_INFO_SIRET';
2625 if ($idprofcursor == 3) {
2626 $constkeyforprofid =
'MAIN_INFO_APE';
2628 if ($idprofcursor == 4) {
2629 $constkeyforprofid =
'MAIN_INFO_RCS';
2631 $showprofid = (($idprofcursor <= 6) && $langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code) !=
'-');
2636 $dropdownBody .=
'<br><b>'.$langs->transcountry(
"ProfId".$idprofcursor, $mysoc->country_code).
'</b>: <span>'.
dol_print_profids(
getDolGlobalString($constkeyforprofid),
'1').
'</span>';
2640 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2641 if (isModEnabled(
'multicurrency')) {
2642 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.
$conf->currency.
'</span>';
2644 $dropdownBody .=
'</div>';
2646 $dropdownBody .=
'<br>';
2647 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2648 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2651 if (!empty($user->admin)) {
2652 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2655 if (!empty($user->socid)) {
2656 $thirdpartystatic =
new Societe($db);
2657 $thirdpartystatic->fetch($user->socid);
2658 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2659 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2661 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2662 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2663 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2664 $dropdownBody .=
'<br>';
2666 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2667 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2669 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.
$conf->entity.
' (user entity '.$user->entity.
')';
2671 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)');
2672 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2673 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2674 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
$conf->theme;
2676 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2678 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2680 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2681 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2682 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2687 $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>';
2688 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
$conf->browser->layout;
2689 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2690 if (
$conf->browser->layout ==
'phone') {
2691 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2693 if (!empty($_SESSION[
"disablemodules"])) {
2694 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.implode(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2696 $dropdownBody .=
'</div>';
2699 $parameters = array(
'user' => $user,
'langs' => $langs);
2700 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2701 if (is_numeric($result)) {
2703 $dropdownBody .= $hookmanager->resPrint;
2705 $dropdownBody = $hookmanager->resPrint;
2709 if (empty($urllogout)) {
2710 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.
newToken();
2715 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2716 if (
$conf->browser->name ==
'chrome') {
2717 $stringforfirstkey .=
' ALT +';
2718 } elseif (
$conf->browser->name ==
'firefox') {
2719 $stringforfirstkey .=
' ALT + SHIFT +';
2721 $stringforfirstkey .=
' CTL +';
2725 $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>';
2726 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2727 $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');
2728 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt pictofixedwidth"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2730 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2731 if (!empty($user->admin)) {
2732 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2736 $appli = constant(
'DOL_APPLICATION_TITLE');
2739 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
2741 $appli .=
" ".DOL_VERSION;
2745 $btnUser =
'<!-- div for user link -->
2746 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2747 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2748 '.$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>' :
'').
'
2750 <div class="dropdown-menu">
2752 <div class="user-header">
2753 '.$userDropDownImage.
'
2755 '.$profilName.
'<br>';
2757 if ($user->datelastlogin) {
2758 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2759 if ($user->datepreviouslogin) {
2760 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2763 $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>';
2764 if ($user->datepreviouslogin) {
2765 $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>';
2773 <!-- Menu Body user-->
2774 <div class="user-body">'.$dropdownBody.
'</div>
2777 <div class="user-footer">
2778 <div class="pull-left">
2781 <div class="pull-left">
2782 '.$virtuelcardLink.
'
2784 <div class="pull-right">
2787 <div class="clearboth"></div>
2793 $btnUser =
'<!-- div for user link text browser -->
2794 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2795 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle" alt="'.$langs->trans(
"MyUserCard").
'">
2796 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small valignmiddle">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2801 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
2803 <!-- Code to show/hide the user drop-down -->
2805 function closeTopMenuLoginDropdown() {
2806 console.log("close login dropdown"); // This is called at each click on page, so we disable the log
2808 jQuery("#topmenu-login-dropdown").removeClass("open");
2810 jQuery(document).ready(function() {
2811 jQuery(document).on("click", function(event) {
2812 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2813 /* console.log("click close login - we click outside"); */
2814 closeTopMenuLoginDropdown();
2822 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2823 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2824 event.preventDefault();
2825 jQuery("#topmenu-login-dropdown").toggleClass("open");
2828 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2829 console.log("Click on #topmenulogincompanyinfo-btn");
2830 jQuery("#topmenulogincompanyinfo").slideToggle();
2833 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2834 console.log("Click on #topmenuloginmoreinfo-btn");
2835 jQuery("#topmenuloginmoreinfo").slideToggle();
2856 global
$conf, $langs;
2867 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2868 if (
$conf->browser->os ===
'macintosh') {
2869 $stringforfirstkey .=
' CTL +';
2871 if (
$conf->browser->name ==
'chrome') {
2872 $stringforfirstkey .=
' ALT +';
2873 } elseif (
$conf->browser->name ==
'firefox') {
2874 $stringforfirstkey .=
' ALT + SHIFT +';
2876 $stringforfirstkey .=
' CTL +';
2880 if (!empty(
$conf->use_javascript_ajax)) {
2881 $html .=
'<!-- div for quick add link -->
2882 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2883 <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>
2886 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN')) {
2888 <!-- Code to show/hide the user drop-down for the quick add -->
2890 jQuery(document).ready(function() {
2891 jQuery(document).on("click", function(event) {
2892 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2893 /* console.log("click close quick add - we click outside"); */
2895 $("#topmenu-quickadd-dropdown").removeClass("open");
2898 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2899 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2900 openQuickAddDropDown(event);
2904 $(document).keydown(function(event){
2905 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
2906 if (ostype ===
"macintosh") {
2907 if ( event.which === 65 && event.ctrlKey ) {
2908 console.log(\
'control + a : trigger open quick add dropdown\');
2909 openQuickAddDropDown(event);
2912 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2913 console.log(\'control + shift + a : trigger open quick add dropdown\');
2914 openQuickAddDropDown(event);
2919 var openQuickAddDropDown = function(event) {
2920 event.preventDefault();
2921 $("#topmenu-quickadd-dropdown").toggleClass("open");
2922 //$("#top-quickadd-search-input").focus();
2942 global
$conf, $langs;
2953 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2954 if (
$conf->browser->os ===
'macintosh') {
2955 $stringforfirstkey .=
' CTL +';
2957 if (
$conf->browser->name ==
'chrome') {
2958 $stringforfirstkey .=
' ALT +';
2959 } elseif (
$conf->browser->name ==
'firefox') {
2960 $stringforfirstkey .=
' ALT + SHIFT +';
2962 $stringforfirstkey .=
' CTL +';
2967 if (!empty(
$conf->use_javascript_ajax)) {
2968 $urlforuploadpage = DOL_URL_ROOT.
'/core/upload_page.php';
2973 $html .=
'<!-- div for link to upload file -->
2974 <div id="topmenu-uploadfile-dropdown" class="atoplogin dropdown inline-block">
2975 <a accesskey="i" class="dropdown-togglex login-dropdown-a nofocusvisible" data-toggle="dropdown" href="'.$urlforuploadpage.
'" title="'.$langs->trans(
'UploadFile').
' ('.$stringforfirstkey.
' i)"><i class="fa fa-upload"></i></a>
2991 global $user, $langs, $hookmanager;
2996 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2997 "title" =>
"MenuNewMember@members",
2998 "name" =>
"Adherent@members",
2999 "picto" =>
"object_member",
3000 "activation" => isModEnabled(
'member') && $user->hasRight(
"adherent",
"write"),
3004 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
3005 "title" =>
"MenuNewThirdParty@companies",
3006 "name" =>
"ThirdParty@companies",
3007 "picto" =>
"object_company",
3008 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
3012 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
3013 "title" =>
"NewContactAddress@companies",
3014 "name" =>
"Contact@companies",
3015 "picto" =>
"object_contact",
3016 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
3020 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
3021 "title" =>
"NewPropal@propal",
3022 "name" =>
"Proposal@propal",
3023 "picto" =>
"object_propal",
3024 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
3029 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
3030 "title" =>
"NewOrder@orders",
3031 "name" =>
"Order@orders",
3032 "picto" =>
"object_order",
3033 "activation" => isModEnabled(
'order') && $user->hasRight(
"commande",
"write"),
3037 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
3038 "title" =>
"NewBill@bills",
3039 "name" =>
"Bill@bills",
3040 "picto" =>
"object_bill",
3041 "activation" => isModEnabled(
'invoice') && $user->hasRight(
"facture",
"write"),
3045 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
3046 "title" =>
"NewContractSubscription@contracts",
3047 "name" =>
"Contract@contracts",
3048 "picto" =>
"object_contract",
3049 "activation" => isModEnabled(
'contract') && $user->hasRight(
"contrat",
"write"),
3053 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
3054 "title" =>
"SupplierProposalNew@supplier_proposal",
3055 "name" =>
"SupplierProposal@supplier_proposal",
3056 "picto" =>
"supplier_proposal",
3057 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
3061 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
3062 "title" =>
"NewSupplierOrderShort@orders",
3063 "name" =>
"SupplierOrder@orders",
3064 "picto" =>
"supplier_order",
3065 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
3069 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
3070 "title" =>
"NewBill@bills",
3071 "name" =>
"SupplierBill@bills",
3072 "picto" =>
"supplier_invoice",
3073 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
3077 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
3078 "title" =>
"NewTicket@ticket",
3079 "name" =>
"Ticket@ticket",
3080 "picto" =>
"ticket",
3081 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
3085 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
3086 "title" =>
"NewIntervention@interventions",
3087 "name" =>
"Intervention@interventions",
3088 "picto" =>
"intervention",
3089 "activation" => isModEnabled(
'intervention') && $user->hasRight(
"ficheinter",
"creer"),
3093 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
3094 "title" =>
"NewProduct@products",
3095 "name" =>
"Product@products",
3096 "picto" =>
"object_product",
3097 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
3101 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
3102 "title" =>
"NewService@products",
3103 "name" =>
"Service@products",
3104 "picto" =>
"object_service",
3105 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
3109 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
3110 "title" =>
"AddUser@users",
3111 "name" =>
"User@users",
3113 "activation" => $user->hasRight(
"user",
"user",
"write"),
3119 $dropDownQuickAddHtml =
'';
3123 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
3125 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
3128 $parameters = array();
3129 $hook_items = $items;
3130 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
3131 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
3132 if ($reshook == 0) {
3133 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
3135 $items = $hookmanager->resArray;
3139 $position = array();
3140 foreach ($items[
'items'] as $key => $row) {
3141 $position[$key] = $row[
'position'];
3143 $array1_sort_order = SORT_ASC;
3144 array_multisort($position, $array1_sort_order, $items[
'items']);
3147 foreach ($items[
'items'] as $item) {
3148 if (!$item[
'activation']) {
3151 $langs->load(explode(
'@', $item[
'title'])[1]);
3152 $langs->load(explode(
'@', $item[
'name'])[1]);
3153 $dropDownQuickAddHtml .=
'
3154 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
3155 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
3160 $dropDownQuickAddHtml .=
'</div>';
3162 $dropDownQuickAddHtml .=
'</div>';
3164 return $dropDownQuickAddHtml;
3174 global $langs,
$conf, $user;
3179 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
3190 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3191 if (
$conf->browser->os ===
'macintosh') {
3192 $stringforfirstkey .=
' CTL +';
3194 if (
$conf->browser->name ==
'chrome') {
3195 $stringforfirstkey .=
' ALT +';
3196 } elseif (
$conf->browser->name ==
'firefox') {
3197 $stringforfirstkey .=
' ALT + SHIFT +';
3199 $stringforfirstkey .=
' CTL +';
3203 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty(
$conf->use_javascript_ajax)) {
3204 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
3205 $langs->load(
"bookmarks");
3208 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
3212 $html .=
'<!-- div for bookmark link -->
3213 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
3214 <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>
3215 <div class="dropdown-menu">
3221 <!-- Code to show/hide the bookmark drop-down -->
3223 jQuery(document).ready(function() {
3224 jQuery(document).on("click", function(event) {
3225 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
3226 /* console.log("close bookmark dropdown - we click outside"); */
3228 $("#topmenu-bookmark-dropdown").removeClass("open");
3232 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
3233 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
3234 openBookMarkDropDown(event);
3238 jQuery(document).keydown(function(event) {
3239 var ostype = \''.dol_escape_js(
$conf->browser->os).
'\';
3240 if (ostype ===
"macintosh") {
3241 if ( event.which === 66 && event.ctrlKey ) {
3242 console.log(
"Click on control + b : trigger open bookmark dropdown");
3243 openBookMarkDropDown(event);
3246 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
3247 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
3248 openBookMarkDropDown(event);
3253 var openBookMarkDropDown =
function(event) {
3254 event.preventDefault();
3255 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
3256 jQuery(
"#top-bookmark-search-input").focus();
3272function top_menu_search()
3274 global $langs, $conf, $db, $user, $hookmanager; // used by htdocs/core/ajax/selectsearchbox.php
3279 $arrayresult = array();
3280 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3282 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3283 // accesskey is for Mac: CTRL + key for all browsers
3284 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3285 if ($conf->browser->name == 'chrome
') {
3286 $stringforfirstkey .= ' ALT +
';
3287 } elseif ($conf->browser->name == 'firefox
') {
3288 $stringforfirstkey .= ' ALT + SHIFT +
';
3290 $stringforfirstkey .= ' CTL +
';
3293 $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">
';
3295 $defaultAction = '';
3296 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3297 // Menu with all searchable items
3298 // @phan-suppress-next-line PhanEmptyForeach // array is really empty
3299 foreach ($arrayresult as $keyItem => $item) {
3300 if (empty($defaultAction)) {
3301 $defaultAction = $item['url
'];
3303 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3304 $buttonList .= $item['text
'];
3305 $buttonList .= '</
button>
';
3307 $buttonList .= '</div>
';
3309 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3312 <!-- search input -->
3313 <div
class=
"dropdown-header search-dropdown-header">
3319 <!--
Menu Body search -->
3320 <div
class=
"dropdown-body search-dropdown-body">
3325 $dropDownHtml .= '</form>
';
3327 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3328 // accesskey is for Mac: CTRL + key for all browsers
3329 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3330 if ($conf->browser->name == 'chrome
') {
3331 $stringforfirstkey .= ' ALT +
';
3332 } elseif ($conf->browser->name == 'firefox
') {
3333 $stringforfirstkey .= ' ALT + SHIFT +
';
3335 $stringforfirstkey .= ' CTL +
';
3338 $html .= '<!-- div
for Global Search -->
3339 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3340 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3341 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3343 <div
class=
"dropdown-menu dropdown-search">
3349 <!-- Code to show/hide the
user drop-down -->
3351 jQuery(document).ready(
function() {
3354 jQuery(
"#top-global-search-input").keydown(
function (e) {
3355 if (e.keyCode == 13 || e.keyCode == 40) {
3356 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3357 if (inputs[inputs.index(this) + 1] != null) {
3358 inputs[inputs.index(this) + 1].focus();
3359 if (e.keyCode == 13){
3360 inputs[inputs.index(this) + 1].trigger(
"click");
3370 jQuery(document).keydown(
function(e) {
3372 var $focused = $(
":focus");
3373 if($focused.length && $focused.hasClass(
"global-search-item")){
3376 if (e.keyCode == 38) {
3378 $focused.prev().focus();
3382 if (e.keyCode == 40) {
3384 $focused.next().focus();
3391 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3392 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3393 jQuery(
"#top-menu-action-search").submit();
3397 jQuery(document).on(
"click",
function(event) {
3398 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3399 console.log(
"click close search - we click outside");
3401 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3406 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3407 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3408 openGlobalSearchDropDown();
3412 jQuery(document).keydown(
function(e){
3413 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3414 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3415 openGlobalSearchDropDown();
3417 if ( e.which === 70 && e.alKey ) {
3418 console.log(\'alt + f : trigger open global-search dropdown\');
3419 openGlobalSearchDropDown();
3423 var openGlobalSearchDropDown = function() {
3424 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3425 jQuery("#top-global-search-input").focus();
3449function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3451 global $user,
$conf, $langs, $db, $form;
3452 global $hookmanager, $menumanager;
3456 if (!empty($menu_array_before)) {
3457 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);
3460 if (empty(
$conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3462 $hookmanager->initHooks(array(
'leftblock'));
3464 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3467 if (!is_object($form)) {
3468 $form =
new Form($db);
3473 if (
$conf->browser->layout ==
'phone') {
3474 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3478 $arrayresult = array();
3479 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3484 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3485 if (
$conf->browser->name ==
'chrome') {
3486 $stringforfirstkey .=
' ALT +';
3487 } elseif (
$conf->browser->name ==
'firefox') {
3488 $stringforfirstkey .=
' ALT + SHIFT +';
3490 $stringforfirstkey .=
' CTL +';
3494 $textsearch =
'<span class="fa fa-search paddingright pictofixedwidth"></span>'.$langs->trans(
"Search");
3495 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 0 : 1),
'vmenusearchselectcombo', 1, $textsearch, 1, $stringforfirstkey.
' s');
3497 if (is_array($arrayresult)) {
3499 foreach ($arrayresult as $key => $val) {
3500 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3506 $parameters = array(
'searchform' => $searchform);
3507 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3508 if (empty($reshook)) {
3509 $searchform .= $hookmanager->resPrint;
3511 $searchform = $hookmanager->resPrint;
3516 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3517 $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>';
3519 $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>';
3520 $searchform .=
'<script>
3521 jQuery(document).ready(function () {
3522 jQuery("#divsearchforms1").click(function(){
3523 jQuery("#divsearchforms2").toggle();
3527 $searchform .=
'</div>';
3531 $searchform .=
'<script>
3532 jQuery(document).keydown(function(e){
3533 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3534 console.log(\'control + shift + f : trigger open global-search dropdown\');
3535 openGlobalSearchDropDown();
3537 if( (e.which === 83 || e.which === 115) && e.altKey ){
3538 console.log(\'alt + s : trigger open global-search dropdown\');
3539 openGlobalSearchDropDown();
3543 var openGlobalSearchDropDown = function() {
3544 jQuery("#searchselectcombo").select2(\'open\');
3550 print
'<!-- Begin left menu -->'.
"\n";
3552 print
'<div class="vmenu"'.(getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
' alt="Left menu"' :
'').
'>'.
"\n\n";
3556 $menumanager->menu_array = $menu_array_before;
3558 $menumanager->menu_array_after = $menu_array_after;
3561 $menumanager->showmenu(
'leftdropdown', array(
'searchform' => $searchform));
3564 $menumanager->showmenu(
'left', array(
'searchform' => $searchform));
3569 print
"<!-- Begin Help Block-->\n";
3570 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3574 $doliurl =
'https://www.dolibarr.org';
3576 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3577 $doliurl =
'https://www.dolibarr.fr';
3579 if (preg_match(
'/es/i', $langs->defaultlang)) {
3580 $doliurl =
'https://www.dolibarr.es';
3582 if (preg_match(
'/de/i', $langs->defaultlang)) {
3583 $doliurl =
'https://www.dolibarr.de';
3585 if (preg_match(
'/it/i', $langs->defaultlang)) {
3586 $doliurl =
'https://www.dolibarr.it';
3588 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3589 $doliurl =
'https://www.dolibarr.gr';
3592 $appli = constant(
'DOL_APPLICATION_TITLE');
3595 $appli = (preg_match(
'/^\+/', $applicustom) ? $appli :
'').$applicustom;
3597 $appli .=
" ".DOL_VERSION;
3605 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3607 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3609 print
'<span class="help">';
3617 print
'</div>'.
"\n";
3622 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3625 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3626 $bugbaseurl .=
'&title=';
3627 $bugbaseurl .= urlencode(
"Bug: ");
3628 $bugbaseurl .=
'&body=';
3629 $bugbaseurl .= urlencode(
"# Instructions\n");
3630 $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");
3631 $bugbaseurl .= urlencode(
"*Please:*\n");
3632 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3633 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3634 $bugbaseurl .= urlencode(
"\n");
3635 $bugbaseurl .= urlencode(
"\n");
3636 $bugbaseurl .= urlencode(
"# Bug\n");
3637 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3638 $bugbaseurl .= urlencode(
"\n");
3639 $bugbaseurl .= urlencode(
"## Environment\n");
3640 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3641 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3642 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3643 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3644 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3645 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3646 $bugbaseurl .= urlencode(
"\n");
3647 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3648 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3649 $bugbaseurl .= urlencode(
"\n");
3650 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3651 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3652 $bugbaseurl .= urlencode(
"\n");
3653 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging information…)\n");
3654 $bugbaseurl .= urlencode(
"[*Files*]\n");
3655 $bugbaseurl .= urlencode(
"\n");
3657 $bugbaseurl .= urlencode(
"\n");
3658 $bugbaseurl .= urlencode(
"## Report\n");
3666 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3667 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3668 if (empty($reshook)) {
3669 $bugbaseurl .= $hookmanager->resPrint;
3671 $bugbaseurl = $hookmanager->resPrint;
3674 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3675 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3680 print
"<!-- End Help Block-->\n";
3684 print
"<!-- End left menu -->\n";
3688 $parameters = array();
3689 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3690 print $hookmanager->resPrint;
3692 print
'</div></div> <!-- End side-nav id-left -->';
3696 print
'<!-- Begin right area -->'.
"\n";
3698 if (empty($leftmenuwithoutmainarea)) {
3712 global
$conf, $langs, $hookmanager;
3714 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3715 print
'<div id="id-right">';
3720 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3722 $hookmanager->initHooks(array(
'main'));
3723 $parameters = array();
3724 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3725 print $hookmanager->resPrint;
3728 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode",
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED')), 0, 0,
'1',
'warning maintenancemode');
3733 $parameters = array();
3734 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3735 if (empty($reshook)) {
3736 print
'<!-- Begin show mysoc info header -->'.
"\n";
3737 print
'<div id="mysoc-info-header">'.
"\n";
3738 print
'<table class="centpercent div-table-responsive">'.
"\n";
3740 print
'<tr><td rowspan="0" class="width20p">';
3742 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'))).
'">';
3744 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3745 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3757 print
'</table>'.
"\n";
3758 print
'</div>'.
"\n";
3759 print
'<!-- End show mysoc info header -->'.
"\n";
3778 if (preg_match(
'/^http/i', $helppagename)) {
3780 $helpbaseurl =
'%s';
3781 $helppage = $helppagename;
3786 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3787 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3788 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3789 $helppage = $reg[1];
3792 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3793 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3794 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3795 $helppage = $reg[1];
3798 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3799 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3800 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3801 $helppage = $reg[1];
3804 if (empty($helppage)) {
3805 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3806 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3807 $helppage = $reg[1];
3812 return array(
'helpbaseurl' => $helpbaseurl,
'helppage' => $helppage,
'mode' => $mode);
3832function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3834 global $langs, $user;
3837 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3838 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3839 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3840 if ($showtitlebefore) {
3841 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3843 $ret .=
'<div class="tagtd">';
3844 $ret .=
img_picto(
'', $img,
'', 0, 0, 0,
'',
'paddingright width20');
3845 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3846 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3847 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3848 $ret .=
' placeholder="'.strip_tags($title).
'"';
3849 $ret .= ($autofocus ?
' autofocus' :
'');
3850 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3851 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3852 $ret .=
'<span class="fa fa-search"></span>';
3853 $ret .=
'</button>';
3855 $ret .=
"</form>\n";
3860if (!function_exists(
"llxFooter")) {
3872 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3874 global
$conf, $db, $langs, $user, $mysoc,
$object, $hookmanager, $action;
3875 global $delayedhtmlcontent;
3876 global $contextpage, $page, $limit, $mode;
3877 global $dolibarr_distrib;
3879 $ext =
'layout='.urlencode(
$conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3883 $parameters = array();
3884 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters,
$object, $action);
3885 if (empty($reshook)) {
3886 $llxfooter .= $hookmanager->resPrint;
3887 } elseif ($reshook > 0) {
3888 $llxfooter = $hookmanager->resPrint;
3899 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3901 foreach ($user->lastsearch_values_tmp as $key => $val) {
3902 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3903 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3904 if (empty($val[
'sortfield'])) {
3905 unset($val[
'sortfield']);
3907 if (empty($val[
'sortorder'])) {
3908 unset($val[
'sortorder']);
3910 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criteria)");
3911 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3912 unset($_SESSION[
'lastsearch_values_'.$key]);
3918 $relativepathstring = $_SERVER[
"PHP_SELF"];
3920 if (constant(
'DOL_URL_ROOT')) {
3921 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3923 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3924 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3925 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3926 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3927 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3928 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3929 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3931 if (!empty($contextpage)) {
3932 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3934 if (!empty($page) && $page > 0) {
3935 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3937 if (!empty($limit) && $limit !=
$conf->liste_limit) {
3938 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3940 if (!empty($mode)) {
3941 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3944 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3945 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3946 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3947 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3953 if (
$conf->use_javascript_ajax) {
3954 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3955 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3958 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3959 print
'<div class="error">'.$msg.
'</div>';
3967 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3969 if (empty(
$conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
3970 print
'</div> <!-- End div id-right -->'.
"\n";
3973 if (empty(
$conf->dol_hide_leftmenu) && empty(
$conf->dol_use_jmobile)) {
3974 print
'</div> <!-- End div id-container -->'.
"\n";
3979 print
'<!-- '.$comment.
' -->'.
"\n";
3984 if (!empty($delayedhtmlcontent)) {
3985 print $delayedhtmlcontent;
3988 if (!empty(
$conf->use_javascript_ajax)) {
3989 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3990 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3995 if (in_array(
$object->element, array(
'facture')) &&
$object->statut > 0) {
3996 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3999 jQuery(document).ready(
function () {
4000 $(
'a.documentpreview').click(
function() {
4001 console.log(
"Call /blockedlog/ajax/block-add on a.documentpreview");
4002 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
4005 , element:
'<?php echo dol_escape_js($object->element) ?>'
4006 , action:
'DOC_PREVIEW'
4007 , token:
'<?php echo currentToken(); ?>'
4011 $(
'a.documentdownload').click(
function() {
4012 console.log(
"Call /blockedlog/ajax/block-add a.documentdownload");
4013 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
4016 , element:
'<?php echo dol_escape_js($object->element) ?>'
4017 , action:
'DOC_DOWNLOAD'
4018 , token:
'<?php echo currentToken(); ?>'
4029 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
4030 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
4034 $forceping =
GETPOST(
'forceping',
'alpha');
4035 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
4037 $hash_unique_id =
dol_hash(
'dolibarr'.
$conf->file->instance_unique_id,
'sha256');
4040 || (!empty(
$conf->file->instance_unique_id) && ($hash_unique_id !=
$conf->global->MAIN_FIRST_PING_OK_ID) && (
getDolGlobalString(
'MAIN_FIRST_PING_OK_ID') !=
'disabled'))
4043 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
4044 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
4045 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
4049 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occurred this month, we will try later. -->\n";
4051 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4053 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";
4054 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
4055 $url_for_ping =
getDolGlobalString(
'MAIN_URL_FOR_PING',
"https://ping.dolibarr.org/");
4057 $distrib =
'standard';
4058 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
4059 $distrib =
'doliwamp';
4061 if (!empty($dolibarr_distrib)) {
4062 $distrib = $dolibarr_distrib;
4066 jQuery(document).ready(
function (tmp) {
4067 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
4070 url:
"<?php echo $url_for_ping ?>",
4074 hash_algo:
'dol_hash-sha256',
4075 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
4076 action:
'dolibarrping',
4077 version:
'<?php echo (float) DOL_VERSION; ?>',
4078 entity:
'<?php echo (int) $conf->entity; ?>',
4079 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
4080 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
4081 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
4082 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
4083 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
4084 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
4085 token:
'notrequired'
4087 success:
function (data,
status, xhr) {
4088 console.log(
"Ping ok");
4091 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
4094 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
4097 error:
function (data,
status,xhr) {
4098 console.log(
"Ping ko: " + data);
4101 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
4104 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
4114 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
4115 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
4122 $parameters = array();
4123 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
4125 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays).
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
if(!defined( 'DOL_APPLICATION_TITLE')) if(!defined('DOL_VERSION')) if(!defined( 'EURO')) if(!defined('LOG_DEBUG')) if(defined( 'DOL_INC_FOR_VERSION_ERROR')) dol_session_start()
Replace session_start()
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
conf($dolibarr_main_document_root)
Load conf file (file must exists)
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) getArrayOfEmoji()
Return array of Emojis.
top_menu_importfile()
Build the tooltip on top menu quick add.
top_menu_quickadd()
Build the tooltip on top menu quick add.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after=array(), $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
realCharForNumericEntities($matches)
Return the real char for a numeric entities.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
printDropdownQuickadd($mode=0)
Generate list of quickadd items.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
top_menu_search()
Build the tooltip on top menu search.
analyseVarsForSqlAndScriptsInjection(&$var, $type, $stopcode=1)
Return true if security check on parameters are OK, false otherwise.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successful.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.