|  |  |  | @ -7,6 +7,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | namespace yii\bootstrap; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | use Yii; | 
			
		
	
		
			
				
					|  |  |  |  | use yii\base\InvalidConfigException; | 
			
		
	
		
			
				
					|  |  |  |  | use yii\helpers\ArrayHelper; | 
			
		
	
		
			
				
					|  |  |  |  | use yii\helpers\Html; | 
			
		
	
	
		
			
				
					|  |  |  | @ -21,9 +22,8 @@ use yii\helpers\Html; | 
			
		
	
		
			
				
					|  |  |  |  |  *     'items' => array( | 
			
		
	
		
			
				
					|  |  |  |  |  *         array( | 
			
		
	
		
			
				
					|  |  |  |  |  *             'label' => 'Home', | 
			
		
	
		
			
				
					|  |  |  |  |  *             'url' => '/', | 
			
		
	
		
			
				
					|  |  |  |  |  *             'url' => array('site/index'), | 
			
		
	
		
			
				
					|  |  |  |  |  *             'linkOptions' => array(...), | 
			
		
	
		
			
				
					|  |  |  |  |  *             'active' => true, | 
			
		
	
		
			
				
					|  |  |  |  |  *         ), | 
			
		
	
		
			
				
					|  |  |  |  |  *         array( | 
			
		
	
		
			
				
					|  |  |  |  |  *             'label' => 'Dropdown', | 
			
		
	
	
		
			
				
					|  |  |  | @ -63,7 +63,7 @@ class Nav extends Widget | 
			
		
	
		
			
				
					|  |  |  |  | 	 * - linkOptions: array, optional, the HTML attributes of the item's link. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * - options: array, optional, the HTML attributes of the item container (LI). | 
			
		
	
		
			
				
					|  |  |  |  | 	 * - active: boolean, optional, whether the item should be on active state or not. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * - dropdown: array|string, optional, the configuration array for creating a [[Dropdown]] widget, | 
			
		
	
		
			
				
					|  |  |  |  | 	 * - items: array|string, optional, the configuration array for creating a [[Dropdown]] widget, | 
			
		
	
		
			
				
					|  |  |  |  | 	 *   or a string representing the dropdown menu. Note that Bootstrap does not support sub-dropdown menus. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $items = array(); | 
			
		
	
	
		
			
				
					|  |  |  | @ -71,6 +71,26 @@ class Nav extends Widget | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var boolean whether the nav items labels should be HTML-encoded. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $encodeLabels = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var boolean whether to automatically activate items according to whether their route setting | 
			
		
	
		
			
				
					|  |  |  |  | 	 * matches the currently requested route. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @see isItemActive | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $activateItems = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var string the route used to determine if a menu item is active or not. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * If not set, it will use the route of the current request. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @see params | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @see isItemActive | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $route; | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var array the parameters used to determine if a menu item is active or not. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * If not set, it will use `$_GET`. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @see route | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @see isItemActive | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $params; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
	
		
			
				
					|  |  |  | @ -79,6 +99,12 @@ class Nav extends Widget | 
			
		
	
		
			
				
					|  |  |  |  | 	public function init() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		parent::init(); | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->route === null && Yii::$app->controller !== null) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->route = Yii::$app->controller->getRoute(); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->params === null) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->params = $_GET; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		Html::addCssClass($this->options, 'nav'); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -124,7 +150,13 @@ class Nav extends Widget | 
			
		
	
		
			
				
					|  |  |  |  | 		$url = Html::url(ArrayHelper::getValue($item, 'url', '#')); | 
			
		
	
		
			
				
					|  |  |  |  | 		$linkOptions = ArrayHelper::getValue($item, 'linkOptions', array()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ArrayHelper::getValue($item, 'active')) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (isset($item['active'])) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$active = ArrayHelper::remove($item, 'active', false); | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			$active = $this->isItemActive($item); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($active) { | 
			
		
	
		
			
				
					|  |  |  |  | 			Html::addCssClass($options, 'active'); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -144,4 +176,31 @@ class Nav extends Widget | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return Html::tag('li', Html::a($label, $url, $linkOptions) . $items, $options); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Checks whether a menu item is active. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This is done by checking if [[route]] and [[params]] match that specified in the `url` option of the menu item. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * When the `url` option of a menu item is specified in terms of an array, its first element is treated | 
			
		
	
		
			
				
					|  |  |  |  | 	 * as the route for the item and the rest of the elements are the associated parameters. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Only when its route and parameters match [[route]] and [[params]], respectively, will a menu item | 
			
		
	
		
			
				
					|  |  |  |  | 	 * be considered active. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param array $item the menu item to be checked | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return boolean whether the menu item is active | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function isItemActive($item) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if (isset($item['url']) && is_array($item['url']) && trim($item['url'][0], '/') === $this->route) { | 
			
		
	
		
			
				
					|  |  |  |  | 			unset($item['url']['#']); | 
			
		
	
		
			
				
					|  |  |  |  | 			if (count($item['url']) > 1) { | 
			
		
	
		
			
				
					|  |  |  |  | 				foreach (array_splice($item['url'], 1) as $name => $value) { | 
			
		
	
		
			
				
					|  |  |  |  | 					if (!isset($this->params[$name]) || $this->params[$name] != $value) { | 
			
		
	
		
			
				
					|  |  |  |  | 						return false; | 
			
		
	
		
			
				
					|  |  |  |  | 					} | 
			
		
	
		
			
				
					|  |  |  |  | 				} | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			return true; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return false; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |