diff --git a/htdocs/core/menubase.class.php b/htdocs/core/menubase.class.php
index cde3c21689f..fe9d14931e2 100644
--- a/htdocs/core/menubase.class.php
+++ b/htdocs/core/menubase.class.php
@@ -325,64 +325,125 @@ class Menubase
$this->tms='';
}
-
- function menuCharger($mainmenu, $newmenu, $type_user, $leftmenu)
+ /**
+ * Add entries found in database in a menu array
+ *
+ * @param unknown_type $newmenu Menu array to complete
+ * @param unknown_type $mainmenu Value for mainmenu that defined top menu
+ * @param unknown_type $leftmenu Value for left that defined leftmenu
+ * @param unknown_type $type_user 0=Internal,1=External,2=All
+ * @return array Menu array completed
+ */
+ function menuLeftCharger($newmenu, $mainmenu, $leftmenu, $type_user)
{
global $langs, $user, $conf;
-
- $this->mainmenu = $mainmenu;
+ global $rights; // To export to dol_eval function
+
$this->newmenu = $newmenu;
$this->leftmenu = $leftmenu;
- $sql = "SELECT m.rowid, m.titre, m.type";
- $sql.= " FROM " . MAIN_DB_PREFIX . "menu as m";
- $sql.= " WHERE m.mainmenu = '".$this->mainmenu."'";
- $sql.= " AND m.menu_handler= '".$this->menu_handler."'";
- $sql.= " AND type = 'top'";
- $result = $this->db->query($sql);
- $menutop = $this->db->fetch_object($result);
- $menutopid=$menutop->rowid;
+ $tabMenu = array ();
- $data[] = array ($menutopid,-1,$this->mainmenu);
-
- $sql = "SELECT m.rowid, m.fk_menu, m.url, m.titre, m.langs, m.perms, m.target, m.mainmenu, m.leftmenu";
+ $sql = "SELECT m.rowid, m.fk_menu, m.url, m.titre, m.langs, m.perms, m.target, m.mainmenu, m.leftmenu,";
+ $sql.= " mo.action";
$sql.= " FROM " . MAIN_DB_PREFIX . "menu as m";
- $sql.= " WHERE m.menu_handler= '".$this->menu_handler."'";
- if($type_user == 0) $sql.= " AND m.user <> 1";
- else $sql.= " AND m.user > 0";
+ $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."menu_const as mc ON m.rowid = mc.fk_menu";
+ $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."menu_constraint as mo ON mc.fk_constraint = mo.rowid";
+ $sql.= " WHERE m.menu_handler in('".$this->menu_handler."','all')";
+ if ($type_user == 0) $sql.= " AND m.user in (0,2)";
+ if ($type_user == 1) $sql.= " AND m.user in (1,2)";
+ // If type_user == 2, no test requires
$sql.= " ORDER BY m.position, m.rowid";
- $res = $this->db->query($sql);
- if ($res)
+ dolibarr_syslog("Menubase::menuLeftCharger sql=".$sql);
+ $resql = $this->db->query($sql);
+ if ($resql)
{
- $num = $this->db->num_rows($res);
+ $numa = $this->db->num_rows($resql);
- $i = 1;
- while ($menu = $this->db->fetch_array($res))
+ $a = 0;
+ $b = 0;
+ $oldrowid=0;
+ while ($a < $numa)
{
- if (! empty($menu['langs'])) $langs->load($menu['langs']);
+ //$objm = $this->db->fetch_object($resql);
+ $menu = $this->db->fetch_array($resql);
- $titre = $langs->trans($menu['titre']);
- $rights = $this->verifRights($menu['right']);
- $data[] = array (
- $menu['rowid'],
- $menu['fk_menu'],
- $menu['url'],
- $titre,
- $rights,
- $menu['target'],
- $menu['leftmenu']
- );
- $i++;
+ // Define $chaine
+ $chaine="";
+ $title = $langs->trans($menu['titre']);
+ if (! eregi('\(dotnoloadlang\)$',$title))
+ {
+ if (! empty($menu['langs'])) $langs->load($menu['langs']);
+ }
+ else
+ {
+ $title=eregi_replace('\(dotnoloadlang\)$','',$title);
+ }
+ if (eregi("/",$title))
+ {
+ $tab_titre = explode("/",$title);
+ $chaine = $langs->trans($tab_titre[0])."/".$langs->trans($tab_titre[1]);
+ }
+ else
+ {
+ $chaine = $langs->trans($title);
+ }
+
+ // Define $right
+ $perms = true;
+ if ($menu['perms'])
+ {
+ //print "verifCond rowid=".$menu['rowid']." ".$menu['right']."
\n";
+ $perms = $this->verifCond($menu['perms']);
+ }
+
+ // Define $constraint
+ $constraint = true;
+ if ($menu['action'])
+ {
+ $constraint = $this->verifCond($menu['action']);
+ }
+
+ if ($menu['rowid'] != $oldrowid && $oldrowid) $b++; // Break on new entry
+ $oldrowid=$menu['rowid'];
+ $tabMenu[$b][0] = $menu['rowid'];
+ $tabMenu[$b][1] = $menu['fk_menu'];
+ $tabMenu[$b][2] = $menu['url'];
+ $tabMenu[$b][3] = $chaine;
+// $tabMenu[$b][4] = $perms;
+ $tabMenu[$b][5] = $menu['target'];
+ $tabMenu[$b][6] = $menu['leftmenu'];
+ if (! isset($tabMenu[$b][4])) $tabMenu[$b][4] = $perms;
+ else $tabMenu[$b][4] = ($tabMenu[$b][4] && $perms);
+ if (! isset($tabMenu[$b][7])) $tabMenu[$b][7] = $constraint;
+ else $tabMenu[$b][7] = ($tabMenu[$b][7] && $constraint);
+
+ $a++;
}
+ $this->db->free($resql);
}
else
{
dolibarr_print_error($this->db);
}
- $this->recur($data, $menutopid, 1);
+
+ // Get menutopid
+ $sql = "SELECT m.rowid, m.titre, m.type";
+ $sql.= " FROM " . MAIN_DB_PREFIX . "menu as m";
+ $sql.= " WHERE m.mainmenu = '".$mainmenu."'";
+ $sql.= " AND m.menu_handler= '".$this->menu_handler."'";
+ $sql.= " AND type = 'top'";
+ // It should have only one response
+ $resql = $this->db->query($sql);
+ $menutop = $this->db->fetch_object($resql);
+ $menutopid=$menutop->rowid;
+ $this->db->free($resql);
+
+ // Now edit this->newmenu to add entries in data that are in parent sons
+ $this->recur($tabMenu, $menutopid, 1);
return $this->newmenu;
@@ -402,27 +463,21 @@ class Menubase
//print "xx".$pere;
$leftmenu = $this->leftmenu;
//ballayage du tableau
- for ($x = 0; $x < count($tab); $x++) {
-
+ for ($x = 0; $x < count($tab); $x++)
+ {
//si un element a pour pere : $pere
- if ($tab[$x][1] == $pere) {
-
- //on affiche le menu
-
- if ($this->verifConstraint($tab[$x][0], $tab[$x][6], $tab[$x][7]) != 0)
+ if ($tab[$x][1] == $pere)
+ {
+ if ($tab[$x][7])
{
$leftmenuConstraint = true;
if ($tab[$x][6])
{
- $leftmenuConstraint = false;
- $str = 'if(' . $tab[$x][6] . ') $leftmenuConstraint = true;';
- //print $str."
\n";
- //eval ($str);
- dol_eval($str);
+ $leftmenuConstraint = $this->verifCond($tab[$x][6]);
}
- if ($leftmenuConstraint == true)
+ if ($leftmenuConstraint)
{
$this->newmenu->add_submenu(DOL_URL_ROOT . $tab[$x][2], $tab[$x][3], $rang -1, $tab[$x][4], $tab[$x][5]);
$this->recur($tab, $tab[$x][0], $rang +1);
@@ -477,16 +532,15 @@ class Menubase
return $constraint;
}
- function verifRights($strRights) {
+ function verifCond($strRights) {
- global $user,$conf,$user;
+ global $user,$conf,$lang;
global $rights; // To export to dol_eval function
if ($strRights != "")
{
$rights = true;
-
- $tab_rights = explode(" || ", $strRights);
+ $tab_rights = explode("||", $strRights);
$i = 0;
while (($i < count($tab_rights)) && ($rights == true)) {
$str = 'if(!(' . $strRights . ')) { $rights = false; }';
@@ -534,7 +588,7 @@ class Menubase
function menuTopCharger($type_user, $mainmenu, $menu_handler)
{
global $langs, $user, $conf;
- global $rights, $constraint; // To export to dol_eval function
+ global $rights; // To export to dol_eval function
$tabMenu=array();
@@ -547,6 +601,7 @@ class Menubase
$sql.= " AND m.menu_handler in('".$menu_handler."','all')";
if ($type_user == 0) $sql.= " AND m.user in (0,2)";
if ($type_user == 1) $sql.= " AND m.user in (1,2)";
+ // If type_user == 2, no test requires
$sql.= " ORDER BY m.position";
dolibarr_syslog("Menubase::menuTopCharger sql=".$sql);
@@ -560,19 +615,11 @@ class Menubase
$oldrowid=0;
while ($a < $numa)
{
- // Init tabMenu array
$objm = $this->db->fetch_object($resql);
-
- // Define class
- $class="";
- if ($_SESSION["mainmenu"] && $_SESSION["mainmenu"] == $objm->mainmenu)
- {
- $class='id="sel"';
- }
+
+ // Define $chaine
$chaine="";
-
- // Define $chaine
- $title=$objm->titre;
+ $title=$objm->titre;
if (! eregi('\(dotnoloadlang\)$',$title))
{
if (! empty($objm->langs)) $langs->load($objm->langs);
@@ -581,7 +628,6 @@ class Menubase
{
$title=eregi_replace('\(dotnoloadlang\)$','',$title);
}
-
if (eregi("/",$title))
{
$tab_titre = explode("/",$title);
@@ -591,25 +637,26 @@ class Menubase
{
$chaine = $langs->trans($title);
}
-
+
+ // Define class
+ $class="";
+ if ($_SESSION["mainmenu"] && $_SESSION["mainmenu"] == $objm->mainmenu)
+ {
+ $class='id="sel"';
+ }
+
// Define $right
- $rights = true;
+ $perms = true;
if ($objm->perms)
{
- $rights = false;
- $str = 'if ('.$objm->perms.') { $rights = true; }';
- dol_eval($str);
- //print "Check permission for ".$objm->rowid.": ".$objm->perms.": rights=".$rights."
\n";
+ $perms = $this->verifCond($objm->perms);
}
// Define $constraint
$constraint = true;
if ($objm->action)
{
- $constraint = false;
- $strconstraint = 'if (' . $objm->action . ') { $constraint = true; }';
- dol_eval($strconstraint);
- //print "Check enable constraint for ".$objm->rowid.": ".$objm->action.": constraint=".$constraint."
\n";
+ $constraint = $this->verifCond($objm->action);
}
if ($objm->rowid != $oldrowid && $oldrowid) $b++; // Break on new entry
@@ -621,8 +668,8 @@ class Menubase
$tabMenu[$b]['url'] = $objm->url;
$tabMenu[$b]['atarget'] = $this->atarget;
$tabMenu[$b]['class'] = $class;
- if (! isset($tabMenu[$b]['right'])) $tabMenu[$b]['right'] = $rights;
- else $tabMenu[$b]['right'] = ($tabMenu[$b]['right'] && $rights);
+ if (! isset($tabMenu[$b]['right'])) $tabMenu[$b]['right'] = $perms;
+ else $tabMenu[$b]['right'] = ($tabMenu[$b]['right'] && $perms);
if (! isset($tabMenu[$b]['enabled'])) $tabMenu[$b]['enabled'] = $constraint;
else $tabMenu[$b]['enabled'] = ($tabMenu[$b]['enabled'] && $constraint);
@@ -650,7 +697,8 @@ function dol_eval($s)
{
// Only global variables can be changed by eval function and returned to caller
global $langs, $user, $conf;
- global $leftmenu, $leftmenuConstraint, $constraint, $rights;
+ global $rights;
+ global $leftmenu, $leftmenuConstraint;
// \todo
// Warning. We must add code to exclude test if it contains = (affectation) that is not == (compare)
diff --git a/htdocs/includes/menus/barre_left/auguria_backoffice.php b/htdocs/includes/menus/barre_left/auguria_backoffice.php
index f127a920623..c89505b6e46 100644
--- a/htdocs/includes/menus/barre_left/auguria_backoffice.php
+++ b/htdocs/includes/menus/barre_left/auguria_backoffice.php
@@ -113,7 +113,7 @@ class MenuLeft {
{
- $this->newmenu = $this->menuArbo->menuCharger($mainmenu, $this->newmenu,0,$this->leftmenu);
+ $this->newmenu = $this->menuArbo->menuLeftCharger($this->newmenu,$mainmenu,$this->leftmenu,0);
/*
* Menu AUTRES (Pour les menus du haut qui ne serait pas gérés)
diff --git a/htdocs/includes/menus/barre_left/auguria_frontoffice.php b/htdocs/includes/menus/barre_left/auguria_frontoffice.php
index ddfd2eef63f..46c2beedb1e 100644
--- a/htdocs/includes/menus/barre_left/auguria_frontoffice.php
+++ b/htdocs/includes/menus/barre_left/auguria_frontoffice.php
@@ -112,7 +112,7 @@ class MenuLeft {
if ($mainmenu)
{
- $this->newmenu = $this->menuArbo->menuCharger($mainmenu, $this->newmenu,1,$this->leftmenu);
+ $this->newmenu = $this->menuArbo->menuLeftCharger($this->newmenu,$mainmenu,$this->leftmenu,1);
/*
* Menu AUTRES (Pour les menus du haut qui ne serait pas g�r�s)
@@ -288,32 +288,6 @@ class MenuLeft {
return $constraint;
}
-
- function verifRights($strRights)
- {
-
- global $user;
-
- if ($strRights != "")
- {
- $rights = true;
-
- $tab_rights = explode(" || ",$strRights);
- $i = 0;
- while(($i < count($tab_rights)) && ($rights == true))
- {
- $str = "if(!(".$strRights.")) { \$rights = false;}";
- eval($str);
- $i++;
- }
- }
- else $rights = true;
-
-
- return $rights;
- }
-
-
}