2^(1-1) = 1 * - user level id = 2 -> 2^(2-1) = 2 * - user level id = 3 -> 2^(3-1) = 4 * - user level id = 4 -> 2^(4-1) = 8 * - active: it is possible to disable particular menu item, then it will not be displayed. * - order: menu item order in the particular set. * * * 4. Display Menu. * Use the following sample code to display menu: * @code * $oMenu = BxTemplMenu::getObjectInstance('sample_menu'); // 'sample_menu' is 'object' field from 'sys_objects_menu' table. * if ($oMenu) * echo $oMenu->getCode; // display menu * @endcode * * But in most cases you don't need to use above code to display menu, * menu objects are integrated into pages - there is special 'menu' page block type for it. * */ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolReplaceable { protected static $SEL_MODULE = ''; protected static $SEL_NAME = ''; protected $_bDynamicMode; protected $_sSelModule; protected $_sSelName; protected $_sObject; protected $_aObject; protected $_oQuery; protected $_oPermalinks; protected $_aMarkers = array (); /** * Constructor * @param $aObject array of menu options */ protected function __construct($aObject) { parent::__construct(); $this->_bDynamicMode = false; $this->_sObject = isset($aObject['object']) ? $aObject['object'] : 'bx-menu-obj-' . time() . rand(0, PHP_INT_MAX); $this->_aObject = $aObject; $this->_oQuery = new BxDolMenuQuery($this->_aObject); $this->_oPermalinks = BxDolPermalinks::getInstance(); if (isLogged()) { $oProfile = BxDolProfile::getInstance(); if ($oProfile) { $this->addMarkers(array( 'member_id' => $oProfile->id(), 'member_display_name' => $oProfile->getDisplayName(), 'member_url' => $oProfile->getUrl(), )); } } } /** * Get menu object instance by object name * @param $sObject object name * @return object instance or false on error */ static public function getObjectInstance($sObject, $oTemplate = false) { if (isset($GLOBALS['bxDolClasses']['BxDolMenu!'.$sObject])) return $GLOBALS['bxDolClasses']['BxDolMenu!'.$sObject]; $aObject = BxDolMenuQuery::getMenuObject($sObject); if (!$aObject || !is_array($aObject) || (int)$aObject['active'] == 0) return false; $sClass = 'BxTemplMenu'; if (!empty($aObject['override_class_name'])) { $sClass = $aObject['override_class_name']; if (!empty($aObject['override_class_file'])) require_once(BX_DIRECTORY_PATH_ROOT . $aObject['override_class_file']); } $o = new $sClass($aObject, $oTemplate); return ($GLOBALS['bxDolClasses']['BxDolMenu!'.$sObject] = $o); } /** * Set selected menu item globally. * @param $sModule menu item module to set as selected * @param $sName menu item name to set as selected */ static public function setSelectedGlobal ($sModule, $sName) { self::$SEL_MODULE = $sModule; self::$SEL_NAME = $sName; } /** * Process menu triggers. * Menu triggers allow to automatically add menu items to modules with no different if dependant module was install before or after the module menu item belongs to. * For example module "Notes" adds menu items to all profiles modules (Persons, Organizations, etc) * with no difference if persons module was installed before or after "Notes" module was installed. * @param $sMenuTriggerName trigger name to process, usually specified in module installer class - @see BxBaseModGeneralInstaller * @return always true, always success */ static public function processMenuTrigger ($sMenuTriggerName) { // get list of active modules $aModules = BxDolModuleQuery::getInstance()->getModulesBy(array( 'type' => 'modules', 'active' => 1, )); // get list of menu triggers $aMenuItems = BxDolMenuQuery::getMenuTriggers($sMenuTriggerName); // check each menu item trigger for all modules foreach ($aMenuItems as $aMenuItem) { foreach ($aModules as $aModule) { if (!BxDolRequest::serviceExists($aModule['name'], 'get_menu_set_name_for_menu_trigger')) continue; if (!($sMenuSet = BxDolService::call($aModule['name'], 'get_menu_set_name_for_menu_trigger', array($sMenuTriggerName)))) continue; $aMenuItem['set_name'] = $sMenuSet; BxDolMenuQuery::addMenuItemToSet($aMenuItem); } } return true; } /** * Check if the menu is visible. The menu is visible if at least one menu item is visible. * @return boolean */ public function isVisible() { if((int)$this->_aObject['active'] == 0) return false; if(!isset($this->_aObject['menu_items'])) $this->_aObject['menu_items'] = $this->_oQuery->getMenuItems(); $bVisible = false; foreach ($this->_aObject['menu_items'] as $a) { if((isset($a['active']) && !$a['active']) || (isset($a['visible_for_levels']) && !$this->_isVisible($a))) continue; $bVisible = true; break; } return $bVisible; } /** * Set selected menu item for current menu object only. * @param $sModule menu item module to set as selected * @param $sName menu item name to set as selected */ public function setSelected ($sModule, $sName) { $this->_sSelModule = $sModule; $this->_sSelName = $sName; } public function setDynamicMode ($bDynamicMode) { $this->_bDynamicMode = $bDynamicMode; } /** * Add replace markers. * @param $a array of markers as key => value * @return true on success or false on error */ public function addMarkers ($a) { if (empty($a) || !is_array($a)) return false; $this->_aMarkers = array_merge ($this->_aMarkers, $a); return true; } /** * Remove marker * @param $s marker key */ public function removeMarker ($s) { unset($this->_aMarkers[$s]); } /** * Check if menu items is selected. * @param $a menu item array * @return boolean */ protected function _isSelected ($a) { if ($this->_sSelModule || $this->_sSelName) return (!isset($a['module']) || $a['module'] == $this->_sSelModule) && (isset($a['name']) && $a['name'] == $this->_sSelName) ? true : false; return (!isset($a['module']) || $a['module'] == self::$SEL_MODULE) && (isset($a['name']) && $a['name'] == self::$SEL_NAME) ? true : false; } /** * Check if menu items is visible. * @param $a menu item array * @return boolean */ protected function _isVisible ($a) { return BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']); } /** * Replace provided markers in menu item array, curently markers are replaced in title, link and onclick fields. * @param $a menu item array * @return array where markes are replaced with real values */ protected function _replaceMarkers ($a) { if (empty($this->_aMarkers)) return $a; $aReplacebleFields = array ('title', 'link', 'onclick'); foreach ($aReplacebleFields as $sField) if (isset($a[$sField])) $a[$sField] = bx_replace_markers($a[$sField], $this->_aMarkers); return $a; } } /** @} */