Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/menu.xml.php
<?php
/**
* @version        $Id: menu.xml.php 2284 2019-05-12 16:39:13Z IOS $
* @package        Elxis
* @subpackage    Menu/XML
* @copyright    Copyright (c) 2006-2019 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisXMLMenu {

    private
$elxis_menu = null;
    private
$lang = 'en';
    private
$errormsg = '';
    private
$component = '';
    private
$rootLink = '';
    private
$menuLang = 'en';
    private
$menuTitle = 'Unknown';
    private
$menu = null;
    private
$mygid = 7;
    private
$mylevel = 0;


   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct($elxis_menu) {
       
$this->elxis_menu = $elxis_menu;
       
$this->lang = eFactory::getLang()->currentLang();
       
$this->mygid = (int)eFactory::getElxis()->user()->gid;
       
$this->mylevel = (int)eFactory::getElxis()->acl()->getLevel();
    }


   
/******************************************/
    /* GENERATE ELXIS MENU FROM XML MENU FILE */
    /******************************************/
   
public function getMenu($parent_id, $component, $root_link, $expand=0, $section='frontend', $menu_name='default', $lang='') {
       
$expand = (int)$expand;
        if ((
$expand < 1) || ($expand > 2)) { return false; }
       
$this->component = $component;
        if (
$lang == '') { $lang = $this->lang; }
       
$this->menuLang = $lang;
       
$this->rootLink = $root_link;

       
$this->menu = $this->parseMenu($section, $menu_name);
        if (!
$this->menu) { return false; }

        if ((
$this->rootLink == '') || ($this->rootLink == '/') || ($this->rootLink == $this->component.':/')) {
            if (
$expand === 1) {
                return
$this->parseRootNodes($menu_name, $parent_id);
            } else {
                return
$this->parseRootAll($menu_name, $parent_id);
            }
        } else {
            if (
$expand === 1) {
                return
$this->parseNodeRootNodes($menu_name, $parent_id, $root_link);
            } else {
                return
$this->parseNodeAllNodes($menu_name, $parent_id, $root_link);
            }
        }
    }


   
/****************************/
    /* PARSE ROOT ELEMENT NODES */
    /****************************/
   
private function parseRootNodes($menu_name, $parent_id) {
        if (!isset(
$this->menu->items)) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$xml_items = $this->menu->items->children();
        if (!
$xml_items) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$items = array();
       
$n = 1;
        foreach (
$xml_items as $xml_item) {
           
$attrs = $xml_item->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
           
$title = $this->getTitleXML($xml_item, $this->menuLang);
           
$link = (string)$attrs['link'];
           
$params = $this->makeParams($attrs, $parent_id, $n, 0);
           
$idx = $this->elxis_menu->newIndex();
           
$n++;

           
$items[$idx] = $this->elxis_menu->makeItem($title, $link, $idx, $params);
            unset(
$link, $title, $idx, $params, $attrs);
        }
        return
$items;
    }


   
/*********************************/
    /* PARSE ALL ROOT ELEMENTS NODES */
    /*********************************/
   
private function parseRootAll($menu_name, $parent_id) {
        if (!isset(
$this->menu->items)) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$xml_items = $this->menu->items->children();
        if (!
$xml_items) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$items = array();
       
$n = 1;
        foreach (
$xml_items as $xml_item) {
           
$attrs = $xml_item->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
           
$title = $this->getTitleXML($xml_item, $this->menuLang);
           
$link = (string)$attrs['link'];
           
$params = $this->makeParams($attrs, $parent_id, $n, 0);
           
$idx = $this->elxis_menu->newIndex();
           
$n++;

           
$items[$idx] = $this->elxis_menu->makeItem($title, $link, $idx, $params);
            unset(
$link, $title, $params, $attrs);

            if (isset(
$xml_item->subitems) && (count($xml_item->subitems->children()) > 0)) { //1st level
               
$m = 1;
                foreach (
$xml_item->subitems->children() as $lev1node) {
                   
$attrs = $lev1node->attributes();
                    if (!
$attrs) { continue; }
                    if (!isset(
$attrs['link'])) { continue; }
                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                   
$title = $this->getTitleXML($lev1node, $this->menuLang);
                   
$link = (string)$attrs['link'];
                   
$params = $this->makeParams($attrs, $idx, $m, 0);
                   
$idx2 = $this->elxis_menu->newIndex();
                   
$items[$idx]->children[$idx2] = $this->elxis_menu->makeItem($title, $link, $idx2, $params);
                    unset(
$link, $title, $params, $attrs);                    
                   
$m++;

                    if (isset(
$lev1node->subitems) && (count($lev1node->subitems->children()) > 0)) { //2nd level
                       
$g = 1;
                        foreach (
$lev1node->subitems->children() as $lev2node) {
                           
$attrs = $lev2node->attributes();
                            if (!
$attrs) { continue; }
                            if (!isset(
$attrs['link'])) { continue; }
                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                           
$title = $this->getTitleXML($lev2node, $this->menuLang);
                           
$link = (string)$attrs['link'];
                           
$params = $this->makeParams($attrs, $idx2, $g, 0);
                           
$idx3 = $this->elxis_menu->newIndex();
                           
$items[$idx]->children[$idx2]->children[$idx3] = $this->elxis_menu->makeItem($title, $link, $idx3, $params);
                            unset(
$link, $title, $params, $attrs);                    
                           
$g++;

                            if (isset(
$lev2node->subitems) && (count($lev2node->subitems->children()) > 0)) { //3rd level
                               
$z = 1;
                                foreach (
$lev2node->subitems->children() as $lev3node) {
                                   
$attrs = $lev3node->attributes();
                                    if (!
$attrs) { continue; }
                                    if (!isset(
$attrs['link'])) { continue; }
                                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                   
$title = $this->getTitleXML($lev3node, $this->menuLang);
                                   
$link = (string)$attrs['link'];
                                   
$params = $this->makeParams($attrs, $idx3, $z, 0);
                                   
$idx4 = $this->elxis_menu->newIndex();
                                   
$items[$idx]->children[$idx2]->children[$idx3]->children[$idx4] = $this->elxis_menu->makeItem($title, $link, $idx4, $params);
                                    unset(
$link, $title, $params, $attrs);                    
                                   
$z++;

                                    if (isset(
$lev3node->subitems) && (count($lev3node->subitems->children()) > 0)) { //4th level
                                       
$v = 1;
                                        foreach (
$lev3node->subitems->children() as $lev4node) {
                                           
$attrs = $lev4node->attributes();
                                            if (!
$attrs) { continue; }
                                            if (!isset(
$attrs['link'])) { continue; }
                                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                           
$title = $this->getTitleXML($lev4node, $this->menuLang);
                                           
$link = (string)$attrs['link'];
                                           
$params = $this->makeParams($attrs, $idx4, $v, 0);
                                           
$idx5 = $this->elxis_menu->newIndex();
                                           
$items[$idx]->children[$idx2]->children[$idx3]->children[$idx4]->children[$idx5] = $this->elxis_menu->makeItem($title, $link, $idx5, $params);
                                            unset(
$link, $title, $params, $attrs);                    
                                           
$v++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return
$items;
    }


   
/*************************/
    /* PARSE NODE ROOT NODES */
    /*************************/
   
private function parseNodeRootNodes($menu_name, $parent_id, $root_link) {
        if (!isset(
$this->menu->items)) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$xml_items = $this->menu->items->children();
        if (!
$xml_items) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$node = $this->searchNode($xml_items, $root_link);
        if (
$node === null) {
           
$this->errormsg = 'Link '.$root_link.' not found in XML menu tree!';
            return
false;
        }
       
        if (!isset(
$node->subitems) || (count($node->subitems->children()) == 0)) {
            return
false;
        }

       
$items = array();
       
$n = 1;
        foreach (
$node->subitems->children() as $subnode) {
           
$attrs = $subnode->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
           
$title = $this->getTitleXML($subnode, $this->menuLang);
           
$link = (string)$attrs['link'];
           
$params = $this->makeParams($attrs, $parent_id, $n, 0);
           
$idx = $this->elxis_menu->newIndex();
           
$n++;

           
$items[$idx] = $this->elxis_menu->makeItem($title, $link, $idx, $params);
            unset(
$link, $title, $idx, $params, $attrs);
        }

        return
$items;
    }


   
/*************************/
    /* PARSE NODE ALL NODES */
    /*************************/
   
private function parseNodeAllNodes($menu_name, $parent_id, $root_link) {
        if (!isset(
$this->menu->items)) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$xml_items = $this->menu->items->children();
        if (!
$xml_items) {
           
$this->errormsg = 'Requested menu '.$menu_name.' has no menu items!';
            return
false;
        }

       
$node = $this->searchNode($xml_items, $root_link);
        if (
$node === null) {
           
$this->errormsg = 'Link '.$root_link.' not found in XML menu tree!';
            return
false;
        }

        if (!isset(
$node->subitems) || (count($node->subitems->children()) == 0)) {
            return
false;
        }

       
$items = array();
       
$n = 1;
        foreach (
$node->subitems->children() as $subnode) { //root level
           
$attrs = $subnode->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
           
$title = $this->getTitleXML($subnode, $this->menuLang);
           
$link = (string)$attrs['link'];
           
$params = $this->makeParams($attrs, $parent_id, $n, 0);
           
$idx = $this->elxis_menu->newIndex();
           
$items[$idx] = $this->elxis_menu->makeItem($title, $link, $idx, $params);
            unset(
$link, $title, $params, $attrs);
           
$n++;

            if (isset(
$subnode->subitems) && (count($subnode->subitems->children()) > 0)) { //1st level
               
$m = 1;
                foreach (
$subnode->subitems->children() as $lev1node) {
                   
$attrs = $lev1node->attributes();
                    if (!
$attrs) { continue; }
                    if (!isset(
$attrs['link'])) { continue; }
                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                   
$title = $this->getTitleXML($lev1node, $this->menuLang);
                   
$link = (string)$attrs['link'];
                   
$params = $this->makeParams($attrs, $idx, $m, 0);
                   
$idx2 = $this->elxis_menu->newIndex();
                   
$items[$idx]->children[$idx2] = $this->elxis_menu->makeItem($title, $link, $idx2, $params);
                    unset(
$link, $title, $params, $attrs);                    
                   
$m++;

                    if (isset(
$lev1node->subitems) && (count($lev1node->subitems->children()) > 0)) { //2nd level
                       
$g = 1;
                        foreach (
$lev1node->subitems->children() as $lev2node) {
                           
$attrs = $lev2node->attributes();
                            if (!
$attrs) { continue; }
                            if (!isset(
$attrs['link'])) { continue; }
                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                           
$title = $this->getTitleXML($lev2node, $this->menuLang);
                           
$link = (string)$attrs['link'];
                           
$params = $this->makeParams($attrs, $idx2, $g, 0);
                           
$idx3 = $this->elxis_menu->newIndex();
                           
$items[$idx]->children[$idx2]->children[$idx3] = $this->elxis_menu->makeItem($title, $link, $idx3, $params);
                            unset(
$link, $title, $params, $attrs);                    
                           
$g++;

                            if (isset(
$lev2node->subitems) && (count($lev2node->subitems->children()) > 0)) { //3rd level
                               
$z = 1;
                                foreach (
$lev2node->subitems->children() as $lev3node) {
                                   
$attrs = $lev3node->attributes();
                                    if (!
$attrs) { continue; }
                                    if (!isset(
$attrs['link'])) { continue; }
                                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                   
$title = $this->getTitleXML($lev3node, $this->menuLang);
                                   
$link = (string)$attrs['link'];
                                   
$params = $this->makeParams($attrs, $idx3, $z, 0);
                                   
$idx4 = $this->elxis_menu->newIndex();
                                   
$items[$idx]->children[$idx2]->children[$idx3]->children[$idx4] = $this->elxis_menu->makeItem($title, $link, $idx4, $params);
                                    unset(
$link, $title, $params, $attrs);                    
                                   
$z++;
                                }
                            }
                        }
                    }
                }
            }
        }

        return
$items;
    }


   
/*************************************/
    /* INITIAL PARSE OF AN XML MENU FILE */
    /*************************************/
   
private function parseMenu($section, $menu_name) {
       
$xmlfile = ELXIS_PATH.'/components/com_'.$this->component.'/'.$this->component.'.menu.xml';
        if (!
file_exists($xmlfile)) {
           
$this->errormsg = 'File '.$this->component.'.menu.xml not found!';
            return
false;
        }
       
libxml_use_internal_errors(true);
       
$xml = simplexml_load_file($xmlfile, 'SimpleXMLElement');
        if (!
$xml) {
            foreach (
libxml_get_errors() as $error) {
               
$this->errormsg = 'Parse XML error on file '.$this->component.'.menu.xml. Error: '.$error->message.'. Line: '.$error->line;
                break;
            }
            return
false;
        }

        if (
$xml->getName() != 'elxismenu') {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml is not a valid Elxis menu file!';
            return
false;
        }
       
$attrs = $xml->attributes();
        if (!
$attrs) {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml is not a valid Elxis menu file!';
            return
false;
        }
        if (!isset(
$attrs['component']) || ($attrs['component'] != $this->component)) {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml is not a valid Elxis menu file for component '.$this->component.'!';
            return
false;
        }
        if (!isset(
$xml->$section)) {
           
$this->errormsg = 'Component '.$this->component.' does not have menu information for '.$section.'!';
            return
false;
        }
   
        if (!isset(
$xml->$section->menu)) {
           
$this->errormsg = 'Component '.$this->component.' does not have menu information for '.$section.'!';
            return
false;
        }

       
$menu = null;
        foreach (
$xml->$section->menu as $mchild) {
           
$attrs = $mchild->attributes();
            if (
$attrs && isset($attrs['name']) && ($attrs['name'] == $menu_name)) {
               
$menu = $mchild;
                break;
            }
        }

        if (
$menu === null) {
           
$this->errormsg = 'Requested menu '.$menu_name.' is not available for '.$section.'!';
            return
false;
        }

       
$this->menuTitle = $this->getTitleXML($menu, $this->menuLang, ucfirst($this->component));
        return
$menu;
    }


   
/*****************************************************/
    /* SEARCH XML FOR GIVEN LINK AND RETURN A NODES TREE */
    /*****************************************************/
   
private function searchNode($nodes, $link) {
        foreach (
$nodes as $node) { //root level
           
$attrs = $node->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
           
$nodelink = (string)$attrs['link'];
            if (
$nodelink == $link) { return $node; }
            if (isset(
$node->subitems) && (count($node->subitems->children()) > 0)) { //1st level
               
foreach ($node->subitems->children() as $lev1node) {
                   
$attrs = $lev1node->attributes();
                    if (!
$attrs) { continue; }
                    if (!isset(
$attrs['link'])) { continue; }
                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                   
$nodelink = (string)$attrs['link'];
                    if (
$nodelink == $link) { return $lev1node; }
                    if (isset(
$lev1node->subitems) && (count($lev1node->subitems->children()) > 0)) { //2nd level
                       
foreach ($lev1node->subitems->children() as $lev2node) {
                           
$attrs = $lev2node->attributes();
                            if (!
$attrs) { continue; }
                            if (!isset(
$attrs['link'])) { continue; }
                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                           
$nodelink = (string)$attrs['link'];
                            if (
$nodelink == $link) { return $lev2node; }
                            if (isset(
$lev2node->subitems) && (count($lev2node->subitems->children()) > 0)) { //3rd level
                               
foreach ($lev2node->subitems->children() as $lev3node) {
                                   
$attrs = $lev3node->attributes();
                                    if (!
$attrs) { continue; }
                                    if (!isset(
$attrs['link'])) { continue; }
                                    if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                    if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                   
$nodelink = (string)$attrs['link'];
                                    if (
$nodelink == $link) { return $lev3node; }
                                    if (isset(
$lev3node->subitems) && (count($lev3node->subitems->children()) > 0)) { //4th level
                                       
foreach ($lev3node->subitems->children() as $lev4node) {
                                           
$attrs = $lev4node->attributes();
                                            if (!
$attrs) { continue; }
                                            if (!isset(
$attrs['link'])) { continue; }
                                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                           
$nodelink = (string)$attrs['link'];
                                            if (
$nodelink == $link) { return $lev4node; }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return
null;
    }


   
/**********************************************************/
    /* GET THE TITLE FROM AN XML MENU ITEM OR THE MENU ITSELF */
    /**********************************************************/
   
private function getTitleXML($element, $lang, $default='Unknown') {
       
$en_title = '';
        if (isset(
$element->title)) {
            foreach (
$element->title as $tchild) {
               
$attrs = $tchild->attributes();
                if (
$attrs && isset($attrs['lang'])) {
                    if (
$attrs['lang'] == $lang) {
                        return (string)
$tchild;
                        break;
                    } else if (
$attrs['lang'] == 'en') {
                       
$en_title = (string)$tchild;
                    }
                }
            }
        }

        return (
$en_title != '') ? $en_title : $default;
    }


   
/***************************************/
    /* MAKE PARAMETERS FROM XML ATTRIBUTES */
    /***************************************/
   
private function makeParams($attrs, $parent, $ordering, $expand) {
       
$params = array();
       
$params['type'] = (isset($attrs['type'])) ? (string)$attrs['type'] : 'link';
       
$params['file'] = (isset($attrs['file'])) ? (string)$attrs['file'] : 'index.php';
       
$params['popup'] = (isset($attrs['popup'])) ? (int)$attrs['popup'] : 0;
       
$params['secure'] = (isset($attrs['secure'])) ? (int)$attrs['secure'] : 0;
       
$params['target'] = (isset($attrs['target'])) ? (string)$attrs['target'] : '_self';
       
$params['parent'] = $parent;
       
$params['ordering'] = $ordering;
       
$params['expand'] = $expand;
       
$params['width'] = (isset($attrs['width'])) ? (int)$attrs['width'] : 0;
       
$params['height'] = (isset($attrs['height'])) ? (int)$attrs['height'] : 0;
       
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
       
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';
        return
$params;
    }


   
/**********************/
    /* GET THE MENU TITLE */
    /**********************/
   
public function getMenuTitle() {
        return
$this->menuTitle;
    }


   
/**************************/
    /* GET LAST ERROR MESSAGE */
    /**************************/
   
public function getErrorMsg() {
        return
$this->errormsg;
    }


/************ LINK GENERATOR FOR ADMIN AREA *************************/


    /**************************************/
    /* RETURN ALL MENU'S (LINK GENERATOR) */
    /**************************************/
   
public function getAllMenus($component, $section='frontend', $lang='') {
       
$this->component = $component;
        if (
$lang == '') { $lang = $this->lang; }
       
$xmenus = $this->parseAllMenus($section, $lang);
        if (!
$xmenus) { return array(); }

       
$menus = array();
        foreach (
$xmenus as $xmenu) {
           
$menu = new stdClass;
           
$menu->name = $xmenu['name'];
           
$menu->title = $xmenu['title'];
           
$menu->iconfont = $xmenu['iconfont'];
           
$menu->cpiconfont = $xmenu['cpiconfont'];
           
$menu->items = $this->parseEverything($xmenu['children'], $lang);
           
$menus[] = $menu;
        }

        return
$menus;
    }


   
/******************************************************/
    /* INITIAL PARSE OF AN XML MENU FILE (LINK GENERATOR) */
    /******************************************************/
   
private function parseAllMenus($section, $lang) {
       
$xmlfile = ELXIS_PATH.'/components/com_'.$this->component.'/'.$this->component.'.menu.xml';
        if (!
file_exists($xmlfile)) {
           
$this->errormsg = 'File '.$this->component.'.menu.xml not found!';
            return
false;
        }
       
libxml_use_internal_errors(true);
       
$xml = simplexml_load_file($xmlfile, 'SimpleXMLElement');
        if (!
$xml) {
            foreach (
libxml_get_errors() as $error) {
               
$this->errormsg = 'Parse XML error on file '.$this->component.'.menu.xml. Error: '.$error->message.'. Line: '.$error->line;
                break;
            }
            return
false;
        }

        if (
$xml->getName() != 'elxismenu') {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml is not a valid Elxis menu file!';
            return
false;
        }
       
$attrs = $xml->attributes();
        if (!
$attrs) {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml is not a valid Elxis menu file!';
            return
false;
        }
        if (!isset(
$attrs['component']) || ($attrs['component'] != $this->component)) {
           
$this->errormsg = 'XML file '.$this->component.'.menu.xml in not a valid Elxis menu file for component '.$this->component.'!';
            return
false;
        }
        if (!isset(
$xml->$section)) {
           
$this->errormsg = 'Component '.$this->component.' does not have menu information for '.$section.'!';
            return
false;
        }
   
        if (!isset(
$xml->$section->menu)) {
           
$this->errormsg = 'Component '.$this->component.' does not have menu information for '.$section.'!';
            return
false;
        }

       
$menus = array();
        foreach (
$xml->$section->menu as $mchild) {
           
$attrs = $mchild->attributes();
            if (
$attrs && isset($attrs['name'])) {
               
$menu_name = (string)$attrs['name'];
               
$iconfont = isset($attrs['iconfont']) ? (string)$attrs['iconfont'] : '';
               
$cpiconfont = isset($attrs['cpiconfont']) ? (string)$attrs['cpiconfont'] : '';
            } else {
                break;
            }
           
$menus[] = array(
               
'name' => $menu_name,
               
'iconfont' => $iconfont,
               
'cpiconfont' => $cpiconfont,
               
'title' => $this->getTitleXML($mchild, $this->lang, ucfirst($this->component)),
               
'children' => $mchild
           
);
        }

        return
$menus;
    }


   
/*************************************/
    /* PARSE EVERYTHING (LINK GENERATOR) */
    /*************************************/
   
private function parseEverything($xmenu, $lang) {
        if (!isset(
$xmenu->items)) { return array(); }
       
$xml_items = $xmenu->items->children();
        if (!
$xml_items) { return array(); }

       
$items = array();
       
$n = 1;
       
$idx = 0;
        foreach (
$xml_items as $xml_item) {
           
$attrs = $xml_item->attributes();
            if (!
$attrs) { continue; }
            if (!isset(
$attrs['link'])) { continue; }
            if (isset(
$attrs['if_file_exists'])) {
                if (
$attrs['if_file_exists'] != '') {
                    if (!
file_exists(ELXIS_PATH.'/'.$attrs['if_file_exists'])) { continue; }
                }
            }
           
$name = $this->getTitleXML($xml_item, $this->lang);
           
$title = $this->getTitleXML($xml_item, $lang);
           
$link = (string)$attrs['link'];
           
$params = $this->makeParams($attrs, 0, $n, 0);
           
$params['alevel'] = (isset($attrs['minlevel'])) ? (int)$attrs['minlevel'] : 0;
           
$params['gid'] = (isset($attrs['gid'])) ? (int)$attrs['gid'] : 0;
           
$params['uid'] = (isset($attrs['uid'])) ? (int)$attrs['uid'] : 0;
           
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
           
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';

           
$idx++;
           
$n++;
           
$items[$idx] = $this->makeGenItem($title, $name, $link, $idx, $params);
            unset(
$link, $title, $params, $attrs);

            if (isset(
$xml_item->subitems) && (count($xml_item->subitems->children()) > 0)) { //1st level
               
$m = 1;
               
$idx2 = 0;
                foreach (
$xml_item->subitems->children() as $lev1node) {
                   
$attrs = $lev1node->attributes();
                    if (!
$attrs) { continue; }
                    if (!isset(
$attrs['link'])) { continue; }
                    if (isset(
$attrs['if_file_exists'])) {
                        if (
$attrs['if_file_exists'] != '') {
                            if (!
file_exists(ELXIS_PATH.'/'.$attrs['if_file_exists'])) { continue; }
                        }
                    }
                   
$name = $this->getTitleXML($lev1node, $this->lang);
                   
$title = $this->getTitleXML($lev1node, $lang);
                   
$link = (string)$attrs['link'];
                   
$params = $this->makeParams($attrs, $idx, $m, 0);
                   
$params['alevel'] = (isset($attrs['minlevel'])) ? (int)$attrs['minlevel'] : 0;
                   
$params['gid'] = (isset($attrs['gid'])) ? (int)$attrs['gid'] : 0;
                   
$params['uid'] = (isset($attrs['uid'])) ? (int)$attrs['uid'] : 0;
                   
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
                   
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';
                   
$idx2++;
                   
$items[$idx]->children[$idx2] = $this->makeGenItem($title, $name, $link, $idx2, $params);
                    unset(
$link, $title, $params, $attrs);                    
                   
$m++;

                    if (isset(
$lev1node->subitems) && (count($lev1node->subitems->children()) > 0)) { //2nd level
                       
$g = 1;
                       
$idx3 = 0;
                        foreach (
$lev1node->subitems->children() as $lev2node) {
                           
$attrs = $lev2node->attributes();
                            if (!
$attrs) { continue; }
                            if (!isset(
$attrs['link'])) { continue; }
                            if (isset(
$attrs['if_file_exists'])) {
                                if (
$attrs['if_file_exists'] != '') {
                                    if (!
file_exists(ELXIS_PATH.'/'.$attrs['if_file_exists'])) { continue; }
                                }
                            }
                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                           
$name = $this->getTitleXML($lev2node, $this->lang);
                           
$title = $this->getTitleXML($lev2node, $lang);
                           
$link = (string)$attrs['link'];
                           
$params = $this->makeParams($attrs, $idx2, $g, 0);
                           
$params['alevel'] = (isset($attrs['minlevel'])) ? (int)$attrs['minlevel'] : 0;
                           
$params['gid'] = (isset($attrs['gid'])) ? (int)$attrs['gid'] : 0;
                           
$params['uid'] = (isset($attrs['uid'])) ? (int)$attrs['uid'] : 0;
                           
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
                           
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';
                           
$idx3++;
                           
$items[$idx]->children[$idx2]->children[$idx3] = $this->makeGenItem($title, $name, $link, $idx3, $params);
                            unset(
$link, $title, $params, $attrs);                    
                           
$g++;

                            if (isset(
$lev2node->subitems) && (count($lev2node->subitems->children()) > 0)) { //3rd level
                               
$z = 1;
                               
$idx4 = 0;
                                foreach (
$lev2node->subitems->children() as $lev3node) {
                                   
$attrs = $lev3node->attributes();
                                    if (!
$attrs) { continue; }
                                    if (!isset(
$attrs['link'])) { continue; }
                                    if (isset(
$attrs['if_file_exists'])) {
                                        if (
$attrs['if_file_exists'] != '') {
                                            if (!
file_exists(ELXIS_PATH.'/'.$attrs['if_file_exists'])) { continue; }
                                        }
                                    }
                                   
$name = $this->getTitleXML($lev3node, $this->lang);
                                   
$title = $this->getTitleXML($lev3node, $lang);
                                   
$link = (string)$attrs['link'];
                                   
$params = $this->makeParams($attrs, $idx3, $z, 0);
                                   
$params['alevel'] = (isset($attrs['minlevel'])) ? (int)$attrs['minlevel'] : 0;
                                   
$params['gid'] = (isset($attrs['gid'])) ? (int)$attrs['gid'] : 0;
                                   
$params['uid'] = (isset($attrs['uid'])) ? (int)$attrs['uid'] : 0;
                                   
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
                                   
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';
                                   
$idx4++;
                                   
$items[$idx]->children[$idx2]->children[$idx3]->children[$idx4] = $this->makeGenItem($title, $name, $link, $idx4, $params);
                                    unset(
$link, $title, $params, $attrs);                    
                                   
$z++;

                                    if (isset(
$lev3node->subitems) && (count($lev3node->subitems->children()) > 0)) { //4th level
                                       
$v = 1;
                                       
$idx5 = 0;
                                        foreach (
$lev3node->subitems->children() as $lev4node) {
                                           
$attrs = $lev4node->attributes();
                                            if (!
$attrs) { continue; }
                                            if (!isset(
$attrs['link'])) { continue; }
                                            if (isset(
$attrs['if_file_exists'])) {
                                                if (
$attrs['if_file_exists'] != '') {
                                                    if (!
file_exists(ELXIS_PATH.'/'.$attrs['if_file_exists'])) { continue; }
                                                }
                                            }
                                            if (isset(
$attrs['gid']) && (intval($attrs['gid']) > 0) && ($attrs['gid'] <> $this->mygid)) { continue; }
                                            if (isset(
$attrs['minlevel']) && (intval($attrs['minlevel']) > $this->mylevel)) { continue; }
                                           
$name = $this->getTitleXML($lev4node, $this->lang);
                                           
$title = $this->getTitleXML($lev4node, $lang);
                                           
$link = (string)$attrs['link'];
                                           
$params = $this->makeParams($attrs, $idx4, $v, 0);
                                           
$params['alevel'] = (isset($attrs['minlevel'])) ? (int)$attrs['minlevel'] : 0;
                                           
$params['gid'] = (isset($attrs['gid'])) ? (int)$attrs['gid'] : 0;
                                           
$params['uid'] = (isset($attrs['uid'])) ? (int)$attrs['uid'] : 0;
                                           
$params['icon'] = (isset($attrs['icon'])) ? (string)$attrs['icon'] : '';
                                           
$params['iconfont'] = (isset($attrs['iconfont'])) ? (string)$attrs['iconfont'] : '';
                                           
$idx5++;
                                           
$items[$idx]->children[$idx2]->children[$idx3]->children[$idx4]->children[$idx5] = $this->makeGenItem($title, $name, $link, $idx5, $params);
                                            unset(
$link, $title, $params, $attrs);                    
                                           
$v++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return
$items;
    }


   
/******************************************************/
    /* MAKE A NEW MENU ITEM (LINK GENERATOR & ADMIN MENU) */
    /******************************************************/
   
public function makeGenItem($title, $name, $link, $id, $params=array(), $children=array()) {
       
$item = new stdClass;
       
$item->menu_id = $id;
       
$item->name = $name; //title in current lang
       
$item->title = $title; //title in default lang
       
$item->menu_type = (isset($params['type']) && (trim($params['type']) != '')) ? $params['type'] : 'link';
       
$item->link = $link;
       
$item->file = (isset($params['file']) && (trim($params['file']) != '')) ? (string)$params['file'] : 'index.php';
       
$item->popup = isset($params['popup']) ? (int)$params['popup'] : 0;
       
$item->secure = isset($params['secure']) ? (int)$params['secure'] : 0;
       
$item->parent_id = isset($params['parent']) ? $params['parent'] : 0;
       
$item->ordering = isset($params['ordering']) ? (int)$params['ordering'] : 1;
       
$item->expand = isset($params['expand']) ? (int)$params['expand'] : 0;
       
$item->target = isset($params['target']) ? (string)$params['target'] : '_self';
       
$item->width = isset($params['width']) ? (int)$params['width'] : 0;
       
$item->height = isset($params['height']) ? (int)$params['height'] : 0;
       
$item->alevel = isset($params['alevel']) ? (int)$params['alevel'] : 0;
       
$item->gid = isset($params['gid']) ? (int)$params['gid'] : 0;
       
$item->uid = isset($params['uid']) ? (int)$params['uid'] : 0;
       
$item->icon = isset($params['icon']) ? (string)$params['icon'] : '';
       
$item->iconfont = isset($params['iconfont']) ? (string)$params['iconfont'] : '';
       
$item->children = $children;
        return
$item;
    }

}

?>