diff -r 5e7a0fedabdf -r 877f952ae2bd web/lib/Zend/View/Helper/Navigation/Menu.php
--- a/web/lib/Zend/View/Helper/Navigation/Menu.php Thu Mar 21 17:31:31 2013 +0100
+++ b/web/lib/Zend/View/Helper/Navigation/Menu.php Thu Mar 21 19:50:53 2013 +0100
@@ -15,9 +15,9 @@
* @category Zend
* @package Zend_View
* @subpackage Helper
- * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
- * @version $Id: Menu.php 20096 2010-01-06 02:05:09Z bkarwin $
+ * @version $Id: Menu.php 25239 2013-01-22 09:45:01Z frosch $
*/
/**
@@ -31,7 +31,7 @@
* @category Zend
* @package Zend_View
* @subpackage Helper
- * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_View_Helper_Navigation_Menu
@@ -45,6 +45,34 @@
protected $_ulClass = 'navigation';
/**
+ * Unique identifier (id) for the ul element
+ *
+ * @var string
+ */
+ protected $_ulId = null;
+
+ /**
+ * CSS class to use for the active elements
+ *
+ * @var string
+ */
+ protected $_activeClass = 'active';
+
+ /**
+ * CSS class to use for the parent li element
+ *
+ * @var string
+ */
+ protected $_parentClass = 'menu-parent';
+
+ /**
+ * Whether parent li elements should be rendered with parent class
+ *
+ * @var bool
+ */
+ protected $_renderParentClass = false;
+
+ /**
* Whether only active branch should be rendered
*
* @var bool
@@ -66,6 +94,27 @@
protected $_partial = null;
/**
+ * Expand all sibling nodes of active branch nodes
+ *
+ * @var bool
+ */
+ protected $_expandSiblingNodesOfActiveBranch = false;
+
+ /**
+ * Adds CSS class from page to li element
+ *
+ * @var bool
+ */
+ protected $_addPageClassToLi = false;
+
+ /**
+ * Inner indentation string
+ *
+ * @var string
+ */
+ protected $_innerIndent = ' ';
+
+ /**
* View helper entry point:
* Retrieves helper and optionally sets container to operate on
*
@@ -111,6 +160,107 @@
}
/**
+ * Sets unique identifier (id) to use for the first 'ul' element when
+ * rendering
+ *
+ * @param string|null $ulId Unique identifier (id) to set
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function setUlId($ulId)
+ {
+ if (is_string($ulId)) {
+ $this->_ulId = $ulId;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns unique identifier (id) to use for the first 'ul' element when
+ * rendering
+ *
+ * @return string|null Unique identifier (id); Default is 'null'
+ */
+ public function getUlId()
+ {
+ return $this->_ulId;
+ }
+
+ /**
+ * Sets CSS class to use for the active elements when rendering
+ *
+ * @param string $activeClass CSS class to set
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function setActiveClass($activeClass)
+ {
+ if (is_string($activeClass)) {
+ $this->_activeClass = $activeClass;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns CSS class to use for the active elements when rendering
+ *
+ * @return string CSS class
+ */
+ public function getActiveClass()
+ {
+ return $this->_activeClass;
+ }
+
+ /**
+ * Sets CSS class to use for the parent li elements when rendering
+ *
+ * @param string $parentClass CSS class to set to parents
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function setParentClass($parentClass)
+ {
+ if (is_string($parentClass)) {
+ $this->_parentClass = $parentClass;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns CSS class to use for the parent lie elements when rendering
+ *
+ * @return string CSS class
+ */
+ public function getParentClass()
+ {
+ return $this->_parentClass;
+ }
+
+ /**
+ * Enables/disables rendering of parent class to the li element
+ *
+ * @param bool $flag [optional] render with parent
+ * class. Default is true.
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function setRenderParentClass($flag = true)
+ {
+ $this->_renderParentClass = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Returns flag indicating whether parent class should be rendered to the li
+ * element
+ *
+ * @return bool whether parent class should be rendered
+ */
+ public function getRenderParentClass()
+ {
+ return $this->_renderParentClass;
+ }
+
+ /**
* Sets a flag indicating whether only active branch should be rendered
*
* @param bool $flag [optional] render only active
@@ -135,8 +285,34 @@
{
return $this->_onlyActiveBranch;
}
+
+ /**
+ * Sets a flag indicating whether to expand all sibling nodes of the active branch
+ *
+ * @param bool $flag [optional] expand all siblings of
+ * nodes in the active branch. Default is true.
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function setExpandSiblingNodesOfActiveBranch($flag = true)
+ {
+ $this->_expandSiblingNodesOfActiveBranch = (bool) $flag;
+ return $this;
+ }
/**
+ * Returns a flag indicating whether to expand all sibling nodes of the active branch
+ *
+ * By default, this value is false, meaning the entire menu will be
+ * be rendered.
+ *
+ * @return bool whether siblings of nodes in the active branch should be expanded
+ */
+ public function getExpandSiblingNodesOfActiveBranch()
+ {
+ return $this->_expandSiblingNodesOfActiveBranch;
+ }
+
+ /**
* Enables/disables rendering of parents when only rendering active branch
*
* See {@link setOnlyActiveBranch()} for more information.
@@ -195,6 +371,78 @@
return $this->_partial;
}
+ /**
+ * Adds CSS class from page to li element
+ *
+ * Before:
+ *
+ *
+ *
+ * After:
+ *
+ *
+ *
+ * @param bool $flag [optional] adds CSS class from
+ * page to li element
+ *
+ * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+ */
+ public function addPageClassToLi($flag = true)
+ {
+ $this->_addPageClassToLi = (bool) $flag;
+
+ return $this;
+ }
+
+ /**
+ * Returns a flag indicating whether the CSS class from page to be added to
+ * li element
+ *
+ * @return bool
+ */
+ public function getAddPageClassToLi()
+ {
+ return $this->_addPageClassToLi;
+ }
+
+ /**
+ * Set the inner indentation string for using in {@link render()}, optionally
+ * a number of spaces to indent with
+ *
+ * @param string|int $indent indentation string or
+ * number of spaces
+ * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface,
+ * returns self
+ */
+ public function setInnerIndent($indent)
+ {
+ $this->_innerIndent = $this->_getWhitespace($indent);
+
+ return $this;
+ }
+
+ /**
+ * Returns inner indentation (format output is respected)
+ *
+ * @see getFormatOutput()
+ *
+ * @return string indentation string or an empty string
+ */
+ public function getInnerIndent()
+ {
+ if (false === $this->getFormatOutput()) {
+ return '';
+ }
+
+ return $this->_innerIndent;
+ }
+
// Public methods:
/**
@@ -226,18 +474,25 @@
$attribs = array(
'id' => $page->getId(),
'title' => $title,
- 'class' => $page->getClass()
);
+ if (false === $this->getAddPageClassToLi()) {
+ $attribs['class'] = $page->getClass();
+ }
+
// does page have a href?
if ($href = $page->getHref()) {
- $element = 'a';
- $attribs['href'] = $href;
- $attribs['target'] = $page->getTarget();
+ $element = 'a';
+ $attribs['href'] = $href;
+ $attribs['target'] = $page->getTarget();
+ $attribs['accesskey'] = $page->getAccessKey();
} else {
$element = 'span';
}
+ // Add custom HTML attributes
+ $attribs = array_merge($attribs, $page->getCustomHtmlAttribs());
+
return '<' . $element . $this->_htmlAttribs($attribs) . '>'
. $this->view->escape($label)
. '' . $element . '>';
@@ -251,18 +506,51 @@
*/
protected function _normalizeOptions(array $options = array())
{
+ // Ident
if (isset($options['indent'])) {
$options['indent'] = $this->_getWhitespace($options['indent']);
} else {
$options['indent'] = $this->getIndent();
}
+ // Inner ident
+ if (isset($options['innerIndent'])) {
+ $options['innerIndent'] =
+ $this->_getWhitespace($options['innerIndent']);
+ } else {
+ $options['innerIndent'] = $this->getInnerIndent();
+ }
+
+ // UL class
if (isset($options['ulClass']) && $options['ulClass'] !== null) {
$options['ulClass'] = (string) $options['ulClass'];
} else {
$options['ulClass'] = $this->getUlClass();
}
+ // UL id
+ if (isset($options['ulId']) && $options['ulId'] !== null) {
+ $options['ulId'] = (string) $options['ulId'];
+ } else {
+ $options['ulId'] = $this->getUlId();
+ }
+
+ // Active class
+ if (isset($options['activeClass']) && $options['activeClass'] !== null
+ ) {
+ $options['activeClass'] = (string) $options['activeClass'];
+ } else {
+ $options['activeClass'] = $this->getActiveClass();
+ }
+
+ // Parent class
+ if (isset($options['parentClass']) && $options['parentClass'] !== null) {
+ $options['parentClass'] = (string) $options['parentClass'];
+ } else {
+ $options['parentClass'] = $this->getParentClass();
+ }
+
+ // Minimum depth
if (array_key_exists('minDepth', $options)) {
if (null !== $options['minDepth']) {
$options['minDepth'] = (int) $options['minDepth'];
@@ -275,6 +563,7 @@
$options['minDepth'] = 0;
}
+ // Maximum depth
if (array_key_exists('maxDepth', $options)) {
if (null !== $options['maxDepth']) {
$options['maxDepth'] = (int) $options['maxDepth'];
@@ -283,14 +572,31 @@
$options['maxDepth'] = $this->getMaxDepth();
}
+ // Only active branch
if (!isset($options['onlyActiveBranch'])) {
$options['onlyActiveBranch'] = $this->getOnlyActiveBranch();
}
+ // Expand sibling nodes of active branch
+ if (!isset($options['expandSiblingNodesOfActiveBranch'])) {
+ $options['expandSiblingNodesOfActiveBranch'] = $this->getExpandSiblingNodesOfActiveBranch();
+ }
+
+ // Render parents?
if (!isset($options['renderParents'])) {
$options['renderParents'] = $this->getRenderParents();
}
+ // Render parent class?
+ if (!isset($options['renderParentClass'])) {
+ $options['renderParentClass'] = $this->getRenderParentClass();
+ }
+
+ // Add page CSS class to LI element
+ if (!isset($options['addPageClassToLi'])) {
+ $options['addPageClassToLi'] = $this->getAddPageClassToLi();
+ }
+
return $options;
}
@@ -300,19 +606,34 @@
* Renders the deepest active menu within [$minDepth, $maxDeth], (called
* from {@link renderMenu()})
*
- * @param Zend_Navigation_Container $container container to render
- * @param array $active active page and depth
- * @param string $ulClass CSS class for first UL
- * @param string $indent initial indentation
- * @param int|null $minDepth minimum depth
- * @param int|null $maxDepth maximum depth
- * @return string rendered menu
+ * @param Zend_Navigation_Container $container container to render
+ * @param string $ulClass CSS class for first UL
+ * @param string $indent initial indentation
+ * @param string $innerIndent inner indentation
+ * @param int|null $minDepth minimum depth
+ * @param int|null $maxDepth maximum depth
+ * @param string|null $ulId unique identifier (id)
+ * for first UL
+ * @param bool $addPageClassToLi adds CSS class from
+ * page to li element
+ * @param string|null $activeClass CSS class for active
+ * element
+ * @param string $parentClass CSS class for parent
+ * li's
+ * @param bool $renderParentClass Render parent class?
+ * @return string rendered menu (HTML)
*/
protected function _renderDeepestMenu(Zend_Navigation_Container $container,
$ulClass,
$indent,
+ $innerIndent,
$minDepth,
- $maxDepth)
+ $maxDepth,
+ $ulId,
+ $addPageClassToLi,
+ $activeClass,
+ $parentClass,
+ $renderParentClass)
{
if (!$active = $this->findActive($container, $minDepth - 1, $maxDepth)) {
return '';
@@ -326,22 +647,49 @@
} else if (!$active['page']->hasPages()) {
// found pages has no children; render siblings
$active['page'] = $active['page']->getParent();
- } else if (is_int($maxDepth) && $active['depth'] +1 > $maxDepth) {
+ } else if (is_int($maxDepth) && $active['depth'] + 1 > $maxDepth) {
// children are below max depth; render siblings
$active['page'] = $active['page']->getParent();
}
- $ulClass = $ulClass ? ' class="' . $ulClass . '"' : '';
- $html = $indent . '