getPath( 'admin_html' ) ); $id = intval( mosGetParam( $_GET, 'id', 0 ) ); $type = mosGetParam( $_REQUEST, 'type', false ); $menutype = mosGetParam( $_REQUEST, 'menutype', 'mainmenu' ); $task = mosGetParam( $_REQUEST, 'task', '' ); $access = mosGetParam( $_POST, 'access', '' ); $utaccess = mosGetParam( $_POST, 'utaccess', '' ); $ItemName = mosGetParam( $_POST, 'ItemName', '' ); $menu = mosGetParam( $_POST, 'menu', '' ); $cid = mosGetParam( $_POST, 'cid', array(0) ); $path = $mosConfig_absolute_path .'/administrator/components/com_menus/'; if (!is_array( $cid )) { $cid = array(0); } switch ($task) { case 'new': addMenuItem( $cid, $menutype, $option, $task ); break; case 'edit': $cid[0] = ( $id ? $id : $cid[0] ); $menu = new mosMenu( $database ); if ( $cid[0] ) { $menu->load( $cid[0] ); } else { $menu->type = $type; } if ( $menu->type ) { $type = $menu->type; require( $path . $menu->type .'/'. $menu->type .'.menu.php' ); } break; case 'save': case 'apply': require( $path . $type .'/'. $type .'.menu.php' ); break; case 'publish': case 'unpublish': if ($msg = publishMenuSection( $cid, ($task == 'publish') )) { // proceed no further if the menu item can't be published mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype .'&mosmsg= '.$msg ); } else { mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype ); } break; case 'remove': if ($msg = TrashMenusection( $cid )) { mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype .'&mosmsg= '.$msg ); } else { mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype ); } break; case 'cancel': cancelMenu( $option ); break; case 'orderup': orderMenu( $cid[0], -1, $option ); break; case 'orderdown': orderMenu( $cid[0], 1, $option ); break; case 'accesspublic': accessMenu( $cid[0], 0, $option, $menutype ); break; case 'accessregistered': accessMenu( $cid[0], 1, $option, $menutype ); break; case 'accessspecial': accessMenu( $cid[0], 2, $option, $menutype ); break; case 'movemenu': moveMenu( $option, $cid, $menutype ); break; case 'movemenusave': moveMenuSave( $option, $cid, $menu, $menutype ); break; case 'copymenu': copyMenu( $option, $cid, $menutype ); break; case 'copymenusave': copyMenuSave( $option, $cid, $menu, $menutype ); break; case 'cancelcopymenu': case 'cancelmovemenu': viewMenuItems( $menutype, $option ); break; case 'saveorder': saveOrder( $cid, $menutype ); break; default: $type = trim( mosGetParam( $_REQUEST, 'type', null ) ); if ($type) { // adding a new item - type selection form require( $path . $type .'/'. $type .'.menu.php' ); } else { viewMenuItems( $menutype, $option ); } break; } /** * Shows a list of items for a menu */ function viewMenuItems( $menutype, $option ) { global $database, $mainframe, $mosConfig_list_limit; $limit = $mainframe->getUserStateFromRequest( "viewlistlimit", 'limit', $mosConfig_list_limit ); $limitstart = $mainframe->getUserStateFromRequest( "view{$option}limitstart$menutype", 'limitstart', 0 ); $levellimit = $mainframe->getUserStateFromRequest( "view{$option}limit$menutype", 'levellimit', 10 ); $search = $mainframe->getUserStateFromRequest( "search{$option}$menutype", 'search', '' ); $search = $database->getEscaped( trim( strtolower( $search ) ) ); // select the records // note, since this is a tree we have to do the limits code-side if ($search) { $query = "SELECT m.id" . "\n FROM #__menu AS m" //. "\n LEFT JOIN #__content AS c ON c.id = m.componentid AND type='content_typed'" . "\n WHERE menutype='$menutype'" . "\n AND LOWER(m.name) LIKE '%" . strtolower( $search ) . "%'" ; $database->setQuery( $query ); $search_rows = $database->loadResultArray(); } $query = "SELECT m.*, u.name AS editor, g.name AS groupname, c.publish_up, c.publish_down, com.name AS com_name" . "\n FROM #__menu AS m" . "\n LEFT JOIN #__users AS u ON u.id = m.checked_out" . "\n LEFT JOIN #__groups AS g ON g.id = m.access" . "\n LEFT JOIN #__content AS c ON c.id = m.componentid AND m.type='content_typed'" . "\n LEFT JOIN #__components AS com ON com.id = m.componentid AND m.type='components'" . "\n WHERE m.menutype='$menutype'" . "\n AND m.published != -2" . "\n ORDER BY parent,ordering" ; $database->setQuery( $query ); $rows = $database->loadObjectList(); // establish the hierarchy of the menu $children = array(); // first pass - collect children foreach ($rows as $v ) { $pt = $v->parent; $list = @$children[$pt] ? $children[$pt] : array(); array_push( $list, $v ); $children[$pt] = $list; } // second pass - get an indent list of the items $list = mosTreeRecurse( 0, '', array(), $children, max( 0, $levellimit-1 ) ); // eventually only pick out the searched items. if ($search) { $list1 = array(); foreach ($search_rows as $sid ) { foreach ($list as $item) { if ($item->id == $sid) { $list1[] = $item; } } } // replace full list with found items $list = $list1; } $total = count( $list ); require_once( $GLOBALS['mosConfig_absolute_path'] . '/administrator/includes/pageNavigation.php' ); $pageNav = new mosPageNav( $total, $limitstart, $limit ); $levellist = mosHTML::integerSelectList( 1, 20, 1, 'levellimit', 'size="1" onchange="document.adminForm.submit();"', $levellimit ); // slice out elements based on limits $list = array_slice( $list, $pageNav->limitstart, $pageNav->limit ); $i = 0; foreach ( $list as $mitem ) { $edit = ''; switch ( $mitem->type ) { case 'separator': case 'component_item_link': break; case 'url': if ( eregi( 'index.php\?', $mitem->link ) ) { if ( !eregi( 'Itemid=', $mitem->link ) ) { $mitem->link .= '&Itemid='. $mitem->id; } } break; case 'newsfeed_link': $edit = 'index2.php?option=com_newsfeeds&task=edit&hidemainmenu=1A&id=' . $mitem->componentid; $list[$i]->descrip = 'Edit this Newsfeed'; $mitem->link .= '&Itemid='. $mitem->id; break; case 'contact_item_link': $edit = 'index2.php?option=com_contact&task=editA&hidemainmenu=1&id=' . $mitem->componentid; $list[$i]->descrip = 'Edit this Contact'; $mitem->link .= '&Itemid='. $mitem->id; break; case 'content_item_link': $edit = 'index2.php?option=com_content&task=edit&hidemainmenu=1&id=' . $mitem->componentid; $list[$i]->descrip = 'Edit this Content'; break; case 'content_typed': $edit = 'index2.php?option=com_typedcontent&task=edit&hidemainmenu=1&id='. $mitem->componentid; $list[$i]->descrip = 'Edit this Static Content'; break; default: $mitem->link .= '&Itemid='. $mitem->id; break; } $list[$i]->link = $mitem->link; $list[$i]->edit = $edit; $i++; } $i = 0; foreach ( $list as $row ) { // pulls name and description from menu type xml $row = ReadMenuXML( $row->type, $row->com_name ); $list[$i]->type = $row[0]; if (!isset($list[$i]->descrip)) $list[$i]->descrip = $row[1]; $i++; } HTML_menusections::showMenusections( $list, $pageNav, $search, $levellist, $menutype, $option ); } /** * Displays a selection list for menu item types */ function addMenuItem( &$cid, $menutype, $option, $task ) { global $mosConfig_absolute_path; $types = array(); // list of directories $dirs = mosReadDirectory( $mosConfig_absolute_path .'/administrator/components/com_menus' ); // load files for menu types foreach ( $dirs as $dir ) { // needed within menu type .php files $type = $dir; $dir = $mosConfig_absolute_path .'/administrator/components/com_menus/'. $dir; if ( is_dir( $dir ) ) { $files = mosReadDirectory( $dir, ".\.menu\.php$" ); foreach ($files as $file) { require_once( "$dir/$file" ); // type of menu type $types[]->type = $type; } } } $i = 0; foreach ( $types as $type ) { // pulls name and description from menu type xml $row = ReadMenuXML( $type->type ); $types[$i]->name = $row[0]; $types[$i]->descrip = $row[1]; $types[$i]->group = $row[2]; $i++; } // sort array of objects alphabetically by name of menu type SortArrayObjects( $types, 'name', 1 ); // split into Content $i = 0; foreach ( $types as $type ) { if ( strstr( $type->group, 'Content' ) ) { $types_content[] = $types[$i]; } $i++; } // split into Links $i = 0; foreach ( $types as $type ) { if ( strstr( $type->group, 'Link' ) ) { $types_link[] = $types[$i]; } $i++; } // split into Component $i = 0; foreach ( $types as $type ) { if ( strstr( $type->group, 'Component' ) ) { $types_component[] = $types[$i]; } $i++; } // split into Other $i = 0; foreach ( $types as $type ) { if ( strstr( $type->group, 'Other' ) || !$type->group ) { $types_other[] = $types[$i]; } $i++; } HTML_menusections::addMenuItem( $cid, $menutype, $option, $types_content, $types_component, $types_link, $types_other ); } /** * Generic function to save the menu */ function saveMenu( $option, $task='save' ) { global $database; $params = mosGetParam( $_POST, 'params', '' ); if (is_array( $params )) { $txt = array(); foreach ($params as $k=>$v) { $txt[] = "$k=$v"; } $_POST['params'] = mosParameters::textareaHandling( $txt ); } $row = new mosMenu( $database ); if (!$row->bind( $_POST )) { echo "\n"; exit(); } if (!$row->check()) { echo "\n"; exit(); } if (!$row->store()) { echo "\n"; exit(); } $row->checkin(); $row->updateOrder( "menutype='$row->menutype' AND parent='$row->parent'" ); $msg = 'Menu item Saved'; switch ( $task ) { case 'apply': mosRedirect( 'index2.php?option='. $option .'&menutype='. $row->menutype .'&task=edit&id='. $row->id . '&hidemainmenu=1' , $msg ); break; case 'save': default: mosRedirect( 'index2.php?option='. $option .'&menutype='. $row->menutype, $msg ); break; } } /** * Publishes or Unpublishes one or more menu sections * @param database A database connector object * @param string The name of the category section * @param array An array of id numbers * @param integer 0 if unpublishing, 1 if publishing */ function publishMenuSection( $cid=null, $publish=1 ) { global $database, $mosConfig_absolute_path; if (!is_array( $cid ) || count( $cid ) < 1) { return 'Select an item to ' . ($publish ? 'publish' : 'unpublish'); } $menu = new mosMenu( $database ); foreach ($cid as $id) { $menu->load( $id ); $menu->published = $publish; if (!$menu->check()) { return $menu->getError(); } if (!$menu->store()) { return $menu->getError(); } if ($menu->type) { $database = &$database; $task = $publish ? 'publish' : 'unpublish'; require( $mosConfig_absolute_path . '/administrator/components/com_menus/' . $menu->type . '/' . $menu->type . '.menu.php' ); } } return null; } /** * Trashes a menu record */ function TrashMenuSection( $cid=NULL ) { global $database; $state = "-2"; //seperate contentids $cids = implode( ',', $cid ); $query = "UPDATE #__menu SET published = '". $state ."', ordering = '0'" . "\n WHERE id IN ( ". $cids ." )" ; $database->setQuery( $query ); if ( !$database->query() ) { echo "\n"; exit(); } $total = count( $cid ); $msg = $total ." Item(s) sent to the Trash"; return $msg; } /** * Cancels an edit operation */ function cancelMenu( $option ) { global $database; $menu = new mosMenu( $database ); $menu->bind( $_POST ); $menuid = mosGetParam( $_POST, 'menuid', 0 ); if ( $menuid ) { $menu->id = $menuid; } $menu->checkin(); /* if ( $menu->type == 'content_typed' ) { $contentid = mosGetParam( $_POST, 'id', 0 ); $content = new mosContent( $database ); $content->load( $contentid ); $content->checkin(); } */ mosRedirect( 'index2.php?option='. $option .'&menutype='. $menu->menutype ); } /** * Moves the order of a record * @param integer The increment to reorder by */ function orderMenu( $uid, $inc, $option ) { global $database; $row = new mosMenu( $database ); $row->load( $uid ); $row->move( $inc, 'menutype="'. $row->menutype .'" AND parent="'. $row->parent .'"' ); mosRedirect( 'index2.php?option='. $option .'&menutype='. $row->menutype ); } /** * changes the access level of a record * @param integer The increment to reorder by */ function accessMenu( $uid, $access, $option, $menutype ) { global $database; $menu = new mosMenu( $database ); $menu->load( $uid ); $menu->access = $access; if (!$menu->check()) { return $menu->getError(); } if (!$menu->store()) { return $menu->getError(); } mosRedirect( 'index2.php?option='. $option .'&menutype='. $menutype ); } /** * Form for moving item(s) to a specific menu */ function moveMenu( $option, $cid, $menutype ) { global $database; if (!is_array( $cid ) || count( $cid ) < 1) { echo "\n"; exit; } ## query to list selected menu items $cids = implode( ',', $cid ); $query = "SELECT a.name FROM #__menu AS a WHERE a.id IN ( ". $cids ." )"; $database->setQuery( $query ); $items = $database->loadObjectList(); ## query to choose menu $query = "SELECT a.params FROM #__modules AS a WHERE a.module = 'mod_mainmenu' ORDER BY a.title"; $database->setQuery( $query ); $modules = $database->loadObjectList(); foreach ( $modules as $module) { $params = mosParseParams( $module->params ); // adds menutype to array $type = trim( @$params->menutype ); $menu[] = mosHTML::makeOption( $type, $type ); } // build the html select list $MenuList = mosHTML::selectList( $menu, 'menu', 'class="inputbox" size="10"', 'value', 'text', null ); HTML_menusections::moveMenu( $option, $cid, $MenuList, $items, $menutype ); } /** * Add all descendants to list of meni id's */ function addDescendants($id, &$cid) { global $database; $database->setQuery("SELECT id FROM #__menu WHERE parent=$id"); $rows = $database->loadObjectList(); if ($database->getErrorNum()) { echo "\n"; exit(); } // if foreach ($rows as $row) { $found = false; foreach ($cid as $idx) if ($idx == $row->id) { $found = true; break; } // if if (!$found) $cid[] = $row->id; addDescendants($row->id, $cid); } // foreach } // addDescendants /** * Save the item(s) to the menu selected */ function moveMenuSave( $option, $cid, $menu, $menutype ) { global $database, $my; // add all decendants to the list foreach ($cid as $id) addDescendants($id, $cid); $row = new mosMenu( $database ); $ordering = 1000000; $firstroot = 0; foreach ($cid as $id) { $row->load( $id ); // is it moved together with his parent? $found = false; if ($row->parent != 0) foreach ($cid as $idx) if ($idx == $row->parent) { $found = true; break; } // if if (!$found) { $row->parent = 0; $row->ordering = $ordering++; if (!$firstroot) $firstroot = $row->id; } // if $row->menutype = $menu; if ( !$row->store() ) { echo "\n"; exit(); } // if } // foreach if ($firstroot) { $row->load( $firstroot ); $row->updateOrder( "menutype='". $row->menutype ."' AND parent='". $row->parent ."'" ); } // if $msg = count($cid) .' Menu Items moved to '. $menu; mosRedirect( 'index2.php?option='. $option .'&menutype='. $menutype .'&mosmsg='. $msg ); } // moveMenuSave /** * Form for copying item(s) to a specific menu */ function copyMenu( $option, $cid, $menutype ) { global $database; if (!is_array( $cid ) || count( $cid ) < 1) { echo "\n"; exit; } ## query to list selected menu items $cids = implode( ',', $cid ); $query = "SELECT a.name FROM #__menu AS a WHERE a.id IN ( ". $cids ." )"; $database->setQuery( $query ); $items = $database->loadObjectList(); $menuTypes = mosAdminMenus::menutypes(); foreach ( $menuTypes as $menuType ) { $menu[] = mosHTML::makeOption( $menuType, $menuType ); } // build the html select list $MenuList = mosHTML::selectList( $menu, 'menu', 'class="inputbox" size="10"', 'value', 'text', null ); HTML_menusections::copyMenu( $option, $cid, $MenuList, $items, $menutype ); } /** * Save the item(s) to the menu selected */ function copyMenuSave( $option, $cid, $menu, $menutype ) { global $database; $curr = new mosMenu( $database ); $cidref = array(); foreach( $cid as $id ) { $curr->load( $id ); $curr->id = NULL; if ( !$curr->store() ) { echo "\n"; exit(); } $cidref[] = array($id, $curr->id); } foreach ( $cidref as $ref ) { $curr->load( $ref[1] ); if ($curr->parent!=0) { $found = false; foreach ( $cidref as $ref2 ) if ($curr->parent == $ref2[0]) { $curr->parent = $ref2[1]; $found = true; break; } // if if (!$found && $curr->menutype!=$menu) $curr->parent = 0; } // if $curr->menutype = $menu; $curr->ordering = '9999'; if ( !$curr->store() ) { echo "\n"; exit(); } $curr->updateOrder( "menutype='". $curr->menutype ."' AND parent='". $curr->parent ."'" ); } // foreach $msg = count( $cid ) .' Menu Items Copied to '. $menu; mosRedirect( 'index2.php?option='. $option .'&menutype='. $menutype .'&mosmsg='. $msg ); } function ReadMenuXML( $type, $component=-1 ) { global $mosConfig_absolute_path; // xml file for module $xmlfile = $mosConfig_absolute_path .'/administrator/components/com_menus/'. $type .'/'. $type .'.xml'; $parser = new mosXMLDescription ($xmlfile); $name = $parser->getName('menu'); $descrip = $parser->getDescription('menu'); $group = $parser->getGroup('menu'); if ( ( $component <> -1 ) && ( $name == 'Component') ) { $name .= ' - '. $component; } $row[0] = $name; $row[1] = $descrip; $row[2] = $group; return $row; } function saveOrder( &$cid, $menutype ) { global $database; $total = count( $cid ); $order = mosGetParam( $_POST, 'order', array(0) ); $row = new mosMenu( $database ); $conditions = array(); // update ordering values for( $i=0; $i < $total; $i++ ) { $row->load( $cid[$i] ); if ($row->ordering != $order[$i]) { $row->ordering = $order[$i]; if (!$row->store()) { echo "\n"; exit(); } // remember to updateOrder this group $condition = "menutype = '$menutype' AND parent = '$row->parent' AND published >= 0"; $found = false; foreach ( $conditions as $cond ) if ($cond[1]==$condition) { $found = true; break; } // if if (!$found) $conditions[] = array($row->id, $condition); } // for } // for // execute updateOrder for each group foreach ( $conditions as $cond ) { $row->load( $cond[0] ); $row->updateOrder( $cond[1] ); } // foreach $msg = 'New ordering saved'; mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype, $msg ); } // saveOrder function mosTreeRecurse( $id, $indent, $list, &$children, $maxlevel=9999, $level=0, $type=1 ) { if (@$children[$id] && $level <= $maxlevel) { foreach ($children[$id] as $v) { $id = $v->id; if ( $type ) { $pre = 'L '; $spacer = '.      '; } else { $pre = '- '; $spacer = '  '; } if ( $v->parent == 0 ) { $txt = $v->name; } else { $txt = $pre . $v->name; } $pt = $v->parent; $list[$id] = $v; $list[$id]->treename = "$indent$txt"; $list[$id]->children = count( @$children[$id] ); $list = mosTreeRecurse( $id, $indent . $spacer, $list, $children, $maxlevel, $level+1, $type ); } } return $list; } ?>