]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - lib/menu.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / lib / menu.php
1 <?php
2 /**
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2011, StatusNet, Inc.
5  *
6  * Menu widget
7  * 
8  * PHP version 5
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Affero General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Affero General Public License for more details.
19  *
20  * You should have received a copy of the GNU Affero General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * @category  Widget
24  * @package   StatusNet
25  * @author    Evan Prodromou <evan@status.net>
26  * @copyright 2011 StatusNet, Inc.
27  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
28  * @link      http://status.net/
29  */
30
31 if (!defined('STATUSNET')) {
32     // This check helps protect against security problems;
33     // your code file can't be executed directly from the web.
34     exit(1);
35 }
36
37 /**
38  * Superclass for menus
39  *
40  * @category  General
41  * @package   StatusNet
42  * @author    Evan Prodromou <evan@status.net>
43  * @copyright 2011 StatusNet, Inc.
44  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
45  * @link      http://status.net/
46  */
47
48 class Menu extends Widget
49 {
50     var $action     = null;
51     var $actionName = null;
52     var $actionArgs = null;
53     
54     /**
55      * Construction
56      *
57      * @param Action $action current action, used for output
58      */
59     function __construct(Action $action=null)
60     {
61         parent::__construct($action);
62
63         $this->action     = $action;
64         $this->actionName = $action->trimmed('action');
65
66         $rtargs = $action->returnToArgs();
67
68         $this->actionArgs = $rtargs[1];
69     }
70
71     function getItems()
72     {
73         return array();
74     }
75
76     function tag()
77     {
78         return null;
79     }
80     
81     function show()
82     {
83         $items = $this->getItems();
84         $tag = $this->tag();
85
86         $attrs = array('class' => 'nav');
87
88         if (!is_null($tag)) {
89             $attrs['id']  = 'nav_' . $tag;
90         }
91
92         if (Event::handle('StartNav', array($this, &$tag, &$items))) {
93
94             $this->out->elementStart('ul', $attrs);
95
96             foreach ($items as $item) {
97                 assert(is_array($item));
98                 assert(count($item) == 5);
99
100                 list($actionName, $args, $label, $description, $id) = $item;
101
102                 $this->item($actionName, $args, $label, $description, $id);
103             }
104
105             $this->out->elementEnd('ul');
106
107             Event::handle('EndNav', array($this, $tag, $items));
108         }
109     }
110
111     function item($actionName, array $args, $label, $description, $id=null, $cls=null)
112     {
113         if (empty($id)) {
114             $id = $this->menuItemID($actionName, $args);
115         }
116
117         $url = common_local_url($actionName, $args);
118
119         $this->out->menuItem($url,
120                              $label,
121                              $description,
122                              $this->isCurrent($actionName, $args),
123                              $id,
124                              $cls);
125     }
126
127     function isCurrent($actionName, array $args)
128     {
129         if ($actionName != $this->actionName) {
130             return false;
131         } elseif (!is_array($args)) {
132             /*
133              * No array, then the below loop doesn't need to run and
134              * 'return false' will never be reached.
135              */
136             return true;
137         }
138
139         foreach ($this->actionArgs as $k => $v) {
140             if (!array_key_exists($k, $args) || $args[$k] != $v) {
141                 return false;
142             }
143         }
144
145         return true;
146     }
147
148     function menuItemID($actionName, $args = null)
149     {
150         $id = sprintf('nav_%s', $actionName);
151
152         if (!is_null($args)) {
153             foreach ($args as $key => $value) {
154                 $id .= '_' . $key . '_' . $value;
155             }
156         }
157
158         return $id;
159     }
160
161     function submenu($label, $menu)
162     {
163         if (Event::handle('StartSubMenu', array($this->action, $menu, $label))) {
164             $this->action->elementStart('li');
165             $this->action->element('h3', null, $label);
166             $menu->show();
167             $this->action->elementEnd('li');
168             Event::handle('EndSubMenu', array($this->action, $menu, $label));
169         }
170     }
171 }