Your IP : 216.73.216.170


Current Path : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_zoo/classes/
Upload File :
Current File : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_zoo/classes/menu.php

<?php
/**
* @package   com_zoo
* @author    YOOtheme http://www.yootheme.com
* @copyright Copyright (C) YOOtheme GmbH
* @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
*/

/**
 * Class to deal with menus
 *
 * @package Component.Classes
 */
class AppMenu extends AppTree {

	/**
	 * The name of the menu
	 *
	 * @var string
	 * @since 2.0
	 */
	protected $_name;

	/**
	 * Class constructor
	 *
	 * @param string $name The name of the menu
	 */
	public function __construct($name) {
		parent::__construct();

		$this->_name = $name;
	}

	/**
	 * Render the menu
	 *
	 * @return string The html code for the menu
	 *
	 * @since 2.0
	 */
	public function render() {

		// create html
		$html = '<ul>';
		foreach ($this->_root->getChildren() as $child) {
			$html .= $child->render($this);
		}
		$html .= '</ul>';

		// decorator callbacks ?
		if (func_num_args()) {

			// parse html
			if ($xml = simplexml_load_string($html)) {

				foreach (func_get_args() as $callback) {
					if (is_callable($callback)) {
						$this->_map($xml, $callback);
					}
				}

				$html = $xml->asXML();
			}
		}

		return $html;
	}

	/**
	 * Call a method on evey child of the tree
	 *
	 * @param  SimpleXMLElement $xml      The xml to traverse
	 * @param  function         $callback The method to call on each child
	 * @param  array            $args     The arguments to pass on to the callback
	 *
	 * @since 2.0
	 */
	protected function _map(SimpleXMLElement $xml, $callback, $args = array()) {

		// init level
		if (!isset($args['level'])) {
			$args['level'] = 0;
		}

		// call function
		call_user_func($callback, $xml, $args);

		// raise level
		$args['level']++;

		// map to all children
		$children = $xml->children();
		if ($n = count($children)) {
			for ($i = 0; $i < $n; $i++) {
				$this->_map($children[$i], $callback, $args);
			}
		}
	}

}

/**
 * Class to represent a Menu Item
 *
 * @package Component.Classes
 */
class AppMenuItem extends AppTreeItem {

	/**
	 * Id of the menu item
	 *
	 * @var int
	 * @since 2.0
	 */
	protected $_id;

	/**
	 * Name of the menu item
	 *
	 * @var string
	 * @since 2.0
	 */
	protected $_name;

	/**
	 * Url of the menu item
	 *
	 * @var string
	 * @since 2.0
	 */
	protected $_link;

	/**
	 * Attributes to apply to the item
	 *
	 * @var array
	 * @since 2.0
	 */
	protected $_attributes;

	/**
	 * Class contructor
	 *
	 * @param int 	 $id         Id of the menu item
	 * @param string $name       Name of the menu item
	 * @param string $link       Link of the menu item
	 * @param array  $attributes List of attributes
	 */
	public function __construct($id = null, $name = '', $link = null, array $attributes = array()) {
		$this->_id		   = $id;
		$this->_name 	   = $name;
		$this->_link 	   = $link;
		$this->_attributes = $attributes;
	}

	/**
	 * Get the name of the menu Item
	 *
	 * @return string The name of the meu item
	 *
	 * @since 2.0
	 */
	public function getName() {
		return $this->_name;
	}

	/**
	 * Set the name of the menu item
	 *
	 * @param string $name The name
	 *
	 * @return AppMenuItem $this for chaining support
	 *
	 * @since 2.0
	 */
	public function setName($name) {
		$this->_name = $name;
		return $this;
	}

	/**
	 * Get the id of the menu item
	 *
	 * @return int The menu item id
	 *
	 * @since 2.0
	 */
	public function getID() {
		return $this->_id ? $this->_id : parent::getId();
	}

	/**
	 * Get an attribute for the menu item
	 *
	 * @param  string $key The key to fetch
	 *
	 * @return string      The value for the attribute
	 *
	 * @since 2.0
	 */
	public function getAttribute($key) {

		if (isset($this->_attributes[$key])) {
			return $this->_attributes[$key];
		}

		return null;
	}

	/**
	 * Set an attribute for the menu item
	 *
	 * @param string $key   The key
	 * @param string $value The value
	 *
	 * @return AppMenuItem $this for chaining support
	 *
	 * @since 2.0
	 */
	public function setAttribute($key, $value) {
		$this->_attributes[$key] = $value;
		return $this;
	}

	/**
	 * Render the single menu item
	 *
	 * @return string The html for this menu item
	 *
	 * @since 2.0
	 */
	public function render() {
		$link   = $this->app->request->getVar('hidemainmenu') ? null : $this->_link;
		$html   = array('<li '.JArrayHelper::toString($this->_attributes).'>');
		$html[] = ($link ? '<a href="'.JRoute::_($link).'">' : '<span>').'<span>'.$this->getName().'</span>'.($link ? '</a>' : '</span>');

		if (count($this->getChildren())) {
			$html[] = '<ul>';
			foreach ($this->getChildren() as $child) {
				$html[] = $child->render();
			}
			$html[] = '</ul>';
		}

		$html[] = '</li>';

		return implode("\n", $html);
	}

}

/**
 * A decorator class for the menus
 */
class AppMenuDecorator {

    /**
     * Add item index and level to class attribute
     *
     * @param  SimpleXMLElement $node The node to add the index and level to
     * @param  array            $args Callback arguments
     *
     * @since 	2.0
     */
	public static function index(SimpleXMLElement $node, $args) {

		if ($node->getName() == 'ul') {

			// set ul level
			$level = ($args['level'] / 2) + 1;
			$node->addAttribute('class', trim($node->attributes()->class.' level'.$level));

			// set order/first/last for li
			$count = count($node->children());
			foreach ($node->children() as $i => $child) {
				$child->addAttribute('level', $level);
				$child->addAttribute('order', $i + 1);
				if ($i == 0) $child->addAttribute('first', 1);
				if ($i == $count - 1) $child->addAttribute('last', 1);
			}

		}

		if ($node->getName() == 'li') {

			// level and item order
			$css  = 'level'.$node->attributes()->level;
			$css .= ' item'.$node->attributes()->order;

			// first, last and parent
			if ($node->attributes()->first) $css .= ' first';
			if ($node->attributes()->last)  $css .= ' last';
			if (isset($node->ul))           $css .= ' parent';

			// add li css classes
			$node->attributes()->class = trim($node->attributes()->class.' '.$css);

			// add a/span css classes
			$children = $node->children();
			if ($firstChild = $children[0]) {
				$firstChild->addAttribute('class', trim($firstChild->attributes()->class.' '.$css));
			}
		}

		unset($node->attributes()->level, $node->attributes()->order, $node->attributes()->first, $node->attributes()->last);

	}

}