/** * Prepares final menu html * * @param DOMElement $menu */ protected function getFinalMenuTree($menu) { if (NULL == $this->mnuPaths) { $this->mnuPaths = array(); } $sourceQueue = array(array('menu' => $menu, 'path' => 'root')); $targetQueue = array($this->root); while (count($sourceQueue) > 0) { $mnuItem = array_shift($sourceQueue); $menu = $mnuItem['menu']; $parentPath = $mnuItem['path']; $parent = array_shift($targetQueue); if ($mChs = $menu->childNodes) { foreach ($mChs as $mCh) { if ($mCh->nodeName == 'item') { if (Fox::getHelper('admin/acl')->isAllowed($mCh->getAttribute('action'))) { $node = Uni_Data_XDOMDocument::createNode('item', array('action' => $mCh->getAttribute('action'), 'order' => ($order = $mCh->getAttribute('order')) ? $order : '0'), $this->finalMenuTree); $node->appendChild($this->finalMenuTree->createTextNode($mCh->nodeValue)); $parent->appendChild($node); } } else { if ($mCh->nodeName == 'menu') { $label = $mCh->getAttribute('label'); $menuPath = $parentPath . '/' . str_replace('/', '_', $label); if (isset($this->mnuPaths[$menuPath])) { $item = $this->mnuPaths[$menuPath]; } else { $item = Uni_Data_XDOMDocument::createNode('menu', array('label' => $label, 'order' => ($order = $mCh->getAttribute('order')) ? $order : '0'), $this->finalMenuTree); $parent->appendChild($item); $this->mnuPaths[$menuPath] = $item; } $targetQueue[] = $item; $sourceQueue[] = array('menu' => $mCh, 'path' => $menuPath); } } } } } }
/** * Get menu html * * @param string $key Menu group key * @return string */ public function getMenu($key) { $menuHTML = ''; $cacheSettings = Uni_Core_CacheManager::loadCacheSettings(); $isCacheEnabled = isset($cacheSettings[Fox_Core_Model_Cache::CACHE_CODE_LAYOUT]) ? $cacheSettings[Fox_Core_Model_Cache::CACHE_CODE_LAYOUT] : FALSE; $package = Fox::getPreference(Uni_Controller_Action::MODE_ADMIN . '/package'); $theme = Fox::getPreference(Uni_Controller_Action::MODE_ADMIN . '/theme'); $cacheMenuBasePath = CACHE_DIR . DIRECTORY_SEPARATOR . Fox_Core_Model_Cache::CACHE_CODE_LAYOUT . DIRECTORY_SEPARATOR . Uni_Controller_Action::MODE_WEB . DIRECTORY_SEPARATOR . $package . DIRECTORY_SEPARATOR . $theme . DIRECTORY_SEPARATOR . self::CACHE_MENU_FOLDER; file_exists($cacheMenuBasePath) && is_dir($cacheMenuBasePath) || mkdir($cacheMenuBasePath, 0777, TRUE); $cacheMenuPath = $cacheMenuBasePath . DIRECTORY_SEPARATOR . $key . '.menu'; if ($isCacheEnabled && file_exists($cacheMenuPath)) { $cacheMenuDoc = new DOMDocument(); $cacheMenuDoc->loadHTMLFile($cacheMenuPath); $menuHTML = $cacheMenuDoc->saveXML(); unset($cacheMenuDoc); } else { $menuGroupModel = Fox::getModel('navigation/menugroup'); $menuGroupModel->load($key, 'key'); if ($menuGroupModel->getId() && $menuGroupModel->getStatus() == Fox_Navigation_Model_Menugroup::STATUS_ENABLED) { $menuModel = Fox::getModel('navigation/menu'); $menuList = $menuModel->getMenuItemsByGroup($key); $mnuDoc = new DOMDocument(); $mnuDoc->formatOutput = true; $mnuRoot = NULL; if (count($menuList)) { $mnuRoot = Uni_Data_XDOMDocument::createNode(self::ROOT_TAG, array('class' => 'menu_container'), $mnuDoc); $mnuDoc->appendChild($mnuRoot); foreach ($menuList as $menu) { $node = Uni_Data_XDOMDocument::createNode(self::LEAF_TAG, array('class' => 'menu_nav' . ($menu['style_class'] ? ' ' . $menu['style_class'] : '')), $mnuDoc); if (strpos($menu['link'], 'http://', 0) === 0 || strpos($menu['link'], 'https://', 0) === 0) { $link = $menu['link']; } else { $link = Fox::getUrl($menu['link']); } $link = Uni_Data_XDOMDocument::createNode('a', array('href' => $link, 'target' => $menu['open_window'], 'class' => $menu['style_class']), $mnuDoc); $link->appendChild($mnuDoc->createTextNode($menu['title'])); $node->appendChild($link); $mnuRoot->appendChild($node); } } if (isset($mnuDoc)) { $menuHTML = $mnuDoc->saveXML($mnuRoot); if ($isCacheEnabled) { $mnuDoc->saveHTMLFile($cacheMenuPath); @chmod($cacheMenuPath, 0777); } } unset($mnuDoc); } } return $menuHTML; }
/** * Prepare package xml * * @return bool */ protected function preparePackage() { $pkgXml = $this->getPackageXml(); /* generating package nodes */ $extInfo = Uni_Data_XDOMDocument::createNode(self::PACKAGE_ROOT_ELEMENT, array(), $pkgXml); $name = Uni_Data_XDOMDocument::createNode(self::PACKAGE_NAME_ELEMENT, array(), $pkgXml); $version = Uni_Data_XDOMDocument::createNode(self::PACKAGE_VERSION_ELEMENT, array(), $pkgXml); $description = Uni_Data_XDOMDocument::createNode(self::PACKAGE_DESCRIPTION_ELEMENT, array(), $pkgXml); $summary = Uni_Data_XDOMDocument::createNode(self::PACKAGE_SUMMARY_ELEMENT, array(), $pkgXml); $license = Uni_Data_XDOMDocument::createNode(self::PACKAGE_LICENSE_ELEMENT, array(), $pkgXml); $releaseNote = Uni_Data_XDOMDocument::createNode(self::PACKAGE_RELEASE_NOTE_ELEMENT, array(), $pkgXml); $stability = Uni_Data_XDOMDocument::createNode(self::PACKAGE_STABILITY_ELEMENT, array(), $pkgXml); $date = Uni_Data_XDOMDocument::createNode(self::PACKAGE_DATE_ELEMENT, array(), $pkgXml); $name->appendChild($pkgXml->createTextNode($this->getName())); $version->appendChild($pkgXml->createTextNode($this->getVersion())); $summary->appendChild($pkgXml->createTextNode($this->getSummary())); $description->appendChild($pkgXml->createTextNode($this->getDescription())); $license->appendChild($pkgXml->createTextNode($this->getLicense())); if ($this->getLicenseUrl()) { $license->setAttribute("url", $this->getLicenseUrl()); } $releaseNote->appendChild($pkgXml->createTextNode($this->getReleaseNote())); if ($this->getStability()) { $stability->appendChild($pkgXml->createTextNode(Fox::getModel("extensionmanager/package/state")->getOptionText($this->getStability()))); } $date->appendChild($pkgXml->createTextNode(Fox_Core_Model_Date::getCurrentDate('Y-m-d H:i:s'))); $nodes = array($name, $version, $summary, $description, $license, $releaseNote, $stability, $date); foreach ($nodes as $node) { $extInfo->appendChild($node); } $pkgXml->appendChild($extInfo); if ($this->getProviders()) { $this->_prepareProviders(); } if ($this->getContentTreeData()) { $this->_prepareContentsTree(); } else { throw new Exception("Unknown contents"); } return true; }
/** * @return string the XML, or false if an error occurred */ function getMenuMarkup() { $menuQueue = array(); $menuTree = new Uni_Data_XDOMDocument(); $root = Uni_Data_XDOMDocument::createNode('div', array('id' => 'setting-menu', 'class' => 'accordion'), $menuTree); $xPath = new DOMXPath($this->finalMenuTree); $menus = $xPath->query('/settings/menu'); $menus = $this->getSortedNodes($menus); foreach ($menus as $menu) { $h3 = Uni_Data_XDOMDocument::createNode('h3', array('class' => 'accordion-header'), $menuTree); $a = Uni_Data_XDOMDocument::createNode('a', array('href' => '#'), $menuTree); $a->appendChild($menuTree->createTextNode($menu->getAttribute('label'))); $h3->appendChild($a); $div = Uni_Data_XDOMDocument::createNode('div', array('class' => 'accordion-content'), $menuTree); $ul = Uni_Data_XDOMDocument::createNode('ul', NULL, $menuTree); $div->appendChild($ul); $root->appendChild($h3); $root->appendChild($div); $menuQueue[$menu->getAttribute('name')] = $ul; } $items = $xPath->query('/settings/item'); $items = $this->getSortedNodes($items); foreach ($items as $item) { $li = Uni_Data_XDOMDocument::createNode('li', NULL, $menuTree); $a = Uni_Data_XDOMDocument::createNode('a', array('href' => Fox::getUrl('admin/system_setting/edit', array('item' => $item->getAttribute('name'), 'lbl' => urlencode($item->getAttribute('label'))))), $menuTree); $a->appendChild($menuTree->createTextNode($item->getAttribute('label'))); $li->appendChild($a); if ($parent = $menuQueue[$item->getAttribute('menu')]) { $parent->appendChild($li); } } return $menuTree->saveXML($root); }
/** * Constructs the resources XML and Dumps tree back into a string * * @param int $roleId * @param int $parentId * @return string the XML, or false if an error occurred */ public function getTreeData($roleId, $parentId = 0) { $catData = array(); $model = Fox::getModel('admin/role/resource'); $roleModel = Fox::getModel('admin/role'); $roleModel->load($roleId); $roleResources = explode(',', $roleModel->getResourceIds()); $sourceNodes[] = array('id' => $parentId); $mnuDoc = new DOMDocument(); $mnuRoot = Uni_Data_XDOMDocument::createNode('root', array(), $mnuDoc); $mnuDoc->appendChild($mnuRoot); while (count($sourceNodes) > 0) { $parentData = array_pop($sourceNodes); $parentId = $parentData['id']; $rootNodes = $this->getCollection("parent_id={$parentId}", '*', 'sort_order ASC'); foreach ($rootNodes as $rootNode) { $itemNode = Uni_Data_XDOMDocument::createNode('item', array('id' => $rootNode['access_all'] == 1 ? $rootNode['resource_ids'] : 'cat_' . $rootNode['id'], 'parent_id' => isset($parentData['treeId']) ? $parentData['treeId'] : 0, 'rel' => 'resource_category', 'state' => 'open'), $mnuDoc); $contentNode = Uni_Data_XDOMDocument::createNode('content', array(), $mnuDoc); $dataNode = Uni_Data_XDOMDocument::createNode('name', array(), $mnuDoc); $dataNode->appendChild($mnuDoc->createTextNode($rootNode['name'])); $contentNode->appendChild($dataNode); $itemNode->appendChild($contentNode); $mnuRoot->appendChild($itemNode); if ($rootNode['resource_ids']) { $resourceCollection = $model->getCollection('id IN(' . $rootNode['resource_ids'] . ') AND display_in_tree=1', '*', 'sort_order ASC'); foreach ($resourceCollection as $resource) { $itemNode = Uni_Data_XDOMDocument::createNode('item', array('id' => $resource['id'], 'rel' => 'resource', 'parent_id' => $rootNode['access_all'] == 1 ? $rootNode['resource_ids'] : 'cat_' . $rootNode['id'], 'state' => 'open'), $mnuDoc); $contentNode = Uni_Data_XDOMDocument::createNode('content', array(), $mnuDoc); $dataNode = Uni_Data_XDOMDocument::createNode('name', array(), $mnuDoc); $dataNode->appendChild($mnuDoc->createCDATASection($resource['resource_path'])); $contentNode->appendChild($dataNode); $itemNode->appendChild($contentNode); $mnuRoot->appendChild($itemNode); } } array_push($sourceNodes, array('id' => $rootNode['id'], 'treeId' => $rootNode['access_all'] == 1 ? $rootNode['resource_ids'] : 'cat_' . $rootNode['id'])); } } return $mnuDoc->saveXML($mnuRoot); }