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

358 lines
8.4 KiB
PHP

<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @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;
/**
* Utility class working with menu select lists
*
* @package Joomla.Libraries
* @subpackage HTML
* @since 1.5
*/
abstract class JHtmlMenu
{
/**
* Cached array of the menus.
*
* @var array
* @since 1.6
*/
protected static $menus = null;
/**
* Cached array of the menus items.
*
* @var array
* @since 1.6
*/
protected static $items = null;
/**
* Get a list of the available menus.
*
* @return string
*
* @since 1.6
*/
public static function menus()
{
if (empty(static::$menus))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('menutype AS value, title AS text')
->from($db->quoteName('#__menu_types'))
->order('title');
$db->setQuery($query);
static::$menus = $db->loadObjectList();
}
return static::$menus;
}
/**
* Returns an array of menu items grouped by menu.
*
* @param array $config An array of configuration options.
*
* @return array
*
* @since 1.6
*/
public static function menuitems($config = array())
{
if (empty(static::$items))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('menutype AS value, title AS text')
->from($db->quoteName('#__menu_types'))
->order('title');
$db->setQuery($query);
$menus = $db->loadObjectList();
$query->clear()
->select('a.id AS value, a.title AS text, a.level, a.menutype')
->from('#__menu AS a')
->where('a.parent_id > 0')
->where('a.type <> ' . $db->quote('url'))
->where('a.client_id = 0');
// Filter on the published state
if (isset($config['published']))
{
if (is_numeric($config['published']))
{
$query->where('a.published = ' . (int) $config['published']);
}
elseif ($config['published'] === '')
{
$query->where('a.published IN (0,1)');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Collate menu items based on menutype
$lookup = array();
foreach ($items as &$item)
{
if (!isset($lookup[$item->menutype]))
{
$lookup[$item->menutype] = array();
}
$lookup[$item->menutype][] = &$item;
$item->text = str_repeat('- ', $item->level) . $item->text;
}
static::$items = array();
foreach ($menus as &$menu)
{
// Start group:
static::$items[] = JHtml::_('select.optgroup', $menu->text);
// Special "Add to this Menu" option:
static::$items[] = JHtml::_('select.option', $menu->value . '.1', JText::_('JLIB_HTML_ADD_TO_THIS_MENU'));
// Menu items:
if (isset($lookup[$menu->value]))
{
foreach ($lookup[$menu->value] as &$item)
{
static::$items[] = JHtml::_('select.option', $menu->value . '.' . $item->value, $item->text);
}
}
// Finish group:
static::$items[] = JHtml::_('select.optgroup', $menu->text);
}
}
return static::$items;
}
/**
* Displays an HTML select list of menu items.
*
* @param string $name The name of the control.
* @param string $selected The value of the selected option.
* @param string $attribs Attributes for the control.
* @param array $config An array of options for the control.
*
* @return string
*
* @since 1.6
*/
public static function menuitemlist($name, $selected = null, $attribs = null, $config = array())
{
static $count;
$options = static::menuitems($config);
return JHtml::_(
'select.genericlist', $options, $name,
array(
'id' => isset($config['id']) ? $config['id'] : 'assetgroups_' . (++$count),
'list.attr' => (is_null($attribs) ? 'class="inputbox" size="1"' : $attribs),
'list.select' => (int) $selected,
'list.translate' => false
)
);
}
/**
* Build the select list for Menu Ordering
*
* @param object &$row The row object
* @param integer $id The id for the row. Must exist to enable menu ordering
*
* @return string
*
* @since 1.5
*/
public static function ordering(&$row, $id)
{
if ($id)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('ordering AS value, title AS text')
->from($db->quoteName('#__menu'))
->where($db->quoteName('menutype') . ' = ' . $db->quote($row->menutype))
->where($db->quoteName('parent_id') . ' = ' . (int) $row->parent_id)
->where($db->quoteName('published') . ' != -2')
->order('ordering');
$order = JHtml::_('list.genericordering', $query);
$ordering = JHtml::_(
'select.genericlist', $order, 'ordering',
array('list.attr' => 'class="inputbox" size="1"', 'list.select' => (int) $row->ordering)
);
}
else
{
$ordering = '<input type="hidden" name="ordering" value="' . $row->ordering . '" />' . JText::_('JGLOBAL_NEWITEMSLAST_DESC');
}
return $ordering;
}
/**
* Build the multiple select list for Menu Links/Pages
*
* @param boolean $all True if all can be selected
* @param boolean $unassigned True if unassigned can be selected
*
* @return string
*
* @since 1.5
*/
public static function linkoptions($all = false, $unassigned = false)
{
$db = JFactory::getDbo();
// Get a list of the menu items
$query = $db->getQuery(true)
->select('m.id, m.parent_id, m.title, m.menutype')
->from($db->quoteName('#__menu') . ' AS m')
->where($db->quoteName('m.published') . ' = 1')
->order('m.menutype, m.parent_id, m.ordering');
$db->setQuery($query);
$mitems = $db->loadObjectList();
if (!$mitems)
{
$mitems = array();
}
// Establish the hierarchy of the menu
$children = array();
// First pass - collect children
foreach ($mitems as $v)
{
$pt = $v->parent_id;
$list = @$children[$pt] ? $children[$pt] : array();
array_push($list, $v);
$children[$pt] = $list;
}
// Second pass - get an indent list of the items
$list = static::treerecurse((int) $mitems[0]->parent_id, '', array(), $children, 9999, 0, 0);
// Code that adds menu name to Display of Page(s)
$mitems = array();
if ($all | $unassigned)
{
$mitems[] = JHtml::_('select.option', '<OPTGROUP>', JText::_('JOPTION_MENUS'));
if ($all)
{
$mitems[] = JHtml::_('select.option', 0, JText::_('JALL'));
}
if ($unassigned)
{
$mitems[] = JHtml::_('select.option', -1, JText::_('JOPTION_UNASSIGNED'));
}
$mitems[] = JHtml::_('select.option', '</OPTGROUP>');
}
$lastMenuType = null;
$tmpMenuType = null;
foreach ($list as $list_a)
{
if ($list_a->menutype != $lastMenuType)
{
if ($tmpMenuType)
{
$mitems[] = JHtml::_('select.option', '</OPTGROUP>');
}
$mitems[] = JHtml::_('select.option', '<OPTGROUP>', $list_a->menutype);
$lastMenuType = $list_a->menutype;
$tmpMenuType = $list_a->menutype;
}
$mitems[] = JHtml::_('select.option', $list_a->id, $list_a->title);
}
if ($lastMenuType !== null)
{
$mitems[] = JHtml::_('select.option', '</OPTGROUP>');
}
return $mitems;
}
/**
* Build the list representing the menu tree
*
* @param integer $id Id of the menu item
* @param string $indent The indentation string
* @param array $list The list to process
* @param array &$children The children of the current item
* @param integer $maxlevel The maximum number of levels in the tree
* @param integer $level The starting level
* @param string $type Type of link: component, URL, alias, separator
*
* @return array
*
* @since 1.5
*/
public static function treerecurse($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 = '<sup>|_</sup>&#160;';
$spacer = '.&#160;&#160;&#160;&#160;&#160;&#160;';
}
else
{
$pre = '- ';
$spacer = '&#160;&#160;';
}
if ($v->parent_id == 0)
{
$txt = $v->title;
}
else
{
$txt = $pre . $v->title;
}
$list[$id] = $v;
$list[$id]->treename = $indent . $txt;
$list[$id]->children = count(@$children[$id]);
$list = static::treerecurse($id, $indent . $spacer, $list, $children, $maxlevel, $level + 1, $type);
}
}
return $list;
}
}