joomla_test/libraries/legacy/menu/menu.php
2020-01-02 22:20:31 +07:00

359 lines
6.4 KiB
PHP

<?php
/**
* @package Joomla.Legacy
* @subpackage Menu
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('JPATH_PLATFORM') or die;
/**
* JMenu class
*
* @package Joomla.Legacy
* @subpackage Menu
* @since 11.1
*/
class JMenu
{
/**
* Array to hold the menu items
*
* @var array
* @since 11.1
*/
protected $_items = array();
/**
* Identifier of the default menu item
*
* @var integer
* @since 11.1
*/
protected $_default = array();
/**
* Identifier of the active menu item
*
* @var integer
* @since 11.1
*/
protected $_active = 0;
/**
* @var array JMenu instances container.
* @since 11.3
*/
protected static $instances = array();
/**
* Class constructor
*
* @param array $options An array of configuration options.
*
* @since 11.1
*/
public function __construct($options = array())
{
// Load the menu items
$this->load();
foreach ($this->_items as $item)
{
if ($item->home)
{
$this->_default[trim($item->language)] = $item->id;
}
// Decode the item params
$result = new JRegistry;
$result->loadString($item->params);
$item->params = $result;
}
}
/**
* Returns a JMenu object
*
* @param string $client The name of the client
* @param array $options An associative array of options
*
* @return JMenu A menu object.
*
* @since 11.1
*/
public static function getInstance($client, $options = array())
{
if (empty(self::$instances[$client]))
{
// Create a JMenu object
$classname = 'JMenu' . ucfirst($client);
if (!class_exists($classname))
{
// @deprecated 13.3 Everything in this block is deprecated but the warning is only logged after the file_exists
// Load the menu object
$info = JApplicationHelper::getClientInfo($client, true);
if (is_object($info))
{
$path = $info->path . '/includes/menu.php';
if (file_exists($path))
{
JLog::add('Non-autoloadable JMenu subclasses are deprecated.', JLog::WARNING, 'deprecated');
include_once $path;
}
}
}
if (class_exists($classname))
{
self::$instances[$client] = new $classname($options);
}
else
{
throw new Exception(JText::sprintf('JLIB_APPLICATION_ERROR_MENU_LOAD', $client), 500);
}
}
return self::$instances[$client];
}
/**
* Get menu item by id
*
* @param integer $id The item id
*
* @return mixed The item object, or null if not found
*
* @since 11.1
*/
public function getItem($id)
{
$result = null;
if (isset($this->_items[$id]))
{
$result = &$this->_items[$id];
}
return $result;
}
/**
* Set the default item by id and language code.
*
* @param integer $id The menu item id.
* @param string $language The language cod (since 1.6).
*
* @return boolean True, if successful
*
* @since 11.1
*/
public function setDefault($id, $language = '')
{
if (isset($this->_items[$id]))
{
$this->_default[$language] = $id;
return true;
}
return false;
}
/**
* Get the default item by language code.
*
* @param string $language The language code, default value of * means all.
*
* @return object The item object
*
* @since 11.1
*/
public function getDefault($language = '*')
{
if (array_key_exists($language, $this->_default))
{
return $this->_items[$this->_default[$language]];
}
elseif (array_key_exists('*', $this->_default))
{
return $this->_items[$this->_default['*']];
}
else
{
return 0;
}
}
/**
* Set the default item by id
*
* @param integer $id The item id
*
* @return mixed If successful the active item, otherwise null
*
* @since 11.1
*/
public function setActive($id)
{
if (isset($this->_items[$id]))
{
$this->_active = $id;
$result = &$this->_items[$id];
return $result;
}
return null;
}
/**
* Get menu item by id.
*
* @return object The item object.
*
* @since 11.1
*/
public function getActive()
{
if ($this->_active)
{
$item = &$this->_items[$this->_active];
return $item;
}
return null;
}
/**
* Gets menu items by attribute
*
* @param mixed $attributes The field name(s).
* @param mixed $values The value(s) of the field. If an array, need to match field names
* each attribute may have multiple values to lookup for.
* @param boolean $firstonly If true, only returns the first item found
*
* @return array
*
* @since 11.1
*/
public function getItems($attributes, $values, $firstonly = false)
{
$items = array();
$attributes = (array) $attributes;
$values = (array) $values;
foreach ($this->_items as $item)
{
if (!is_object($item))
{
continue;
}
$test = true;
for ($i = 0, $count = count($attributes); $i < $count; $i++)
{
if (is_array($values[$i]))
{
if (!in_array($item->$attributes[$i], $values[$i]))
{
$test = false;
break;
}
}
else
{
if ($item->$attributes[$i] != $values[$i])
{
$test = false;
break;
}
}
}
if ($test)
{
if ($firstonly)
{
return $item;
}
$items[] = $item;
}
}
return $items;
}
/**
* Gets the parameter object for a certain menu item
*
* @param integer $id The item id
*
* @return JRegistry A JRegistry object
*
* @since 11.1
*/
public function getParams($id)
{
if ($menu = $this->getItem($id))
{
return $menu->params;
}
else
{
return new JRegistry;
}
}
/**
* Getter for the menu array
*
* @return array
*
* @since 11.1
*/
public function getMenu()
{
return $this->_items;
}
/**
* Method to check JMenu object authorization against an access control
* object and optionally an access extension object
*
* @param integer $id The menu id
*
* @return boolean True if authorised
*
* @since 11.1
*/
public function authorise($id)
{
$menu = $this->getItem($id);
$user = JFactory::getUser();
if ($menu)
{
return in_array((int) $menu->access, $user->getAuthorisedViewLevels());
}
else
{
return true;
}
}
/**
* Loads the menu items
*
* @return array
*
* @since 11.1
*/
public function load()
{
return array();
}
}