34if (!defined(
'CSRFCHECK_WITH_TOKEN') && (empty($_GET[
'action']) || $_GET[
'action'] !=
'reset')) {
35 define(
'CSRFCHECK_WITH_TOKEN',
'1');
41if (!isset($_GET[
'mainmenu']) && !isset($_POST[
'mainmenu'])) {
42 $_GET[
'mainmenu'] =
'home';
46require
'../main.inc.php';
58@phan-var-force string $dolibarr_main_url_root_alt
60require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
61require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
62require_once DOL_DOCUMENT_ROOT.
'/core/lib/geturl.lib.php';
63require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
64require_once DOL_DOCUMENT_ROOT.
'/core/class/events.class.php';
65require_once DOL_DOCUMENT_ROOT.
'/core/modules/DolibarrModules.class.php';
66require_once DOL_DOCUMENT_ROOT.
'/admin/remotestore/class/externalModules.class.php';
70$langs->loadLangs(array(
"errors",
"admin",
"modulebuilder"));
72$action =
GETPOST(
'action',
'aZ09');
75$optioncss =
GETPOST(
'optioncss',
'aZ09');
76$sortfield =
GETPOST(
'sortfield',
'aZ09');
77$sortorder =
GETPOST(
'sortorder',
'aZ09');
79$mode =
GETPOST(
'mode',
'alpha');
80$value =
GETPOST(
'value',
'alpha');
81$search_keyword =
GETPOST(
'search_keyword',
'alpha');
82$search_status =
GETPOST(
'search_status',
'alpha');
83$search_nature =
GETPOST(
'search_nature',
'alpha');
84$search_version =
GETPOST(
'search_version',
'alpha');
89$options[
'per_page'] = 11;
92$options[
'search'] =
GETPOST(
'search_keyword',
'alpha');
95if (
GETPOST(
'buttonsubmit',
'alphanohtml', 2)) {
96 $options[
'no_page'] = 1;
100$options[
'search_source_dolistore'] =
getDolGlobalInt(
'MAIN_ENABLE_EXTERNALMODULES_DOLISTORE');
102$options[
'search_source_github'] =
getDolGlobalInt(
'MAIN_ENABLE_EXTERNALMODULES_COMMUNITY');
109 'hr' => array(
'position' =>
'001',
'label' => $langs->trans(
"ModuleFamilyHr")),
110 'crm' => array(
'position' =>
'006',
'label' => $langs->trans(
"ModuleFamilyCrm")),
111 'srm' => array(
'position' =>
'007',
'label' => $langs->trans(
"ModuleFamilySrm")),
112 'financial' => array(
'position' =>
'009',
'label' => $langs->trans(
"ModuleFamilyFinancial")),
113 'products' => array(
'position' =>
'012',
'label' => $langs->trans(
"ModuleFamilyProducts")),
114 'projects' => array(
'position' =>
'015',
'label' => $langs->trans(
"ModuleFamilyProjects")),
115 'ecm' => array(
'position' =>
'018',
'label' => $langs->trans(
"ModuleFamilyECM")),
116 'technic' => array(
'position' =>
'021',
'label' => $langs->trans(
"ModuleFamilyTechnic")),
117 'portal' => array(
'position' =>
'040',
'label' => $langs->trans(
"ModuleFamilyPortal")),
118 'interface' => array(
'position' =>
'050',
'label' => $langs->trans(
"ModuleFamilyInterface")),
119 'base' => array(
'position' =>
'060',
'label' => $langs->trans(
"ModuleFamilyBase")),
120 'other' => array(
'position' =>
'100',
'label' => $langs->trans(
"ModuleFamilyOther")),
124if (!
GETPOST(
'buttonreset',
'alpha')) {
125 if ($search_keyword) {
126 $param .=
'&search_keyword='.urlencode($search_keyword);
128 if ($search_status && $search_status !=
'-1') {
129 $param .=
'&search_status='.urlencode($search_status);
131 if ($search_nature && $search_nature !=
'-1') {
132 $param .=
'&search_nature='.urlencode($search_nature);
134 if ($search_version && $search_version !=
'-1') {
135 $param .=
'&search_version='.urlencode($search_version);
139$dirins = DOL_DOCUMENT_ROOT.
'/custom';
140$urldolibarrmodules =
'https://www.dolistore.com/';
143$hookmanager->initHooks(array(
'adminmodules',
'globaladmin'));
146$max_execution_time_for_deploy =
getDolGlobalInt(
'MODULE_UPLOAD_MAX_EXECUTION_TIME', 300);
147if (!empty($max_execution_time_for_deploy)) {
148 $err = error_reporting();
151 @set_time_limit($max_execution_time_for_deploy);
152 error_reporting($err);
155$max_time = @ini_get(
"max_execution_time");
156if ($max_time && $max_time < $max_execution_time_for_deploy) {
157 dol_syslog(
"max_execution_time=".$max_time.
" is lower than max_execution_time_for_deploy=".$max_execution_time_for_deploy.
". We try to increase it dynamically.");
158 @ini_set(
"max_execution_time", $max_execution_time_for_deploy);
162$dolibarrdataroot = preg_replace(
'/([\\/]+)$/i',
'', DOL_DATA_ROOT);
163$allowonlineinstall =
true;
165if (
dol_is_file($dolibarrdataroot.
'/installmodules.lock')) {
166 $allowonlineinstall =
false;
172if ($mode ==
'marketplace') {
177 $remotestore->loadRemoteSources(
false);
191$parameters = array();
192$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
198if (GETPOSTISSET(
'mode')) {
199 $mode =
GETPOST(
'mode',
'alpha');
200 if ($mode ==
'common' && !
getDolGlobalString(
'MAIN_MODULE_SETUP_ON_LIST_BY_DEFAULT')) {
207if (
GETPOST(
'buttonreset',
'alpha')) {
208 $search_keyword =
'';
211 $search_version =
'';
214if ($action ==
'install' && $allowonlineinstall) {
218 $isExternalDownload = 0;
219 $producttoinstall =
GETPOST(
'producttoinstall',
'array');
222 if ($producttoinstall) {
223 $isExternalDownload = 1;
224 $tmpExternalModuleZipFile = $remotestore->getModuleZIP($producttoinstall);
225 if ($tmpExternalModuleZipFile) {
227 $_FILES[
'fileinstall'] = array(
228 'name' => basename($tmpExternalModuleZipFile),
229 'type' =>
'application/zip',
230 'tmp_name' => $tmpExternalModuleZipFile,
232 'size' => filesize($tmpExternalModuleZipFile)
237 $tmpfile = (
string) $_FILES[
'fileinstall'][
'tmp_name'];
238 $original_file = basename($_FILES[
"fileinstall"][
"name"]);
239 $original_file = preg_replace(
'/\s*\(\d+\)\.zip$/i',
'.zip', $original_file);
242 if (empty($tmpfile)) {
243 $langs->load(
"errors");
248 if (!$original_file) {
249 $langs->load(
"Error");
250 if ($isExternalDownload) {
251 setEventMessages($langs->trans(
"ErrorFailToDownloadModuleFromSource", $producttoinstall[
'name']),
null,
'warnings');
253 setEventMessages($langs->trans(
"ErrorModuleFileRequired"),
null,
'warnings');
257 if (!$error && !preg_match(
'/\.zip$/i', $original_file)) {
258 $langs->load(
"errors");
259 setEventMessages($langs->trans(
"ErrorFileMustBeADolibarrPackage", $original_file),
null,
'errors');
262 if (!$error && !preg_match(
'/^(module[a-zA-Z0-9]*_|theme_|).*\-([0-9][0-9\.]*)(\s\(\d+\)\s)?\.zip$/i', $original_file)) {
263 $langs->load(
"errors");
264 setEventMessages($langs->trans(
"ErrorFilenameDosNotMatchDolibarrPackageRules", $original_file,
'modulename-x[.y.z].zip'),
null,
'errors');
270 if ($original_file) {
275 $tmpdir = preg_replace(
'/\.zip$/i',
'', $original_file).
'.dir';
281 $result =
dol_move_uploaded_file($tmpfile, $newfile, 1, 0, $_FILES[
'fileinstall'][
'error'], 0,
'addedfile',
'', $isExternalDownload ? 1 : 0);
282 if ((
int) $result > 0) {
285 if (!empty($resultuncompress[
'error'])) {
286 $langs->load(
"errors");
287 setEventMessages($langs->trans($resultuncompress[
'error'], $original_file),
null,
'errors');
291 $modulename = preg_replace(
'/module_/',
'', $original_file);
292 $modulename = preg_replace(
'/\-([0-9][0-9\.]*)\.zip$/i',
'', $modulename);
294 $modulenamedir =
$conf->admin->dir_temp.
'/'.$tmpdir.
'/'.$modulename;
297 $modulenamedir =
$conf->admin->dir_temp.
'/'.$tmpdir.
'/htdocs/'.$modulename;
300 setEventMessages($langs->trans(
"ErrorModuleFileSeemsToHaveAWrongFormat").
'<br>'.$langs->trans(
"ErrorModuleFileSeemsToHaveAWrongFormat2", $modulename,
'htdocs/'.$modulename),
null,
'errors');
305 dol_syslog(
"Uncompress of module file is a success.");
344 if (
GETPOST(
'checkforcompliance') ==
'on') {
346 $res = include_once DOL_DOCUMENT_ROOT.
'/core/modules/DolibarrModules.class.php';
348 $checkRes = $dolibarrmodule->checkForcompliance($modulename);
350 if (!is_numeric($checkRes) && $checkRes !=
'') {
351 $langs->load(
"errors");
352 setEventMessages($modulename.
' : '.$langs->trans($checkRes),
null,
'errors');
367 $modulenamearrays = array();
368 if (
dol_is_file($modulenamedir.
'/metapackage.conf')) {
370 $metafile = file_get_contents($modulenamedir.
'/metapackage.conf');
371 $modulenamearrays = explode(
"\n", $metafile);
373 $modulenamearrays[$modulename] = $modulename;
378 foreach ($modulenamearrays as $modulenameval) {
379 if (strpos($modulenameval,
'#') === 0) {
382 if (strpos($modulenameval,
'//') === 0) {
385 if (!trim($modulenameval)) {
392 $submodulenamedir =
$conf->admin->dir_temp.
'/'.$tmpdir.
'/'.$modulenameval;
394 $submodulenamedir =
$conf->admin->dir_temp.
'/'.$tmpdir.
'/htdocs/'.$modulenameval;
396 dol_syslog(
"We copy now directory ".$submodulenamedir.
" into target dir ".$dirins.
'/'.$modulenameval);
397 $resultcopy =
dolCopyDir($submodulenamedir, $dirins.
'/'.$modulenameval,
'0444', 1);
398 if ($resultcopy <= 0) {
399 dol_syslog(
'Failed to call dolCopyDir result='.$resultcopy.
" with param ".$submodulenamedir.
" and ".$dirins.
'/'.$modulenameval, LOG_WARNING);
400 $langs->load(
"errors");
401 setEventMessages($langs->trans(
"ErrorFailToCopyDir", $submodulenamedir, $dirins.
'/'.$modulenameval),
null,
'errors');
409 setEventMessages($langs->trans(
"ErrorFailToRenameFile", $tmpfile, $newfile).
' - code = '.$result,
null,
'errors');
417 $text = $langs->trans(
"SecurityModuleDeploymentError",
dol_sanitizePathName($_FILES[
"fileinstall"][
"name"]));
418 $securityevent->type =
'MODULE_DEPLOYMENT_ERROR';
420 $text = $langs->trans(
"SecurityModuleDeploymentSuccess",
dol_sanitizePathName($_FILES[
"fileinstall"][
"name"]));
421 $securityevent->type =
'MODULE_DEPLOYMENT_SUCCESS';
423 $securityevent->dateevent = $now;
424 $securityevent->description = $text;
426 $resultcreateevent = $securityevent->create($user);
429 $searchParams = array(
430 'search_keyword' => $modulenameval,
431 'search_status' =>
'-1',
432 'search_nature' =>
'-1',
433 'search_version' =>
'-1'
435 $queryString = http_build_query($searchParams);
436 $redirectUrl = DOL_URL_ROOT .
'/admin/modules.php?' . $queryString;
438 $message = $langs->trans(
"SetupIsReadyForUse", $redirectUrl, $langs->transnoentitiesnoconv(
"Home").
' - '.$langs->transnoentitiesnoconv(
"Setup").
' - '.$langs->transnoentitiesnoconv(
"Modules"));
442} elseif ($action ==
'install' && !$allowonlineinstall) {
443 httponly_accessforbidden(
"You try to bypass the protection to disallow deployment of an external module. Hack attempt ?");
446if ($action ==
'set' && $user->admin) {
451 $resarray = activateModule($value, 1, 0,
'acceptredirect');
453 if ($checkOldValue !=
getDolGlobalInt(
'CHECKLASTVERSION_EXTERNALMODULE')) {
454 setEventMessage($langs->trans(
'WarningModuleHasChangedLastVersionCheckParameter', $value),
'warnings');
456 if ($csrfCheckOldValue !=
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) {
457 setEventMessage($langs->trans(
'WarningModuleHasChangedSecurityCsrfParameter', $value),
'warnings');
461 if (!empty($resarray[
'errors'])) {
465 if ($resarray[
'nbperms'] > 0) {
466 $tmpsql =
"SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX.
"user WHERE admin <> 1";
467 $resqltmp =
$db->query($tmpsql);
469 $obj =
$db->fetch_object($resqltmp);
471 if ($obj && $obj->nb > 1) {
472 $msg = $langs->trans(
'ModuleEnabledAdminMustCheckRights');
480 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?mode=".$mode.$param.($page_y ?
'&page_y='.$page_y :
''));
482} elseif ($action ==
'reset' && $user->admin &&
GETPOST(
'confirm') ==
'yes') {
483 $result = unActivateModule($value);
488 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?mode=".$mode.$param.($page_y ?
'&page_y='.$page_y :
''));
490} elseif (
getDolGlobalInt(
"MAIN_FEATURES_LEVEL") > 1 && $action ==
'reload' && $user->admin &&
GETPOST(
'confirm') ==
'yes') {
491 $result = unActivateModule($value, 0,
'newboxdefonly');
495 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?mode=".$mode.$param.($page_y ?
'&page_y='.$page_y :
''));
499 $resarray = activateModule($value, 0, 1,
'acceptredirect');
502 if (!empty($resarray[
'errors'])) {
505 if ($resarray[
'nbperms'] > 0) {
506 $tmpsql =
"SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX.
"user WHERE admin <> 1";
507 $resqltmp =
$db->query($tmpsql);
509 $obj =
$db->fetch_object($resqltmp);
510 if ($obj && $obj->nb > 1) {
511 $msg = $langs->trans(
'ModuleEnabledAdminMustCheckRights');
519 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?mode=".$mode.$param.($page_y ?
'&page_y='.$page_y :
''));
531$morecss = array(
"/admin/remotestore/css/store.css");
539$help_url =
'EN:First_setup|FR:Premiers_paramétrages|ES:Primeras_configuraciones';
540llxHeader(
'', $langs->trans(
"Setup"), $help_url,
'', 0, 0, $morejs, $morecss,
'',
'mod-admin page-modules');
546$arrayofnatures = array(
547 'core' => array(
'label' => $langs->transnoentitiesnoconv(
"NativeModules")),
548 'external' => array(
'label' => $langs->transnoentitiesnoconv(
"External").
' - ['.$langs->trans(
"AllPublishers").
']')
550$arrayofwarnings = array();
551$arrayofwarningsext = array();
561$modNameLoaded = array();
564foreach ($modulesdir as $dir) {
567 dol_syslog(
"Scan directory ".$dir.
" for module descriptor files (modXXX.class.php)");
568 $handle = @opendir($dir);
569 $timestart = microtime(
true);
570 if (is_resource($handle)) {
571 while (($file = readdir($handle)) !==
false) {
573 if (is_readable($dir.$file) && substr($file, 0, 3) ==
'mod' && substr($file,
dol_strlen($file) - 10) ==
'.class.php') {
574 $modName = substr($file, 0,
dol_strlen($file) - 10);
577 if (!empty($modNameLoaded[$modName])) {
578 $mesg =
"Error: Module ".$modName.
" was found twice: Into ".$modNameLoaded[$modName].
" and ".$dir.
". You probably have an old file on your disk.<br>";
585 $res = include_once $dir.$file;
586 if (class_exists($modName)) {
587 $objMod =
new $modName(
$db);
588 '@phan-var-force DolibarrModules $objMod';
590 $modNameLoaded[$modName] = $dir;
591 if (!$objMod->numero > 0 && $modName !=
'modUser') {
592 dol_syslog(
'The module descriptor '.$modName.
' must have a numero property', LOG_ERR);
594 $j = $objMod->numero;
596 $modulequalified = 1;
599 $const_name =
'MAIN_MODULE_'.strtoupper(preg_replace(
'/^mod/i',
'', get_class($objMod)));
601 $modulequalified = 0;
604 $modulequalified = 0;
607 $modulequalified = 0;
611 if (!empty($objMod->hidden)) {
612 $modulequalified = 0;
615 if ($modulequalified > 0) {
617 $external = ($objMod->isCoreOrExternalModule() ==
'external');
627 $arrayofnatures[
'external_'.$publisher] = array(
'label' => $langs->trans(
"External").
' - '.$publisher,
'data-html' => $langs->trans(
"External").
' - <span class="opacitymedium inine-block valignmiddle">'.$publisher.
'</span>');
629 $arrayofnatures[
'external_'] = array(
'label' => $langs->trans(
"External").
' - ['.$langs->trans(
"UnknownPublishers").
']');
632 ksort($arrayofnatures);
635 $filename[$i] = $modName;
636 $modules[$modName] = $objMod;
637 $timestoinit[$modName] = round((microtime(
true) - $timestart) * 1000, 3);
640 if (is_array($objMod->familyinfo) && !empty($objMod->familyinfo)) {
641 $familyinfo = array_merge($familyinfo, $objMod->familyinfo);
642 $familykey = key($objMod->familyinfo);
644 $familykey = $objMod->family;
646 '@phan-var-force string $familykey';
648 $moduleposition = ($objMod->module_position ? $objMod->module_position :
'50');
649 if ($objMod->isCoreOrExternalModule() ==
'external' && $moduleposition < 100000) {
651 $moduleposition =
'80';
655 if (!empty($objMod->warnings_activation)) {
656 $arrayofwarnings[$modName] = $objMod->warnings_activation;
658 if (!empty($objMod->warnings_activation_ext)) {
659 $arrayofwarningsext[$modName] = $objMod->warnings_activation_ext;
662 $familyposition = (empty($familyinfo[$familykey][
'position']) ?
'0' : $familyinfo[$familykey][
'position']);
663 if ($external && !in_array($familykey, array_keys($familyinfo))) {
665 if (is_numeric($familyposition)) {
666 $familyposition = sprintf(
"%03d", (
int) $familyposition + 100);
670 $orders[$i] = $familyposition.
"_".$familykey.
"_".$moduleposition.
"_".$j;
673 $specialstring =
'unknown';
674 if ($objMod->version ==
'development' || $objMod->version ==
'experimental') {
675 $specialstring =
'expdev';
677 if (isset($categ[$specialstring])) {
678 $categ[$specialstring]++;
680 $categ[$specialstring] = 1;
685 dol_syslog(
"Module ".get_class($objMod).
" not qualified");
689 $silentModules = array(
'modSupplierOrder',
'modSupplierInvoice',
'modFournisseur');
690 if (!in_array($modName, $silentModules)) {
691 print
info_admin(
"admin/modules.php Warning bad descriptor file : ".$dir.$file.
" (Class ".$modName.
" not found into file)", 0, 0,
'1',
'warning');
695 dol_syslog(
"Failed to load ".$dir.$file.
" ".$e->getMessage(), LOG_ERR);
702 dol_syslog(
"htdocs/admin/modules.php: Failed to open directory ".$dir.
". See permission and open_basedir option.", LOG_WARNING);
706'@phan-var-force array<string,DolibarrModules> $modules';
709if ($action ==
'reset_confirm' && $user->admin) {
710 if (!empty($modules[$value])) {
711 $objMod = $modules[$value];
713 if (!empty($objMod->langfiles)) {
714 $langs->loadLangs($objMod->langfiles);
718 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?value='.$value.
'&mode='.$mode.$param, $langs->trans(
'ConfirmUnactivation'), $langs->trans(
GETPOST(
'confirm_message_code')),
'reset',
'',
'no', 1, 300, 550);
722if ($action ==
'reload_confirm' && $user->admin) {
723 if (!empty($modules[$value])) {
724 $objMod = $modules[$value];
726 if (!empty($objMod->langfiles)) {
727 $langs->loadLangs($objMod->langfiles);
731 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?value='.$value.
'&mode='.$mode.$param, $langs->trans(
'ConfirmReload'), $langs->trans(
GETPOST(
'confirm_message_code')),
'reload',
'',
'no', 1);
742$nbofactivatedmodules = count(
$conf->modules);
745$nbmodulesnotautoenabled = count(
$conf->modules);
746$listofmodulesautoenabled = array(
'user',
'agenda',
'fckeditor',
'export',
'import');
747foreach ($listofmodulesautoenabled as $moduleautoenable) {
748 if (in_array($moduleautoenable,
$conf->modules)) {
749 $nbmodulesnotautoenabled--;
757if ($mode ==
'common' || $mode ==
'commonkanban') {
758 $desc = $langs->trans(
"ModulesDesc",
'{picto}');
759 $desc .=
' '.$langs->trans(
"ModulesDesc2",
'{picto2}');
760 $desc = str_replace(
'{picto}',
img_picto(
'',
'switch_off',
'class="size15x"'), $desc);
761 $desc = str_replace(
'{picto2}',
img_picto(
'',
'setup',
'class="size15x"'), $desc);
763 $deschelp .=
'<div class="info hideonsmartphone">'.$desc.
"<br></div>\n";
766 $deschelp .=
'<div class="info">'.$langs->trans(
getDolGlobalString(
'MAIN_SETUP_MODULES_INFO')).
"<br></div>\n";
772if ($mode ==
'deploy') {
773 $deschelp =
'<div class="info hideonsmartphone">'.$langs->trans(
"ModulesDeployDesc", $langs->transnoentitiesnoconv(
"AvailableModules")).
"<br></div><br>\n";
775if ($mode ==
'develop') {
776 $deschelp =
'<div class="info hideonsmartphone">'.$langs->trans(
"ModulesDevelopDesc").
"<br></div><br>\n";
782if ($mode ==
'common' || $mode ==
'commonkanban') {
785 print
'<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
786 print
'<input type="hidden" name="token" value="'.newToken().
'">';
787 if (isset($optioncss) && $optioncss !=
'') {
788 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
790 if (isset($sortfield) && $sortfield !=
'') {
791 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
793 if (isset($sortorder) && $sortorder !=
'') {
794 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
796 if (isset($page) && $page !=
'') {
797 print
'<input type="hidden" name="page" value="'.$page.
'">';
799 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
805 $moreforfilter =
'<div class="valignmiddle">';
807 $moreforfilter .=
'<div class="floatright right pagination paddingtop --module-list"><ul><li>';
808 $moreforfilter .= dolGetButtonTitle($langs->trans(
'CheckForModuleUpdate'), $langs->trans(
'CheckForModuleUpdate').
'<br><br>'.
img_warning(
'',
'',
'paddingright').$langs->trans(
'CheckForModuleUpdateHelp').
' '.$langs->trans(
'CheckForModuleUpdateHelp2', DolibarrModules::URL_FOR_BLACKLISTED_MODULES).
'<br>'.$langs->trans(
"YourIPWillBeRevealedToThisExternalProviders"),
'fa fa-sync', $_SERVER[
"PHP_SELF"].
'?action=checklastversion&token='.newToken().
'&mode='.$mode.$param,
'', 1, array(
'morecss' =>
'reposition'));
809 $moreforfilter .= dolGetButtonTitleSeparator();
810 $moreforfilter .= dolGetButtonTitle($langs->trans(
'ViewList'),
'',
'fa fa-bars imgforviewmode', $_SERVER[
"PHP_SELF"].
'?mode=common'.$param,
'', ($mode ==
'common' ? 2 : 1), array(
'morecss' =>
'reposition'));
811 $moreforfilter .= dolGetButtonTitle($langs->trans(
'ViewKanban'),
'',
'fa fa-th-list imgforviewmode', $_SERVER[
"PHP_SELF"].
'?mode=commonkanban'.$param,
'', ($mode ==
'commonkanban' ? 2 : 1), array(
'morecss' =>
'reposition'));
812 $moreforfilter .=
'</li></ul></div>';
814 $moreforfilter .=
'<div class="divfilteralone colorbacktimesheet float valignmiddle nopaddingtopimp nopaddingbottomimp">';
815 $moreforfilter .=
'<div class="divsearchfield paddingtop paddingbottom valignmiddle inline-block">';
816 $moreforfilter .=
img_picto($langs->trans(
"Filter"),
'filter',
'class="paddingright opacityhigh hideonsmartphone"').
'<input type="text" id="search_keyword" name="search_keyword" class="maxwidth125" value="'.
dol_escape_htmltag($search_keyword).
'" spellcheck="false" placeholder="'.
dol_escape_htmltag($langs->trans(
'Keyword')).
'">';
817 $moreforfilter .=
'</div>';
818 $moreforfilter .=
'<div class="divsearchfield paddingtop paddingbottom valignmiddle inline-block">';
819 $moreforfilter .= $form->selectarray(
'search_nature', $arrayofnatures,
dol_escape_htmltag($search_nature), $langs->trans(
'Origin'), 0, 0,
'', 0, 0, 0,
'',
'maxwidth250', 1);
820 $moreforfilter .=
'</div>';
823 $array_version = array(
'stable' => $langs->transnoentitiesnoconv(
"Stable"));
825 $array_version[
'deprecated'] = $langs->trans(
"Deprecated");
828 $array_version[
'experimental'] = $langs->trans(
"Experimental");
831 $array_version[
'development'] = $langs->trans(
"Development");
833 $moreforfilter .=
'<div class="divsearchfield paddingtop paddingbottom valignmiddle inline-block">';
834 $moreforfilter .= $form->selectarray(
'search_version', $array_version, $search_version, $langs->transnoentitiesnoconv(
'Version'), 0, 0,
'', 0, 0, 0,
'',
'maxwidth150', 1);
835 $moreforfilter .=
'</div>';
837 $array_status = array(
'active' => $langs->transnoentitiesnoconv(
"Enabled"),
'disabled' => $langs->transnoentitiesnoconv(
"Disabled"));
838 $moreforfilter .=
'<div class="divsearchfield paddingtop paddingbottom valignmiddle inline-block">';
839 $moreforfilter .= $form->selectarray(
'search_status', $array_status, $search_status, $langs->transnoentitiesnoconv(
'Status'), 0, 0,
'', 0, 0, 0,
'',
'maxwidth150', 1);
840 $moreforfilter .=
'</div>';
841 $moreforfilter .=
' ';
842 $moreforfilter .=
'<div class="divsearchfield valignmiddle inline-block">';
843 $moreforfilter .=
'<input type="submit" name="buttonsubmit" class="button small nomarginleft" value="'.dolPrintHTMLForAttribute($langs->trans(
"Refresh")).
'">';
844 if ($search_keyword || ($search_nature && $search_nature !=
'-1') || ($search_version && $search_version !=
'-1') || ($search_status && $search_status !=
'-1')) {
845 $moreforfilter .=
' ';
846 $moreforfilter .=
'<input type="submit" name="buttonreset" class="buttonreset noborderall nomargintop nomarginbottom" value="'.dolPrintHTMLForAttribute($langs->trans(
"Reset")).
'">';
848 $moreforfilter .=
'</div>';
849 $moreforfilter .=
'</div>';
851 $moreforfilter .=
'</div>';
853 print $moreforfilter;
854 $parameters = array();
855 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
856 print $hookmanager->resPrint;
860 print
'<div class="clearboth"></div><br><br>';
863 $parameters = array();
864 $reshook = $hookmanager->executeHooks(
'insertExtraHeader', $parameters, $object, $action);
869 $disabled_modules = array();
870 if (!empty($_SESSION[
"disablemodules"])) {
871 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
876 $foundoneexternalmodulewithupdate = 0;
878 $atleastonequalified = 0;
879 $atleastoneforfamily = 0;
881 print
'<script type="text/javascript">
882 jQuery(document).ready(function() {
883 jQuery(".modulefamilygroup").each(function() {
884 var $group = jQuery(this);
885 var $title = $group.find(".titre.inline-block").first();
886 var $nextContainer = $group.nextAll(".div-table-responsive, .box-flex-container").first();
887 if ($title.length && !$title.children(".modulefamilytoggleicon").length) {
888 $title.prepend("<i class=\"fa modulefamilytoggleicon paddingleft paddingleftright\"></i> ");
890 var $icon = $title.children(".modulefamilytoggleicon").first();
891 var isVisible = $nextContainer.is(":visible");
892 if ($icon.length && $nextContainer.length) {
893 $icon.toggleClass("fa-folder-open", isVisible);
894 $icon.toggleClass("fa-folder", !isVisible);
898 jQuery(document).on("click", ".modulefamilygroup", function() {
899 var $group = jQuery(this);
900 var $nextContainer = $group.nextAll(".div-table-responsive, .box-flex-container").first();
901 if ($nextContainer.length) {
902 var $icon = $group.find(".modulefamilytoggleicon").first();
903 var isVisible = $nextContainer.is(":visible");
904 $nextContainer.stop(true, true).slideToggle(150);
906 $icon.toggleClass("fa-folder-open", !isVisible);
907 $icon.toggleClass("fa-folder", isVisible);
914 foreach ($orders as $key => $value) {
916 $tab = explode(
'_', $value);
917 $familykey = $tab[1];
918 $module_position = $tab[2];
920 $modName = $filename[$key];
923 $objMod = $modules[$modName];
925 if (!is_object($objMod)) {
930 if ($mode ==
'expdev' && $objMod->version !=
'development' && $objMod->version !=
'experimental') {
934 if (!$objMod->getName()) {
935 dol_syslog(
"Error for module ".$key.
" - Property name of module looks empty", LOG_WARNING);
939 $modulenameshort = strtolower(preg_replace(
'/^mod/i',
'', get_class($objMod)));
940 $const_name =
'MAIN_MODULE_'.strtoupper(preg_replace(
'/^mod/i',
'', get_class($objMod)));
943 $modulename = $objMod->getName();
944 $moduletechnicalname = $objMod->name;
945 $moduledesc = $objMod->getDesc();
946 $moduledesclong = $objMod->getDescLong();
947 $moduleauthor = $objMod->getPublisher();
950 if ($search_keyword) {
952 $search_keyword_array = explode(
' ', $search_keyword);
954 foreach ($search_keyword_array as $word) {
955 if (!preg_match(
'/'.preg_quote($word,
'/').
'/i', $modulename)
956 && !preg_match(
'/'.preg_quote($word,
'/').
'/i', $moduletechnicalname)
957 && !($moduledesc && preg_match(
'/'.preg_quote($word,
'/').
'/i', $moduledesc))
958 && !($moduledesclong && preg_match(
'/'.preg_quote($word,
'/').
'/i', $moduledesclong))
959 && !($moduleauthor && preg_match(
'/'.preg_quote($word,
'/').
'/i', $moduleauthor))
971 if ($search_status) {
979 if ($search_nature) {
980 if (preg_match(
'/^external/', $search_nature) && $objMod->isCoreOrExternalModule() !=
'external') {
984 if (preg_match(
'/^external_(.*)$/', $search_nature, $reg)) {
990 if (!$reg[1] && !empty($publisher)) {
994 if ($search_nature ==
'core' && $objMod->isCoreOrExternalModule() ==
'external') {
998 if ($search_version) {
999 if (($objMod->version ==
'development' || $objMod->version ==
'experimental' || preg_match(
'/deprecated/', $objMod->version)) && $search_version ==
'stable') {
1002 if ($objMod->version !=
'development' && ($search_version ==
'development')) {
1005 if ($objMod->version !=
'experimental' && ($search_version ==
'experimental')) {
1008 if (!preg_match(
'/deprecated/', $objMod->version) && ($search_version ==
'deprecated')) {
1013 $atleastonequalified++;
1016 if (isset($objMod->langfiles) && is_array($objMod->langfiles)) {
1017 foreach ($objMod->langfiles as $domain) {
1018 $langs->load($domain);
1023 if ($familykey != $oldfamily) {
1025 print
'</table></div><br>';
1028 $familytext = empty($familyinfo[$familykey][
'label']) ? $familykey : $familyinfo[$familykey][
'label'];
1032 if ($mode ==
'commonkanban') {
1033 print
'<div class="box-flex-container kanban">';
1035 print
'<div class="div-table-responsive">';
1036 print
'<table class="tagtable liste" summary="list_of_modules">'.
"\n";
1039 $atleastoneforfamily = 0;
1042 $atleastoneforfamily++;
1044 if ($familykey != $oldfamily) {
1045 $familytext = empty($familyinfo[$familykey][
'label']) ? $familykey : $familyinfo[$familykey][
'label'];
1046 $oldfamily = $familykey;
1050 $version = $objMod->getVersion(0);
1052 $warningstring =
'';
1053 if (preg_match(
'/development/i', $version)) {
1054 $warningstring = $langs->trans(
"Development");
1056 if (preg_match(
'/experimental/i', $version)) {
1057 $warningstring = $langs->trans(
"Experimental");
1059 if (preg_match(
'/deprecated/i', $version)) {
1060 $warningstring = $langs->trans(
"Deprecated");
1063 if ($objMod->isCoreOrExternalModule() ==
'external' || preg_match(
'/development|experimental|deprecated/i', $version)) {
1064 $versiontrans .= $objMod->getVersion(1);
1067 if ($objMod->isCoreOrExternalModule() ==
'external' && ($action ==
'checklastversion' ||
getDolGlobalString(
'CHECKLASTVERSION_EXTERNALMODULE'))) {
1071 $checkRes = $objMod->checkForUpdate();
1072 if ($checkRes > 0) {
1073 setEventMessages($objMod->getName().
' : '.preg_replace(
'/[^a-z0-9_\.\-\s]/i',
'', $versiontrans).
' -> '.preg_replace(
'/[^a-z0-9_\.\-\s]/i',
'', $objMod->lastVersion),
null,
'warnings');
1074 } elseif ($checkRes < 0) {
1075 setEventMessages($objMod->getName().
' '.$langs->trans(
'CheckVersionFail'),
null,
'errors');
1079 if ($objMod->isCoreOrExternalModule() ==
'external' && $action ==
'checklastversion' && !
getDolGlobalString(
'DISABLE_CHECK_ON_MALWARE_MODULES')) {
1080 $checkRes = $objMod->checkForCompliance();
1081 if (!is_numeric($checkRes) && $checkRes !=
'') {
1082 $langs->load(
"errors");
1083 setEventMessages($objMod->getName().
' : '.$langs->trans($checkRes),
null,
'errors');
1089 if ($objMod->isCoreOrExternalModule() ==
'external') {
1090 $imginfo =
"info_black";
1093 $codeenabledisable =
'';
1097 if (in_array($modulenameshort, $disabled_modules)) {
1098 $objMod->disabled =
true;
1105 if (!empty($arrayofwarnings[$modName])) {
1106 $codeenabledisable .=
'<!-- This module has a warning to show when we activate it (note: your country is '.$mysoc->country_code.
') -->'.
"\n";
1109 if (!empty($objMod->disabled)) {
1110 $codeenabledisable .= $langs->trans(
"Disabled");
1111 } elseif (is_object($objMod)
1112 && (!empty($objMod->always_enabled) || ((
isModEnabled(
'multicompany') && $objMod->core_enabled) && ($user->entity ||
$conf->entity != 1)))) {
1114 if (method_exists($objMod,
'alreadyUsed') && $objMod->alreadyUsed()) {
1115 $codeenabledisable .= $langs->trans(
"Used");
1117 $codeenabledisable .=
img_picto($langs->trans(
"Required"),
'switch_on',
'', 0, 0, 0,
'',
'opacitymedium valignmiddle');
1125 if (is_object($objMod) && !empty($objMod->warnings_unactivation[
$mysoc->country_code]) && method_exists($objMod,
'alreadyUsed') && $objMod->alreadyUsed()) {
1126 $codeenabledisable .=
'<a class="reposition valignmiddle" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=reset_confirm&confirm_message_code='.urlencode($objMod->warnings_unactivation[
$mysoc->country_code]).
'&value='.$modName.
'&mode='.$mode.$param.
'">';
1127 $codeenabledisable .=
img_picto($langs->trans(
"Activated").($warningstring ?
' '.$warningstring :
''),
'switch_on');
1128 $codeenabledisable .=
'</a>';
1130 $codeenabledisable .=
' ';
1131 $codeenabledisable .=
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=reload_confirm&value='.$modName.
'&mode='.$mode.
'&confirm=yes'.$param.
'">';
1132 $codeenabledisable .=
img_picto($langs->trans(
"Reload"),
'refresh',
'class="opacitymedium"');
1133 $codeenabledisable .=
'</a>';
1136 $codeenabledisable .=
'<a class="reposition valignmiddle" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=reset&value='.$modName.
'&mode='.$mode.
'&confirm=yes'.$param.
'">';
1137 $codeenabledisable .=
img_picto($langs->trans(
"Activated").($warningstring ?
' '.$warningstring :
''),
'switch_on');
1138 $codeenabledisable .=
'</a>';
1140 $codeenabledisable .=
' ';
1141 $codeenabledisable .=
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=reload&value='.$modName.
'&mode='.$mode.
'&confirm=yes'.$param.
'">';
1142 $codeenabledisable .=
img_picto($langs->trans(
"Reload"),
'refresh',
'class="opacitymedium"');
1143 $codeenabledisable .=
'</a>';
1149 if (!empty($objMod->config_page_url) && !$disableSetup) {
1150 $backtourlquery = [];
1151 if ($search_keyword !=
'') {
1152 $backtourlquery += [
'search_keyword' => $search_keyword];
1154 if ($search_nature > -1) {
1155 $backtourlquery += [
'search_nature' => $search_nature];
1157 if ($search_version > -1) {
1158 $backtourlquery += [
'search_version' => $search_version];
1160 if ($search_status > -1) {
1161 $backtourlquery += [
'search_status' => $search_status];
1163 $backtourl =
dolBuildUrl($_SERVER[
"PHP_SELF"], $backtourlquery);
1167 'save_lastsearch_values' => 1,
1168 'backtopage' => $backtourl,
1170 if (is_array($objMod->config_page_url)) {
1172 foreach ($objMod->config_page_url as $page) {
1175 $codetoconfig .=
'<a href="'.$urlpage.
'" title="'.$langs->trans($page).
'">'.
img_picto(ucfirst($page),
"setup").
'</a>';
1178 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $urlpage, $regs)) {
1179 $urltouse =
dol_buildpath(
'/'.$regs[2].
'/admin/'.$regs[1], 1);
1180 $codetoconfig .=
'<a href="'.$urltouse.(preg_match(
'/\?/', $urltouse) ?
'&' :
'?').
'save_lastsearch_values=1&backtopage='.urlencode($backtourl).
'" title="'.$langs->trans(
"Setup").
'">'.
img_picto($langs->trans(
"Setup"),
"setup",
'style="padding-right: 6px"', 0, 0, 0,
'',
'fa-15').
'</a>';
1182 $urltouse = $urlpage;
1183 $codetoconfig .=
'<a href="'.$urltouse.(preg_match(
'/\?/', $urltouse) ?
'&' :
'?').
'save_lastsearch_values=1&backtopage='.urlencode($backtourl).
'" title="'.$langs->trans(
"Setup").
'">'.
img_picto($langs->trans(
"Setup"),
"setup",
'style="padding-right: 6px"', 0, 0, 0,
'',
'fa-15').
'</a>';
1187 } elseif (preg_match(
'/^([^@]+)@([^@]+)$/i', (
string) $objMod->config_page_url, $regs)) {
1188 $codetoconfig .=
'<a class="valignmiddle" href="'.dol_buildpath(
'/'.$regs[2].
'/admin/'.$regs[1], 1).
'?save_lastsearch_values=1&backtopage='.urlencode($backtourl).
'" title="'.$langs->trans(
"Setup").
'">'.
img_picto($langs->trans(
"Setup"),
"setup",
'style="padding-right: 6px"', 0, 0, 0,
'',
'fa-15').
'</a>';
1190 $codetoconfig .=
'<a class="valignmiddle" href="'.((string) $objMod->config_page_url).
'?save_lastsearch_values=1&backtopage='.urlencode($backtourl).
'" title="'.$langs->trans(
"Setup").
'">'.
img_picto($langs->trans(
"Setup"),
"setup",
'style="padding-right: 6px"', 0, 0, 0,
'',
'fa-15').
'</a>';
1193 $codetoconfig .=
img_picto($langs->trans(
"NothingToSetup"),
"setup",
'class="opacitytransp" style="padding-right: 6px"', 0, 0, 0,
'',
'fa-15');
1197 if (!empty($objMod->always_enabled)) {
1199 $codeenabledisable .=
'<!-- Message to show: an always_enabled module has been disabled -->'.
"\n";
1200 $codeenabledisable .=
'<a class="reposition" id="idalways'.$objMod->numero.
'" data-alreadyclicked="0" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=set&token='.newToken().
'&value='.$modName.
'&mode='.$mode.$param.
'"';
1201 $codeenabledisable .=
'>';
1202 $codeenabledisable .=
img_picto($langs->trans(
"Disabled"),
'switch_off');
1203 $codeenabledisable .=
"</a>\n";
1204 } elseif (!empty($objMod->disabled)) {
1205 $codeenabledisable .= $langs->trans(
"Disabled");
1208 $warningmessage =
'';
1211 if (!empty($arrayofwarnings[$modName])) {
1212 $codeenabledisable .=
'<!-- This module is a core module and it may have a warning to show when we activate it (note: your country is '.$mysoc->country_code.
') -->'.
"\n";
1213 foreach ($arrayofwarnings[$modName] as $keycountry => $cursorwarningmessage) {
1214 if (preg_match(
'/^always/', $keycountry) || (
$mysoc->country_code && preg_match(
'/^'.
$mysoc->country_code.
'/', $keycountry))) {
1215 if (!is_array($cursorwarningmessage)) {
1216 $cursorwarningmessage = array($cursorwarningmessage);
1218 foreach ($cursorwarningmessage as $messagetoshow) {
1219 if (preg_match(
'/:1$/', $messagetoshow)) {
1222 $messagetoshow = preg_replace(
'/:1$/',
'', $messagetoshow);
1225 $warningmessage .= ($warningmessage ?
"\n" :
"").$langs->trans($messagetoshow, $objMod->getName(),
$mysoc->country_code);
1230 if ($objMod->isCoreOrExternalModule() ==
'external' && !empty($arrayofwarningsext)) {
1231 $codeenabledisable .=
'<!-- This module is an external module and it may have a warning to show (note: your country is '.$mysoc->country_code.
') -->'.
"\n";
1232 foreach ($arrayofwarningsext as $keymodule => $arrayofwarningsextbycountry) {
1233 $keymodulelowercase = strtolower(preg_replace(
'/^mod/',
'', $keymodule));
1234 if (preg_match(
'/^always/', $keymodulelowercase) || in_array($keymodulelowercase,
$conf->modules)) {
1235 foreach ($arrayofwarningsextbycountry as $keycountry => $cursorwarningmessage) {
1236 if (preg_match(
'/^always/', $keycountry) || (
$mysoc->country_code && preg_match(
'/^'.
$mysoc->country_code.
'/', $keycountry))) {
1237 if (!is_array($cursorwarningmessage)) {
1238 $cursorwarningmessage = array($cursorwarningmessage);
1240 foreach ($cursorwarningmessage as $messagetoshow) {
1242 $warningmessage .= ($warningmessage ?
"\n" :
"").$langs->trans($messagetoshow, $objMod->getName(),
$mysoc->country_code, $modules[$keymodule]->getName());
1244 $warningmessage .= ($warningmessage ?
"\n" :
"").($warningmessage ?
"\n" :
"").$langs->trans(
"Module").
' : '.$objMod->getName();
1245 if (!empty($objMod->editor_name)) {
1246 $warningmessage .= ($warningmessage ?
"\n" :
"").$langs->trans(
"Publisher").
' : '.$objMod->editor_name;
1248 if ($keymodulelowercase !=
'always') {
1249 $warningmessage .= ($warningmessage ?
"\n" :
"").$langs->trans(
"ModuleTriggeringThisWarning").
' : '.$modules[$keymodule]->getName();
1257 $urltogo = $_SERVER[
"PHP_SELF"].
'?id='.$objMod->numero.
'&token='.newToken().
'&module_position='.$module_position.
'&action=set&token='.newToken().
'&value='.$modName.
'&mode='.$mode.$param;
1260 $codeenabledisable .=
'<!-- Message to show: '.$warningmessage.
' -->'.
"\n";
1261 $codeenabledisable .=
'<a class="reposition" id="idqualified'.$objMod->numero.
'" data-alreadyclicked="0" href="'.$urltogo.
'"';
1262 if ($warningmessage) {
1263 $codeenabledisable .=
' onclick="return confirmDolibarr(\''.dol_escape_js($warningmessage).
'\', \
'idqualified'.$objMod->numero.
'\',
'.$popupWidth.',
'.$popupHeight.',
'.$disableCancel.');
"';
1265 $codeenabledisable .= '>';
1266 $codeenabledisable .= img_picto($langs->trans("Disabled
"), 'switch_off');
1267 $codeenabledisable .= "</a>\n
";
1270 // Set $codetoconfig
1271 $codetoconfig .= img_picto($langs->trans("NothingToSetup
"), "setup
", 'class="opacitytransp
" style="padding-right: 6px
"');
1274 if ($mode == 'commonkanban') {
1276 print $objMod->getKanbanView($codeenabledisable, $codetoconfig);
1278 print '<tr class="oddeven
'.($warningstring ? ' info-box-content-warning
' : '').'">'."\n
";
1279 if (getDolGlobalString('MAIN_MODULES_SHOW_LINENUMBERS')) {
1280 print '<td class="width50
">'.$linenum.'</td>';
1283 // Picto + Name of module
1284 print ' <td class="tdoverflowmax200 minwidth200imp
" title="'.dol_escape_htmltag($objMod->getName()).'">';
1286 //if (is_array($objMod->need_dolibarr_version)) $alttext.=($alttext?' - ':'').'Dolibarr >= '.join('.',$objMod->need_dolibarr_version);
1287 //if (is_array($objMod->phpmin)) $alttext.=($alttext?' - ':'').'PHP >= '.join('.',$objMod->phpmin);
1288 if (!empty($objMod->picto)) {
1289 if (preg_match('/^\//i', $objMod->picto)) {
1290 print img_picto($alttext, $objMod->picto, 'class="valignmiddle pictomodule paddingrightonly
"', 1);
1292 print img_object($alttext, $objMod->picto, 'class="valignmiddle pictomodule paddingrightonly
"');
1295 print img_object($alttext, 'generic', 'class="valignmiddle paddingrightonly
"');
1297 print ' <span class="valignmiddle
">'.$objMod->getName().'</span>';
1301 print '<td class="valignmiddle tdoverflowmax300 minwidth200imp opacitylow
">';
1302 print nl2br($objMod->getDesc());
1306 print '<td class="center nowrap
" style="width: 82px;
">';
1307 print '<a href="javascript:
document_preview(\
''.DOL_URL_ROOT.
'/admin/modulehelp.php?id='.((
int) $objMod->numero).
'\',\
'text/html\',\''.dol_escape_js($langs->trans(
"Module")).
'\')
">';
1308 print img_picto(($objMod->isCoreOrExternalModule() == 'external' ? $langs->trans("ExternalModule
").' - ' : '').$langs->trans("ClickToShowDescription
"), $imginfo, '', 0, 0, 0, '', 'purple');
1310 print ($timestoinit[$modName] > 500 ? img_picto($langs->trans('InitModuleIsSlow'), 'fa-exclamation-circle') : '');
1314 print '<td class="center nowrap width150
" title="'.dol_escape_htmltag(dol_string_nohtmltag($versiontrans)).'">';
1315 if ($objMod->needUpdate) {
1316 $versionTitle = $langs->trans('ModuleUpdateAvailable').' : '.$objMod->lastVersion;
1317 print '<span class="badge badge-warning classfortooltip
" title="'.dol_escape_htmltag($versionTitle).'">'.$versiontrans.'</span>';
1319 print $versiontrans;
1323 // Link enable/disable
1324 print '<td class="center valignmiddle left nowraponall
" width="60px
">';
1325 print $codeenabledisable;
1329 print '<td class="tdsetuppicto right valignmiddle
" width="60px
">';
1330 print $codetoconfig;
1335 if ($objMod->needUpdate) {
1336 $foundoneexternalmodulewithupdate++;
1340 if ($action == 'checklastversion') {
1341 if ($foundoneexternalmodulewithupdate) {
1342 setEventMessages($langs->trans("ModuleUpdateAvailable
"), null, 'warnings', '', 0, 1);
1344 setEventMessages($langs->trans("NoExternalModuleWithUpdate
"), null, 'mesgs');
1349 if ($mode == 'commonkanban') {
1357 if (!$atleastonequalified) {
1358 print '<br><span class="opacitymedium
">'.$langs->trans("NoDeployedModulesFoundWithThisSearchCriteria
").'</span><br><br>';
1361 print dol_get_fiche_end();
1365 // Show warning about external users
1366 print info_admin(showModulesExludedForExternal($modules))."\n
";
1371if ($mode == 'marketplace') {
1372 print dol_get_fiche_head($head, $mode, '', -1);
1378 print '<!-- summary of sources -->';
1380 // Marketplace and community modules
1381 print '<div class="div-
table-responsive-no-min
">';
1382 print '<table summary="list_of_modules
" class="noborder centpercent
">'."\n
";
1383 print '<tr class="liste_titre
">'."\n
";
1384 print '<td colspan="2
">'.$form->textwithpicto($langs->trans("ModuleProviderSites
"), $langs->trans("WebSiteDesc
")).'</td>';
1385 print '<td class="hideonsmartphone
">';
1391 // Source Community github
1392 $url = 'https://github.com/Dolibarr/dolibarr-community-modules';
1394 print '<tr class="oddeven nohover
" height="100
">'."\n
";
1395 print '<td class="hideonsmartphone center width150 nopaddingleftimp nopaddingrightimp
"><a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
"><img border="0
" class="imgautosize imgmaxwidth100
" src="'.DOL_URL_ROOT.'/theme/dolibarr_logo.svg
"></a></td>';
1396 print '<td class="minwidth500imp smallonsmartphone
"><span class="opacitymedium
">'.$langs->trans("CommunityModulesDesc
").'</span><br>';
1397 print img_picto('', 'url', 'class="pictofixedwidth
"').'<a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
">'.$url.'</a></td>';
1399 print ajax_constantonoff('MAIN_ENABLE_EXTERNALMODULES_COMMUNITY', array(), null, 0, 0, 1);
1401 print '<td class="center
">';
1402 if (!getDolGlobalString('MAIN_DISABLE_EXTERNALMODULES_COMMUNITY') && getDolGlobalInt('MAIN_ENABLE_EXTERNALMODULES_COMMUNITY')) {
1403 $messagetoadd = '<br><br><span class="small
">Content of the repository index file '.$remotestore->file_source_url.' should be in the local cache file '.$remotestore->cache_file;
1404 $messagetoadd .= ' (Date: '.dol_print_date(dol_filemtime($remotestore->cache_file), 'dayhour', 'tzuserrel').')</span>';
1405 if ($remotestore->githubFileError) {
1406 $messagetoadd .= '<br><span class="error small
">'.$remotestore->githubFileError.'</span>';
1408 print $remotestore->libStatus($remotestore->githubFileStatus, 2, $messagetoadd);
1414 // Source Marketplace DoliStore
1415 $url = 'https://www.dolistore.com';
1417 print '<tr class="oddeven nohover
" height="100
">'."\n
";
1418 print '<td class="hideonsmartphone center width150 nopaddingleftimp nopaddingrightimp
"><a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
"><img border="0
" class="imgautosize imgmaxwidth100
" src="'.DOL_URL_ROOT.'/theme/dolistore_logo.svg
"></a></td>';
1419 print '<td class="minwidth500imp smallonsmartphone
"><span class="opacitymedium
">'.$langs->trans("DoliStoreDesc
").'</span><br>';
1420 print img_picto('', 'url', 'class="pictofixedwidth
"').'<a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
">'.$url.'</a></td>';
1422 print ajax_constantonoff('MAIN_ENABLE_EXTERNALMODULES_DOLISTORE', array(), null, 0, 0, 1);
1424 print '<td class="center
">';
1425 if (!getDolGlobalString('MAIN_DISABLE_EXTERNALMODULES_DOLISTORE') && getDolGlobalInt('MAIN_ENABLE_EXTERNALMODULES_DOLISTORE')) {
1426 $messagetoadd = '<br><span class="small
">';
1427 if ($remotestore->dolistoreApiStatus <= 0) {
1428 $messagetoadd = '<br>'.$remotestore->dolistoreApiError.'<br>Failed to get answer of remote API server<br>';
1431 $messagetoadd .= '<br>Using Shop address MAIN_MODULE_DOLISTORE_SHOP_URL = '.$remotestore->shop_url;
1432 $messagetoadd .= '<br>Using Remote API address MAIN_MODULE_DOLISTORE_API_URL = '.$remotestore->dolistore_api_url;
1433 $messagetoadd .= '<br>Using API public key MAIN_MODULE_DOLISTORE_API_KEY = '.$remotestore->dolistore_api_key;
1434 // Add basic auth if needed
1435 $basicAuthLogin = getDolGlobalString('MAIN_MODULE_DOLISTORE_BASIC_LOGIN');
1436 $basicAuthPassword = getDolGlobalString('MAIN_MODULE_DOLISTORE_BASIC_PASSWORD');
1437 if ($basicAuthLogin) {
1438 $messagetoadd .= '<br>Using basic auth login: base64('.$basicAuthLogin.':'.$basicAuthPassword.')';
1440 $messagetoadd .= '</span>';
1442 print $remotestore->libStatus($remotestore->dolistoreApiStatus, 2, $messagetoadd);
1450 print dol_get_fiche_end();
1454 if ($remotestore->numberOfProviders > 0) {
1455 // $options is array with filter criteria
1456 $nbmaxtoshow = $options['per_page'];
1457 $options['per_page']++;
1459 //$remotestore->getRemoteCategories();
1460 //$remotestore->getRemoteProducts($options);
1462 //print '<span class="opacitymedium hideonsmartphone
">'.$langs->trans('DOLISTOREdescriptionLong').'</span><br><br>';
1464 $categories_tree = $remotestore->getCategories($options['categorie']); // Call API to get the categories
1466 $products_list = $remotestore->getProducts($options); // Get list of product from all sources
1468 $previouslink = $remotestore->get_previous_link();
1470 $nextlink = $remotestore->get_next_link();
1473 print '<div class="liste_titre liste_titre_bydiv centpercent
"><div class="">';
1475 print '<form method="POST
" class="centpercent
" id="searchFormList
" action="'.$remotestore->url.'">'; ?>
1476 <input type="hidden
" name="token
" value="<?php echo newToken(); ?>
">
1477 <input type="hidden
" name="mode
" value="marketplace
">
1478 <input type="hidden
" name="page_y
" value="">
1479 <div class="divsearchfield
">
1480 <input name="search_keyword
" placeholder="<?php echo $langs->trans(
'Keyword') ?>
" id="search_keyword
" type="text
" class="minwidth200
" value="<?php echo
dolPrintHTMLForAttribute($options[
'search']) ?>
" spellcheck="false">
1482 <div class="divsearchfield
">
1483 <input name="buttonsubmit
" class="button buttongen reposition
" value="<?php echo $langs->trans(
'Search') ?>
" type="submit
">
1485 if ($search_keyword !== '') {
1486 print '<a class="buttonreset reposition
" href="'.$_SERVER["PHP_SELF"].'?mode=marketplace
">'.$langs->trans('Reset').'</a>';
1488 print $form->textwithpicto('', $langs->trans('DOLISTOREdescriptionLong'));
1494 $totalnboflines = '<span class="product-count opacitymedium paddingleft
">';
1495 $totalnboflines .= $langs->trans("itemFound
", $remotestore->numberTotalOfProducts);
1496 $totalnboflines .= '</span>';
1498 print $totalnboflines;
1499 print $remotestore->getPagination();
1503 print '<div class="clearboth
"></div>';
1506 <?php if (!empty($categories_tree)) { ?>
1507 <div id="category-tree-left
" class="paddingtop
">
1510 print $categories_tree; ?>
1515 <div id="listing-content
" class="div-
table-responsive
" <?php if (empty($categories_tree)) { ?>style="width:100%;
"<?php } ?>>
1516 <table summary="list_of_modules
" id="list_of_modules
" class="productlist centpercent
">
1517 <tbody id="listOfModules
">
1518 <!-- $product_list is $remotestore->getProducts($options) done previously -->
1519 <?php print $products_list; ?>
1523 <div style="clear: both;
"></div>
1524 <div><?php print $remotestore->getPagination(); ?></div>
1530// Form to install an external module
1532if ($mode == 'deploy') {
1533 print dol_get_fiche_head($head, $mode, '', -1);
1535 $fullurl = '<a href="'.$urldolibarrmodules.'" target="_blank
" rel="noopener noreferrer
">'.$urldolibarrmodules.'</a>';
1537 if ($allowonlineinstall) {
1538 if (!in_array('/custom', explode(',', $dolibarr_main_url_root_alt))) {
1539 $message = info_admin($langs->trans("ConfFileMustContainCustom
", DOL_DOCUMENT_ROOT.'/custom', DOL_DOCUMENT_ROOT));
1543 if (!is_writable(dol_osencode($dirins))) {
1544 $langs->load("errors
");
1545 $message = info_admin($langs->trans("ErrorFailedToWriteInDir
", $dirins), 0, 0, '1', 'warning');
1549 $message = info_admin($langs->trans("NotExistsDirect
", $dirins).$langs->trans("InfDirAlt
").$langs->trans("InfDirExample
"));
1554 if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
1555 // Show clean message
1556 if (!is_numeric(getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US'))) {
1557 $message = info_admin($langs->trans(getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')), 0, 0, 'warning');
1559 $message = info_admin($langs->trans('InstallModuleFromWebHasBeenDisabledContactUs'), 0, 0, 'warning');
1562 // Show technical message
1563 $message = info_admin($langs->trans("InstallModuleFromWebHasBeenDisabledByFile
", $dolibarrdataroot.'/installmodules.lock'), 0, 0, 'warning');
1570 if ($allowfromweb < 1) {
1571 print $langs->trans("SomethingMakeInstallFromWebNotPossible
");
1573 //print $langs->trans("SomethingMakeInstallFromWebNotPossible2
");
1577 // $allowfromweb = -1 if installation or setup not correct, 0 if not allowed, 1 if allowed
1578 if ($allowfromweb >= 0) {
1579 if ($allowfromweb == 1) {
1580 //print $langs->trans("ThisIsProcessToFollow
").'<br>';
1584 print $langs->trans("ThisIsAlternativeProcessToFollow
").'<br>';
1585 print '<b>'.$langs->trans("StepNb
", 1).'</b>: ';
1586 print str_replace('{s1}', $fullurl, $langs->trans("FindPackageFromWebSite
", '{s1}')).'<br>';
1587 print '<b>'.$langs->trans("StepNb
", 2).'</b>: ';
1588 print str_replace('{s1}', $fullurl, $langs->trans("DownloadPackageFromWebSite
", '{s1}')).'<br>';
1589 print '<b>'.$langs->trans("StepNb
", 3).'</b>: ';
1592 if ($allowfromweb == 1) {
1593 print '<form enctype="multipart/form-data
" method="POST
" class="noborder
" action="'.$_SERVER["PHP_SELF"].'" name="forminstall
">';
1594 print '<input type="hidden
" name="token
" value="'.newToken().'">';
1595 print '<input type="hidden
" name="action
" value="install
">';
1596 print '<input type="hidden
" name="mode
" value="deploy
">';
1598 print $langs->trans("YouCanSubmitFile
").'<br><br><br>';
1600 print '<span class="opacitymedium
"><input class="paddingright
" type="checkbox
" name="checkforcompliance
" id="checkforcompliance
"'.(getDolGlobalString('DISABLE_CHECK_ON_MALWARE_MODULES') ? ' disabled="disabled"' : 'checked="checked
"').'>';
1601 print '<label for="checkforcompliance
">'.$form->textwithpicto($langs->trans("CheckIfModuleIsNotBlackListed
"), $langs->trans("CheckIfModuleIsNotBlackListedHelp
").'<br><br>'.DolibarrModules::URL_FOR_BLACKLISTED_MODULES).'</label>';
1602 print '</span><br><br>';
1604 $max = getDolGlobalString('MAIN_UPLOAD_DOC'); // In Kb
1605 $maxphp = @ini_get('upload_max_filesize'); // In unknown
1606 if (preg_match('/k$/i', $maxphp)) {
1607 $maxphp = preg_replace('/k$/i', '', $maxphp);
1610 if (preg_match('/m$/i', $maxphp)) {
1611 $maxphp = preg_replace('/m$/i', '', $maxphp);
1614 if (preg_match('/g$/i', $maxphp)) {
1615 $maxphp = preg_replace('/g$/i', '', $maxphp);
1616 $maxphp *= 1024 * 1024;
1618 if (preg_match('/t$/i', $maxphp)) {
1619 $maxphp = preg_replace('/t$/i', '', $maxphp);
1620 $maxphp *= 1024 * 1024 * 1024;
1622 $maxphp2 = @ini_get('post_max_size'); // In unknown
1623 if (preg_match('/k$/i', $maxphp2)) {
1624 $maxphp2 = preg_replace('/k$/i', '', $maxphp2);
1627 if (preg_match('/m$/i', $maxphp2)) {
1628 $maxphp2 = preg_replace('/m$/i', '', $maxphp2);
1631 if (preg_match('/g$/i', $maxphp2)) {
1632 $maxphp2 = preg_replace('/g$/i', '', $maxphp2);
1633 $maxphp2 *= 1024 * 1024;
1635 if (preg_match('/t$/i', $maxphp2)) {
1636 $maxphp2 = preg_replace('/t$/i', '', $maxphp2);
1637 $maxphp2 *= 1024 * 1024 * 1024;
1639 // Now $max and $maxphp and $maxphp2 are in Kb
1641 $maxphptoshow = $maxphptoshowparam = '';
1643 $maxmin = min($max, $maxphp);
1644 $maxphptoshow = $maxphp;
1645 $maxphptoshowparam = 'upload_max_filesize';
1648 $maxmin = min($max, $maxphp2);
1649 if ($maxphp2 < $maxphp) {
1650 $maxphptoshow = $maxphp2;
1651 $maxphptoshowparam = 'post_max_size';
1656 print '<script type="text/javascript
">
1657 $(document).ready(function() {
1658 jQuery("#fileinstall
").on("change
", function() {
1659 if(this.files[0].size > '.($maxmin * 1024).') {
1660 alert("'.dol_escape_js($langs->transnoentitiesnoconv("ErrorFileSizeTooLarge")).'");
1666 // MAX_FILE_SIZE doit précéder le champ input de type file
1667 print '<input type="hidden
" name="MAX_FILE_SIZE
" value="'.($maxmin * 1024).'">';
1670 print '<input class="flat minwidth400
" type="file
" name="fileinstall
" id="fileinstall
">';
1672 print '<input type="submit
" name="send
" value="'.dol_escape_htmltag($langs->trans("Upload")).'" class="button small
">';
1674 if (getDolGlobalString('MAIN_UPLOAD_DOC')) {
1676 $langs->load('other');
1678 print info_admin($langs->trans("ThisLimitIsDefinedInSetup
", $max, $maxphptoshow, $maxphptoshowparam), 1);
1681 print ' ('.$langs->trans("UploadDisabled
").')';
1689 print '<div class="center
"><div class="logo_setup
"></div></div>';
1691 print $langs->trans("UnpackPackageInModulesRoot
", $dirins).'<br>';
1692 print '<b>'.$langs->trans("StepNb
", 4).'</b>: ';
1693 print $langs->trans("SetupIsReadyForUse
", DOL_URL_ROOT.'/admin/modules.php?mainmenu=home', $langs->transnoentitiesnoconv("Home
").' - '.$langs->transnoentitiesnoconv("Setup").' - '.$langs->transnoentitiesnoconv("Modules
")).'<br>';
1697 print dol_get_fiche_end();
1700if ($mode == 'develop') {
1701 print dol_get_fiche_head($head, $mode, '', -1);
1708 print '<div class="div-
table-responsive-no-min
">';
1709 print '<table summary="list_of_modules
" class="noborder centpercent
">'."\n
";
1710 print '<tr class="liste_titre
">'."\n
";
1711 print '<td colspan="3
">'.$langs->trans("DevelopYourModuleDesc
").'</td>';
1714 print '<tr class="oddeven nohover
" height="100
">'."\n
";
1715 print '<td class="center hideonsmartphone
">';
1716 print '<div class="imgmaxheight50 logo_setup
"></div>';
1718 print '<td class="minwidth500imp smallonsmartphone
">'.$langs->trans("TryToUseTheModuleBuilder
", $langs->transnoentitiesnoconv("ModuleBuilder
")).'</td>';
1719 print '<td class="maxwidth300
">';
1720 if (isModEnabled('modulebuilder')) {
1721 print $langs->trans("SeeTopRightMenu
");
1723 print '<span class="opacitymedium
">'.$langs->trans("ModuleMustBeEnabledFirst
", $langs->transnoentitiesnoconv("ModuleBuilder
")).'</span>';
1728 print '<tr class="oddeven nohover
" height="100
">'."\n
";
1729 $url = 'https://partners.dolibarr.org';
1730 print '<td class="center hideonsmartphone
">';
1731 print'<a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
"><img border="0
" class="imgautosize imgmaxwidth180
" src="'.DOL_URL_ROOT.'/theme/dolibarr_preferred_partner.png
"></a>';
1733 print '<td class="minwidth500imp smallonsmartphone
">'.$langs->trans("DoliPartnersDesc
").'</td>';
1734 print '<td><a href="'.$url.'" target="_blank
" rel="noopener noreferrer external
">';
1735 print img_picto('', 'url', 'class="pictofixedwidth
"');
1736 print $url.'</a></td>';
1742 print dol_get_fiche_end();
if(! $sortfield) if(! $sortorder) $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).
modules_prepare_head($nbofactivatedmodules, $nboftotalmodules, $nbmodulesnotautoenabled)
Prepare array with list of tabs.
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.
document_preview(file, type, title)
Function to show a document preview popup.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_uncompress($inputfile, $outputdir)
Uncompress a file.
dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement=null, $excludesubdir=0, $excludefileext=null, $excludearchivefiles=0)
Copy a dir to another dir.
dol_is_file($pathoffile)
Return if path is a file.
dol_is_dir($folder)
Test if filename is a directory.
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $keyforsourcefile='addedfile', $upload_dir='', $mode=0)
Check validity of a file upload from an GUI page, and move it to its final destination.
dolGetModulesDirs($subdir='')
Return list of directories that contain modules.
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizePathName($str, $newstr='_', $unaccent=0, $allowdash=0)
Clean a string to use it as a path name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
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...
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
treeview li table
No Email.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.