vendor/pimcore/pimcore/lib/Navigation/Renderer/Breadcrumbs.php line 225

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. /**
  15.  * ----------------------------------------------------------------------------------
  16.  * based on @author ZF1 Zend_View_Helper_Navigation_Breadcrumbs
  17.  * ----------------------------------------------------------------------------------
  18.  */
  19. /**
  20.  * Zend Framework
  21.  *
  22.  * LICENSE
  23.  *
  24.  * This source file is subject to the new BSD license that is bundled
  25.  * with this package in the file LICENSE.txt.
  26.  * It is also available through the world-wide-web at this URL:
  27.  * http://framework.zend.com/license/new-bsd
  28.  * If you did not receive a copy of the license and are unable to
  29.  * obtain it through the world-wide-web, please send an email
  30.  * to license@zend.com so we can send you a copy immediately.
  31.  *
  32.  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  33.  * @license    http://framework.zend.com/license/new-bsd     New BSD License
  34.  */
  35. namespace Pimcore\Navigation\Renderer;
  36. use Pimcore\Navigation\Container;
  37. use Pimcore\Navigation\Page;
  38. class Breadcrumbs extends AbstractRenderer
  39. {
  40.     /**
  41.      * Breadcrumbs separator string
  42.      *
  43.      * @var string
  44.      */
  45.     protected $_separator ' &gt; ';
  46.     /**
  47.      * The minimum depth a page must have to be included when rendering
  48.      *
  49.      * @var int
  50.      */
  51.     protected $_minDepth 1;
  52.     /**
  53.      * Whether last page in breadcrumb should be hyperlinked
  54.      *
  55.      * @var bool
  56.      */
  57.     protected $_linkLast false;
  58.     /**
  59.      * Partial view script to use for rendering menu
  60.      *
  61.      * @var string|array
  62.      */
  63.     protected $_template;
  64.     // Accessors:
  65.     /**
  66.      * Returns breadcrumb separator
  67.      *
  68.      * @return string  breadcrumb separator
  69.      */
  70.     public function getSeparator()
  71.     {
  72.         return $this->_separator;
  73.     }
  74.     /**
  75.      * @param string $separator
  76.      *
  77.      * @return $this
  78.      */
  79.     public function setSeparator($separator)
  80.     {
  81.         if (is_string($separator)) {
  82.             $this->_separator $separator;
  83.         }
  84.         return $this;
  85.     }
  86.     /**
  87.      * @param bool $linkLast
  88.      *
  89.      * @return $this
  90.      */
  91.     public function setLinkLast($linkLast)
  92.     {
  93.         $this->_linkLast = (bool) $linkLast;
  94.         return $this;
  95.     }
  96.     /**
  97.      * Returns whether last page in breadcrumbs should be hyperlinked
  98.      *
  99.      * @return bool  whether last page in breadcrumbs should be hyperlinked
  100.      */
  101.     public function getLinkLast()
  102.     {
  103.         return $this->_linkLast;
  104.     }
  105.     /**
  106.      * @return array|string
  107.      */
  108.     public function getTemplate()
  109.     {
  110.         return $this->_template;
  111.     }
  112.     /**
  113.      * @param array|string $template
  114.      *
  115.      * @return $this
  116.      */
  117.     public function setTemplate($template)
  118.     {
  119.         $this->_template $template;
  120.         return $this;
  121.     }
  122.     /**
  123.      * Alias of getTemplate()
  124.      *
  125.      * @return string|array|null
  126.      */
  127.     public function getPartial()
  128.     {
  129.         return $this->getTemplate();
  130.     }
  131.     /**
  132.      * Alias of setTemplate()
  133.      *
  134.      * @param  string $partial
  135.      *
  136.      * @return $this
  137.      */
  138.     public function setPartial($partial)
  139.     {
  140.         return $this->setTemplate($partial);
  141.     }
  142.     // Render methods:
  143.     /**
  144.      * Get all pages between the currently active page and the container's root page.
  145.      *
  146.      * @param Container $container
  147.      *
  148.      * @return array
  149.      */
  150.     public function getPages(Container $container)
  151.     {
  152.         $pages = [];
  153.         if (! $active $this->findActive($container)) {
  154.             return [];
  155.         }
  156.         /** @var \Pimcore\Navigation\Page $active */
  157.         $active $active['page'];
  158.         $pages[] = $active;
  159.         while ($parent $active->getParent()) {
  160.             if ($parent instanceof Page) {
  161.                 $pages[] = $parent;
  162.             } else {
  163.                 break;
  164.             }
  165.             if ($parent === $container) {
  166.                 // break if at the root of the given container
  167.                 break;
  168.             }
  169.             $active $parent;
  170.         }
  171.         return array_reverse($pages);
  172.     }
  173.     /**
  174.      * Renders breadcrumbs by chaining 'a' elements with the separator
  175.      * registered in the helper
  176.      *
  177.      * @param Container $container
  178.      *
  179.      * @return string
  180.      */
  181.     public function renderStraight(Container $container)
  182.     {
  183.         // find deepest active
  184.         if (!$active $this->findActive($container)) {
  185.             return '';
  186.         }
  187.         /** @var Page $active */
  188.         $active $active['page'];
  189.         // put the deepest active page last in breadcrumbs
  190.         if ($this->getLinkLast()) {
  191.             $html $this->htmlify($active);
  192.         } else {
  193.             $html $active->getLabel();
  194.             $html htmlspecialchars($htmlENT_COMPAT'UTF-8');
  195.         }
  196.         // walk back to root
  197.         while ($parent $active->getParent()) {
  198.             if ($parent instanceof Page) {
  199.                 // prepend crumb to html
  200.                 $html $this->htmlify($parent)
  201.                       . $this->getSeparator()
  202.                       . $html;
  203.             }
  204.             if ($parent === $container) {
  205.                 // at the root of the given container
  206.                 break;
  207.             }
  208.             $active $parent;
  209.         }
  210.         return strlen($html) ? $this->getIndent() . $html '';
  211.     }
  212.     /**
  213.      * @param Container $container
  214.      * @param string|null $partial
  215.      *
  216.      * @return string
  217.      *
  218.      * @throws \Exception
  219.      */
  220.     public function renderTemplate(Container $containerstring $partial null)
  221.     {
  222.         if (null === $partial) {
  223.             $partial $this->getTemplate();
  224.         }
  225.         if (empty($partial)) {
  226.             throw new \Exception('Unable to render menu: No partial view script provided');
  227.         }
  228.         $pages $this->getPages($container);
  229.         return $this->templatingEngine->render($partialcompact('pages'));
  230.     }
  231.     /**
  232.      * Alias of renderTemplate() for ZF1 backward compatibility
  233.      *
  234.      * @param Container $container
  235.      * @param string|null $partial
  236.      *
  237.      * @return string
  238.      */
  239.     public function renderPartial(Container $containerstring $partial null)
  240.     {
  241.         return $this->renderTemplate($container$partial);
  242.     }
  243.     /**
  244.      * {@inheritdoc}
  245.      */
  246.     public function render(Container $container)
  247.     {
  248.         if ($partial $this->getTemplate()) {
  249.             return $this->renderPartial($container$partial);
  250.         } else {
  251.             return $this->renderStraight($container);
  252.         }
  253.     }
  254. }