diff -r 000000000000 -r 4eba9c11703f web/Zend/View/Helper/Navigation/Menu.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/Zend/View/Helper/Navigation/Menu.php Mon Dec 13 18:29:26 2010 +0100 @@ -0,0 +1,647 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets CSS class to use for the first 'ul' element when rendering + * + * @param string $ulClass CSS class to set + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setUlClass($ulClass) + { + if (is_string($ulClass)) { + $this->_ulClass = $ulClass; + } + + return $this; + } + + /** + * Returns CSS class to use for the first 'ul' element when rendering + * + * @return string CSS class + */ + public function getUlClass() + { + return $this->_ulClass; + } + + /** + * Sets a flag indicating whether only active branch should be rendered + * + * @param bool $flag [optional] render only active + * branch. Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setOnlyActiveBranch($flag = true) + { + $this->_onlyActiveBranch = (bool) $flag; + return $this; + } + + /** + * Returns a flag indicating whether only active branch should be rendered + * + * By default, this value is false, meaning the entire menu will be + * be rendered. + * + * @return bool whether only active branch should be rendered + */ + public function getOnlyActiveBranch() + { + return $this->_onlyActiveBranch; + } + + /** + * Enables/disables rendering of parents when only rendering active branch + * + * See {@link setOnlyActiveBranch()} for more information. + * + * @param bool $flag [optional] render parents when + * rendering active branch. + * Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setRenderParents($flag = true) + { + $this->_renderParents = (bool) $flag; + return $this; + } + + /** + * Returns flag indicating whether parents should be rendered when rendering + * only the active branch + * + * By default, this value is true. + * + * @return bool whether parents should be rendered + */ + public function getRenderParents() + { + return $this->_renderParents; + } + + /** + * Sets which partial view script to use for rendering menu + * + * @param string|array $partial partial view script or null. If + * an array is given, it is + * expected to contain two values; + * the partial view script to use, + * and the module where the script + * can be found. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setPartial($partial) + { + if (null === $partial || is_string($partial) || is_array($partial)) { + $this->_partial = $partial; + } + + return $this; + } + + /** + * Returns partial view script to use for rendering menu + * + * @return string|array|null + */ + public function getPartial() + { + return $this->_partial; + } + + // Public methods: + + /** + * Returns an HTML string containing an 'a' element for the given page if + * the page's href is not empty, and a 'span' element if it is empty + * + * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}. + * + * @param Zend_Navigation_Page $page page to generate HTML for + * @return string HTML string for the given page + */ + public function htmlify(Zend_Navigation_Page $page) + { + // get label and title for translating + $label = $page->getLabel(); + $title = $page->getTitle(); + + // translate label and title? + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + if (is_string($label) && !empty($label)) { + $label = $t->translate($label); + } + if (is_string($title) && !empty($title)) { + $title = $t->translate($title); + } + } + + // get attribs for element + $attribs = array( + 'id' => $page->getId(), + 'title' => $title, + 'class' => $page->getClass() + ); + + // does page have a href? + if ($href = $page->getHref()) { + $element = 'a'; + $attribs['href'] = $href; + $attribs['target'] = $page->getTarget(); + } else { + $element = 'span'; + } + + return '<' . $element . $this->_htmlAttribs($attribs) . '>' + . $this->view->escape($label) + . '' . $element . '>'; + } + + /** + * Normalizes given render options + * + * @param array $options [optional] options to normalize + * @return array normalized options + */ + protected function _normalizeOptions(array $options = array()) + { + if (isset($options['indent'])) { + $options['indent'] = $this->_getWhitespace($options['indent']); + } else { + $options['indent'] = $this->getIndent(); + } + + if (isset($options['ulClass']) && $options['ulClass'] !== null) { + $options['ulClass'] = (string) $options['ulClass']; + } else { + $options['ulClass'] = $this->getUlClass(); + } + + if (array_key_exists('minDepth', $options)) { + if (null !== $options['minDepth']) { + $options['minDepth'] = (int) $options['minDepth']; + } + } else { + $options['minDepth'] = $this->getMinDepth(); + } + + if ($options['minDepth'] < 0 || $options['minDepth'] === null) { + $options['minDepth'] = 0; + } + + if (array_key_exists('maxDepth', $options)) { + if (null !== $options['maxDepth']) { + $options['maxDepth'] = (int) $options['maxDepth']; + } + } else { + $options['maxDepth'] = $this->getMaxDepth(); + } + + if (!isset($options['onlyActiveBranch'])) { + $options['onlyActiveBranch'] = $this->getOnlyActiveBranch(); + } + + if (!isset($options['renderParents'])) { + $options['renderParents'] = $this->getRenderParents(); + } + + return $options; + } + + // Render methods: + + /** + * 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 + */ + protected function _renderDeepestMenu(Zend_Navigation_Container $container, + $ulClass, + $indent, + $minDepth, + $maxDepth) + { + if (!$active = $this->findActive($container, $minDepth - 1, $maxDepth)) { + return ''; + } + + // special case if active page is one below minDepth + if ($active['depth'] < $minDepth) { + if (!$active['page']->hasPages()) { + return ''; + } + } 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) { + // children are below max depth; render siblings + $active['page'] = $active['page']->getParent(); + } + + $ulClass = $ulClass ? ' class="' . $ulClass . '"' : ''; + $html = $indent . '
+ * renderMenu($container, array(
+ * 'indent' => $indent,
+ * 'ulClass' => $ulClass,
+ * 'minDepth' => null,
+ * 'maxDepth' => null,
+ * 'onlyActiveBranch' => true,
+ * 'renderParents' => false
+ * ));
+ *
+ *
+ * @param Zend_Navigation_Container $container [optional] container to
+ * render. Default is to render
+ * the container registered in
+ * the helper.
+ * @param string $ulClass [optional] CSS class to
+ * use for UL element. Default
+ * is to use the value from
+ * {@link getUlClass()}.
+ * @param string|int $indent [optional] indentation as
+ * a string or number of
+ * spaces. Default is to use
+ * the value retrieved from
+ * {@link getIndent()}.
+ * @return string rendered content
+ */
+ public function renderSubMenu(Zend_Navigation_Container $container = null,
+ $ulClass = null,
+ $indent = null)
+ {
+ return $this->renderMenu($container, array(
+ 'indent' => $indent,
+ 'ulClass' => $ulClass,
+ 'minDepth' => null,
+ 'maxDepth' => null,
+ 'onlyActiveBranch' => true,
+ 'renderParents' => false
+ ));
+ }
+
+ /**
+ * Renders the given $container by invoking the partial view helper
+ *
+ * The container will simply be passed on as a model to the view script
+ * as-is, and will be available in the partial script as 'container', e.g.
+ * echo 'Number of pages: ', count($this->container);.
+ *
+ * @param Zend_Navigation_Container $container [optional] container to
+ * pass to view script. Default
+ * is to use the container
+ * registered in the helper.
+ * @param string|array $partial [optional] partial view
+ * script to use. Default is to
+ * use the partial registered
+ * in the helper. If an array
+ * is given, it is expected to
+ * contain two values; the
+ * partial view script to use,
+ * and the module where the
+ * script can be found.
+ * @return string helper output
+ */
+ public function renderPartial(Zend_Navigation_Container $container = null,
+ $partial = null)
+ {
+ if (null === $container) {
+ $container = $this->getContainer();
+ }
+
+ if (null === $partial) {
+ $partial = $this->getPartial();
+ }
+
+ if (empty($partial)) {
+ require_once 'Zend/View/Exception.php';
+ $e = new Zend_View_Exception(
+ 'Unable to render menu: No partial view script provided'
+ );
+ $e->setView($this->view);
+ throw $e;
+ }
+
+ $model = array(
+ 'container' => $container
+ );
+
+ if (is_array($partial)) {
+ if (count($partial) != 2) {
+ require_once 'Zend/View/Exception.php';
+ $e = new Zend_View_Exception(
+ 'Unable to render menu: A view partial supplied as '
+ . 'an array must contain two values: partial view '
+ . 'script and module where script can be found'
+ );
+ $e->setView($this->view);
+ throw $e;
+ }
+
+ return $this->view->partial($partial[0], $partial[1], $model);
+ }
+
+ return $this->view->partial($partial, null, $model);
+ }
+
+ // Zend_View_Helper_Navigation_Helper:
+
+ /**
+ * Renders menu
+ *
+ * Implements {@link Zend_View_Helper_Navigation_Helper::render()}.
+ *
+ * If a partial view is registered in the helper, the menu will be rendered
+ * using the given partial script. If no partial is registered, the menu
+ * will be rendered as an 'ul' element by the helper's internal method.
+ *
+ * @see renderPartial()
+ * @see renderMenu()
+ *
+ * @param Zend_Navigation_Container $container [optional] container to
+ * render. Default is to
+ * render the container
+ * registered in the helper.
+ * @return string helper output
+ */
+ public function render(Zend_Navigation_Container $container = null)
+ {
+ if ($partial = $this->getPartial()) {
+ return $this->renderPartial($container, $partial);
+ } else {
+ return $this->renderMenu($container);
+ }
+ }
+}