]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/menu.php
Always naming it 'plugin' is not good, it can easily confuse. So better name it
[quix0rs-gnu-social.git] / lib / menu.php
index 751f8e1b7d9bd8c1ba7766505ccfbd7e41f1153c..f0f797fe3257b609fa771d630667624b5b2e5989 100644 (file)
@@ -49,40 +49,69 @@ class Menu extends Widget
 {
     var $action     = null;
     var $actionName = null;
+    var $actionArgs = null;
+    
     /**
      * Construction
      *
      * @param Action $action current action, used for output
      */
-    function __construct($action=null)
+    function __construct(Action $action=null)
     {
         parent::__construct($action);
 
         $this->action     = $action;
         $this->actionName = $action->trimmed('action');
+
+        $rtargs = $action->returnToArgs();
+
+        $this->actionArgs = $rtargs[1];
     }
 
-    function id()
+    function getItems()
     {
-        return 'unknown_menu';
+        return array();
     }
 
-    function menuStart()
+    function tag()
     {
-        $this->action->elementStart('div', array('id' => $this->id()));
-        $this->action->elementStart('ul', array('class' => 'nav'));
+        return null;
     }
-
-    function menuEnd()
+    
+    function show()
     {
-        $this->action->elementEnd('ul');
-        $this->action->elementEnd('div');
+        $items = $this->getItems();
+        $tag = $this->tag();
+
+        $attrs = array('class' => 'nav');
+
+        if (!is_null($tag)) {
+            $attrs['id']  = 'nav_' . $tag;
+        }
+
+        if (Event::handle('StartNav', array($this, &$tag, &$items))) {
+
+            $this->out->elementStart('ul', $attrs);
+
+            foreach ($items as $item) {
+                assert(is_array($item));
+                assert(count($item) == 5);
+
+                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));
+        }
     }
 
-    function item($actionName, $args, $label, $description, $id=null)
+    function item($actionName, array $args, $label, $description, $id=null, $cls=null)
     {
         if (empty($id)) {
-            $id = $this->menuItemID($actionName);
+            $id = $this->menuItemID($actionName, $args);
         }
 
         $url = common_local_url($actionName, $args);
@@ -90,20 +119,53 @@ class Menu extends Widget
         $this->out->menuItem($url,
                              $label,
                              $description,
-                             $actionName == $this->actionName,
-                             $id);
+                             $this->isCurrent($actionName, $args),
+                             $id,
+                             $cls);
+    }
+
+    function isCurrent($actionName, array $args)
+    {
+        if ($actionName != $this->actionName) {
+            return false;
+        } elseif (!is_array($args)) {
+            /*
+             * No array, then the below loop doesn't need to run and
+             * 'return false' will never be reached.
+             */
+            return true;
+        }
+
+        foreach ($this->actionArgs as $k => $v) {
+            if (!array_key_exists($k, $args) || $args[$k] != $v) {
+                return false;
+            }
+        }
+
+        return true;
     }
 
-    function menuItemID($actionName)
+    function menuItemID($actionName, $args = null)
     {
-        return sprintf('nav_%s', $actionName);
+        $id = sprintf('nav_%s', $actionName);
+
+        if (!is_null($args)) {
+            foreach ($args as $key => $value) {
+                $id .= '_' . $key . '_' . $value;
+            }
+        }
+
+        return $id;
     }
 
     function submenu($label, $menu)
     {
-        $this->action->elementStart('li');
-        $this->action->element('h3', null, $label);
-        $menu->show();
-        $this->action->elementEnd('li');
+        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));
+        }
     }
 }