1<?php 2/* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net> 3 * Copyright (C) 2007-2009 Regis Houssin <regis.houssin@inodbox.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <https://www.gnu.org/licenses/>. 17 */ 18 19/** 20 * \file htdocs/core/menus/standard/eldy_menu.php 21 * \brief Menu eldy manager 22 */ 23 24 25/** 26 * Class to manage menu Eldy 27 */ 28class MenuManager 29{ 30 /** 31 * @var DoliDB Database handler. 32 */ 33 public $db; 34 35 public $type_user; // Put 0 for internal users, 1 for external users 36 public $atarget = ""; // To store default target to use onto links 37 public $name = "eldy"; 38 39 public $menu_array; 40 public $menu_array_after; 41 42 public $tabMenu; 43 44 45 /** 46 * Constructor 47 * 48 * @param DoliDB $db Database handler 49 * @param int $type_user Type of user 50 */ 51 public function __construct($db, $type_user) 52 { 53 $this->type_user = $type_user; 54 $this->db = $db; 55 } 56 57 58 /** 59 * Load this->tabMenu 60 * 61 * @param string $forcemainmenu To force mainmenu to load 62 * @param string $forceleftmenu To force leftmenu to load 63 * @return void 64 */ 65 public function loadMenu($forcemainmenu = '', $forceleftmenu = '') 66 { 67 global $conf, $user, $langs; 68 69 // We save into session the main menu selected 70 if (GETPOSTISSET("mainmenu")) { 71 $_SESSION["mainmenu"] = GETPOST("mainmenu", 'aZ09'); 72 } 73 if (GETPOSTISSET("idmenu")) { 74 $_SESSION["idmenu"] = GETPOST("idmenu", 'int'); 75 } 76 77 // Read now mainmenu and leftmenu that define which menu to show 78 if (GETPOSTISSET("mainmenu")) { 79 // On sauve en session le menu principal choisi 80 $mainmenu = GETPOST("mainmenu", 'aZ09'); 81 $_SESSION["mainmenu"] = $mainmenu; 82 $_SESSION["leftmenuopened"] = ""; 83 } else { 84 // On va le chercher en session si non defini par le lien 85 $mainmenu = isset($_SESSION["mainmenu"]) ? $_SESSION["mainmenu"] : ''; 86 } 87 if (!empty($forcemainmenu)) { 88 $mainmenu = $forcemainmenu; 89 } 90 91 if (GETPOSTISSET("leftmenu")) { 92 // On sauve en session le menu principal choisi 93 $leftmenu = GETPOST("leftmenu", 'aZ09'); 94 $_SESSION["leftmenu"] = $leftmenu; 95 96 if ($_SESSION["leftmenuopened"] == $leftmenu) { // To collapse 97 //$leftmenu=""; 98 $_SESSION["leftmenuopened"] = ""; 99 } else { 100 $_SESSION["leftmenuopened"] = $leftmenu; 101 } 102 } else { 103 // On va le chercher en session si non defini par le lien 104 $leftmenu = isset($_SESSION["leftmenu"]) ? $_SESSION["leftmenu"] : ''; 105 } 106 if (!empty($forceleftmenu)) { 107 $leftmenu = $forceleftmenu; 108 } 109 110 require_once DOL_DOCUMENT_ROOT.'/core/class/menubase.class.php'; 111 $tabMenu = array(); 112 $menuArbo = new Menubase($this->db, 'eldy'); 113 $menuArbo->menuLoad($mainmenu, $leftmenu, $this->type_user, 'eldy', $tabMenu); 114 $this->tabMenu = $tabMenu; 115 //var_dump($tabMenu); 116 117 //if ($forcemainmenu == 'all') { var_dump($this->tabMenu); exit; } 118 } 119 120 121 /** 122 * Show menu. 123 * Menu defined in sql tables were stored into $this->tabMenu BEFORE this is called. 124 * 125 * @param string $mode 'top', 'topnb', 'left', 'jmobile' (used to get full xml ul/li menu) 126 * @param array $moredata An array with more data to output 127 * @return int 0 or nb of top menu entries if $mode = 'topnb' 128 */ 129 public function showmenu($mode, $moredata = null) 130 { 131 global $conf, $langs, $user; 132 133 //var_dump($this->tabMenu); 134 135 require_once DOL_DOCUMENT_ROOT.'/core/menus/standard/eldy.lib.php'; 136 137 if ($this->type_user == 1) { 138 $conf->global->MAIN_SEARCHFORM_SOCIETE_DISABLED = 1; 139 $conf->global->MAIN_SEARCHFORM_CONTACT_DISABLED = 1; 140 } 141 142 require_once DOL_DOCUMENT_ROOT.'/core/class/menu.class.php'; 143 $this->menu = new Menu(); 144 145 if (empty($conf->global->MAIN_MENU_INVERT)) { 146 if ($mode == 'top') { 147 print_eldy_menu($this->db, $this->atarget, $this->type_user, $this->tabMenu, $this->menu, 0, $mode); 148 } 149 if ($mode == 'left') { 150 print_left_eldy_menu($this->db, $this->menu_array, $this->menu_array_after, $this->tabMenu, $this->menu, 0, '', '', $moredata, $this->type_user); 151 } 152 } else { 153 $conf->global->MAIN_SHOW_LOGO = 0; 154 if ($mode == 'top') { 155 print_left_eldy_menu($this->db, $this->menu_array, $this->menu_array_after, $this->tabMenu, $this->menu, 0, '', '', $moredata, $this->type_user); 156 } 157 if ($mode == 'left') { 158 print_eldy_menu($this->db, $this->atarget, $this->type_user, $this->tabMenu, $this->menu, 0, $mode); 159 } 160 } 161 if ($mode == 'topnb') { 162 print_eldy_menu($this->db, $this->atarget, $this->type_user, $this->tabMenu, $this->menu, 1, $mode); // no output 163 return $this->menu->getNbOfVisibleMenuEntries(); 164 } 165 166 if ($mode == 'jmobile') { // Used to get menu in xml ul/li 167 print_eldy_menu($this->db, $this->atarget, $this->type_user, $this->tabMenu, $this->menu, 1, $mode); // Fill this->menu that is empty with top menu 168 169 // $this->menu->liste is top menu 170 //var_dump($this->menu->liste);exit; 171 $lastlevel = array(); 172 print '<!-- Generate menu list from menu handler '.$this->name.' -->'."\n"; 173 foreach ($this->menu->liste as $key => $val) { // $val['url','titre','level','enabled'=0|1|2,'target','mainmenu','leftmenu' 174 print '<ul class="ulmenu" data-inset="true">'; 175 print '<li class="lilevel0">'; 176 177 if ($val['enabled'] == 1) { 178 $substitarray = array('__LOGIN__' => $user->login, '__USER_ID__' => $user->id, '__USER_SUPERVISOR_ID__' => $user->fk_user); 179 $substitarray['__USERID__'] = $user->id; // For backward compatibility 180 $val['url'] = make_substitutions($val['url'], $substitarray); 181 182 $relurl = dol_buildpath($val['url'], 1); 183 $canonurl = preg_replace('/\?.*$/', '', $val['url']); 184 185 print '<a class="alilevel0" href="#">'; 186 187 // Add font-awesome 188 if ($val['level'] == 0 && !empty($val['prefix'])) { 189 print $val['prefix']; 190 } 191 192 print $val['titre']; 193 print '</a>'."\n"; 194 195 // Search submenu fot this mainmenu entry 196 $tmpmainmenu = $val['mainmenu']; 197 $tmpleftmenu = 'all'; 198 $submenu = new Menu(); 199 print_left_eldy_menu($this->db, $this->menu_array, $this->menu_array_after, $this->tabMenu, $submenu, 1, $tmpmainmenu, $tmpleftmenu, null, $this->type_user); // Fill $submenu (example with tmpmainmenu='home' tmpleftmenu='all', return left menu tree of Home) 200 // Note: $submenu contains menu entry with substitution not yet done 201 //if ($tmpmainmenu.'-'.$tmpleftmenu == 'home-all') { var_dump($submenu); exit; } 202 //if ($tmpmainmenu=='accountancy') { var_dump($submenu->liste); exit; } 203 $nexturl = dol_buildpath($submenu->liste[0]['url'], 1); 204 205 $canonrelurl = preg_replace('/\?.*$/', '', $relurl); 206 $canonnexturl = preg_replace('/\?.*$/', '', $nexturl); 207 //var_dump($canonrelurl); 208 //var_dump($canonnexturl); 209 210 print '<ul>'."\n"; 211 if (($canonrelurl != $canonnexturl && !in_array($val['mainmenu'], array('tools'))) 212 || (strpos($canonrelurl, '/product/index.php') !== false || strpos($canonrelurl, '/compta/bank/list.php') !== false)) { 213 // We add sub entry 214 print str_pad('', 1).'<li class="lilevel1 ui-btn-icon-right ui-btn">'; // ui-btn to highlight on clic 215 print '<a href="'.$relurl.'">'; 216 if ($langs->trans(ucfirst($val['mainmenu'])."Dashboard") == ucfirst($val['mainmenu'])."Dashboard") { // No translation 217 if (in_array($val['mainmenu'], array('cashdesk', 'externalsite', 'website', 'collab', 'takepos'))) { 218 print $langs->trans("Access"); 219 } else { 220 print $langs->trans("Dashboard"); 221 } 222 } else { 223 print $langs->trans(ucfirst($val['mainmenu'])."Dashboard"); 224 } 225 print '</a>'; 226 print '</li>'."\n"; 227 } 228 229 /* 230 if ($val['level'] == 0) { 231 if ($val['enabled']) { 232 $lastlevel[0] = 'enabled'; 233 } elseif ($showmenu) { 234 // Not enabled but visible (so greyed) 235 $lastlevel[0] = 'greyed'; 236 } else { 237 $lastlevel[0] = 'hidden'; 238 } 239 } 240 */ 241 242 $lastlevel2 = array(); 243 foreach ($submenu->liste as $key2 => $val2) { // $val['url','titre','level','enabled'=0|1|2,'target','mainmenu','leftmenu' 244 $showmenu = true; 245 if (!empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED) && empty($val2['enabled'])) { 246 $showmenu = false; 247 } 248 249 // If at least one parent is not enabled, we do not show any menu of all children 250 if ($val2['level'] > 0) { 251 $levelcursor = $val2['level'] - 1; 252 while ($levelcursor >= 0) { 253 if ($lastlevel2[$levelcursor] != 'enabled') { 254 $showmenu = false; 255 } 256 $levelcursor--; 257 } 258 } 259 260 if ($showmenu) { // Visible (option to hide when not allowed is off or allowed) 261 $substitarray = array('__LOGIN__' => $user->login, '__USER_ID__' => $user->id, '__USER_SUPERVISOR_ID__' => $user->fk_user); 262 $substitarray['__USERID__'] = $user->id; // For backward compatibility 263 $val2['url'] = make_substitutions($val2['url'], $substitarray); // Make also substitution of __(XXX)__ and __[XXX]__ 264 265 if (!preg_match("/^(http:\/\/|https:\/\/)/i", $val2['url'])) { 266 $relurl2 = dol_buildpath($val2['url'], 1); 267 } else { 268 $relurl2 = $val2['url']; 269 } 270 $canonurl2 = preg_replace('/\?.*$/', '', $val2['url']); 271 //var_dump($val2['url'].' - '.$canonurl2.' - '.$val2['level']); 272 if (in_array($canonurl2, array('/admin/index.php', '/admin/tools/index.php', '/core/tools.php'))) { 273 $relurl2 = ''; 274 } 275 276 $disabled = ''; 277 if (!$val2['enabled']) { 278 $disabled = " vsmenudisabled"; 279 } 280 281 print str_pad('', $val2['level'] + 1); 282 print '<li class="lilevel'.($val2['level'] + 1); 283 if ($val2['level'] == 0) { 284 print ' ui-btn-icon-right ui-btn'; // ui-btn to highlight on clic 285 } 286 print $disabled.'">'; // ui-btn to highlight on clic 287 if ($relurl2) { 288 if ($val2['enabled']) { // Allowed 289 print '<a href="'.$relurl2.'"'; 290 //print ' data-ajax="false"'; 291 print '>'; 292 $lastlevel2[$val2['level']] = 'enabled'; 293 } else // Not allowed but visible (greyed) 294 { 295 print '<a href="#" class="vsmenudisabled">'; 296 $lastlevel2[$val2['level']] = 'greyed'; 297 } 298 } else { 299 if ($val2['enabled']) { // Allowed 300 $lastlevel2[$val2['level']] = 'enabled'; 301 } else { 302 $lastlevel2[$val2['level']] = 'greyed'; 303 } 304 } 305 print $val2['titre']; 306 if ($relurl2) { 307 if ($val2['enabled']) { // Allowed 308 print '</a>'; 309 } else { 310 print '</a>'; 311 } 312 } 313 print '</li>'."\n"; 314 } 315 } 316 //var_dump($submenu); 317 print '</ul>'; 318 } 319 if ($val['enabled'] == 2) { 320 print '<font class="vsmenudisabled">'; 321 // Add font-awesome 322 if ($val['level'] == 0 && !empty($val['prefix'])) { 323 print $val['prefix']; 324 } 325 326 print $val['titre']; 327 print '</font>'; 328 } 329 print '</li>'; 330 print '</ul>'."\n"; 331 } 332 } 333 334 unset($this->menu); 335 336 //print 'xx'.$mode; 337 return 0; 338 } 339} 340