vendor/pimcore/pimcore/lib/Twig/Extension/Templating/Navigation.php line 72

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Twig\Extension\Templating;
  16. use Pimcore\Navigation\Builder;
  17. use Pimcore\Navigation\Container;
  18. use Pimcore\Navigation\Renderer\Breadcrumbs;
  19. use Pimcore\Navigation\Renderer\Menu;
  20. use Pimcore\Navigation\Renderer\Menu as MenuRenderer;
  21. use Pimcore\Navigation\Renderer\RendererInterface;
  22. use Pimcore\Twig\Extension\Templating\Navigation\Exception\InvalidRendererException;
  23. use Pimcore\Twig\Extension\Templating\Navigation\Exception\RendererNotFoundException;
  24. use Pimcore\Twig\Extension\Templating\Traits\HelperCharsetTrait;
  25. use Psr\Container\ContainerInterface;
  26. use Symfony\Component\OptionsResolver\OptionsResolver;
  27. use Twig\Extension\RuntimeExtensionInterface;
  28. /**
  29.  * @method MenuRenderer menu()
  30.  * @method Breadcrumbs breadcrumbs()
  31.  *
  32.  */
  33. class Navigation implements RuntimeExtensionInterface
  34. {
  35.     use HelperCharsetTrait;
  36.     /**
  37.      * @var Builder
  38.      */
  39.     private $builder;
  40.     /**
  41.      * @var ContainerInterface
  42.      */
  43.     private $rendererLocator;
  44.     /**
  45.      * @param Builder $builder
  46.      * @param ContainerInterface $rendererLocator
  47.      */
  48.     public function __construct(Builder $builderContainerInterface $rendererLocator)
  49.     {
  50.         $this->builder $builder;
  51.         $this->rendererLocator $rendererLocator;
  52.     }
  53.     /**
  54.      * Builds a navigation container by passing params
  55.      * Possible config params are: 'root', 'htmlMenuPrefix', 'pageCallback', 'cache', 'maxDepth', 'active'
  56.      *
  57.      * @param array $params
  58.      *
  59.      * @return Container
  60.      *
  61.      * @throws \Exception
  62.      */
  63.     public function build(array $params): Container
  64.     {
  65.         $optionsResolver = new OptionsResolver();
  66.         $optionsResolver->setDefaults([
  67.            'root' => null,
  68.            'htmlMenuPrefix' => null,
  69.            'pageCallback' => null,
  70.            'cache' => true,
  71.            'cacheLifetime' => null,
  72.            'maxDepth' => null,
  73.            'active' => null,
  74.         ]);
  75.         $options $optionsResolver->resolve($params);
  76.         return $this->builder->getNavigation(
  77.             $options['active'],
  78.             $options['root'],
  79.             $options['htmlMenuPrefix'],
  80.             $options['pageCallback'],
  81.             $options['cache'],
  82.             $options['maxDepth'],
  83.             $options['cacheLifetime']
  84.         );
  85.     }
  86.     /**
  87.      * Get a named renderer
  88.      *
  89.      * @param string $alias
  90.      *
  91.      * @return RendererInterface
  92.      */
  93.     public function getRenderer(string $alias): RendererInterface
  94.     {
  95.         if (!$this->rendererLocator->has($alias)) {
  96.             throw RendererNotFoundException::create($alias);
  97.         }
  98.         $renderer $this->rendererLocator->get($alias);
  99.         if (!$renderer instanceof RendererInterface) {
  100.             throw InvalidRendererException::create($alias$renderer);
  101.         }
  102.         return $renderer;
  103.     }
  104.     /**
  105.      * Renders a navigation with the given renderer
  106.      *
  107.      * @param Container $container
  108.      * @param string $rendererName
  109.      * @param string $renderMethod     Optional render method to use (e.g. menu -> renderMenu)
  110.      * @param array<int, mixed> $rendererArguments      Option arguments to pass to the render method after the container
  111.      *
  112.      * @return string
  113.      */
  114.     public function render(
  115.         Container $container,
  116.         string $rendererName 'menu',
  117.         string $renderMethod 'render',
  118.         ...$rendererArguments
  119.     ) {
  120.         $renderer $this->getRenderer($rendererName);
  121.         if (!method_exists($renderer$renderMethod)) {
  122.             throw new \InvalidArgumentException(sprintf('Method "%s" does not exist on renderer "%s"'$renderMethod$rendererName));
  123.         }
  124.         $args array_merge([$container], array_values($rendererArguments));
  125.         return call_user_func_array([$renderer$renderMethod], $args);
  126.     }
  127.     /**
  128.      * Magic overload is an alias to getRenderer()
  129.      *
  130.      * @param string $method
  131.      * @param array $arguments
  132.      *
  133.      * @return RendererInterface
  134.      */
  135.     public function __call($method, array $arguments = []): RendererInterface
  136.     {
  137.         return $this->getRenderer($method);
  138.     }
  139. }