NEW custom dir is enabled dy default on first install.

Fix modulebuilder when custom dir not defined.
This commit is contained in:
Laurent Destailleur 2017-06-10 23:50:02 +02:00
parent a74d008ff2
commit 542a72c684
5 changed files with 150 additions and 116 deletions

View File

@ -278,7 +278,7 @@ foreach ($modulesdir as $dir)
try
{
$res=include_once $dir.$file; // A class already exists in a different file will send a non catchable fatal error.
$res=include_once $dir.$file; // A class already exists in a different file will send a non catchable fatal error.
if (class_exists($modName))
{
try {
@ -352,7 +352,7 @@ foreach ($modulesdir as $dir)
{
$arrayofwarningsext[$modName]=$objMod->warnings_activation_ext;
}
$orders[$i] = $familyinfo[$familykey]['position']."_".$familykey."_".$moduleposition."_".$j; // Sort by family, then by module position then number
$dirmod[$i] = $dir;
//print $i.'-'.$dirmod[$i].'<br>';
@ -436,7 +436,7 @@ if ($mode == 'common')
print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
print '<input type="hidden" name="page" value="'.$page.'">';
dol_fiche_head($head, $mode, '', -1);
$moreforfilter = '';
@ -473,12 +473,12 @@ if ($mode == 'common')
$reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
}
print '<div class="clearboth"></div><br>';
$moreforfilter='';
// Show list of modules
$oldfamily='';
@ -564,13 +564,13 @@ if ($mode == 'common')
if ($familykey!=$oldfamily)
{
if ($oldfamily) print '</table></div><br>';
$familytext=empty($familyinfo[$familykey]['label'])?$familykey:$familyinfo[$familykey]['label'];
print_fiche_titre($familytext, '', '');
print '<div class="div-table-responsive">';
print '<table class="tagtable liste" summary="list_of_modules">'."\n";
$atleastoneforfamily=0;
}
@ -582,9 +582,9 @@ if ($mode == 'common')
$oldfamily=$familykey;
}
// Version (with picto warning or not)
$version=$objMod->getVersion(0);
$versiontrans='';
@ -592,14 +592,14 @@ if ($mode == 'common')
if (preg_match('/experimental/i', $version)) $versiontrans.=img_warning($langs->trans("Experimental"), 'style="float: left"');
if (preg_match('/deprecated/i', $version)) $versiontrans.=img_warning($langs->trans("Deprecated"), 'style="float: left"');
$versiontrans.=$objMod->getVersion(1);
// Define imginfo
$imginfo="info";
if ($objMod->isCoreOrExternalModule() == 'external')
{
$imginfo="info_black";
}
print '<tr>'."\n";
// Picto + Name of module
@ -756,32 +756,32 @@ if ($mode == 'common')
print "</a>\n";
}
print "</td>\n";
// Link config
print '<td class="tdsetuppicto right valignmiddle" width="60px">'.img_picto($langs->trans("NothingToSetup"),"setup",'class="opacitytransp" style="padding-right: 6px"').'</td>';
}
print "</tr>\n";
}
if ($oldfamily)
{
print "</table>\n";
print '</div>';
}
dol_fiche_end();
// Show warning about external users
print info_admin(showModulesExludedForExternal($modules))."\n";
print '</form>';
}
if ($mode == 'marketplace')
{
dol_fiche_head($head, $mode, '', -1);
// Marketplace
print "<table summary=\"list_of_modules\" class=\"noborder\" width=\"100%\">\n";
print "<tr class=\"liste_titre\">\n";
@ -790,7 +790,7 @@ if ($mode == 'marketplace')
print '<td>'.$langs->trans("URL").'</td>';
print '</tr>';
print "<tr class=\"oddeven\">\n";
$url='https://www.dolistore.com';
print '<td align="left"><a href="'.$url.'" target="_blank" rel="external"><img border="0" class="imgautosize imgmaxwidth180" src="'.DOL_URL_ROOT.'/theme/dolistore_logo.png"></a></td>';
@ -798,7 +798,7 @@ if ($mode == 'marketplace')
print '<td><a href="'.$url.'" target="_blank" rel="external">'.$url.'</a></td>';
print '</tr>';
print "<tr class=\"oddeven\">\n";
$url='https://partners.dolibarr.org';
print '<td align="left"><a href="'.$url.'" target="_blank" rel="external"><img border="0" class="imgautosize imgmaxwidth180" src="'.DOL_URL_ROOT.'/theme/dolibarr_preferred_partner_int.png"></a></td>';
@ -813,23 +813,23 @@ if ($mode == 'marketplace')
// Install external module
if ($mode == 'deploy')
{
dol_fiche_head($head, $mode, '', -1);
$allowonlineinstall=true;
$allowfromweb=1;
if (dol_is_file($dolibarrdataroot.'/installmodules.lock')) $allowonlineinstall=false;
$fullurl='<a href="'.$urldolibarrmodules.'" target="_blank">'.$urldolibarrmodules.'</a>';
$message='';
if (! empty($allowonlineinstall))
{
if (! in_array('/custom',explode(',',$dolibarr_main_url_root_alt)))
{
$message=info_admin($langs->trans("ConfFileMuseContainCustom", DOL_DOCUMENT_ROOT.'/custom', DOL_DOCUMENT_ROOT));
$message=info_admin($langs->trans("ConfFileMustContainCustom", DOL_DOCUMENT_ROOT.'/custom', DOL_DOCUMENT_ROOT));
$allowfromweb=-1;
}
else
@ -845,7 +845,7 @@ if ($mode == 'deploy')
}
else
{
$message=info_admin($langs->trans("NotExistsDirect",$dirins).$langs->trans("InfDirAlt").$langs->trans("InfDirExample"));
$allowfromweb=0;
}
@ -856,7 +856,7 @@ if ($mode == 'deploy')
$message=info_admin($langs->trans("InstallModuleFromWebHasBeenDisabledByFile",$dolibarrdataroot.'/installmodules.lock'));
$allowfromweb=0;
}
if ($allowfromweb < 1)
{
print $langs->trans("SomethingMakeInstallFromWebNotPossible");
@ -864,15 +864,15 @@ if ($mode == 'deploy')
//print $langs->trans("SomethingMakeInstallFromWebNotPossible2");
print '<br>';
}
if ($allowfromweb >= 0)
{
if ($allowfromweb == 1)
if ($allowfromweb == 1)
{
//print $langs->trans("ThisIsProcessToFollow").'<br>';
}
else
else
{
print $langs->trans("ThisIsAlternativeProcessToFollow").'<br>';
print '<b>'.$langs->trans("StepNb",1).'</b>: ';
@ -881,7 +881,7 @@ if ($mode == 'deploy')
print $langs->trans("DownloadPackageFromWebSite",$fullurl).'<br>';
print '<b>'.$langs->trans("StepNb",3).'</b>: ';
}
if ($allowfromweb == 1)
{
print $langs->trans("UnpackPackageInModulesRoot",$dirins).'<br>';
@ -899,12 +899,12 @@ if ($mode == 'deploy')
print $langs->trans("SetupIsReadyForUse").'<br>';
}
}
if (! empty($result['return']))
{
print '<br>';
foreach($result['return'] as $value)
{
echo $value.'<br>';

View File

@ -57,14 +57,14 @@ $db_user=GETPOST('db_user','alpha');
$db_pass=GETPOST('db_pass');
$db_port=GETPOST('db_port','int');
$db_prefix=GETPOST('db_prefix','alpha');
$db_create_database = GETPOST('db_create_database');
$db_create_user = GETPOST('db_create_user');
$db_create_database = GETPOST('db_create_database','none');
$db_create_user = GETPOST('db_create_user','none');
// Force https
$main_force_https = ((GETPOST("main_force_https") && (GETPOST("main_force_https") == "on" || GETPOST("main_force_https") == 1)) ? '1' : '0');
$main_force_https = ((GETPOST("main_force_https",'alpha') && (GETPOST("main_force_https",'alpha') == "on" || GETPOST("main_force_https",'alpha') == 1)) ? '1' : '0');
// Use alternative directory
$main_use_alt_dir = ((GETPOST("main_use_alt_dir") && (GETPOST("main_use_alt_dir") == "on" || GETPOST("main_use_alt_dir") == 1)) ? '' : '//');
$main_use_alt_dir = ((GETPOST("main_use_alt_dir",'alpha') == '' || (GETPOST("main_use_alt_dir",'alpha') == "on" || GETPOST("main_use_alt_dir",'alpha') == 1)) ? '' : '//');
// Alternative root directory name
$main_alt_dir_name = ((GETPOST("main_alt_dir_name") && GETPOST("main_alt_dir_name") != '') ? GETPOST("main_alt_dir_name") : 'custom');
$main_alt_dir_name = ((GETPOST("main_alt_dir_name",'alpha') && GETPOST("main_alt_dir_name",'alpha') != '') ? GETPOST("main_alt_dir_name",'alpha') : 'custom');
session_start(); // To be able to keep info into session (used for not losing password during navigation. The password must not transit through parameters)

View File

@ -1619,7 +1619,7 @@ BackupDumpWizard=Wizard to build database backup dump file
SomethingMakeInstallFromWebNotPossible=Installation of external module is not possible from the web interface for the following reason:
SomethingMakeInstallFromWebNotPossible2=For this reason, process to upgrade described here is only manual steps a privileged user can do.
InstallModuleFromWebHasBeenDisabledByFile=Install of external module from application has been disabled by your administrator. You must ask him to remove the file <strong>%s</strong> to allow this feature.
ConfFileMuseContainCustom=Installing an external module from application need to save the module files into directory <strong>%s</strong>. To have this directory processed by Dolibarr, you must setup your <strong>conf/conf.php</strong> to add the 2 directive lines:<br><strong>$dolibarr_main_url_root_alt='/custom';</strong><br><strong>$dolibarr_main_document_root_alt='%s/custom';</strong>
ConfFileMustContainCustom=Installing or building an external module from application need to save the module files into directory <strong>%s</strong>. To have this directory processed by Dolibarr, you must setup your <strong>conf/conf.php</strong> to add the 2 directive lines:<br><strong>$dolibarr_main_url_root_alt='/custom';</strong><br><strong>$dolibarr_main_document_root_alt='%s/custom';</strong>
HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over
HighlightLinesColor=Highlight color of the line when the mouse passes over (keep empty for no highlight)
TextTitleColor=Color of page title

View File

@ -9,26 +9,26 @@ If you're not a module developer you have no use for this.
Documentation
-------------
[Module tutorial](http://wiki.dolibarr.org/index.php/Module_development)
[Module tutorial](https://wiki.dolibarr.org/index.php/Module_development)
[Dolibarr development](http://wiki.dolibarr.org/index.php/Developer_documentation)
[Dolibarr development](https://wiki.dolibarr.org/index.php/Developer_documentation)
### Translations
Dolibarr uses [Transifex](http://transifex.com) to manage it's translations.
Dolibarr uses [Transifex](https://transifex.com) to manage it's translations.
This template also contains a sample configuration for Transifex managed translations under the hidden [.tx](.tx) directory.
For more informations, see the [translator's documentation](http://wiki.dolibarr.org/index.php/Translator_documentation).
There is a [Transifex project](http://transifex.com/projects/p/dolibarr-module-template) for this module.
There is a [Transifex project](https://transifex.com/projects/p/dolibarr-module-template) for this module.
Install
-------
### Manually
- Make sure Dolibarr (>= 3.3.x) is already installed and configured on your workstation or development server.
- Make sure Dolibarr is already installed and configured on your workstation or development server.
- In your Dolibarr installation directory, edit the ```htdocs/conf/conf.php``` file
@ -60,8 +60,6 @@ Install
For more information about the ```conf.php``` file take a look at the conf.php.example file.
*Note that for Dolibarr versions before 3.5, the ```$dolibarr_main_url_root_alt``` has to be an absolute path*
- Clone the repository in ```$dolibarr_main_document_root_alt/mymodule```
*(You may have to create the ```htdocs/custom``` directory first if it doesn't exist yet.)*
@ -187,10 +185,6 @@ The de-facto standard for publishing and marketing modules for Dolibarr is the [
Templates for required images and texts are [provided](dev/dolistore).
Check the dedicated [README](dev/dolistore/README.md) for more informations.
Contributions
-------------
Feel free to contribute and report defects on our [issue tracker](http://github.com/Dolibarr/dolibarr-module-template/issues).
Licenses
--------

View File

@ -45,7 +45,7 @@ if (! $user->admin && empty($conf->global->MODULEBUILDER_FOREVERYONE)) accessfor
// Dir for custom dirs
$tmp=explode(',', $dolibarr_main_document_root_alt);
$dircustom = $tmp[0];
$dirins = $tmp[0];
$FILEFLAG='modulebuilder.txt';
@ -54,16 +54,16 @@ $FILEFLAG='modulebuilder.txt';
* Actions
*/
if ($dircustom && $action == 'initmodule' && $modulename)
if ($dirins && $action == 'initmodule' && $modulename)
{
$srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template';
$destdir = $dircustom.'/'.strtolower($modulename);
$destdir = $dirins.'/'.strtolower($modulename);
$arrayreplacement=array(
'mymodule'=>strtolower($modulename),
'MyModule'=>$modulename
);
$result = dolCopyDir($srcdir, $destdir, 0, 0, $arrayreplacement);
//dol_mkdir($destfile);
if ($result <= 0)
@ -94,17 +94,17 @@ if ($dircustom && $action == 'initmodule' && $modulename)
'My module'=>$modulename,
'htdocs/modulebuilder/template/'=>'',
);
$result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement);
//var_dump($result);
if ($result < 0)
{
setEventMessages($langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname']), null, 'errors');
}
}
}
}
if (! $error)
{
setEventMessages('ModuleInitialized', null);
@ -113,15 +113,15 @@ if ($dircustom && $action == 'initmodule' && $modulename)
}
}
if ($dircustom && $action == 'generatepackage')
if ($dirins && $action == 'generatepackage')
{
$modulelowercase=strtolower($module);
// Dir for module
$dir = $dircustom.'/'.$modulelowercase;
$dir = $dirins.'/'.$modulelowercase;
// Zip file to build
$FILENAMEZIP='';
// Load module
dol_include_once($modulelowercase.'/core/modules/mod'.$module.'.class.php');
$class='mod'.$module;
@ -144,13 +144,13 @@ if ($dircustom && $action == 'generatepackage')
dol_print_error($langs->trans("ErrorFailedToLoadModuleDescriptorForXXX", $module));
exit;
}
$arrayversion=explode('.',$moduleobj->version,3);
if (count($arrayversion))
{
$FILENAMEZIP="module_".$modulelowercase.'-'.$arrayversion[0].'.'.$arrayversion[1].($arrayversion[2]?".".$arrayversion[2]:"").".zip";
$outputfile = $conf->admin->dir_temp.'/'.$FILENAMEZIP;
$result = dol_compress_dir($dir, $outputfile, 'zip');
if ($result > 0)
{
@ -176,6 +176,14 @@ if ($dircustom && $action == 'generatepackage')
* View
*/
// Set dir where external modules are installed
if (! dol_is_dir($dirins))
{
dol_mkdir($dirins);
}
$dirins_ok=(dol_is_dir($dirins));
llxHeader("",$langs->trans("ModuleBuilder"),"");
@ -193,8 +201,8 @@ if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // En
{
foreach ($dolibarr_main_document_root_alt as $diralt)
{*/
$dirsincustom=dol_dir_list($dircustom, 'directories');
$dirsincustom=dol_dir_list($dirins, 'directories');
if (is_array($dirsincustom) && count($dirsincustom) > 0)
{
foreach ($dirsincustom as $dircustomcursor)
@ -224,8 +232,40 @@ if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // En
// Show description of content
$newdircustom=$dirins;
if (empty($newdircustom)) $newdircustom=img_warning();
print $langs->trans("ModuleBuilderDesc").'<br>';
print $langs->trans("ModuleBuilderDesc2", 'conf/conf.php', $dircustom).'<br>';
print $langs->trans("ModuleBuilderDesc2", 'conf/conf.php', $newdircustom).'<br>';
$message='';
if (! $dirins)
{
$message=info_admin($langs->trans("ConfFileMustContainCustom", DOL_DOCUMENT_ROOT.'/custom', DOL_DOCUMENT_ROOT));
$allowfromweb=-1;
}
else
{
if ($dirins_ok)
{
if (! is_writable(dol_osencode($dirins)))
{
$langs->load("errors");
$message=info_admin($langs->trans("ErrorFailedToWriteInDir",$dirins));
$allowfromweb=0;
}
}
else
{
$message=info_admin($langs->trans("NotExistsDirect",$dirins).$langs->trans("InfDirAlt").$langs->trans("InfDirExample"));
$allowfromweb=0;
}
}
if ($message)
{
print $message;
}
print $langs->trans("ModuleBuilderDesc3", count($listofmodules), $FILEFLAG).'<br>';
//print '<br>';
@ -237,7 +277,7 @@ $moduleobj = null;
if (! empty($module) && $module != 'initmodule')
{
$modulelowercase=strtolower($module);
// Load module
dol_include_once($modulelowercase.'/core/modules/mod'.$module.'.class.php');
$class='mod'.$module;
@ -261,7 +301,7 @@ if (! empty($module) && $module != 'initmodule')
}
}
print '<br>';
print '<br>';
// Tabs for all modules
@ -272,7 +312,7 @@ $head[$h][0] = $_SERVER["PHP_SELF"].'?module=initmodule';
$head[$h][1] = $langs->trans("NewModule");
$head[$h][2] = 'initmodule';
$h++;
foreach($listofmodules as $tmpmodule => $tmpmodulewithcase)
{
$head[$h][0] = $_SERVER["PHP_SELF"].'?module='.$tmpmodulewithcase;
@ -292,11 +332,11 @@ if ($module == 'initmodule')
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
print '<input type="hidden" name="action" value="initmodule">';
print '<input type="hidden" name="module" value="initmodule">';
print $langs->trans("EnterNameOfModuleDesc").'<br><br>';
print '<input type="text" name="modulename" value="'.dol_escape_htmltag($modulename).'" placeholder="'.dol_escape_htmltag($langs->trans("ModuleKey")).'">';
print '<input type="submit" class="button" name="create" value="'.dol_escape_htmltag($langs->trans("Create")).'">';
print '<input type="submit" class="button" name="create" value="'.dol_escape_htmltag($langs->trans("Create")).'"'.($dirins?'':' disabled="disabled"').'>';
print '</form>';
}
elseif (! empty($module))
@ -310,53 +350,53 @@ elseif (! empty($module))
$modulestatusinfo=img_info('').' '.$langs->trans("ModuleIsNotActive");
if (! empty($conf->$module->enabled))
{
$modulestatusinfo=img_warning().' '.$langs->trans("ModuleIsLive");
$modulestatusinfo=img_warning().' '.$langs->trans("ModuleIsLive");
}
foreach($listofmodules as $tmpmodule => $tmpmodulewithcase)
{
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=description&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("Description");
$head2[$h][2] = 'description';
$h++;
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=objects&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("Objects");
$head2[$h][2] = 'objects';
$h++;
$h++;
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=menus&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("Menus");
$head2[$h][2] = 'menus';
$h++;
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=permissions&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("Permissions");
$head2[$h][2] = 'permissions';
$h++;
$h++;
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=triggers&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("Triggers");
$head2[$h][2] = 'triggers';
$h++;
$h++;
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=buildpackage&module='.$tmpmodulewithcase;
$head2[$h][1] = $langs->trans("BuildPackage");
$head2[$h][2] = 'buildpackage';
$h++;
$h++;
}
print $modulestatusinfo.'<br><br>';
dol_fiche_head($head2, $tab, '', -1, '');
print $langs->trans("ModuleBuilderDesc".$tab).'<br><br>';
if ($tab == 'description')
{
print '<div class="underbanner clearboth"></div>';
print '<div class="fichecenter">';
print '<table class="border centpercent">';
print '<tr class="liste_titre"><td class="titlefield">';
print $langs->trans("Parameter");
@ -369,90 +409,90 @@ elseif (! empty($module))
print '</td><td>';
print $moduleobj->numero;
print '</td></tr>';
print '<tr><td>';
print $langs->trans("Name");
print '</td><td>';
print $moduleobj->getName();
print '</td></tr>';
print '<tr><td>';
print $langs->trans("Version");
print '</td><td>';
print $moduleobj->getVersion();
print '</td></tr>';
print '<tr><td>';
print $langs->trans("Family");
print "<br>'crm','financial','hr','projects','products','ecm','technic','interface','other'";
print '</td><td>';
print $moduleobj->family;
print '</td></tr>';
print '<tr><td>';
print $langs->trans("EditorName");
print '</td><td>';
print $moduleobj->editor_name;
print '</td></tr>';
print '<tr><td>';
print $langs->trans("EditorUrl");
print '</td><td>';
print $moduleobj->editor_url;
print '</td></tr>';
print '<tr><td>';
print $langs->trans("Description");
print '</td><td>';
print $moduleobj->getDesc();
print '</td></tr>';
print '<tr><td>';
print $langs->trans("LongDescription");
print '</td><td>';
print $moduleobj->getDescLong();
print '</td></tr>';
print '</table>';
print '</div>';
print '<br><br>';
print '<form name="delete">';
print '<input type="hidden" name="action" value="confirm_delete">';
print '<input type="hidden" name="tab" value="'.dol_escape_htmltag($tab).'">';
print '<input type="hidden" name="module" value="'.dol_escape_htmltag($module).'">';
print '<input type="submit" class="buttonDelete" value="'.$langs->trans("Delete").'">';
print '<input type="submit" class="buttonDelete" value="'.$langs->trans("Delete").'"'.($dirins?'':' disabled="disabled"').'>';
print '</form>';
}
if ($tab == 'objects')
{
print $langs->trans("FeatureNotYetAvailable");
}
if ($tab == 'menus')
{
print $langs->trans("FeatureNotYetAvailable");
}
if ($tab == 'permissions')
{
print $langs->trans("FeatureNotYetAvailable");
}
if ($tab == 'triggers')
{
require_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php';
$interfaces = new Interfaces($db);
$triggers = $interfaces->getTriggersList(array('/'.strtolower($module).'/core/triggers'));
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder">
<tr class="liste_titre">
@ -461,11 +501,11 @@ elseif (! empty($module))
<td align="center">&nbsp;</td>
</tr>
';
$var=True;
foreach ($triggers as $trigger)
{
print '<tr class="oddeven">';
print '<td valign="top" width="14" align="center">'.$trigger['picto'].'</td>';
print '<td class="tdtop">'.$trigger['file'].'</td>';
@ -478,7 +518,7 @@ elseif (! empty($module))
print '</td>';
print '</tr>';
}
print '</table>';
print '</div>';
}
@ -490,15 +530,15 @@ elseif (! empty($module))
print img_warning().' '.$langs->trans("ErrNoZipEngine");
print '<br>';
}
print '<form name="generatepackage">';
print '<input type="hidden" name="action" value="generatepackage">';
print '<input type="hidden" name="tab" value="'.dol_escape_htmltag($tab).'">';
print '<input type="hidden" name="module" value="'.dol_escape_htmltag($module).'">';
print '<input type="submit" class="button" value="'.$langs->trans("Generate").'">';
print '<input type="submit" class="button" value="'.$langs->trans("Generate").'">';
print '</form>';
}
dol_fiche_end();
}
}