/**
  * 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);
 }