--- mambo/branches/4.6/administrator/components/com_menus/admin.menus.php 2006/02/22 12:57:20 314 +++ mambo/branches/4.6/administrator/components/com_menus/admin.menus.php 2007/02/02 05:02:04 948 @@ -1,746 +1,741 @@ -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': - $msg = ''; - foreach($cid as $_id){ - $_cid = array(); - $_cid[] = $_id; - addDescendants($_id, $_cid); - $msg .= TrashMenuSection( $_cid ); - } - if ($msg) { - 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) { - $pub = $publish ? T_('publish') : T_('unpublish'); - return sprintf(T_('Select an item to %s'), $pub); - } - - $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 = sprintf(Tn_("%d Item sent to the Trash", "%d Items sent to the Trash", $total), $total); - 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) { - $pparser = new mosParameters($module->params); - $params = $pparser->getParams(); - // 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 = sprintf(Tn_('%d Menu Item moved to %s', '%d Menu Items moved to %s', count($cid)), count($cid), $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 = sprintf(Tn_('%d Menu Item Copied to %s', '%d Menu Items Copied to %s', count($cid)), count($cid), $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; - $order = mosGetParam( $_POST, 'order', array(0) ); - $row = new mosMenu( $database ); - $parents = array(); - // update ordering values - foreach ($cid as $i=>$ciditem) { - $row->load( $ciditem ); - if ($row->ordering != $order[$i]) { - $row->ordering = $order[$i]; - if (!$row->store()) { - echo "\n"; - exit(); - } - // remember to updateOrder this group - $parents[$row->parent] = $row->id; - } - } - // execute updateOrder for each group - foreach ($parents as $parent=>$rowid) { - $row->updateOrder("menutype = '$menutype' AND parent = '$parent' AND published >= 0"); - } // foreach - - $msg = T_('New ordering saved'); - mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype, $msg ); -} // saveOrder - - -?> +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 + if ($rows) 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 News Feed'; + $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) { + $pub = $publish ? T_('publish') : T_('unpublish'); + return sprintf(T_('Select an item to %s'), $pub); + } + + $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 = sprintf(Tn_("%d Item sent to the Trash", "%d Items sent to the Trash", $total), $total); + 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; + } + // sanitize + $row->id = intval($row->id); + $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) { + $pparser = new mosParameters($module->params); + $params = $pparser->getParams(); + // 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 = sprintf(Tn_('%d Menu Item moved to %s', '%d Menu Items moved to %s', count($cid)), count($cid), $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 = sprintf(Tn_('%d Menu Item Copied to %s', '%d Menu Items Copied to %s', count($cid)), count($cid), $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; + $order = mosGetParam( $_POST, 'order', array(0) ); + $row = new mosMenu( $database ); + $parents = array(); + // update ordering values + foreach ($cid as $i=>$ciditem) { + $row->load( $ciditem ); + if ($row->ordering != $order[$i]) { + $row->ordering = $order[$i]; + if (!$row->store()) { + echo "\n"; + exit(); + } + // remember to updateOrder this group + $parents[$row->parent] = $row->id; + } + } + // execute updateOrder for each group + foreach ($parents as $parent=>$rowid) { + $row->updateOrder("menutype = '$menutype' AND parent = '$parent' AND published >= 0"); + } // foreach + + $msg = T_('New ordering saved'); + mosRedirect( 'index2.php?option=com_menus&menutype='. $menutype, $msg ); +} // saveOrder + + +?>