Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CoreBundle\Twig\Extension; | |
use Knp\Menu\ItemInterface; | |
use Knp\Menu\Matcher\MatcherInterface; | |
use Mautic\CoreBundle\Twig\Helper\MenuHelper; | |
use Twig\Extension\AbstractExtension; | |
use Twig\TwigFunction; | |
class MenuExtension extends AbstractExtension | |
{ | |
public function __construct( | |
protected MenuHelper $menuHelper | |
) { | |
} | |
public function getFunctions() | |
{ | |
return [ | |
new TwigFunction('menuRender', [$this, 'menuRender'], ['is_safe' => ['all']]), | |
new TwigFunction('parseMenuAttributes', [$this, 'parseMenuAttributes'], ['is_safe' => ['all']]), | |
new TwigFunction('buildMenuClasses', [$this, 'buildMenuClasses'], ['is_safe' => ['all']]), | |
]; | |
} | |
/** | |
* Renders a menu with the specified renderer. | |
* | |
* @param ItemInterface|string|array<mixed> $menu | |
* @param array<mixed> $options | |
*/ | |
public function menuRender($menu, array $options = [], ?string $renderer = null): string | |
{ | |
return $this->menuHelper->render($menu, $options, $renderer); | |
} | |
/** | |
* Parses attributes for the menu view. | |
* | |
* @param array<string,string> $attributes | |
* @param array<string,string> $overrides | |
*/ | |
public function parseMenuAttributes(array $attributes, array $overrides = []): string | |
{ | |
return $this->menuHelper->parseAttributes($attributes, $overrides); | |
} | |
/** | |
* Concats the appropriate classes for menu links. | |
* | |
* @param array<string,string> $options | |
* | |
* @return array<mixed> | |
*/ | |
public function buildMenuClasses(ItemInterface $item, ?MatcherInterface $matcher, array $options, ?string $extraClasses): array | |
{ | |
$isAncestor = null !== $matcher && $matcher->isAncestor($item, (int) $options['matchingDepth']); | |
$isCurrent = null !== $matcher && $matcher->isCurrent($item); | |
$class = $item->getAttribute('class'); | |
$classes = ''; | |
$classesArray = []; | |
$classes .= ($class) ? " {$class}" : ''; | |
$classes .= ($extraClasses) ? " {$extraClasses}" : ''; | |
$classes .= ($isCurrent) ? " {$options['currentClass']}" : ''; | |
$classes .= ($isAncestor) ? " {$options['ancestorClass']}" : ''; | |
$classes .= ($isAncestor && $this->menuHelper->invisibleChildSelected($item, $matcher)) ? " {$options['currentClass']}" : ''; | |
$classes .= ($item->actsLikeFirst() && isset($options['firstClass'])) ? " {$options['firstClass']}" : ''; | |
$classes .= ($item->actsLikeLast() && isset($options['lastClass'])) ? " {$options['lastClass']}" : ''; | |
if ('' !== $classes) { | |
$classesArray = ['class' => trim($classes)]; | |
} | |
return $classesArray; | |
} | |
} | |