diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php
index b61e5a4a86e..e34861450eb 100644
--- a/htdocs/admin/modules.php
+++ b/htdocs/admin/modules.php
@@ -29,12 +29,15 @@
require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
-require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
$langs->load("errors");
$langs->load("admin");
-$mode=GETPOST('mode', 'alpha')?GETPOST('mode', 'alpha'):0;
+$mode=GETPOST('mode', 'alpha');
+if (empty($mode)) $mode='common';
$action=GETPOST('action','alpha');
$value=GETPOST('value', 'alpha');
$page_y=GETPOST('page_y','int');
@@ -69,13 +72,14 @@ if ($search_status) $param.='&search_status='.urlencode($search_status);
if ($search_nature) $param.='&search_nature='.urlencode($search_nature);
if ($search_version) $param.='&search_version='.urlencode($search_version);
+$dirins=DOL_DOCUMENT_ROOT.'/custom';
+$urldolibarrmodules='https://www.dolistore.com/';
/*
* Actions
*/
-
if (GETPOST('buttonreset'))
{
$search_keyword='';
@@ -84,6 +88,103 @@ if (GETPOST('buttonreset'))
$search_version='';
}
+if ($action=='install')
+{
+ $error=0;
+
+ // $original_file should match format module_modulename-x.y[.z].zip
+ $original_file=basename($_FILES["fileinstall"]["name"]);
+ $newfile=$conf->admin->dir_temp.'/'.$original_file.'/'.$original_file;
+
+ if (! $original_file)
+ {
+ $langs->load("Error");
+ setEventMessages($langs->trans("ErrorModuleFileRequired"), null, 'warnings');
+ $error++;
+ }
+ else
+ {
+ if (! preg_match('/\.zip/i',$original_file))
+ {
+ $langs->load("errors");
+ setEventMessages($langs->trans("ErrorFileMustBeADolibarrPackage",$original_file), null, 'errors');
+ $error++;
+ }
+ }
+
+ if (! $error)
+ {
+ if ($original_file)
+ {
+ @dol_delete_dir_recursive($conf->admin->dir_temp.'/'.$original_file);
+ dol_mkdir($conf->admin->dir_temp.'/'.$original_file);
+ }
+
+ $tmpdir=preg_replace('/\.zip$/','',$original_file).'.dir';
+ if ($tmpdir)
+ {
+ @dol_delete_dir_recursive($conf->admin->dir_temp.'/'.$tmpdir);
+ dol_mkdir($conf->admin->dir_temp.'/'.$tmpdir);
+ }
+
+ $result=dol_move_uploaded_file($_FILES['fileinstall']['tmp_name'],$newfile,1,0,$_FILES['fileinstall']['error']);
+ if ($result > 0)
+ {
+ $result=dol_uncompress($newfile,$conf->admin->dir_temp.'/'.$tmpdir);
+
+ if (! empty($result['error']))
+ {
+ $langs->load("errors");
+ setEventMessages($langs->trans($result['error'],$original_file), null, 'errors');
+ $error++;
+ }
+ else
+ {
+ // Now we move the dir of the module
+ $modulename=preg_replace('/module_/', '', $original_file);
+ $modulename=preg_replace('/\-[\d]+\.[\d]+.*$/', '', $modulename);
+ // Search dir $modulename
+ $modulenamedir=$conf->admin->dir_temp.'/'.$tmpdir.'/'.$modulename;
+ //var_dump($modulenamedir);
+ if (! dol_is_dir($modulenamedir))
+ {
+ $modulenamedir=$conf->admin->dir_temp.'/'.$tmpdir.'/htdocs/'.$modulename;
+ //var_dump($modulenamedir);
+ if (! dol_is_dir($modulenamedir))
+ {
+ setEventMessages($langs->trans("ErrorModuleFileSeemsToHaveAWrongFormat"), null, 'errors');
+ $error++;
+ }
+ }
+
+ if (! $error)
+ {
+ //var_dump($dirins);
+ @dol_delete_dir_recursive($dirins.'/'.$modulename);
+ dol_syslog("Uncompress of module file is a success. We copy it from ".$modulenamedir." into target dir ".$dirins.'/'.$modulename);
+ $result=dolCopyDir($modulenamedir, $dirins.'/'.$modulename, '0444', 1);
+ if ($result <= 0)
+ {
+ dol_syslog('Failed to call dolCopyDir result='.$result." with param ".$modulenamedir." and ".$dirins.'/'.$modulename, LOG_WARNING);
+ $langs->load("errors");
+ setEventMessages($langs->trans("ErrorFailToCopyDir", $modulenamedir, $dirins.'/'.$modulename), null, 'errors');
+ $error++;
+ }
+ }
+ }
+ }
+ else
+ {
+ $error++;
+ }
+ }
+
+ if (! $error)
+ {
+ setEventMessages($langs->trans("SetupIsReadyForUse", DOL_URL_ROOT.'/admin/modules.php?mainmenu=home', $langs->transnoentitiesnoconv("Home").' - '.$langs->transnoentitiesnoconv("Setup").' - '.$langs->transnoentitiesnoconv("Modules")), null, 'warnings');
+ }
+}
+
if ($action == 'set' && $user->admin)
{
$resarray = activateModule($value);
@@ -115,6 +216,13 @@ if ($action == 'reset' && $user->admin)
* View
*/
+// Set dir where external modules are installed
+if (! dol_is_dir($dirins))
+{
+ dol_mkdir($dirins);
+}
+$dirins_ok=(dol_is_dir($dirins));
+
$form = new Form($db);
$help_url='EN:First_setup|FR:Premiers_paramétrages|ES:Primeras_configuraciones';
@@ -277,33 +385,35 @@ if ($nbofactivatedmodules <= 1) $moreinfo .= ' '.img_warning($langs->trans("YouM
print load_fiche_titre($langs->trans("ModulesSetup"),$moreinfo,'title_setup');
// Start to show page
-if (empty($mode)) $mode='common';
-if ($mode==='common') print $langs->trans("ModulesDesc")."
\n";
-if ($mode==='marketplace') print $langs->trans("ModulesMarketPlaceDesc")."
\n";
-if ($mode==='expdev') print $langs->trans("ModuleFamilyExperimental")."
\n";
+if ($mode=='common') print $langs->trans("ModulesDesc")."
\n";
+if ($mode=='marketplace') print $langs->trans("ModulesMarketPlaceDesc")."
\n";
+if ($mode=='deploy') print $langs->trans("ModulesDeployDesc", $langs->transnoentitiesnoconv("AvailableModules"))."
\n";
$h = 0;
-$categidx='common'; // Main
-$head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=".$categidx;
+$head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=common";
$head[$h][1] = $langs->trans("AvailableModules");
$head[$h][2] = 'common';
$h++;
-$categidx='marketplace';
-$head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=".$categidx;
+$head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=marketplace";
$head[$h][1] = $langs->trans("ModulesMarketPlaces");
$head[$h][2] = 'marketplace';
$h++;
+$head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=deploy";
+$head[$h][1] = $langs->trans("AddExtensionThemeModuleOrOther");
+$head[$h][2] = 'deploy';
+$h++;
+
print "
\n";
$var=true;
-if ($mode != 'marketplace')
+if ($mode == 'common')
{
print '