mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2026-01-04 16:12:39 +01:00
Do some TODO on modulebuilder module.
This commit is contained in:
@@ -27,6 +27,10 @@ $langs->load("admin");
|
|||||||
|
|
||||||
if (!$user->admin) accessforbidden();
|
if (!$user->admin) accessforbidden();
|
||||||
|
|
||||||
|
$sortfield='file';
|
||||||
|
$sortorder='ASC';
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Action
|
* Action
|
||||||
*/
|
*/
|
||||||
@@ -50,20 +54,21 @@ print "<br>\n";
|
|||||||
|
|
||||||
$interfaces = new Interfaces($db);
|
$interfaces = new Interfaces($db);
|
||||||
$triggers = $interfaces->getTriggersList();
|
$triggers = $interfaces->getTriggersList();
|
||||||
|
$param = ''; $align = '';
|
||||||
|
|
||||||
print '<div class="div-table-responsive-no-min">';
|
print '<div class="div-table-responsive-no-min">';
|
||||||
print '<table class="noborder">
|
print '<table class="noborder">';
|
||||||
<tr class="liste_titre">
|
print '<tr class="liste_titre">';
|
||||||
<td colspan="2">'.$langs->trans("File").'</td>
|
print getTitleFieldOfList($langs->trans("File"), 0, $_SERVER["PHP_SELF"], 'file', "", $param, ($align?'align="'.$align.'"':''), $sortfield, $sortorder, '', 1)."\n";
|
||||||
<td align="center">'.$langs->trans("Active").'</td>
|
print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], 'none', "", $param, '', $sortfield, $sortorder, '', 1)."\n";
|
||||||
<td align="center"> </td>
|
print getTitleFieldOfList($langs->trans("Active"), 0, $_SERVER["PHP_SELF"], 'active', "", $param, 'align="center"', $sortfield, $sortorder, '', 1)."\n";
|
||||||
</tr>
|
print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], 'none', "", $param, ($align?'align="'.$align.'"':''), $sortfield, $sortorder, '', 1)."\n";
|
||||||
';
|
print '</tr>';
|
||||||
|
|
||||||
$var=True;
|
$var=True;
|
||||||
foreach ($triggers as $trigger)
|
foreach ($triggers as $trigger)
|
||||||
{
|
{
|
||||||
|
|
||||||
print '<tr class="oddeven">';
|
print '<tr class="oddeven">';
|
||||||
print '<td valign="top" width="14" align="center">'.$trigger['picto'].'</td>';
|
print '<td valign="top" width="14" align="center">'.$trigger['picto'].'</td>';
|
||||||
print '<td class="tdtop">'.$trigger['file'].'</td>';
|
print '<td class="tdtop">'.$trigger['file'].'</td>';
|
||||||
|
|||||||
@@ -375,6 +375,133 @@ class ModeleBoxes // Can't be abtract as it is instantiated to build "empty"
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return list of widget. Function used by admin page htdoc/admin/widget.
|
||||||
|
* List is sorted by widget filename so by priority to run.
|
||||||
|
*
|
||||||
|
* @param array $forcedirwidget null=All default directories. This parameter is used by modulebuilder module only.
|
||||||
|
* @return array Array list of widget
|
||||||
|
*/
|
||||||
|
static function getWidgetsList($forcedirwidget=null)
|
||||||
|
{
|
||||||
|
global $conf, $langs, $db;
|
||||||
|
|
||||||
|
$files = array();
|
||||||
|
$fullpath = array();
|
||||||
|
$relpath = array();
|
||||||
|
$iscoreorexternal = array();
|
||||||
|
$modules = array();
|
||||||
|
$orders = array();
|
||||||
|
$i = 0;
|
||||||
|
|
||||||
|
$dirwidget=array_merge(array('/core/boxes/'));
|
||||||
|
if (is_array($forcedirwidget))
|
||||||
|
{
|
||||||
|
$dirwidget=$forcedirwidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($dirwidget as $reldir)
|
||||||
|
{
|
||||||
|
$dir=dol_buildpath($reldir,0);
|
||||||
|
$newdir=dol_osencode($dir);
|
||||||
|
|
||||||
|
// Check if directory exists (we do not use dol_is_dir to avoid loading files.lib.php at each call)
|
||||||
|
if (! is_dir($newdir)) continue;
|
||||||
|
|
||||||
|
$handle=opendir($newdir);
|
||||||
|
if (is_resource($handle))
|
||||||
|
{
|
||||||
|
while (($file = readdir($handle))!==false)
|
||||||
|
{
|
||||||
|
if (is_readable($newdir.'/'.$file) && preg_match('/^(.+)\.php/',$file,$reg))
|
||||||
|
{
|
||||||
|
if (preg_match('/\.back$/',$file)) continue;
|
||||||
|
|
||||||
|
$part1=$reg[1];
|
||||||
|
|
||||||
|
$modName = ucfirst($reg[1]);
|
||||||
|
//print "file=$file"; print "modName=$modName"; exit;
|
||||||
|
if (in_array($modName,$modules))
|
||||||
|
{
|
||||||
|
$langs->load("errors");
|
||||||
|
print '<div class="error">'.$langs->trans("Error").' : '.$langs->trans("ErrorDuplicateWidget",$modName,"").'</div>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
include_once $newdir.'/'.$file;
|
||||||
|
}
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
print $e->getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$files[$i] = $file;
|
||||||
|
$fullpath[$i] = $dir.'/'.$file;
|
||||||
|
$relpath[$i] = preg_replace('/^\//','',$reldir).'/'.$file;
|
||||||
|
$iscoreorexternal[$i] = ($reldir == '/core/boxes/'?'internal':'external');
|
||||||
|
$modules[$i] = $modName;
|
||||||
|
$orders[$i] = $part1; // Set sort criteria value
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir($handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asort($orders);
|
||||||
|
|
||||||
|
$widget = array();
|
||||||
|
$j = 0;
|
||||||
|
|
||||||
|
// Loop on each widget
|
||||||
|
foreach ($orders as $key => $value)
|
||||||
|
{
|
||||||
|
$modName = $modules[$key];
|
||||||
|
if (empty($modName)) continue;
|
||||||
|
|
||||||
|
if (! class_exists($modName))
|
||||||
|
{
|
||||||
|
print 'Error: A widget file was found but its class "'.$modName.'" was not found.'."<br>\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$objMod = new $modName($db);
|
||||||
|
if (is_object($objMod))
|
||||||
|
{
|
||||||
|
// Define disabledbyname and disabledbymodule
|
||||||
|
$disabledbyname=0;
|
||||||
|
$module='';
|
||||||
|
|
||||||
|
// Check if widget file is disabled by name
|
||||||
|
if (preg_match('/NORUN$/i',$files[$key])) $disabledbyname=1;
|
||||||
|
|
||||||
|
// We set info of modules
|
||||||
|
$widget[$j]['picto'] = $objMod->picto?img_object('',$objMod->picto):img_object('','generic');
|
||||||
|
$widget[$j]['file'] = $files[$key];
|
||||||
|
$widget[$j]['fullpath'] = $fullpath[$key];
|
||||||
|
$widget[$j]['relpath'] = $relpath[$key];
|
||||||
|
$widget[$j]['iscoreorexternal'] = $iscoreorexternal[$key];
|
||||||
|
//$widget[$j]['version'] = $objMod->getVersion();
|
||||||
|
$widget[$j]['status'] = img_picto($langs->trans("Active"),'tick');
|
||||||
|
if ($disabledbyname > 0 || $disabledbymodule > 1) $widget[$j]['status'] = '';
|
||||||
|
|
||||||
|
$text ='<b>'.$langs->trans("Description").':</b><br>';
|
||||||
|
$text.=$objMod->boxlabel.'<br>';
|
||||||
|
$text.='<br><b>'.$langs->trans("Status").':</b><br>';
|
||||||
|
if ($disabledbymodule == 2) $text.=$langs->trans("HooksDisabledAsModuleDisabled",$module).'<br>';
|
||||||
|
|
||||||
|
$widget[$j]['info'] = $text;
|
||||||
|
}
|
||||||
|
$j++;
|
||||||
|
}
|
||||||
|
return $widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ class Interfaces
|
|||||||
*/
|
*/
|
||||||
function getTriggersList($forcedirtriggers=null)
|
function getTriggersList($forcedirtriggers=null)
|
||||||
{
|
{
|
||||||
global $conf, $langs;
|
global $conf, $langs, $db;
|
||||||
|
|
||||||
$files = array();
|
$files = array();
|
||||||
$fullpath = array();
|
$fullpath = array();
|
||||||
@@ -311,7 +311,7 @@ class Interfaces
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$objMod = new $modName($this->db);
|
$objMod = new $modName($db);
|
||||||
|
|
||||||
// Define disabledbyname and disabledbymodule
|
// Define disabledbyname and disabledbymodule
|
||||||
$disabledbyname=0;
|
$disabledbyname=0;
|
||||||
|
|||||||
@@ -3292,9 +3292,10 @@ function print_liste_field_titre($name, $file="", $field="", $begin="", $morepar
|
|||||||
* @param string $sortfield Current field used to sort (Ex: 'd.datep,d.id')
|
* @param string $sortfield Current field used to sort (Ex: 'd.datep,d.id')
|
||||||
* @param string $sortorder Current sort order (Ex: 'asc,desc')
|
* @param string $sortorder Current sort order (Ex: 'asc,desc')
|
||||||
* @param string $prefix Prefix for css. Use space after prefix to add your own CSS tag.
|
* @param string $prefix Prefix for css. Use space after prefix to add your own CSS tag.
|
||||||
|
* @param string $disablesortlink 1=Disable sort link
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="")
|
function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0)
|
||||||
{
|
{
|
||||||
global $conf, $langs;
|
global $conf, $langs;
|
||||||
//print "$name, $file, $field, $begin, $options, $moreattrib, $sortfield, $sortorder<br>\n";
|
//print "$name, $file, $field, $begin, $options, $moreattrib, $sortfield, $sortorder<br>\n";
|
||||||
@@ -3318,7 +3319,7 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m
|
|||||||
if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace("/^[^\.]+\./","",$field1))) $out.= '<'.$tag.' class="'.$prefix.'liste_titre_sel" '. $moreattrib.'>';
|
if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace("/^[^\.]+\./","",$field1))) $out.= '<'.$tag.' class="'.$prefix.'liste_titre_sel" '. $moreattrib.'>';
|
||||||
else $out.= '<'.$tag.' class="'.$prefix.'liste_titre" '. $moreattrib.'>';
|
else $out.= '<'.$tag.' class="'.$prefix.'liste_titre" '. $moreattrib.'>';
|
||||||
|
|
||||||
if (empty($thead) && $field) // If this is a sort field
|
if (empty($thead) && $field && empty($disablesortlink)) // If this is a sort field
|
||||||
{
|
{
|
||||||
$options=preg_replace('/sortfield=([a-zA-Z0-9,\s\.]+)/i','',$moreparam);
|
$options=preg_replace('/sortfield=([a-zA-Z0-9,\s\.]+)/i','',$moreparam);
|
||||||
$options=preg_replace('/sortorder=([a-zA-Z0-9,\s\.]+)/i','',$options);
|
$options=preg_replace('/sortorder=([a-zA-Z0-9,\s\.]+)/i','',$options);
|
||||||
@@ -3339,7 +3340,7 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m
|
|||||||
|
|
||||||
$out.=$langs->trans($name);
|
$out.=$langs->trans($name);
|
||||||
|
|
||||||
if (empty($thead) && $field) // If this is a sort field
|
if (empty($thead) && $field && empty($disablesortlink)) // If this is a sort field
|
||||||
{
|
{
|
||||||
$out.='</a>';
|
$out.='</a>';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ require_once DOL_DOCUMENT_ROOT.'/blockedlog/class/blockedlog.class.php';
|
|||||||
class InterfaceActionsBlockedLog extends DolibarrTriggers
|
class InterfaceActionsBlockedLog extends DolibarrTriggers
|
||||||
{
|
{
|
||||||
public $family = 'system';
|
public $family = 'system';
|
||||||
public $description = "Triggers of this module add blocklog.";
|
public $description = "Triggers of this module add action for BlockedLog module.";
|
||||||
public $version = self::VERSION_DOLIBARR;
|
public $version = self::VERSION_DOLIBARR;
|
||||||
public $picto = 'system';
|
public $picto = 'technic';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called on Dolibarrr payment or invoice event.
|
* Function called on Dolibarrr payment or invoice event.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Dolibarr language file - Source file is en_US - loan
|
# Dolibarr language file - Source file is en_US - loan
|
||||||
ModuleBuilderDesc=This tools must be used by experienced users or developers. It gives you utilities to build or edit your own module (Documentation for alternative <a href="%s" target="_blank">manual development is here</a>).
|
ModuleBuilderDesc=This tools must be used by experienced users or developers. It gives you utilities to build or edit your own module (Documentation for alternative <a href="%s" target="_blank">manual development is here</a>).
|
||||||
EnterNameOfModuleDesc=Enter name of the module/application to create with no spaces. Use uppercase to separate words (For example: MyModule, EcommerceForShop, SyncWithMySystem...)
|
EnterNameOfModuleDesc=Enter name of the module/application to create with no spaces. Use uppercase to separate words (For example: MyModule, EcommerceForShop, SyncWithMySystem...)
|
||||||
EnterNameOfObjectDesc=Enter name of the object to create with no spaces. Use uppercase to separate words (For example: MyObject, Student, Teacher...)
|
EnterNameOfObjectDesc=Enter name of the object to create with no spaces. Use uppercase to separate words (For example: MyObject, Student, Teacher...). The CRUD class file, but also API file, pages to list/add/edit/delete object and SQL files will be generated.
|
||||||
ModuleBuilderDesc2=Path where modules are generated/edited (first alternative directory defined into %s): <strong>%s</strong>
|
ModuleBuilderDesc2=Path where modules are generated/edited (first alternative directory defined into %s): <strong>%s</strong>
|
||||||
ModuleBuilderDesc3=Generated/editable modules found: <strong>%s</strong> (they are detected as editable when the file <strong>%s</strong> exists in root of module directory).
|
ModuleBuilderDesc3=Generated/editable modules found: <strong>%s</strong> (they are detected as editable when the file <strong>%s</strong> exists in root of module directory).
|
||||||
NewModule=New module
|
NewModule=New module
|
||||||
@@ -44,4 +44,11 @@ ConfirmDeleteProperty=Are you sure you want to delete the property <strong>%s</s
|
|||||||
NotNull=Not NULL
|
NotNull=Not NULL
|
||||||
SearchAll=Used for 'search all'
|
SearchAll=Used for 'search all'
|
||||||
DatabaseIndex=Database index
|
DatabaseIndex=Database index
|
||||||
FileAlreadyExists=File %s already exists
|
FileAlreadyExists=File %s already exists
|
||||||
|
TriggersFile=File for triggers code
|
||||||
|
HooksFile=File for hooks code
|
||||||
|
WidgetFile=Widget file
|
||||||
|
ReadmeFile=Readme file
|
||||||
|
ChangeLog=ChangeLog file
|
||||||
|
SqlFile=Sql file
|
||||||
|
SqlFileKey=Sql file for keys
|
||||||
@@ -719,6 +719,7 @@ elseif (! empty($module))
|
|||||||
{
|
{
|
||||||
$pathtofile = $modulelowercase.'/core/modules/mod'.$module.'.class.php';
|
$pathtofile = $modulelowercase.'/core/modules/mod'.$module.'.class.php';
|
||||||
$pathtofilereadme = $modulelowercase.'/README.md';
|
$pathtofilereadme = $modulelowercase.'/README.md';
|
||||||
|
$pathtochangelog = $modulelowercase.'/ChangeLog.md';
|
||||||
|
|
||||||
if ($action != 'editfile' || empty($file))
|
if ($action != 'editfile' || empty($file))
|
||||||
{
|
{
|
||||||
@@ -730,6 +731,10 @@ elseif (! empty($module))
|
|||||||
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtofilereadme).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtofilereadme).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
|
|
||||||
|
print '<span class="fa fa-file"></span> '.$langs->trans("ChangeLog").' : <strong>'.$pathtochangelog.'</strong>';
|
||||||
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtochangelog).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
print '<br>';
|
print '<br>';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
|
|
||||||
@@ -794,7 +799,7 @@ elseif (! empty($module))
|
|||||||
|
|
||||||
print '<br><br>';
|
print '<br><br>';
|
||||||
|
|
||||||
|
// Readme file
|
||||||
print_fiche_titre($langs->trans("ReadmeFile"));
|
print_fiche_titre($langs->trans("ReadmeFile"));
|
||||||
|
|
||||||
print '<div class="underbanner clearboth"></div>';
|
print '<div class="underbanner clearboth"></div>';
|
||||||
@@ -802,6 +807,16 @@ elseif (! empty($module))
|
|||||||
|
|
||||||
print $moduleobj->getDescLong();
|
print $moduleobj->getDescLong();
|
||||||
|
|
||||||
|
print '<br><br>';
|
||||||
|
|
||||||
|
// ChangeLog
|
||||||
|
print_fiche_titre($langs->trans("ChangeLog"));
|
||||||
|
|
||||||
|
print '<div class="underbanner clearboth"></div>';
|
||||||
|
print '<div class="fichecenter">';
|
||||||
|
|
||||||
|
print $moduleobj->getChangeLog();
|
||||||
|
|
||||||
print '</div>';
|
print '</div>';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -959,12 +974,20 @@ elseif (! empty($module))
|
|||||||
$pathtoapi = strtolower($module).'/class/api_'.strtolower($tabobj).'.class.php';
|
$pathtoapi = strtolower($module).'/class/api_'.strtolower($tabobj).'.class.php';
|
||||||
$pathtolist = strtolower($module).'/'.strtolower($tabobj).'_list.php';
|
$pathtolist = strtolower($module).'/'.strtolower($tabobj).'_list.php';
|
||||||
$pathtocard = strtolower($module).'/'.strtolower($tabobj).'_card.php';
|
$pathtocard = strtolower($module).'/'.strtolower($tabobj).'_card.php';
|
||||||
|
$pathtosql = strtolower($module).'/sql/llx_'.strtolower($tabobj).'.sql';
|
||||||
|
$pathtosqlkey = strtolower($module).'/sql/llx_'.strtolower($tabobj).'.key.sql';
|
||||||
print '<div class="fichehalfleft">';
|
print '<div class="fichehalfleft">';
|
||||||
print '<span class="fa fa-file"></span> '.$langs->trans("ClassFile").' : <strong>'.$pathtoclass.'</strong>';
|
print '<span class="fa fa-file"></span> '.$langs->trans("ClassFile").' : <strong>'.$pathtoclass.'</strong>';
|
||||||
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtoclass).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtoclass).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
print '<span class="fa fa-file"></span> '.$langs->trans("ApiClassFile").' : <strong>'.$pathtoapi.'</strong>';
|
print '<span class="fa fa-file"></span> '.$langs->trans("ApiClassFile").' : <strong>'.$pathtoapi.'</strong>';
|
||||||
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtoapi).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtoapi).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
|
print '<br>';
|
||||||
|
print '<span class="fa fa-file"></span> '.$langs->trans("SqlFile").' : <strong>'.$pathtosql.'</strong>';
|
||||||
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtosql).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
|
print '<br>';
|
||||||
|
print '<span class="fa fa-file"></span> '.$langs->trans("SqlFileKey").' : <strong>'.$pathtosqlkey.'</strong>';
|
||||||
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtosqlkey).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
print '<div class="fichehalfleft">';
|
print '<div class="fichehalfleft">';
|
||||||
print '<span class="fa fa-file"></span> '.$langs->trans("PageForList").' : <strong>'.$pathtolist.'</strong>';
|
print '<span class="fa fa-file"></span> '.$langs->trans("PageForList").' : <strong>'.$pathtolist.'</strong>';
|
||||||
@@ -1138,8 +1161,38 @@ elseif (! empty($module))
|
|||||||
|
|
||||||
if ($tab == 'hooks')
|
if ($tab == 'hooks')
|
||||||
{
|
{
|
||||||
print $langs->trans("FeatureNotYetAvailable");
|
if ($action != 'editfile' || empty($file))
|
||||||
|
{
|
||||||
|
$pathtohook = strtolower($module).'/class/actions_'.strtolower($module).'.class.php';
|
||||||
|
print '<span class="fa fa-file"></span> '.$langs->trans("HooksFile").' : <strong>'.$pathtohook.'</strong>';
|
||||||
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtohook).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
|
print '<br>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$fullpathoffile=dol_buildpath($file, 0);
|
||||||
|
|
||||||
|
$content = file_get_contents($fullpathoffile);
|
||||||
|
|
||||||
|
// New module
|
||||||
|
print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
|
||||||
|
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
print '<input type="hidden" name="action" value="savefile">';
|
||||||
|
print '<input type="hidden" name="file" value="'.dol_escape_htmltag($file).'">';
|
||||||
|
print '<input type="hidden" name="tab" value="'.$tab.'">';
|
||||||
|
print '<input type="hidden" name="module" value="'.$module.'">';
|
||||||
|
|
||||||
|
$doleditor=new DolEditor('editfilecontent', $content, '', '600', 'Full', 'In', true, false, false, 0, '99%');
|
||||||
|
print $doleditor->Create(1, '', false);
|
||||||
|
print '<br>';
|
||||||
|
print '<center>';
|
||||||
|
print '<input type="submit" class="button" name="savefile" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
|
||||||
|
print ' ';
|
||||||
|
print '<input type="submit" class="button" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
|
||||||
|
print '</center>';
|
||||||
|
|
||||||
|
print '</form>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tab == 'triggers')
|
if ($tab == 'triggers')
|
||||||
@@ -1155,7 +1208,7 @@ elseif (! empty($module))
|
|||||||
{
|
{
|
||||||
$pathtofile = $trigger['relpath'];
|
$pathtofile = $trigger['relpath'];
|
||||||
|
|
||||||
print '<span class="fa fa-file"></span> '.$langs->trans("TriggerFile").' : <strong>'.$pathtofile.'</strong>';
|
print '<span class="fa fa-file"></span> '.$langs->trans("TriggersFile").' : <strong>'.$pathtofile.'</strong>';
|
||||||
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtofile).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtofile).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
}
|
}
|
||||||
@@ -1189,8 +1242,46 @@ elseif (! empty($module))
|
|||||||
|
|
||||||
if ($tab == 'widgets')
|
if ($tab == 'widgets')
|
||||||
{
|
{
|
||||||
print $langs->trans("FeatureNotYetAvailable");
|
require_once DOL_DOCUMENT_ROOT.'/core/boxes/modules_boxes.php';
|
||||||
|
|
||||||
|
$widgets = ModeleBoxes::getWidgetsList(array('/'.strtolower($module).'/core/boxes'));
|
||||||
|
|
||||||
|
if ($action != 'editfile' || empty($file))
|
||||||
|
{
|
||||||
|
foreach ($widgets as $widget)
|
||||||
|
{
|
||||||
|
$pathtofile = $widget['relpath'];
|
||||||
|
|
||||||
|
print '<span class="fa fa-file"></span> '.$langs->trans("WidgetFile").' : <strong>'.$pathtofile.'</strong>';
|
||||||
|
print ' <a href="'.$_SERVER['PHP_SELF'].'?tab='.$tab.'&module='.$module.'&action=editfile&file='.urlencode($pathtofile).'">'.img_picto($langs->trans("Edit"), 'edit').'</a>';
|
||||||
|
print '<br>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$fullpathoffile=dol_buildpath($file, 0);
|
||||||
|
|
||||||
|
$content = file_get_contents($fullpathoffile);
|
||||||
|
|
||||||
|
// New module
|
||||||
|
print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
|
||||||
|
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
print '<input type="hidden" name="action" value="savefile">';
|
||||||
|
print '<input type="hidden" name="file" value="'.dol_escape_htmltag($file).'">';
|
||||||
|
print '<input type="hidden" name="tab" value="'.$tab.'">';
|
||||||
|
print '<input type="hidden" name="module" value="'.$module.'">';
|
||||||
|
|
||||||
|
$doleditor=new DolEditor('editfilecontent', $content, '', '600', 'Full', 'In', true, false, false, 0, '99%');
|
||||||
|
print $doleditor->Create(1, '', false);
|
||||||
|
print '<br>';
|
||||||
|
print '<center>';
|
||||||
|
print '<input type="submit" class="button" name="savefile" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
|
||||||
|
print ' ';
|
||||||
|
print '<input type="submit" class="button" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
|
||||||
|
print '</center>';
|
||||||
|
|
||||||
|
print '</form>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tab == 'buildpackage')
|
if ($tab == 'buildpackage')
|
||||||
|
|||||||
5
htdocs/modulebuilder/template/ChangeLog.md
Normal file
5
htdocs/modulebuilder/template/ChangeLog.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# CHANGELOG FOR DOLIBARR ERP CRM
|
||||||
|
|
||||||
|
## 1.0
|
||||||
|
Initial version
|
||||||
|
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \file core/boxes/mybox.php
|
* \file modulebuilder/template/core/boxes/mymodulewidget1.php
|
||||||
* \ingroup mymodule
|
* \ingroup mymodule
|
||||||
* \brief Example box definition.
|
* \brief Widget provided by MyModule
|
||||||
*
|
*
|
||||||
* Put detailed description here.
|
* Put detailed description here.
|
||||||
*/
|
*/
|
||||||
@@ -33,12 +33,12 @@ include_once DOL_DOCUMENT_ROOT . "/core/boxes/modules_boxes.php";
|
|||||||
* Warning: for the box to be detected correctly by dolibarr,
|
* Warning: for the box to be detected correctly by dolibarr,
|
||||||
* the filename should be the lowercase classname
|
* the filename should be the lowercase classname
|
||||||
*/
|
*/
|
||||||
class MyBox extends ModeleBoxes
|
class mymodulewidget1 extends ModeleBoxes
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string Alphanumeric ID. Populated by the constructor.
|
* @var string Alphanumeric ID. Populated by the constructor.
|
||||||
*/
|
*/
|
||||||
public $boxcode = "mybox";
|
public $boxcode = "mymodulebox";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string Box icon (in configuration page)
|
* @var string Box icon (in configuration page)
|
||||||
@@ -90,7 +90,7 @@ class MyBox extends ModeleBoxes
|
|||||||
|
|
||||||
parent::__construct($db, $param);
|
parent::__construct($db, $param);
|
||||||
|
|
||||||
$this->boxlabel = $langs->transnoentitiesnoconv("MyBox");
|
$this->boxlabel = $langs->transnoentitiesnoconv("MyWidget");
|
||||||
|
|
||||||
$this->param = $param;
|
$this->param = $param;
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ class MyBox extends ModeleBoxes
|
|||||||
//include_once DOL_DOCUMENT_ROOT . "/mymodule/class/mymodule.class.php";
|
//include_once DOL_DOCUMENT_ROOT . "/mymodule/class/mymodule.class.php";
|
||||||
|
|
||||||
// Populate the head at runtime
|
// Populate the head at runtime
|
||||||
$text = $langs->trans("MyBoxDescription", $max);
|
$text = $langs->trans("MyModuleBoxDescription", $max);
|
||||||
$this->info_box_head = array(
|
$this->info_box_head = array(
|
||||||
// Title text
|
// Title text
|
||||||
'text' => $text,
|
'text' => $text,
|
||||||
@@ -142,18 +142,21 @@ class MyBox extends ModeleBoxes
|
|||||||
'tr' => 'align="left"',
|
'tr' => 'align="left"',
|
||||||
// HTML properties of the TD element
|
// HTML properties of the TD element
|
||||||
'td' => '',
|
'td' => '',
|
||||||
// Fist line logo
|
|
||||||
'logo' => 'mymodule@mymodule',
|
// Main text for content of cell
|
||||||
// Main text
|
'text' => 'First cell of first line',
|
||||||
'text' => 'My text',
|
|
||||||
// Secondary text
|
|
||||||
'text2' => '<p><strong>Another text</strong></p>',
|
|
||||||
// Unformatted text, usefull to load javascript elements
|
|
||||||
'textnoformat' => '',
|
|
||||||
// Link on 'text' and 'logo' elements
|
// Link on 'text' and 'logo' elements
|
||||||
'url' => 'http://example.com',
|
'url' => 'http://example.com',
|
||||||
// Link's target HTML property
|
// Link's target HTML property
|
||||||
'target' => '_blank',
|
'target' => '_blank',
|
||||||
|
// Fist line logo (deprecated. Include instead logo html code into text or text2, and set asis property to true to avoid HTML cleaning)
|
||||||
|
//'logo' => 'monmodule@monmodule',
|
||||||
|
// Unformatted text, added after text. Usefull to add/load javascript code
|
||||||
|
'textnoformat' => '',
|
||||||
|
|
||||||
|
// Main text for content of cell (other method)
|
||||||
|
//'text2' => '<p><strong>Another text</strong></p>',
|
||||||
|
|
||||||
// Truncates 'text' element to the specified character length, 0 = disabled
|
// Truncates 'text' element to the specified character length, 0 = disabled
|
||||||
'maxlength' => 0,
|
'maxlength' => 0,
|
||||||
// Prevents HTML cleaning (and truncation)
|
// Prevents HTML cleaning (and truncation)
|
||||||
@@ -164,19 +167,27 @@ class MyBox extends ModeleBoxes
|
|||||||
1 => array( // Another column
|
1 => array( // Another column
|
||||||
// No TR for n≠0
|
// No TR for n≠0
|
||||||
'td' => '',
|
'td' => '',
|
||||||
'text' => 'Another cell',
|
'text' => 'Second cell',
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
1 => array( // Another line
|
1 => array( // Another line
|
||||||
0 => array( // TR
|
0 => array( // TR
|
||||||
'tr' => 'align="left"',
|
'tr' => 'align="left"',
|
||||||
'text' => 'Another line'
|
'text' => 'Another line'
|
||||||
|
),
|
||||||
|
1 => array( // TR
|
||||||
|
'tr' => 'align="left"',
|
||||||
|
'text' => ''
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
2 => array( // Another line
|
2 => array( // Another line
|
||||||
0 => array( // TR
|
0 => array( // TR
|
||||||
'tr' => 'align="left"',
|
'tr' => 'align="left"',
|
||||||
'text' => 'Yet another line'
|
'text' => ''
|
||||||
|
),
|
||||||
|
0 => array( // TR
|
||||||
|
'tr' => 'align="left"',
|
||||||
|
'text' => ''
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -173,15 +173,13 @@ class modMyModule extends DolibarrModules
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// Boxes
|
// Boxes/Widgets
|
||||||
// Add here list of php file(s) stored in core/boxes that contains class to show a widget.
|
// Add here list of php file(s) stored in mymodule/core/boxes that contains class to show a widget.
|
||||||
$this->boxes = array(); // List of boxes
|
$this->boxes = array(
|
||||||
// Example:
|
0=>array('file'=>'mymodulewidget1.php@mymodule','note'=>'Widget provided by MyModule','enabledbydefaulton'=>'Home'),
|
||||||
//$this->boxes=array(
|
//1=>array('file'=>'mymodulewidget2.php@mymodule','note'=>'Widget provided by MyModule'),
|
||||||
// 0=>array('file'=>'myboxa.php@mymodule','note'=>'','enabledbydefaulton'=>'Home'),
|
//2=>array('file'=>'mymodulewidget3.php@mymodule','note'=>'Widget provided by MyModule')
|
||||||
// 1=>array('file'=>'myboxb.php@mymodule','note'=>''),
|
);
|
||||||
// 2=>array('file'=>'myboxc.php@mymodule','note'=>'')
|
|
||||||
//);
|
|
||||||
|
|
||||||
|
|
||||||
// Cronjobs
|
// Cronjobs
|
||||||
|
|||||||
@@ -44,5 +44,5 @@ MyPageName = My page name
|
|||||||
#
|
#
|
||||||
# Sample box
|
# Sample box
|
||||||
#
|
#
|
||||||
MyBox = My box
|
MyWidget = My widget
|
||||||
MyBoxDescription = My box description
|
MyWidgetDescription = My widget description
|
||||||
@@ -44,5 +44,5 @@ MyPageName = Nom de ma page
|
|||||||
#
|
#
|
||||||
# Box d'exemple
|
# Box d'exemple
|
||||||
#
|
#
|
||||||
MyBox = Ma boîte
|
MyWidget = Mon widget
|
||||||
MyBoxDescription = Description de ma boîte
|
MyWidgetDescription = Description de mon widget
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ class MyModuleFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase
|
|||||||
{
|
{
|
||||||
$this->url('/admin/boxes.php');
|
$this->url('/admin/boxes.php');
|
||||||
$this->authenticate();
|
$this->authenticate();
|
||||||
return $this->assertContains('mybox', $this->source(), "Box enabled");
|
return $this->assertContains('mymodulewidget1', $this->source(), "Box enabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -244,7 +244,7 @@ class MyModuleFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase
|
|||||||
$this->url('/admin/triggers.php');
|
$this->url('/admin/triggers.php');
|
||||||
$this->authenticate();
|
$this->authenticate();
|
||||||
return $this->assertContains(
|
return $this->assertContains(
|
||||||
'interface_99_modMyModule_MyTrigger.class.php',
|
'interface_99_modMyModule_MyModuleTriggers.class.php',
|
||||||
$this->byTag('body')->text(),
|
$this->byTag('body')->text(),
|
||||||
"Trigger declared"
|
"Trigger declared"
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user