]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
added a data array to ElggMenuItem. Now by default options end up being passed to...
authorcash <cash.costello@gmail.com>
Sun, 26 Jun 2011 18:02:36 +0000 (14:02 -0400)
committercash <cash.costello@gmail.com>
Sun, 26 Jun 2011 18:02:36 +0000 (14:02 -0400)
engine/classes/ElggMenuItem.php
engine/lib/navigation.php
mod/groups/start.php

index 1181583f21ca1caa3bb64a14da5dd367f02cafbd..36c21b8b483f546371e4d1e9f90ded9272e6d7f8 100644 (file)
  * @since 1.8.0
  */
 class ElggMenuItem {
-       /**
-        * @var string Identifier of the menu
-        */
-       protected $name;
 
        /**
-        * @var string The menu display string
+        * @var array Non-rendered data about the menu item
         */
-       protected $text;
+       protected $data = array(
+               // string Identifier of the menu
+               'name' => '',
 
-       /**
-        * @var string The menu url
-        */
-       protected $href = null;
+               // array Page contexts this menu item should appear on
+               'contexts' => array('all'),
 
-       /**
-        * @var string The string to display if link is clicked
-        */
-       protected $confirm = '';
+               // string Menu section identifier
+               'section' => 'default',
 
-       /**
-        * @var array Classes to apply to the anchor tag.
-        */
-       protected $linkClass = array();
+               // int Smaller priorities float to the top
+               'priority' => 100,
 
-       /**
-        * @var array Classes to apply to the li tag.
-        */
-       protected $itemClass = array();
+               // bool Is this the currently selected menu item
+               'selected' => false,
 
-       /**
-        * @var array Page context array
-        */
-       protected $contexts = array('all');
+               // string Identifier of this item's parent
+               'parent_name' => '',
 
-       /**
-        * @var string Menu section identifier
-        */
-       protected $section = 'default';
+               // ElggMenuItem The parent object or null
+               'parent' => null,
 
-       /**
-        * @var string Tooltip
-        */
-       protected $title = '';
+               // array Array of children objects or empty array
+               'children' => array(),
 
-       /**
-        * @var int Menu priority - smaller prioritys float to the top
-        */
-       protected $priority = 100;
+               // array Classes to apply to the li tag
+               'itemClass' => array(),
+
+               // array Classes to apply to the anchor tag
+               'linkClass' => array(),
+       );
 
        /**
-        * @var bool Is this the currently selected menu item
+        * @var string The menu display string
         */
-       protected $selected = false;
+       protected $text;
 
        /**
-        * @var string Identifier of this item's parent
+        * @var string The menu url
         */
-       protected $parent_name = '';
+       protected $href = null;
 
        /**
-        * @var ElggMenuItem The parent object or null
+        * @var string Tooltip
         */
-       protected $parent = null;
+       protected $title = '';
 
        /**
-        * @var array Array of children objects or empty array
+        * @var string The string to display if link is clicked
         */
-       protected $children = array();
+       protected $confirm = '';
+
 
        /**
         * ElggMenuItem constructor
@@ -88,13 +75,15 @@ class ElggMenuItem {
         * @param string $href  URL of the menu item (false if not a link)
         */
        public function __construct($name, $text, $href) {
-               $this->name = $name;
+               //$this->name = $name;
                $this->text = $text;
                if ($href) {
                        $this->href = elgg_normalize_url($href);
                } else {
                        $this->href = $href;
                }
+
+               $this->data['name'] = $name;
        }
 
        /**
@@ -122,6 +111,12 @@ class ElggMenuItem {
                        $options['contexts'] = $options['context'];
                        unset($options['context']);
                }
+               
+               // make sure contexts is set correctly
+               if (isset($options['contexts'])) {
+                       $item->setContext($options['contexts']);
+                       unset($options['contexts']);
+               }
 
                if (isset($options['link_class'])) {
                        $item->setLinkClass($options['link_class']);
@@ -133,16 +128,62 @@ class ElggMenuItem {
                        unset($options['item_class']);
                }
 
+               if (isset($options['data']) && is_array($options['data'])) {
+                       $item->setData($options['data']);
+                       unset($options['data']);
+               }
+               
                foreach ($options as $key => $value) {
-                       $item->$key = $value;
+                       if (isset($item->data[$key])) {
+                               $item->data[$key] = $value;
+                       } else {
+                               $item->$key = $value;
+                       }
                }
 
-               // make sure contexts is set correctly
-               if (isset($options['contexts'])) {
-                       $item->setContext($options['contexts']);
+               return $item;
+       }
+
+       /**
+        * Set a data key/value pair or a set of key/value pairs
+        *
+        * This method allows storage of arbitrary data with this menu item. The
+        * data can be used for sorting, custom rendering, or any other use.
+        *
+        * @param mixed $key   String key or an associative array of key/value pairs
+        * @param mixed $value The value if $key is a string
+        * @return void
+        */
+       public function setData($key, $value = null) {
+               if (is_array($key)) {
+                       $this->data += $key;
+               } else {
+                       $this->data[$key] = $value;
                }
+       }
 
-               return $item;
+       /**
+        * Get stored data
+        *
+        * @param string $key The key for the requested key/value pair
+        * @return mixed
+        */
+       public function getData($key) {
+               if (isset($this->data[$key])) {
+                       return $this->data[$key];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Set the identifier of the menu item
+        *
+        * @param string Unique identifier
+        * @return void
+        */
+       public function setName($name) {
+               $this->data['name'] = $name;
        }
 
        /**
@@ -151,14 +192,13 @@ class ElggMenuItem {
         * @return string
         */
        public function getName() {
-               return $this->name;
+               return $this->data['name'];
        }
-       
+
        /**
         * Set the display text of the menu item
         * 
         * @param string $text The display text
-        * 
         * @return void
         */
        public function setText($text) {
@@ -177,6 +217,7 @@ class ElggMenuItem {
        /**
         * Set the URL of the menu item
         *
+        * @param string $href URL or false if not a link
         * @return void
         */
        public function setHref($href) {
@@ -196,14 +237,13 @@ class ElggMenuItem {
         * Set the contexts that this menu item is available for
         *
         * @param array $contexts An array of context strings
-        *
         * @return void
         */
        public function setContext($contexts) {
                if (is_string($contexts)) {
                        $contexts = array($contexts);
                }
-               $this->contexts = $contexts;
+               $this->data['contexts'] = $contexts;
        }
 
        /**
@@ -212,27 +252,26 @@ class ElggMenuItem {
         * @return array
         */
        public function getContext() {
-               return $this->contexts;
+               return $this->data['contexts'];
        }
 
        /**
         * Should this menu item be used given the current context
         *
         * @param string $context A context string (default is empty string for
-        *                        current context stack.
-        *
+        *                        current context stack).
         * @return bool
         */
        public function inContext($context = '') {
                if ($context) {
-                       return in_array($context, $this->contexts);
+                       return in_array($context, $this->data['contexts']);
                }
 
-               if (in_array('all', $this->contexts)) {
+               if (in_array('all', $this->data['contexts'])) {
                        return true;
                }
 
-               foreach ($this->contexts as $context) {
+               foreach ($this->data['contexts'] as $context) {
                        if (elgg_in_context($context)) {
                                return true;
                        }
@@ -244,11 +283,10 @@ class ElggMenuItem {
         * Set the selected flag
         *
         * @param bool $state Selected state (default is true)
-        *
         * @return void
         */
        public function setSelected($state = true) {
-               $this->selected = $state;
+               $this->data['selected'] = $state;
        }
 
        /**
@@ -257,14 +295,13 @@ class ElggMenuItem {
         * @return bool
         */
        public function getSelected() {
-               return $this->selected;
+               return $this->data['selected'];
        }
 
        /**
         * Set the tool tip text
         *
         * @param string $text The text of the tool tip
-        *
         * @return void
         */
        public function setTooltip($text) {
@@ -284,7 +321,6 @@ class ElggMenuItem {
         * Set the confirm text shown when link is clicked
         *
         * @param string $text The text to show
-        *
         * @return void
         */
        public function setConfirmText($text) {
@@ -304,14 +340,13 @@ class ElggMenuItem {
         * Set the anchor class
         *
         * @param mixed $class An array of class names, or a single string class name.
-        *
         * @return void
         */
        public function setLinkClass($class) {
                if (!is_array($class)) {
-                       $this->linkClass[] = $class;
+                       $this->data['linkClass'] = array($class);
                } else {
-                       $this->linkClass = $class;
+                       $this->data['linkClass'] = $class;
                }
        }
 
@@ -321,21 +356,34 @@ class ElggMenuItem {
         * @return string
         */
        public function getLinkClass() {
-               return implode(' ', $this->linkClass);
+               return implode(' ', $this->data['linkClass']);
        }
 
        /**
-        * Set the li classes
+        * Add a link class
         *
         * @param mixed $class An array of class names, or a single string class name.
+        * @return void
+        */
+       public function addLinkClass($class) {
+               if (!is_array($class)) {
+                       $this->data['linkClass'][] = $class;
+               } else {
+                       $this->data['linkClass'] += $class;
+               }
+       }
+
+       /**
+        * Set the li classes
         *
+        * @param mixed $class An array of class names, or a single string class name.
         * @return void
         */
        public function setItemClass($class) {
                if (!is_array($class)) {
-                       $this->itemClass[] = $class;
+                       $this->data['itemClass'] = array($class);
                } else {
-                       $this->itemClass = $class;
+                       $this->data['itemClass'] = $class;
                }
        }
 
@@ -345,11 +393,11 @@ class ElggMenuItem {
         * @return string
         */
        public function getItemClass() {
-               //allow people to specify name with underscores and colons
+               // allow people to specify name with underscores and colons
                $name = str_replace('_', '-', $this->getName());
                $name = str_replace(':', '-', $name);
 
-               $class = implode(' ', $this->itemClass);
+               $class = implode(' ', $this->data['itemClass']);
                if ($class) {
                        return "elgg-menu-item-$name $class";
                } else {
@@ -361,11 +409,10 @@ class ElggMenuItem {
         * Set the priority of the menu item
         *
         * @param int $priority The smaller numbers mean higher priority (1 before 100)
-        *
         * @return void
         */
        public function setWeight($priority) {
-               $this->priority = $priority;
+               $this->data['priority'] = $priority;
        }
 
        /**
@@ -374,18 +421,17 @@ class ElggMenuItem {
         * @return int
         */
        public function getWeight() {
-               return $this->priority;
+               return $this->data['priority'];
        }
 
        /**
         * Set the section identifier
         *
         * @param string $section The identifier of the section
-        *
         * @return void
         */
        public function setSection($section) {
-               $this->section = $section;
+               $this->data['section'] = $section;
        }
 
        /**
@@ -394,18 +440,17 @@ class ElggMenuItem {
         * @return string
         */
        public function getSection() {
-               return $this->section;
+               return $this->data['section'];
        }
 
        /**
         * Set the parent identifier
         *
-        * @param string $parent_name The identifier of the parent ElggMenuItem
-        *
+        * @param string $name The identifier of the parent ElggMenuItem
         * @return void
         */
-       public function setParentName($parent_name) {
-               $this->parent_name = $parent_name;
+       public function setParentName($name) {
+               $this->data['parent_name'] = $name;
        }
 
        /**
@@ -414,18 +459,17 @@ class ElggMenuItem {
         * @return string
         */
        public function getParentName() {
-               return $this->parent_name;
+               return $this->data['parent_name'];
        }
 
        /**
         * Set the parent menu item
         *
         * @param ElggMenuItem $parent
-        *
         * @return void
         */
        public function setParent($parent) {
-               $this->parent = $parent;
+               $this->data['parent'] = $parent;
        }
 
        /**
@@ -434,29 +478,27 @@ class ElggMenuItem {
         * @return ElggMenuItem or null
         */
        public function getParent() {
-               return $this->parent;
+               return $this->data['parent'];
        }
 
        /**
         * Add a child menu item
         *
         * @param ElggMenuItem $item
-        *
         * @return void
         */
        public function addChild($item) {
-               $this->children[] = $item;
+               $this->data['children'][] = $item;
        }
 
        /**
         * Set the menu item's children
         *
         * @param array $children Array of ElggMenuItems
-        *
         * @return void
         */
        public function setChildren($children) {
-               $this->children = $children;
+               $this->data['children'] = $children;
        }
 
        /**
@@ -465,25 +507,23 @@ class ElggMenuItem {
         * @return array
         */
        public function getChildren() {
-               return $this->children;
+               return $this->data['children'];
        }
 
        /**
         * Sort the children
         *
-        * @param string $sort_function
-        *
+        * @param string $sortFunction A function that is passed to usort()
         * @return void
         */
-       public function sortChildren($sort_function) {
-               usort($this->children, $sort_function);
+       public function sortChildren($sortFunction) {
+               usort($this->data['children'], $sortFunction);
        }
 
        /**
         * Get the menu item content (usually a link)
         *
         * @params array $vars Options to pass to output/url if a link
-        *
         * @return string
         *
         * @todo View code in a model.  How do we feel about that?
@@ -494,30 +534,17 @@ class ElggMenuItem {
                        return $this->text;
                }
 
-               $vars['text'] = $this->text;
+               $defaults = get_object_vars($this);
+               unset($defaults['data']);
 
-               if ($this->href) {
-                       $vars['href'] = $this->href;
-               }
+               $vars += $defaults;
 
-               if ($this->linkClass) {
-                       $vars['class'] = $this->getLinkClass();
-               }
-
-               if ($this->link_rel) {
-                       $vars['rel'] = $this->link_rel;
-               }
-
-               if ($this->rel) {
-                       $vars['rel'] = $this->rel;
-               }
-
-               if ($this->title) {
-                       $vars['title'] = $this->title;
-               }
-
-               if ($this->is_action) {
-                       $vars['is_action'] = $this->is_action;
+               if ($this->data['linkClass']) {
+                       if (isset($vars['class'])) {
+                               $vars['class'] += $this->getLinkClass();
+                       } else {
+                               $vars['class'] = $this->getLinkClass();
+                       }
                }
 
                if ($this->confirm) {
index 4b2c998a23ce26a98b1c4bbf1c0212b3d944c62e..48a3659f616a3f01b5e6c642d0d04aa6823d5b00 100644 (file)
@@ -276,7 +276,7 @@ function elgg_river_menu_setup($hook, $type, $return, $params) {
                                        'href' => "#comments-add-$object->guid",
                                        'text' => elgg_view_icon('speech-bubble'),
                                        'title' => elgg_echo('comment:this'),
-                                       'link_rel' => 'toggle',
+                                       'rel' => 'toggle',
                                        'priority' => 50,
                                );
                                $return[] = ElggMenuItem::factory($options);
index 57c40af5d2628686a4a256522379cdf84d4caa27..83353bae579fac7b5011624e389c89859df83d97 100644 (file)
@@ -776,7 +776,7 @@ function discussion_add_to_river_menu($hook, $type, $return, $params) {
                                                'href' => "#groups-reply-$object->guid",
                                                'text' => elgg_view_icon('speech-bubble'),
                                                'title' => elgg_echo('reply:this'),
-                                               'link_rel' => 'toggle',
+                                               'rel' => 'toggle',
                                                'priority' => 50,
                                        );
                                        $return[] = ElggMenuItem::factory($options);