| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2011, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Menu widget | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Widget | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @copyright 2011 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     // This check helps protect against security problems;
 | 
					
						
							|  |  |  |     // your code file can't be executed directly from the web.
 | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Superclass for menus | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  General | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @copyright 2011 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Menu extends Widget | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     var $action     = null; | 
					
						
							|  |  |  |     var $actionName = null; | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |     var $actionArgs = null; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Construction | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action current action, used for output | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2014-09-12 21:13:01 +02:00
										 |  |  |     function __construct(Action $action=null) | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         parent::__construct($action); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->action     = $action; | 
					
						
							|  |  |  |         $this->actionName = $action->trimmed('action'); | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $rtargs = $action->returnToArgs(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->actionArgs = $rtargs[1]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function getItems() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function tag() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |      | 
					
						
							|  |  |  |     function show() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $items = $this->getItems(); | 
					
						
							|  |  |  |         $tag = $this->tag(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attrs = array('class' => 'nav'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($tag)) { | 
					
						
							|  |  |  |             $attrs['id']  = 'nav_' . $tag; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |         if (Event::handle('StartNav', array($this, &$tag, &$items))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $this->out->elementStart('ul', $attrs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             foreach ($items as $item) { | 
					
						
							|  |  |  |                 list($actionName, $args, $label, $description, $id) = $item; | 
					
						
							|  |  |  |                 $this->item($actionName, $args, $label, $description, $id); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |             $this->out->elementEnd('ul'); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             Event::handle('EndNav', array($this, $tag, $items)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2014-09-12 21:13:01 +02:00
										 |  |  |     function item($actionName, array $args, $label, $description, $id=null, $cls=null) | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (empty($id)) { | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |             $id = $this->menuItemID($actionName, $args); | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $url = common_local_url($actionName, $args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->out->menuItem($url, | 
					
						
							|  |  |  |                              $label, | 
					
						
							|  |  |  |                              $description, | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |                              $this->isCurrent($actionName, $args), | 
					
						
							| 
									
										
										
										
											2011-07-06 18:40:02 -04:00
										 |  |  |                              $id, | 
					
						
							|  |  |  |                              $cls); | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 21:13:01 +02:00
										 |  |  |     function isCurrent($actionName, array $args) | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-07-06 11:10:08 -04:00
										 |  |  |         if ($actionName != $this->actionName) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($this->actionArgs as $k => $v) { | 
					
						
							|  |  |  |             if (!array_key_exists($k, $args) || $args[$k] != $v) { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     function menuItemID($actionName, $args = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $id = sprintf('nav_%s', $actionName); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         if (!is_null($args)) { | 
					
						
							|  |  |  |             foreach ($args as $key => $value) { | 
					
						
							|  |  |  |                 $id .= '_' . $key . '_' . $value; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-07-06 11:19:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $id; | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-01 06:29:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function submenu($label, $menu) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-02-14 17:32:35 +01:00
										 |  |  |         if (Event::handle('StartSubMenu', array($this->action, $menu, $label))) { | 
					
						
							|  |  |  |             $this->action->elementStart('li'); | 
					
						
							|  |  |  |             $this->action->element('h3', null, $label); | 
					
						
							|  |  |  |             $menu->show(); | 
					
						
							|  |  |  |             $this->action->elementEnd('li'); | 
					
						
							|  |  |  |             Event::handle('EndSubMenu', array($this->action, $menu, $label)); | 
					
						
							| 
									
										
										
										
											2015-02-13 16:26:41 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-03-01 06:29:24 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-01 05:45:38 -05:00
										 |  |  | } |