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);
        }
    }
}