Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/components/com_emenu/controllers/menuitem.php
<?php
/**
* @version        $Id: menuitem.php 2434 2022-01-19 17:32:52Z IOS $
* @package        Elxis
* @subpackage    Component eMenu
* @copyright    Copyright (c) 2006-2022 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( https://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
menuitemEmenuController extends emenuController {

   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct($view=null, $task='', $model=null) {
       
parent::__construct($view, $task, $model);
    }


   
/**************************************/
    /* PREPARE TO DISPLAY MENU ITEMS LIST */
    /**************************************/
   
public function listmenuitems() {
       
$eLang = eFactory::getLang();
       
$pathway = eFactory::getPathway();
       
$elxis = eFactory::getElxis();
       
$eDoc = eFactory::getDocument();

       
$segments = eFactory::getURI()->getSegments();
       
$collection = str_ireplace('.html', '', $segments[1]);
       
$collection = trim(preg_replace('/[^A-Za-z0-9]/', '', $collection));
        if (
$this->model->validateCollection($collection) === false) {
           
$link = $elxis->makeAURL('emenu:/');
           
$elxis->redirect($link, 'Requested collection does not exist!', true);
        }

       
$collections = $this->model->getCollections(true);

       
$options = array('limit' => 1000, 'limitstart' => 0, 'page' => 1, 'maxpage' => 1, 'sn' => 'nothing', 'so' => 'asc', 'collection' => $collection, 'maxlevel' => 10, 'total' => 0);

       
$items = $this->model->getMenuItems($options['collection']);
       
$tree = $elxis->obj('tree');
       
$tree->setOptions(array('itemid' => 'menu_id', 'parentid' => 'parent_id', 'itemname' => 'title', 'html' => true));
       
$rows = $tree->makeTree($items, $options['maxlevel']);
        unset(
$items, $tree);

       
$options['total'] = count($rows);
        if (
$options['total'] > 1) {
           
$options['maxpage'] = ceil($options['total']/$options['limit']);
            if (
$options['maxpage'] < 1) { $options['maxpage'] = 1; }
            if (
$options['page'] > $options['maxpage']) { $options['page'] = $options['maxpage']; }
           
$options['limitstart'] = (($options['page'] - 1) * $options['limit']);

            if (
$options['total'] > $options['limit']) {
               
$limitrows = array();
               
$end = $options['limitstart'] + $options['limit'];
               
$k = 0;
                foreach (
$rows as $key => $row) {
                    if (
$k < $options['limitstart']) { $k++; continue; }
                    if (
$k >= $end) { break; }
                   
$limitrows[] = $row;
                   
$k++;
                }
               
$rows = $limitrows;
            }
        }

       
$allgroups = $this->model->getGroups();

       
$pathway->deleteAllNodes();
       
$pathway->addNode($eLang->get('MENU_MANAGER'), 'emenu:/');
       
$pathway->addNode($collection);

       
$eDoc->setTitle($eLang->get('MANAGE_MENU_ITEMS').' - '.$collection);
       
$eDoc->addFontAwesome();
       
$eDoc->addStyleLink($elxis->secureBase().'/components/com_emenu/css/emenu'.$eLang->getinfo('RTLSFX').'.css');
        if (
$rows) {
           
$eDoc->addNativeDocReady('elx5DataTable(\'menuitemstbl\', false);');
        }
       
$eDoc->addScriptLink($elxis->secureBase().'/components/com_emenu/js/emenu.js');

       
$this->view->listmenuitems($rows, $options, $collections, $allgroups, $eLang, $elxis);
    }


   
/*******************************/
    /* MOVE A MENU ITEM UP OR DOWN */
    /*******************************/
   
public function moveitem() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

       
$response = array('success' => 0, 'message' => '');

        if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
           
$response['message'] = $eLang->get('NOTALLOWACTION');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$menu_id = isset($_POST['menu_id']) ? (int)$_POST['menu_id'] : 0;
        if (
$menu_id < 1) {
           
$response['message'] = 'No menu item requested!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$moveup = (isset($_POST['moveup'])) ? (int)$_POST['moveup'] : 0;
       
$inc = ($moveup == 1) ? -1 : 1;

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
       
$row = new menuDbTable();
       
$row->load($menu_id);
        if (!
$row->menu_id) {
           
$response['message'] = 'Menu item not found!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$wheres = array(
            array(
'collection', '=', $row->collection),
            array(
'parent_id', '=', $row->parent_id),
            array(
'section', '=', $row->section)
        );

       
$ok = $row->move($inc, $wheres);
        if (!
$ok) {
           
$response['message'] = addslashes($row->getErrorMsg());
        } else {
           
$response['success'] = 1;
        }

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }


   
/**********************/
    /* DELETE A MENU ITEM */
    /**********************/
   
public function deleteitem() {
       
$response = array('success' => 0, 'message' => '');

        if (!isset(
$_POST['elids'])) {
           
$response['message'] = 'No menu item set!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$menu_id = (isset($_POST['elids'])) ? (int)$_POST['elids'] : 0;
        if (
$menu_id < 1) {
           
$response['message'] = 'Invalid menu item!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$result = $this->model->deleteMenuItem($menu_id); //includes acl check
       
if ($result['success'] === false) {
           
$response['message'] = addslashes($result['message']);
        } else {
           
$response['success'] = 1;
        }

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }


   
/********************************/
    /* TOGGLE ITEM'S PUBLISH STATUS */
    /********************************/
   
public function toggleitem() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

       
$response = array('success' => 0, 'published' => -1, 'icontitle' => '', 'reloadpage' => 0);

       
$menuid = isset($_POST['elid']) ? (int)$_POST['elid'] : 0;

        if (
$menuid < 1) {
           
$response['icontitle'] = 'No menu item requested!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$result = $this->model->publishItem($menuid, -1); //includes acl checks

       
if ($result['success'] === false) {
           
$response['icontitle'] = $result['message'];
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
       
$row = new menuDbTable();
       
$row->load($menuid);

       
$response['success'] = 1;
       
$response['published'] = $row->published;
        if (
$row->published == 1) {
           
$response['icontitle'] = $eLang->get('PUBLISHED').' - '.$eLang->get('CLICK_TOGGLE_STATUS');
        } else {
           
$response['icontitle'] = $eLang->get('UNPUBLISHED').' - '.$eLang->get('CLICK_TOGGLE_STATUS');
           
$response['reloadpage'] = 1;
        }

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }


   
/**********************/
    /* ADD/EDIT MENU ITEM */
    /**********************/
   
public function edititem($row=null) {
       
$eLang = eFactory::getLang();
       
$elxis = eFactory::getElxis();
       
$pathway = eFactory::getPathway();
       
$eDoc = eFactory::getDocument();

       
$is_new = true;
        if (!
$row) {
            if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
               
$msg = $eLang->get('NOTALLOWACTION');
               
$link = $elxis->makeAURL('emenu:/');
               
$elxis->redirect($link, $msg, true);
            }
           
$menu_id = isset($_GET['menu_id']) ? (int)$_GET['menu_id'] : 0;
           
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
           
$row = new menuDbTable();
            if (!
$row->load($menu_id)) {
               
$link = $elxis->makeAURL('emenu:/');
               
$elxis->redirect($link, 'Menu item not found', true);
            }

           
$allowed = (($row->alevel <= $elxis->acl()->getLowLevel()) || ($row->alevel == $elxis->acl()->getExactLevel())) ? true : false;
            if (!
$allowed) {
               
$link = $elxis->makeAURL('emenu:mitems/'.$row->collection.'.html');
               
$elxis->redirect($link, $eLang->get('NOTALLOWACCITEM'), true);
            }
           
$is_new = false;
            if (
trim($row->link) == '') { $row->link = '/'; } //needed to save problem on link validation for frontpage
       
}

       
$leveltip = $this->makeLevelsTip();
       
$treeitems = $this->collectionTree($row->collection);
       
$components = $this->componentsList();

       
$pathway->addNode($eLang->get('MENU_MANAGER'), 'emenu:/');
       
$pathway->addNode($row->collection, 'emenu:mitems/'.$row->collection.'.html');
        if (
$is_new) {
           
$eDoc->setTitle($eLang->get('MANAGE_MENU_ITEMS').' - '.$eLang->get('NEW'));
           
$pathway->addNode($eLang->get('NEW'));
        } else {
           
$eDoc->setTitle($eLang->get('MANAGE_MENU_ITEMS').' - '.$eLang->get('EDIT'));
           
$pathway->addNode($eLang->get('EDIT').' '.$row->menu_id);
        }

       
$toolbar = $elxis->obj('toolbar');
       
$toolbar->add($eLang->get('SAVE'), 'save', false, '', 'elx5Submit(\'save\', \'fmrtedit\', \'eprtask\');');
       
$toolbar->add($eLang->get('APPLY'), 'saveedit', false, '', 'elx5Submit(\'apply\', \'fmrtedit\', \'eprtask\');');
       
$toolbar->add($eLang->get('CANCEL'), 'cancel', false, $elxis->makeAURL('emenu:mitems/'.$row->collection.'.html'));

       
$component = '';
        if (!
$is_new) {
            if (
$row->menu_type == 'link') {
               
$component = $this->findComponent($row->link);
            }
        }
       
$eDoc->addScriptLink($elxis->secureBase().'/components/com_emenu/js/emenu.js');
       
$eDoc->addStyleLink($elxis->secureBase().'/components/com_emenu/css/emenu'.$eLang->getinfo('RTLSFX').'.css');
        if (
$component != '') {
           
$eDoc->addNativeDocReady('emenuPickComponent(\'com_'.$component.'\');');
        }

       
$this->view->editMenuItem($row, $treeitems, $components, $leveltip, $component, $is_new);
    }


   
/*****************/
    /* ADD MENU ITEM */
    /*****************/
   
public function additem() {
       
$elxis = eFactory::getElxis();
        if (
$elxis->acl()->check('com_emenu', 'menu', 'add') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$link = $elxis->makeAURL('emenu:/');
           
$elxis->redirect($link, $msg, true);
        }
       
$collection = trim(filter_input(INPUT_GET, 'collection', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if (
$collection == '') { $collection = 'maimenu'; }
       
$type = trim(filter_input(INPUT_GET, 'type', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if ((
$type == '') || !in_array($type, array('link', 'url', 'separator', 'wrapper', 'onclick'))) { $type = 'link'; }

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
       
$row = new menuDbTable();
       
$row->collection = $collection;
       
$row->section = 'frontend';
       
$row->target = '';
       
$row->file = 'index.php';
       
$row->published = 1;
       
$row->menu_type = $type;
        if ((
$type == 'separator') || ($type == 'url') || ($type == 'onclick')) { $row->file = null; }

       
$this->edititem($row);
    }


   
/************************************/
    /* FIND COMPONENT FROM AN ELXIS URI */
    /************************************/
   
private function findComponent($elxis_uri) {
       
$parts = preg_split('#\:#', $elxis_uri, -1, PREG_SPLIT_NO_EMPTY);
        if (!
$parts) { return 'content'; } //frontpage
       
if (strlen($parts[0]) < 3) { array_shift($parts); } //language
       
$c = count($parts);
        if (
$c > 2) {
            return
'';
        } else if (
$c == 2) {
           
$component = $parts[0];
        } else {
           
$component = 'content';
        }

        if (!
file_exists(ELXIS_PATH.'/components/com_'.$component.'/'.$component.'.php')) { return ''; }
        return
$component;
    }


   
/*******************/
    /* MAKE LEVELS TIP */
    /*******************/
   
private function makeLevelsTip() {
       
$eLang = eFactory::getLang();
       
$groups = $this->model->getGroups();
       
$elements = array();
        if (
$groups) {
            foreach (
$groups as $group) {
                switch (
$group['gid']) {
                    case
7: $name = $eLang->get('GUEST'); break;
                    case
6: $name = $eLang->get('EXTERNALUSER'); break;
                    case
5: $name = $eLang->get('USER'); break;
                    case
1: $name = $eLang->get('ADMINISTRATOR'); break;
                    default:
$name = $group['groupname']; break;
                }
               
$elements[] = (int)$group['level'].': '.$name;
            }
            return
implode(', ', $elements);
        }
        return
'';
    }


   
/*************************************/
    /* MAKE COLLECTION'S MENU ITEMS TREE */
    /*************************************/
   
private function collectionTree($collection) {
       
$rows = $this->model->getMenuItems($collection);
       
$tree = eFactory::getElxis()->obj('tree');
       
$tree->setOptions(array('itemid' => 'menu_id', 'parentid' => 'parent_id', 'itemname' => 'title', 'html' => false));
       
$items = $tree->makeTree($rows, 10);
        return
$items;
    }


   
/*************************************/
    /* MAKE COLLECTION'S MENU ITEMS TREE */
    /*************************************/
   
private function componentsList() {
       
$eLang = eFactory::getLang();
       
$rows = array();
       
$rows['com_content'] = $eLang->get('CONTENT');
       
$comps = $this->model->getComponents();
        if (
$comps) {
            foreach (
$comps as $comp) {
                if (
$comp['component'] == 'com_content') { continue; }
               
$cmp = $comp['component'];
               
$str = strtoupper(str_replace('com_', '', $comp['component']));
               
$name = ($eLang->exist($str)) ? $eLang->get($str) : $comp['name'];
               
$rows[$cmp] = $name;
            }
        }
        return
$rows;
    }


   
/**************************/
    /* PREPARE LINK GENERATOR */
    /**************************/
   
public function linkgenerator() {
       
$eLang = eFactory::getLang();
       
$elxis = eFactory::getElxis();

        if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
           
$this->ajaxHeaders('text/plain');
            echo
'<div class="elx5_error">'.$eLang->get('NOTALLOWACTION')."</div>\n";
            exit;
        }

       
$component = trim(filter_input(INPUT_POST, 'component', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$no_public = array('com_cpanel', 'com_languages', 'com_emenu', 'com_emedia', 'com_etranslator', 'com_extmanager');

        if (
strpos($component, 'com_') === false) {
           
$this->ajaxHeaders('text/plain');
            echo
'<div class="elx5_error">Invalid component!'."</div>\n";
            exit;
        }
        if (
in_array($component, $no_public)) {
           
$this->ajaxHeaders('text/plain');
            echo
'<div class="elx5_warning">'.$eLang->get('COMP_NO_PUBLIC_IFACE')."</div>\n";
            exit;
        }

       
$cname = str_replace('com_', '', $component);
        if (!
file_exists(ELXIS_PATH.'/components/'.$component.'/'.$cname.'.php')) {
           
$this->ajaxHeaders('text/plain');
            echo
'<div class="elx5_error">Invalid component!'."</div>\n";
            exit;
        }

       
$xmlmenus = null;
        if (
file_exists(ELXIS_PATH.'/components/'.$component.'/'.$cname.'.menu.xml')) {
           
elxisLoader::loadFile('includes/libraries/elxis/menu.xml.php');
           
$xmenu = new elxisXMLMenu(null);
           
$xmlmenus = $xmenu->getAllMenus($cname, 'frontend', $elxis->getConfig('LANG'));
            unset(
$xmenu);
        }

        if (
$cname == 'search') {
           
$items = $this->searchGenerator();    
        } else {
           
$items = array();
           
$items[] = $this->componentfpLink($cname);
        }

       
$this->view->linkGeneratorOutput($items, $xmlmenus, $cname, $elxis, $eLang);
    }


   
/*********************************/
    /* LINK TO COMPONENT'S FRONTPAGE */
    /*********************************/
   
private function componentfpLink($cname) {
       
$eLang = eFactory::getLang();

       
$item = new stdClass;
       
$item->name = sprintf($eLang->get('COMP_FRONTPAGE'), ucfirst($cname));
       
$item->title = ucfirst($cname);
       
$item->link = $cname.':/';
       
$item->secure = 0;
       
$item->alevel = 0;
        return
$item;
    }


   
/**********************************************/
    /* CREATE STANDARD LINKS FOR COMPONENT SEARCH */
    /**********************************************/
   
private function searchGenerator() {
       
$eFiles = eFactory::getFiles();
       
$eLang = eFactory::getLang();

       
$component_title = 'Search';
        if (
$eLang->currentLang() == eFactory::getElxis()->getConfig('LANG')) {
           
$component_title = $eLang->get('SEARCH');
        }
       
$items = array();
       
$item = new stdClass;
       
$item->name = sprintf($eLang->get('COMP_FRONTPAGE'), $eLang->get('SEARCH'));
       
$item->title = $component_title;
       
$item->link = 'search:/';
       
$item->secure = 0;
       
$item->alevel = 0;
       
$items[] = $item;

       
$engs = $eFiles->listFolders('components/com_search/engines/');
        if (
$engs) {
            foreach (
$engs as $eng) {
                if (!
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$eng.'/'.$eng.'.engine.php')) { continue; }
               
$item = new stdClass;
               
$item->name = $eLang->get('SEARCH').' '.ucfirst($eng);
               
$item->title = $component_title.' '.ucfirst($eng);
               
$item->link = 'search:'.$eng.'.html';
               
$item->secure = 0;
               
$item->alevel = 0;
               
$items[] = $item;
            }
        }
        return
$items;
    }


   
/*******************/
    /* CONTENT BROWSER */
    /*******************/
   
public function browser() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

        if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
            echo
'<div class="elx5_error">'.$eLang->get('NOTALLOWACTION')."</div>\n";
            return;
        }

       
$options = array(
           
'catid' => 0,
           
'page' => 1,
           
'perpage' => 10,
           
'total' => 0,
           
'maxpage' => 1,
           
'limitstart' => 0,
           
'type' => 'c',
           
'order' => 'oa',
           
'articles' => 0
       
);

       
$options['catid'] = (isset($_GET['catid'])) ? (int)$_GET['catid'] : 0;
        if (
$options['catid'] < 0) { $options['catid'] = 0; }
       
$options['page'] = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
        if (
$options['page'] < 1) { $options['page'] = 1; }
       
$options['type'] = isset($_GET['t']) ? $_GET['t'] : 'c';
        if (
$options['type'] != 'a') { $options['type'] = 'c'; }
       
$options['order'] = isset($_GET['o']) ? $_GET['o'] : 'oa';
        if (
$options['type'] == 'a') {
            if (!
in_array($options['order'], array('oa', 'od', 'ta', 'td', 'ia', 'id', 'da', 'dd', 'ma', 'md'))) {
               
$options['order'] = 'oa';
            }
        } else {
            if (!
in_array($options['order'], array('oa', 'od', 'ta', 'td', 'ia', 'id'))) {
               
$options['order'] = 'oa';
            }
        }

        if (
$options['type'] == 'a') {
           
$options['total'] = $this->model->countArticles($options['catid']);
        } else {
           
$options['total'] = $this->model->countCategories($options['catid']);
           
$options['articles'] = $this->model->countArticles($options['catid']);
        }

        if (
$options['total'] > $options['perpage']) {
           
$options['maxpage'] = ceil($options['total']/$options['perpage']);
            if (
$options['maxpage'] < 1) { $options['maxpage'] = 1; }
            if (
$options['page'] > $options['maxpage']) { $options['page'] = $options['maxpage']; }
           
$options['limitstart'] = (($options['page'] - 1) * $options['perpage']);
        } else {
           
$options['page'] = 1;
        }

        if (
$options['type'] == 'a') {
           
$rows = $this->model->getArticles($options['catid'], $options['limitstart'], $options['order']);
        } else {
           
$rows = $this->model->getCategories($options['catid'], $options['limitstart'], $options['order']);
        }

       
$allgroups = $this->model->getGroups();

       
$paths = $this->makePath($options['catid']);

       
eFactory::getDocument()->addScriptLink($elxis->secureBase().'/components/com_emenu/js/emenu.js');
       
eFactory::getDocument()->addStyleLink($elxis->secureBase().'/components/com_emenu/css/emenu'.$eLang->getinfo('RTLSFX').'.css');

        if (
$options['type'] == 'a') {
           
$this->view->articlesBrowser($rows, $paths, $options, $allgroups);
        } else {
           
$this->view->categoriesBrowser($rows, $paths, $options, $allgroups);
        }
    }


   
/***************************/
    /* MAKE CATEGORIES PATHWAY */
    /***************************/
   
private function makePath($catid=0) {
       
$items = array();
       
$p = $catid;
        while(
$p > 0) {
           
$row = $this->model->getCategory($p);
            if (!
$row) { $p = 0; break; }
           
$item = new stdClass;
           
$item->catid = $p;
           
$item->title = $row['title'];
           
$item->seolink = $row['seolink'];
           
$items[] = $item;
           
$p = $row['parent_id'];
        }

       
$item = new stdClass;
       
$item->catid = 0;
       
$item->title = eFactory::getLang()->get('ROOT');
       
$item->seolink = '';
       
$items[] = $item;

        return
array_reverse($items);
    }


   
/******************/
    /* SAVE MENU ITEM */
    /******************/
   
public function saveitem() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();
       
$eSession = eFactory::getSession();

       
$task = isset($_POST['task']) ? trim($_POST['task']) : 'save';

       
$menu_id = isset($_POST['menu_id']) ? (int)$_POST['menu_id'] : 0;
        if (
$menu_id < 0) { $menu_id = 0; }

       
$redirurl = $elxis->makeAURL('emenu:/');
        if (
$menu_id > 0) {
            if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
               
$elxis->redirect($redirurl, $eLang->get('NOTALLOWACTION'), true);
            }
        } else {
            if (
$elxis->acl()->check('com_emenu', 'menu', 'add') < 1) {
               
$elxis->redirect($redirurl, $eLang->get('NOTALLOWACTION'), true);
            }
        }

       
$sess_token = trim($eSession->get('token_menuitem'));
       
$token = trim(filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
        if ((
$token == '') || ($sess_token == '') || ($sess_token != $token)) {
           
exitPage::make('403', 'CEME-0006', $eLang->get('REQDROPPEDSEC'));
        }

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
       
$row = new menuDbTable();
       
$old_ordering = -1;
        if (
$menu_id > 0) {
            if (!
$row->load($menu_id)) { $elxis->redirect($redirurl, 'Menu item was not found!', true); }
           
$old_ordering = $row->ordering;
        }

        if (!
$row->bind($_POST)) {
           
$elxis->redirect($redirurl, $row->getErrorMsg(), true);
        }

       
$row->published = isset($_POST['published']) ? (int)$_POST['published'] : 0;//because it is checkbox
       
$row->secure = isset($_POST['secure']) ? (int)$_POST['secure'] : 0;//because it is checkbox
       
if ($row->iconfont == 'OTHER') {
           
$row->iconfont = '';
            if (isset(
$_POST['iconfont_other'])) {
               
$row->iconfont = eUTF::trim(filter_input(INPUT_POST, 'iconfont_other', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
            }
        }

        if (
$menu_id > 0) {
           
$redirurledit = $elxis->makeAURL('emenu:mitems/edit.html?menu_id='.$menu_id);
        } else {
           
$redirurledit = $elxis->makeAURL('emenu:mitems/add.html?collection='.$row->collection.'&type='.$row->menu_type);
        }

       
$row->alevel = (int)$row->alevel;
        if (
$row->parent_id > 0) {
           
$parent_alevel = $this->model->getItemLevel($row->parent_id);
            if (
$parent_alevel > $row->alevel) { $row->alevel = $parent_alevel; }
        }

       
$allowed = (($row->alevel <= $elxis->acl()->getLowLevel()) || ($row->alevel == $elxis->acl()->getExactLevel())) ? true : false;
        if (!
$allowed) {
           
$redirurl = $elxis->makeAURL('emenu:mitems/'.$row->collection.'.html');
           
$elxis->redirect($redirurl, $eLang->get('NOTALLOWACCITEM'), true);
        }

       
$ok = ($menu_id > 0) ? $row->update() : $row->insert();
        if (!
$ok) {
           
$elxis->redirect($redirurledit, $row->getErrorMsg(), true);
        }

        if ((
$menu_id == 0) || ($old_ordering <> $row->ordering)) {
           
$reorder = true;
        } else {
           
$reorder = false;
        }
        if (
$reorder) {
           
$wheres = array(array('section', '=', $row->section), array('collection', '=', $row->collection), array('parent_id', '=', $row->parent_id));
           
$row->reorder($wheres, true);
        }

       
//save translations
       
$sitelangs = $eLang->getSiteLangs(false);
       
$translations = array('title' => array());
        foreach (
$sitelangs as $lng) {
            if (
$lng == $elxis->getConfig('LANG')) { continue; }
           
$idx = 'title_'.$lng;
           
$translations['title'][$lng] = isset($_POST[$idx]) ? eUTF::trim(filter_input(INPUT_POST, $idx, FILTER_UNSAFE_RAW)) : '';
        }

       
$elxis->obj('translations')->saveElementTranslations('com_emenu', 'title', $row->menu_id, $translations['title']);

       
$eSession->set('token_menuitem');
        if (
$task == 'apply') {
           
$redirurl = $elxis->makeAURL('emenu:mitems/edit.html?menu_id='.$row->menu_id);
        } else {
           
$redirurl = $elxis->makeAURL('emenu:mitems/'.$row->collection.'.html');
        }
       
$elxis->redirect($redirurl, $eLang->get('ITEM_SAVED'));
    }


   
/*****************************************/
    /* COPY MENU ITEM TO AN OTHER COLLECTION */
    /*****************************************/
   
public function copyitemcol() {
       
$this->copymoveitem();
    }


   
/*****************************************/
    /* MOVE MENU ITEM TO AN OTHER COLLECTION */
    /*****************************************/
   
public function moveitemcol() {
       
$this->copymoveitem(true);
    }


   
/*************************************************/
    /* COPY/MOVE MENU ITEM(S) TO AN OTHER COLLECTION */
    /*************************************************/
   
private function copymoveitem($is_move=false) {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

       
$response = array('success' => 0, 'message' => '');

       
$menu_id = (isset($_POST['menu_id'])) ? (int)$_POST['menu_id'] : 0;
       
$collection = (isset($_POST['collection'])) ? trim($_POST['collection']) : '';

        if (
$elxis->acl()->check('com_emenu', 'menu', 'edit') < 1) {
           
$response['message'] = $eLang->get('NOTALLOWACTION');
        } else if (
$menu_id < 1) {
           
$response['message'] = 'Invalid menu item!';
        } else if (
$collection == '') {
           
$response['message'] = 'Invalid collection!';
        }

        if (
$response['message'] != '') {
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/menu.db.php');
       
$row = new menuDbTable();
        if (!
$row->load($menu_id)) {
           
$response['message'] = 'Menu item not found!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
        if ((
$row->section != 'frontend') || ($row->collection == $collection)) {
           
$response['message'] = 'Invalid action!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$children = $this->model->getMenuChildren($menu_id);
       
$last_ordering = $this->model->getRootLastOrdering($collection);
       
$last_ordering++;

        if (
$is_move) {
           
$row->parent_id = 0;
           
$row->collection = $collection;
           
$row->ordering = $last_ordering;
           
$row->store();
            unset(
$row);
            if (
$children) {
               
$c1 = 1;
                foreach (
$children as $child_id => $childs2) {
                   
$row = new menuDbTable();
                    if (
$row->load($child_id)) {
                       
$row->collection = $collection;
                       
$row->ordering = $c1;
                       
$row->store();
                       
$c1++;
                    }
                    unset(
$row);
                    if (
$childs2) {
                       
$c2 = 1;
                        foreach (
$childs2 as $child_id2 => $childs3) {
                           
$row = new menuDbTable();
                            if (
$row->load($child_id2)) {
                               
$row->collection = $collection;
                               
$row->ordering = $c2;
                               
$row->store();
                               
$c2++;
                            }
                            unset(
$row);
                            if (
$childs3) {
                               
$c3 = 1;
                                foreach (
$childs3 as $child_id3 => $childs4) {
                                   
$row = new menuDbTable();
                                    if (
$row->load($child_id3)) {
                                       
$row->collection = $collection;
                                       
$row->ordering = $c3;
                                       
$row->store();
                                       
$c3++;
                                    }
                                    unset(
$row);
                                    if (
$childs4) {
                                       
$c4 = 1;
                                        foreach (
$childs4 as $child_id4 => $childs5) {
                                           
$row = new menuDbTable();
                                            if (
$row->load($child_id4)) {
                                               
$row->collection = $collection;
                                               
$row->ordering = $c4;
                                               
$row->store();
                                               
$c4++;
                                            }
                                            unset(
$row);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

           
$response['success'] = 1;
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
//copy
       
$copied_ids = array();

       
$row->forceNew(true);
       
$row->parent_id = 0;
       
$row->collection = $collection;
       
$row->ordering = $last_ordering;
       
$row->insert();
       
$copied_ids[$menu_id] = $row->menu_id;
        unset(
$row);
        if (
$children) {
           
$c1 = 1;
            foreach (
$children as $child_id => $childs2) {
               
$row = new menuDbTable();
                if (
$row->load($child_id)) {
                   
$row->forceNew(true);
                   
$row->collection = $collection;
                   
$row->parent_id = $copied_ids[$menu_id];
                   
$row->ordering = $c1;
                   
$row->insert();
                   
$copied_ids[$child_id] = $row->menu_id;
                   
$c1++;
                }
                unset(
$row);
                if (
$childs2) {
                   
$c2 = 1;
                    foreach (
$childs2 as $child_id2 => $childs3) {
                       
$row = new menuDbTable();
                        if (
$row->load($child_id2)) {
                           
$row->forceNew(true);
                           
$row->collection = $collection;
                           
$row->parent_id = $copied_ids[$child_id];
                           
$row->ordering = $c2;
                           
$row->insert();
                           
$copied_ids[$child_id2] = $row->menu_id;
                           
$c2++;
                        }
                        unset(
$row);
                        if (
$childs3) {
                           
$c3 = 1;
                            foreach (
$childs3 as $child_id3 => $childs4) {
                               
$row = new menuDbTable();
                                if (
$row->load($child_id3)) {
                                   
$row->forceNew(true);
                                   
$row->collection = $collection;
                                   
$row->parent_id = $copied_ids[$child_id2];
                                   
$row->ordering = $c3;
                                   
$row->insert();
                                   
$copied_ids[$child_id3] = $row->menu_id;
                                   
$c3++;
                                }
                                unset(
$row);
                                if (
$childs4) {
                                   
$c4 = 1;
                                    foreach (
$childs4 as $child_id4 => $childs5) {
                                       
$row = new menuDbTable();
                                        if (
$row->load($child_id4)) {
                                           
$row->forceNew(true);
                                           
$row->collection = $collection;
                                           
$row->parent_id = $copied_ids[$child_id3];
                                           
$row->ordering = $c4;
                                           
$row->insert();
                                           
$copied_ids[$child_id4] = $row->menu_id;
                                           
$c4++;
                                        }
                                        unset(
$row);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

       
$this->model->copyItemsTranslations($copied_ids);

       
$response['success'] = 1;
       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }

}
   
?>