Qual: Make module system more simple.

Change to prepare adding left menu entries by modules
This commit is contained in:
Laurent Destailleur 2011-04-06 11:11:32 +00:00
parent 97385865e6
commit c6ac86430b
6 changed files with 81 additions and 121 deletions

View File

@ -65,27 +65,6 @@ if (isset($_GET["action"]) && ($_GET["action"] == 'up'))
$current=array(); $current=array();
$previous=array(); $previous=array();
// Redefine order
/*$sql = "SELECT m.rowid, m.position";
$sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
$sql.= " WHERE m.menu_handler='".$menu_handler."'";
$sql.= " AND m.entity = ".$conf->entity;
$sql.= " ORDER BY m.position, m.rowid";
dol_syslog("admin/menus/index.php ".$sql);
$resql = $db->query($sql);
$num = $db->num_rows($resql);
$i = 0;
while($i < $num)
{
$obj = $db->fetch_object($resql);
$sqlupdate ="UPDATE ".MAIN_DB_PREFIX."menu as m SET position=".($i+1);
$sqlupdate.=" WHERE m.menu_handler='".$menu_handler."'";
$sqlupdate.=" AND m.entity = ".$conf->entity;
$sqlupdate.=" AND rowid=".$obj->rowid;
$resql2 = $db->query($sqlupdate);
$i++;
}*/
// Get current position // Get current position
$sql = "SELECT m.rowid, m.position, m.type, m.fk_menu"; $sql = "SELECT m.rowid, m.position, m.type, m.fk_menu";
$sql.= " FROM ".MAIN_DB_PREFIX."menu as m"; $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
@ -223,8 +202,9 @@ if ($_POST["action"] == 'confirm_delete' && $_POST["confirm"] == 'yes')
$html=new Form($db); $html=new Form($db);
$htmladmin=new FormAdmin($db); $htmladmin=new FormAdmin($db);
$arrayofjs=array('/admin/menus/menu.js.php?lang='.$langs->defaultlang);
llxHeader(); llxHeader('',$langs->trans("Menus"),'','',0,0,$arrayofjs);
print_fiche_titre($langs->trans("Menus"),'','setup'); print_fiche_titre($langs->trans("Menus"),'','setup');
@ -292,8 +272,6 @@ $rangLast = 0;
$idLast = -1; $idLast = -1;
if ($conf->use_javascript_ajax) if ($conf->use_javascript_ajax)
{ {
tree_addjs();
/*-------------------- MAIN ----------------------- /*-------------------- MAIN -----------------------
tableau des elements de l'arbre: tableau des elements de l'arbre:
c'est un tableau a 2 dimensions. c'est un tableau a 2 dimensions.
@ -315,6 +293,7 @@ if ($conf->use_javascript_ajax)
$sql.= " FROM ".MAIN_DB_PREFIX."menu as m"; $sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
$sql.= " WHERE menu_handler = '".$menu_handler."'"; $sql.= " WHERE menu_handler = '".$menu_handler."'";
$sql.= " AND entity = ".$conf->entity; $sql.= " AND entity = ".$conf->entity;
$sql.= " AND fk_menu >= 0";
$sql.= " ORDER BY m.position, m.rowid"; // Order is position then rowid (because we need a sort criteria when position is same) $sql.= " ORDER BY m.position, m.rowid"; // Order is position then rowid (because we need a sort criteria when position is same)
$res = $db->query($sql); $res = $db->query($sql);

View File

@ -72,9 +72,9 @@ class Menubase
/** /**
* \brief Create menu entry into database * Create menu entry into database
* \param user User that create * @param user User that create
* \return int <0 si ko, >0 si ok * @return int <0 if KO, Id of record if OK
*/ */
function create($user) function create($user)
{ {
@ -85,14 +85,15 @@ class Menubase
$this->module=trim($this->module); $this->module=trim($this->module);
$this->type=trim($this->type); $this->type=trim($this->type);
$this->mainmenu=trim($this->mainmenu); $this->mainmenu=trim($this->mainmenu);
$this->leftmenu=trim($this->leftmenu);
$this->fk_menu=trim($this->fk_menu); $this->fk_menu=trim($this->fk_menu);
$this->fk_mainmenu=trim($this->fk_mainmenu);
$this->fk_leftmenu=trim($this->fk_leftmenu);
$this->position=trim($this->position); $this->position=trim($this->position);
$this->url=trim($this->url); $this->url=trim($this->url);
$this->target=trim($this->target); $this->target=trim($this->target);
$this->titre=trim($this->titre); $this->titre=trim($this->titre);
$this->langs=trim($this->langs); $this->langs=trim($this->langs);
$this->level=trim($this->level);
$this->leftmenu=trim($this->leftmenu);
$this->perms=trim($this->perms); $this->perms=trim($this->perms);
$this->enabled=trim($this->enabled); $this->enabled=trim($this->enabled);
$this->user=trim($this->user); $this->user=trim($this->user);
@ -115,14 +116,15 @@ class Menubase
$sql.= "module,"; $sql.= "module,";
$sql.= "type,"; $sql.= "type,";
$sql.= "mainmenu,"; $sql.= "mainmenu,";
$sql.= "leftmenu,";
$sql.= "fk_menu,"; $sql.= "fk_menu,";
$sql.= "fk_mainmenu,";
$sql.= "fk_leftmenu,";
$sql.= "position,"; $sql.= "position,";
$sql.= "url,"; $sql.= "url,";
$sql.= "target,"; $sql.= "target,";
$sql.= "titre,"; $sql.= "titre,";
$sql.= "langs,"; $sql.= "langs,";
$sql.= "level,";
$sql.= "leftmenu,";
$sql.= "perms,"; $sql.= "perms,";
$sql.= "enabled,"; $sql.= "enabled,";
$sql.= "usertype"; $sql.= "usertype";
@ -132,14 +134,15 @@ class Menubase
$sql.= " '".$this->module."',"; $sql.= " '".$this->module."',";
$sql.= " '".$this->type."',"; $sql.= " '".$this->type."',";
$sql.= " '".$this->mainmenu."',"; $sql.= " '".$this->mainmenu."',";
$sql.= " '".$this->leftmenu."',";
$sql.= " '".$this->fk_menu."',"; $sql.= " '".$this->fk_menu."',";
$sql.= " ".($this->fk_mainmenu?"'".$this->fk_mainmenu."'":"null").",";
$sql.= " ".($this->fk_leftmenu?"'".$this->fk_leftmenu."'":"null").",";
$sql.= " '".$this->position."',"; $sql.= " '".$this->position."',";
$sql.= " '".$this->url."',"; $sql.= " '".$this->url."',";
$sql.= " '".$this->target."',"; $sql.= " '".$this->target."',";
$sql.= " '".$this->titre."',"; $sql.= " '".$this->titre."',";
$sql.= " '".$this->langs."',"; $sql.= " '".$this->langs."',";
$sql.= " '".$this->level."',";
$sql.= " '".$this->leftmenu."',";
$sql.= " '".$this->perms."',"; $sql.= " '".$this->perms."',";
$sql.= " '".$this->enabled."',"; $sql.= " '".$this->enabled."',";
$sql.= " '".$this->user."'"; $sql.= " '".$this->user."'";
@ -162,11 +165,11 @@ class Menubase
} }
} }
/* /**
* \brief Update database * Update menu entry into database
* \param user User that modify * @param user User that modify
* \param notrigger 0=no, 1=yes (no update trigger) * @param notrigger 0=no, 1=yes (no update trigger)
* \return int <0 if KO, >0 if OK * @return int <0 if KO, >0 if OK
*/ */
function update($user=0, $notrigger=0) function update($user=0, $notrigger=0)
{ {
@ -178,14 +181,15 @@ class Menubase
$this->module=trim($this->module); $this->module=trim($this->module);
$this->type=trim($this->type); $this->type=trim($this->type);
$this->mainmenu=trim($this->mainmenu); $this->mainmenu=trim($this->mainmenu);
$this->leftmenu=trim($this->leftmenu);
$this->fk_menu=trim($this->fk_menu); $this->fk_menu=trim($this->fk_menu);
$this->fk_mainmenu=trim($this->fk_mainmenu);
$this->fk_leftmenu=trim($this->fk_leftmenu);
$this->position=trim($this->position); $this->position=trim($this->position);
$this->url=trim($this->url); $this->url=trim($this->url);
$this->target=trim($this->target); $this->target=trim($this->target);
$this->titre=trim($this->titre); $this->titre=trim($this->titre);
$this->langs=trim($this->langs); $this->langs=trim($this->langs);
$this->level=trim($this->level);
$this->leftmenu=trim($this->leftmenu);
$this->perms=trim($this->perms); $this->perms=trim($this->perms);
$this->enabled=trim($this->enabled); $this->enabled=trim($this->enabled);
$this->user=trim($this->user); $this->user=trim($this->user);
@ -199,14 +203,15 @@ class Menubase
$sql.= " module='".$this->db->escape($this->module)."',"; $sql.= " module='".$this->db->escape($this->module)."',";
$sql.= " type='".$this->type."',"; $sql.= " type='".$this->type."',";
$sql.= " mainmenu='".$this->db->escape($this->mainmenu)."',"; $sql.= " mainmenu='".$this->db->escape($this->mainmenu)."',";
$sql.= " leftmenu='".$this->db->escape($this->leftmenu)."',";
$sql.= " fk_menu='".$this->fk_menu."',"; $sql.= " fk_menu='".$this->fk_menu."',";
$sql.= " fk_mainmenu=".($this->fk_mainmenu?"'".$this->fk_mainmenu."'":"null").",";
$sql.= " fk_leftmenu=".($this->fk_leftmenu?"'".$this->fk_leftmenu."'":"null").",";
$sql.= " position='".$this->position."',"; $sql.= " position='".$this->position."',";
$sql.= " url='".$this->db->escape($this->url)."',"; $sql.= " url='".$this->db->escape($this->url)."',";
$sql.= " target='".$this->db->escape($this->target)."',"; $sql.= " target='".$this->db->escape($this->target)."',";
$sql.= " titre='".$this->db->escape($this->titre)."',"; $sql.= " titre='".$this->db->escape($this->titre)."',";
$sql.= " langs='".$this->db->escape($this->langs)."',"; $sql.= " langs='".$this->db->escape($this->langs)."',";
$sql.= " level='".$this->level."',";
$sql.= " leftmenu='".$this->db->escape($this->leftmenu)."',";
$sql.= " perms='".$this->db->escape($this->perms)."',"; $sql.= " perms='".$this->db->escape($this->perms)."',";
$sql.= " enabled='".$this->db->escape($this->enabled)."',"; $sql.= " enabled='".$this->db->escape($this->enabled)."',";
$sql.= " usertype='".$this->user."'"; $sql.= " usertype='".$this->user."'";
@ -242,14 +247,13 @@ class Menubase
$sql.= " t.module,"; $sql.= " t.module,";
$sql.= " t.type,"; $sql.= " t.type,";
$sql.= " t.mainmenu,"; $sql.= " t.mainmenu,";
$sql.= " t.leftmenu,";
$sql.= " t.fk_menu,"; $sql.= " t.fk_menu,";
$sql.= " t.position,"; $sql.= " t.position,";
$sql.= " t.url,"; $sql.= " t.url,";
$sql.= " t.target,"; $sql.= " t.target,";
$sql.= " t.titre,"; $sql.= " t.titre,";
$sql.= " t.langs,"; $sql.= " t.langs,";
$sql.= " t.level,";
$sql.= " t.leftmenu,";
$sql.= " t.perms,"; $sql.= " t.perms,";
$sql.= " t.enabled,"; $sql.= " t.enabled,";
$sql.= " t.usertype as user,"; $sql.= " t.usertype as user,";
@ -272,14 +276,13 @@ class Menubase
$this->module = $obj->module; $this->module = $obj->module;
$this->type = $obj->type; $this->type = $obj->type;
$this->mainmenu = $obj->mainmenu; $this->mainmenu = $obj->mainmenu;
$this->leftmenu = $obj->leftmenu;
$this->fk_menu = $obj->fk_menu; $this->fk_menu = $obj->fk_menu;
$this->position = $obj->position; $this->position = $obj->position;
$this->url = $obj->url; $this->url = $obj->url;
$this->target = $obj->target; $this->target = $obj->target;
$this->titre = $obj->titre; $this->titre = $obj->titre;
$this->langs = $obj->langs; $this->langs = $obj->langs;
$this->level = $obj->level;
$this->leftmenu = $obj->leftmenu;
$this->perms = $obj->perms; $this->perms = $obj->perms;
$this->enabled = str_replace("\"","'",$obj->enabled); $this->enabled = str_replace("\"","'",$obj->enabled);
$this->user = $obj->user; $this->user = $obj->user;
@ -324,8 +327,8 @@ class Menubase
/** /**
* \brief Initialise object with example values * Initialise object with example values
* \remarks id must be 0 if object instance is a specimen. * Id must be 0 if object instance is a specimen.
*/ */
function initAsSpecimen() function initAsSpecimen()
{ {
@ -391,41 +394,6 @@ class Menubase
} }
} }
/**
* Return all values of mainmenu where leftmenu defined
* in pre.inc.php must be overwritten completely by dynamic menu.
*
* @return array
*/
function listeMainmenu()
{
global $conf;
$overwritemenufor=array();
$sql = "SELECT DISTINCT m.mainmenu";
$sql.= " FROM " . MAIN_DB_PREFIX . "menu as m";
$sql.= " WHERE m.menu_handler in ('".$this->menu_handler."','all')";
$sql.= " AND m.entity = ".$conf->entity;
$sql.= " AND m.leftmenu != '0'"; // leftmenu exists in database so pre.inc.php must be overwritten
//print $sql;
$res = $this->db->query($sql);
if ($res)
{
while ($menu = $this->db->fetch_array($res))
{
if ($menu['mainmenu']) $overwritemenufor[] = $menu['mainmenu'];
}
}
else
{
dol_print_error($this->db);
}
return $overwritemenufor;
}
/** /**
* Load tabMenu array * Load tabMenu array
* @param type_user 0=Internal,1=External,2=All * @param type_user 0=Internal,1=External,2=All

View File

@ -1036,8 +1036,8 @@ class DolibarrModules
/** /**
* \brief Insert menus entries into llx_menu* * Insert menus entries found into $this->menu into llx_menu*
* \return int Nb of errors (0 if OK) * @return int Nb of errors (0 if OK)
*/ */
function insert_menus() function insert_menus()
{ {
@ -1063,15 +1063,27 @@ class DolibarrModules
else else
{ {
//print 'xxx'.$this->menu[$key]['fk_menu'];exit; //print 'xxx'.$this->menu[$key]['fk_menu'];exit;
$numparent=$this->menu[$key]['fk_menu']; $foundparent=0;
$numparent=str_replace('r=','',$numparent); $fk_parent=$this->menu[$key]['fk_menu'];
if (isset($this->menu[$numparent]['rowid'])) if (preg_match('/r=/',$fk_parent))
{ {
$menu->fk_menu=$this->menu[$numparent]['rowid']; $fk_parent=str_replace('r=','',$fk_parent);
if (isset($this->menu[$fk_parent]['rowid']))
{
$menu->fk_menu=$this->menu[$fk_parent]['rowid'];
$foundparent=1;
}
} }
else elseif (preg_match('/mainmenu=(.*),leftmenu=(.*)/',$fk_parent,$reg))
{ {
$this->error="BadDefinitionOfMenuArrayInModuleDescriptor"; $menu->fk_menu=-1;
$menu->fk_mainmenu=$reg[1];
$menu->fk_leftmenu=$reg[2];
$foundparent=1;
}
if (! $foundparent)
{
$this->error="ErrorBadDefinitionOfMenuArrayInModuleDescriptor (bad value for key fk_menu)";
dol_syslog("DolibarrModules::insert_menus ".$this->error." ".$this->menu[$key]['fk_menu'], LOG_ERR); dol_syslog("DolibarrModules::insert_menus ".$this->error." ".$this->menu[$key]['fk_menu'], LOG_ERR);
$err++; $err++;
} }

View File

@ -43,7 +43,12 @@ ALTER TABLE llx_societe ADD COLUMN fk_currency integer DEFAULT 0 AFTER fk_forme_
ALTER TABLE llx_societe_remise MODIFY remise_client double(6,3) DEFAULT 0 NOT NULL; ALTER TABLE llx_societe_remise MODIFY remise_client double(6,3) DEFAULT 0 NOT NULL;
create table llx_c_availability ALTER TABLE llx_menu ADD COLUMN fk_mainmenu varchar(16) after fk_menu;
ALTER TABLE llx_menu ADD COLUMN fk_leftmenu varchar(16) after fk_menu;
ALTER TABLE llx_menu MODIFY leftmenu varchar(100) NULL;
CREATE TABLE llx_c_availability
( (
rowid integer AUTO_INCREMENT PRIMARY KEY, rowid integer AUTO_INCREMENT PRIMARY KEY,
code varchar(30) NOT NULL, code varchar(30) NOT NULL,
@ -55,7 +60,9 @@ create table llx_c_availability
ALTER TABLE llx_propal ADD COLUMN fk_availability integer DEFAULT 0 AFTER fk_adresse_livraison; ALTER TABLE llx_propal ADD COLUMN fk_availability integer DEFAULT 0 AFTER fk_adresse_livraison;
ALTER TABLE llx_propal CHANGE COLUMN delivery fk_availability integer DEFAULT 0; ALTER TABLE llx_propal CHANGE COLUMN delivery fk_availability integer DEFAULT 0;
ALTER TABLE llx_availability CHANGE COLUMN libelle label varchar(60) NOT NULL; ALTER TABLE llx_availability CHANGE COLUMN libelle label varchar(60) NOT NULL;
INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (1, 'DSP', 'Disponible', 1);
INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (2, 'USM', 'Une semaine', 1); INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (1, 'AV_NOW', 'Immediate', 1);
INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (3, 'DSM', 'Deux semaines', 1); INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (2, 'AV_1W', 'One week', 1);
INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (4, 'TSM', 'Trois semaines', 1); INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (3, 'AV_2W', 'Two weeks', 1);
INSERT INTO llx_c_availability (rowid,code,label,active) VALUES (4, 'AV_3W', 'Three weeks', 1);

View File

@ -29,14 +29,16 @@ CREATE TABLE llx_menu
module varchar(64), -- Module name if record is added by a module module varchar(64), -- Module name if record is added by a module
type varchar(4) NOT NULL, -- Menu top or left type varchar(4) NOT NULL, -- Menu top or left
mainmenu varchar(100) NOT NULL, -- Name family/module (home, companies, ...) mainmenu varchar(100) NOT NULL, -- Name family/module (home, companies, ...)
fk_menu integer NOT NULL, -- 0 or Id of mother menu line leftmenu varchar(100) NULL, -- Name family/module for left menu (setup, info, ...)
fk_menu integer NOT NULL, -- 0 or Id of mother menu line, or -1 if we use fk_mainmenu and fk_leftmenu
fk_mainmenu varchar(16), --
fk_leftmenu varchar(16), --
position integer NOT NULL, -- Sort order of entry position integer NOT NULL, -- Sort order of entry
url varchar(255) NOT NULL, -- Relative (or absolute) url to go url varchar(255) NOT NULL, -- Relative (or absolute) url to go
target varchar(100) NULL, -- Target of Url link target varchar(100) NULL, -- Target of Url link
titre varchar(255) NOT NULL, -- Key for menu translation titre varchar(255) NOT NULL, -- Key for menu translation
langs varchar(100), -- Lang file to load for translation langs varchar(100), -- Lang file to load for translation
level smallint, -- Used by auguria menu only. Do not use. level smallint, -- Deprecated. Not used.
leftmenu varchar(1) NULL default '1', -- Say if left menu defined in pre.inc.php and used by top menu must be overwritten by dynamic databse menu (1=yes by default)
perms varchar(255), -- Condition to show enabled or disabled perms varchar(255), -- Condition to show enabled or disabled
enabled varchar(255) NULL default '1', -- Condition to show or hide enabled varchar(255) NULL default '1', -- Condition to show or hide
usertype integer NOT NULL default '0', -- 0 if menu for all users, 1 for external only, 2 for internal only usertype integer NOT NULL default '0', -- 0 if menu for all users, 1 for external only, 2 for internal only

View File

@ -139,20 +139,12 @@ function tree_showpad(&$fulltree,$key,$selected=0)
// ------------------------------- Used by enu editor ----------------- // ------------------------------- Used by menu editor -----------------
/** /**
* \brief Ad javascript tree functions * Show an element with correct offset
*/ * @param $tab Array of all elements
function tree_addjs() * @param $rang Level of offset
{
global $langs;
print '<script src="'.DOL_URL_ROOT.'/admin/menus/menu.js.php?lang='.$langs->defaultlang.'" type="text/javascript"></script>';
}
/* cette fonction gere le decallage des elements
suivant leur position dans l'arborescence
*/ */
function tree_showline($tab,$rang) function tree_showline($tab,$rang)
{ {
@ -220,10 +212,11 @@ function tree_showline($tab,$rang)
} }
/*fonction r<EFBFBD>cursive d'affichage de l'arbre /**
$tab :tableau des <EFBFBD>l<EFBFBD>ments * Recursive function to output menu tree
$pere :index de l'<EFBFBD>l<EFBFBD>ment courant * @param $tab Array of elements
$rang :d<EFBFBD>callage de l'<EFBFBD>l<EFBFBD>ment * @param $pere Id of parent
* @param $rang Level of element
*/ */
function tree_recur($tab,$pere,$rang) function tree_recur($tab,$pere,$rang)
{ {
@ -232,17 +225,16 @@ function tree_recur($tab,$pere,$rang)
if ($rang > 10) return; // Protection contre boucle infinie if ($rang > 10) return; // Protection contre boucle infinie
//ballayage du tableau //ballayage du tableau
for ($x=0;$x<count($tab);$x++) $sizeoftab=count($tab);
for ($x=0; $x < $sizeoftab; $x++)
{ {
//si un <20>l<EFBFBD>ment a pour p<>re : $pere // If an element has $pere for parent
if ($tab[$x][1]==$pere) if ($tab[$x][1]==$pere)
{ {
//on l'affiche avec le d<>callage courrant // We shot it with an offset
tree_showline($tab[$x],$rang); tree_showline($tab[$x],$rang);
/*et on recherche ses fils // And now we search all its sons of lower level
en rappelant la fonction recur()
(+ incr<EFBFBD>mentation du d<EFBFBD>callage)*/
tree_recur($tab,$tab[$x][0],$rang+1); tree_recur($tab,$tab[$x][0],$rang+1);
} }
} }