diff -r 000000000000 -r 4eba9c11703f web/Zend/View/Helper/Navigation/Breadcrumbs.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/Zend/View/Helper/Navigation/Breadcrumbs.php Mon Dec 13 18:29:26 2010 +0100 @@ -0,0 +1,331 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets breadcrumb separator + * + * @param string $separator separator string + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setSeparator($separator) + { + if (is_string($separator)) { + $this->_separator = $separator; + } + + return $this; + } + + /** + * Returns breadcrumb separator + * + * @return string breadcrumb separator + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Sets whether last page in breadcrumbs should be hyperlinked + * + * @param bool $linkLast whether last page should + * be hyperlinked + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setLinkLast($linkLast) + { + $this->_linkLast = (bool) $linkLast; + return $this; + } + + /** + * Returns whether last page in breadcrumbs should be hyperlinked + * + * @return bool whether last page in breadcrumbs should be hyperlinked + */ + public function getLinkLast() + { + return $this->_linkLast; + } + + /** + * 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_Breadcrumbs 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; + } + + // Render methods: + + /** + * Renders breadcrumbs by chaining 'a' elements with the separator + * registered in the helper + * + * @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 renderStraight(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + // find deepest active + if (!$active = $this->findActive($container)) { + return ''; + } + + $active = $active['page']; + + // put the deepest active page last in breadcrumbs + if ($this->getLinkLast()) { + $html = $this->htmlify($active); + } else { + $html = $active->getLabel(); + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + $html = $t->translate($html); + } + $html = $this->view->escape($html); + } + + // walk back to root + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + // prepend crumb to html + $html = $this->htmlify($parent) + . $this->getSeparator() + . $html; + } + + if ($parent === $container) { + // at the root of the given container + break; + } + + $active = $parent; + } + + return strlen($html) ? $this->getIndent() . $html : ''; + } + + /** + * Renders the given $container by invoking the partial view helper + * + * The container will simply be passed on as a model to the view script, + * so in the script it will be available in $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; + } + + // put breadcrumb pages in model + $model = array('pages' => array()); + if ($active = $this->findActive($container)) { + $active = $active['page']; + $model['pages'][] = $active; + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + $model['pages'][] = $parent; + } else { + break; + } + + if ($parent === $container) { + // break if at the root of the given container + break; + } + + $active = $parent; + } + $model['pages'] = array_reverse($model['pages']); + } + + 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 helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @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->renderStraight($container); + } + } +}