?
Path : /home/admin/public_html/old/board/administrator/components/com_menus/models/ |
Current File : /home/admin/public_html/old/board/administrator/components/com_menus/models/list.php |
<?php /** * @version $Id: list.php 19343 2010-11-03 18:12:02Z ian $ * @package Joomla * @subpackage Menus * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. * @license GNU/GPL, see LICENSE.php * Joomla! is free software. This version may have been modified pursuant to the * GNU General Public License, and as distributed it includes or is derivative * of works licensed under the GNU General Public License or other free or open * source software licenses. See COPYRIGHT.php for copyright notices and * details. */ // Check to ensure this file is included in Joomla! defined('_JEXEC') or die( 'Restricted access' ); jimport( 'joomla.application.component.model' ); /** * @package Joomla * @subpackage Menus */ class MenusModelList extends JModel { /** @var object JTable object */ var $_table = null; var $_pagination = null; /** * Returns the internal table object * @return JTable */ function &getTable() { if ($this->_table == null) { $this->_table =& JTable::getInstance( 'menu'); } return $this->_table; } function &getItems() { global $mainframe; static $items; if (isset($items)) { return $items; } $db =& $this->getDBO(); $menutype = $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'menutype' ); $filter_order = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_order', 'filter_order', 'm.ordering', 'cmd' ); $filter_order_Dir = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_order_Dir', 'filter_order_Dir', 'ASC', 'word' ); $filter_state = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_state', 'filter_state', '', 'word' ); $limit = $mainframe->getUserStateFromRequest( 'global.list.limit', 'limit', $mainframe->getCfg( 'list_limit' ), 'int' ); $limitstart = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.limitstart', 'limitstart', 0, 'int' ); $levellimit = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.levellimit', 'levellimit', 10, 'int' ); $search = $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.search', 'search', '', 'string' ); if (strpos($search, '"') !== false) { $search = str_replace(array('=', '<'), '', $search); } $search = JString::strtolower($search); $and = ''; if ( $filter_state ) { if ( $filter_state == 'P' ) { $and = ' AND m.published = 1'; } else if ($filter_state == 'U' ) { $and = ' AND m.published = 0'; } } // ensure $filter_order has a good value if (!in_array($filter_order, array('m.name', 'm.published', 'm.ordering', 'groupname', 'm.type', 'm.id'))) { $filter_order = 'm.ordering'; } if (!in_array(strtoupper($filter_order_Dir), array('ASC', 'DESC', ''))) { $filter_order_Dir = 'ASC'; } // just in case filter_order get's messed up if ($filter_order) { $orderby = ' ORDER BY '.$filter_order .' '. $filter_order_Dir .', m.parent, m.ordering'; } else { $orderby = ' ORDER BY m.parent, m.ordering'; } // select the records // note, since this is a tree we have to do the limits code-side if ($search) { $query = 'SELECT m.id' . ' FROM #__menu AS m' . ' WHERE menutype = '.$db->Quote($menutype) . ' AND LOWER( m.name ) LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false ) . $and; $db->setQuery( $query ); $search_rows = $db->loadResultArray(); } $query = 'SELECT m.*, u.name AS editor, g.name AS groupname, c.publish_up, c.publish_down, com.name AS com_name' . ' FROM #__menu AS m' . ' LEFT JOIN #__users AS u ON u.id = m.checked_out' . ' LEFT JOIN #__groups AS g ON g.id = m.access' . ' LEFT JOIN #__content AS c ON c.id = m.componentid AND m.type = "content_typed"' . ' LEFT JOIN #__components AS com ON com.id = m.componentid AND m.type = "component"' . ' WHERE m.menutype = '.$db->Quote($menutype) . ' AND m.published != -2' . $and . $orderby; $db->setQuery( $query ); $rows = $db->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 = JHTML::_('menu.treerecurse', 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 ); jimport('joomla.html.pagination'); $this->_pagination = new JPagination( $total, $limitstart, $limit ); // slice out elements based on limits $list = array_slice( $list, $this->_pagination->limitstart, $this->_pagination->limit ); $i = 0; $query = array(); foreach ( $list as $mitem ) { $edit = ''; switch ( $mitem->type ) { case 'separator': $list[$i]->descrip = JText::_('Separator'); break; case 'url': $list[$i]->descrip = JText::_('URL'); break; case 'menulink': $list[$i]->descrip = JText::_('Menu Link'); break; case 'component': $list[$i]->descrip = JText::_('Component'); $query = parse_url($list[$i]->link); $view = array(); if(isset($query['query'])) { if(strpos($query['query'], '&') !== false) { $query['query'] = str_replace('&','&',$query['query']); } parse_str($query['query'], $view); } $list[$i]->view = JText::_($list[$i]->com_name); if (isset($view['view'])) { $list[$i]->view .= ' » '.JText::_(ucfirst($view['view'])); } if (isset($view['layout'])) { $list[$i]->view .= ' / '.JText::_(ucfirst($view['layout'])); } if (isset($view['task']) && !isset($view['view'])) { $list[$i]->view .= ' :: '.JText::_(ucfirst($view['task'])); } break; default: $list[$i]->descrip = JText::_('Unknown'); break; } $i++; } $items = $list; return $items; } function &getPagination() { if ($this->_pagination == null) { $this->getItems(); } return $this->_pagination; } /** * Form for copying item(s) to a specific menu */ function getItemsFromRequest() { static $items; if (isset($items)) { return $items; } $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); JArrayHelper::toInteger($cid); if (count($cid) < 1) { $this->setError(JText::_( 'Select an item to move')); return false; } // Query to list the selected menu items $db =& $this->getDBO(); $cids = implode( ',', $cid ); $query = 'SELECT `id`, `name`' . ' FROM `#__menu`' . ' WHERE `id` IN ( '.$cids.' )'; $db->setQuery( $query ); $items = $db->loadObjectList(); return $items; } /** * Gets the componet table object related to this menu item */ function &getComponent() { $id = $this->_table->componentid; $component = & JTable::getInstance( 'component'); $component->load( $id ); return $component; } /** * Save the item(s) to the menu selected */ function copy( $items, $menu ) { $curr =& JTable::getInstance('menu'); $itemref = array(); foreach ($items as $id) { $curr->load( $id ); $curr->id = NULL; $curr->home = 0; if ( !$curr->store() ) { $this->setError($curr->getError()); return false; } $itemref[] = array($id, $curr->id); } foreach ($itemref as $ref) { $curr->load( $ref[1] ); if ($curr->parent!=0) { $found = false; foreach ( $itemref as $ref2 ) { if ($curr->parent == $ref2[0]) { $curr->parent = $ref2[1]; $found = true; break; } // if } if (!$found && $curr->menutype!=$menu) { $curr->parent = 0; } } $curr->menutype = $menu; $curr->ordering = '9999'; $curr->home = 0; if ( !$curr->store() ) { $this->setError($curr->getError()); return false; } $curr->reorder( 'menutype = '.$this->_db->Quote($curr->menutype).' AND parent = '.(int) $curr->parent ); } // foreach //Now, we need to rebuild sublevels... $this->_rebuildSubLevel(); // clean cache MenusHelper::cleanCache(); return true; } function move($items, $menu) { // Add all children to the list foreach ($items as $id) { $this->_addChildren($id, $items); } $row =& $this->getTable(); $ordering = 1000000; $firstroot = 0; foreach ($items as $id) { $row->load( $id ); // is it moved together with his parent? $found = false; if ($row->parent != 0) { foreach ($items 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() ) { $this->setError($row->getError()); return false; } // if } // foreach if ($firstroot) { $row->load( $firstroot ); $row->reorder( 'menutype = '.$this->_db->Quote($row->menutype).' AND parent = '.(int) $row->parent ); } // if //Rebuild sublevel $this->_rebuildSubLevel(); // clean cache MenusHelper::cleanCache(); return true; } function toTrash($items) { $db =& $this->getDBO(); $nd = $db->getNullDate(); $state = -2; $row =& $this->getTable(); $default = 0; // Add all children to the list foreach ($items as $id) { //Check if it's the default item $row->load( $id ); if ($row->home != 1) { $this->_addChildren($id, $items); } else { unset($items[$default]); JError::raiseWarning( 'SOME_ERROR_CODE', JText::_('You cannot trash the default menu item')); } $default++; } if (!empty($items)) { // Sent menu items to the trash JArrayHelper::toInteger($items, array(0)); $where = ' WHERE (id = ' . implode( ' OR id = ', $items ) . ') AND home = 0'; $query = 'UPDATE #__menu' . ' SET published = '.(int) $state.', parent = 0, ordering = 0, checked_out = 0, checked_out_time = '.$db->Quote($nd) . $where; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } } // clean cache MenusHelper::cleanCache(); return count($items); } function fromTrash($items) { $db =& $this->getDBO(); $nd = $db->getNullDate(); $state = 0; // Add all children to the list foreach ($items as $id) { $this->_addChildren($id, $items); } // Sent menu items to the trash JArrayHelper::toInteger($items, array(0)); $where = ' WHERE id = ' . implode( ' OR id = ', $items ); $query = 'UPDATE #__menu' . ' SET published = '.(int) $state.', parent = 0, ordering = 99999, checked_out = 0, checked_out_time = '.$db->Quote($nd) . $where; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } // clean cache (require helper because method can be called from com_trash) require_once( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_menus'.DS.'helpers'.DS.'helper.php' ); MenusHelper::cleanCache(); return count($items); } /** * Set the state of selected menu items */ function setHome( $item ) { $db =& $this->getDBO(); // Clear home field for all other items $query = 'UPDATE #__menu' . ' SET home = 0' . ' WHERE 1'; $db->setQuery( $query ); if ( !$db->query() ) { $this->setError($db->getErrorMsg()); return false; } // Set the given item to home $query = 'UPDATE #__menu' . ' SET home = 1' . ' WHERE id = '.(int) $item; $db->setQuery( $query ); if ( !$db->query() ) { $this->setError($db->getErrorMsg()); return false; } // clean cache MenusHelper::cleanCache(); return true; } /** * Set the state of selected menu items */ function setItemState( $items, $state ) { if(is_array($items)) { $row =& $this->getTable(); foreach ($items as $id) { $row->load( $id ); if ($row->home != 1) { $row->published = $state; if ($state != 1) { // Set any alias menu types to not point to unpublished menu items $db = &$this->getDBO(); $query = 'UPDATE #__menu SET link = 0 WHERE type = \'menulink\' AND link = '.(int)$id; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } } if (!$row->check()) { $this->setError($row->getError()); return false; } if (!$row->store()) { $this->setError($row->getError()); return false; } } else { JError::raiseWarning( 'SOME_ERROR_CODE', JText::_('You cannot unpublish the default menu item')); return false; } } } // clean cache MenusHelper::cleanCache(); return true; } /** * Set the access of selected menu items */ function setAccess( $items, $access ) { $row =& $this->getTable(); foreach ($items as $id) { $row->load( $id ); $row->access = $access; // Set any alias menu types to not point to unpublished menu items $db = &$this->getDBO(); $query = 'UPDATE #__menu SET link = 0 WHERE type = \'menulink\' AND access < '.(int)$access.' AND link = '.(int)$id; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } if (!$row->check()) { $this->setError($row->getError()); return false; } if (!$row->store()) { $this->setError($row->getError()); return false; } } // clean cache MenusHelper::cleanCache(); return true; } function orderItem($item, $movement) { $row =& $this->getTable(); $row->load( $item ); if (!$row->move( $movement, 'menutype = '.$this->_db->Quote($row->menutype).' AND parent = '.(int) $row->parent )) { $this->setError($row->getError()); return false; } // clean cache MenusHelper::cleanCache(); return true; } function setOrder($items, $menutype) { $total = count( $items ); $row =& $this->getTable(); $groupings = array(); $order = JRequest::getVar( 'order', array(), 'post', 'array' ); JArrayHelper::toInteger($order); // update ordering values for( $i=0; $i < $total; $i++ ) { $row->load( $items[$i] ); // track parents $groupings[] = $row->parent; if ($row->ordering != $order[$i]) { $row->ordering = $order[$i]; if (!$row->store()) { $this->setError($row->getError()); return false; } } // if } // for // execute updateOrder for each parent group $groupings = array_unique( $groupings ); foreach ($groupings as $group){ $row->reorder('menutype = '.$this->_db->Quote($menutype).' AND parent = '.(int) $group.' AND published >=0'); } // clean cache MenusHelper::cleanCache(); return true; } /** * Delete one or more menu items * @param mixed int or array of id values */ function delete( $ids ) { JArrayHelper::toInteger($ids); if (!empty( $ids )) { // Add all children to the list foreach ($ids as $id) { $this->_addChildren($id, $ids); } $db = &$this->getDBO(); // Delete associated module and template mappings $where = 'WHERE menuid = ' . implode( ' OR menuid = ', $ids ); $query = 'DELETE FROM #__modules_menu ' . $where; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $menuTable->getErrorMsg() ); return false; } $query = 'DELETE FROM #__templates_menu ' . $where; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $menuTable->getErrorMsg() ); return false; } // Set any alias menu types to not point to missing menu items $query = 'UPDATE #__menu SET link = 0 WHERE type = \'menulink\' AND (link = '.implode( ' OR id = ', $ids ).')'; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } // Delete the menu items $where = 'WHERE id = ' . implode( ' OR id = ', $ids ); $query = 'DELETE FROM #__menu ' . $where; $db->setQuery( $query ); if (!$db->query()) { $this->setError( $db->getErrorMsg() ); return false; } } // clean cache MenusHelper::cleanCache(); return true; } /** * Delete menu items by type */ function deleteByType( $type = '' ) { $db = &$this->getDBO(); $query = 'SELECT id' . ' FROM #__menu' . ' WHERE menutype = ' . $db->Quote( $type ); $db->setQuery( $query ); $ids = $db->loadResultArray(); if ($db->getErrorNum()) { $this->setError( $db->getErrorMsg() ); return false; } return $this->delete( $ids ); } function _addChildren($id, &$list) { // Initialize variables $return = true; // Get all rows with parent of $id $db =& $this->getDBO(); $query = 'SELECT id' . ' FROM #__menu' . ' WHERE parent = '.(int) $id; $db->setQuery( $query ); $rows = $db->loadObjectList(); // Make sure there aren't any errors if ($db->getErrorNum()) { $this->setError($db->getErrorMsg()); return false; } // Recursively iterate through all children... kinda messy // TODO: Cleanup this method foreach ($rows as $row) { $found = false; foreach ($list as $idx) { if ($idx == $row->id) { $found = true; break; } } if (!$found) { $list[] = $row->id; } $return = $this->_addChildren($row->id, $list); } return $return; } /* * Rebuild the sublevel field for items in the menu (if called with 2nd param = 0 or no params, it will rebuild entire menu tree's sublevel * @param array of menu item ids to change level to * @param int level to set the menu items to (based on parent */ function _rebuildSubLevel($cid = array(0), $level = 0) { JArrayHelper::toInteger($cid, array(0)); $db =& $this->getDBO(); $ids = implode( ',', $cid ); $cids = array(); if($level == 0) { $query = 'UPDATE #__menu SET sublevel = 0 WHERE parent = 0'; $db->setQuery($query); $db->query(); $query = 'SELECT id FROM #__menu WHERE parent = 0'; $db->setQuery($query); $cids = $db->loadResultArray(0); } else { $query = 'UPDATE #__menu SET sublevel = '.(int) $level .' WHERE parent IN ('.$ids.')'; $db->setQuery( $query ); $db->query(); $query = 'SELECT id FROM #__menu WHERE parent IN ('.$ids.')'; $db->setQuery( $query ); $cids = $db->loadResultArray( 0 ); } if (!empty( $cids )) { $this->_rebuildSubLevel( $cids, $level + 1 ); } } }