Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\CoreBundle\Twig\Extension; | |
| use Mautic\CoreBundle\Twig\Helper\ButtonHelper; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
| use Symfony\Contracts\Translation\TranslatorInterface; | |
| use Twig\Extension\AbstractExtension; | |
| use Twig\TwigFunction; | |
| class ButtonExtension extends AbstractExtension | |
| { | |
| public function __construct( | |
| protected ButtonHelper $buttonHelper, | |
| protected RequestStack $requestStack, | |
| protected UrlGeneratorInterface $router, | |
| protected TranslatorInterface $translator | |
| ) { | |
| } | |
| public function getFunctions() | |
| { | |
| return [ | |
| new TwigFunction('buttonReset', [$this, 'reset'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonAdd', [$this, 'addButton'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonSetMenuLink', [$this, 'setMenuLink'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonSetWrappingTags', [$this, 'setWrappingTags'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonSetGroupType', [$this, 'setGroupType'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonGetCount', [$this, 'getButtonCount']), | |
| new TwigFunction('buttonsRender', [$this, 'render'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonsAdd', [$this, 'addButtons'], ['is_safe' => ['all']]), | |
| new TwigFunction('buttonsAddFromTemplate', [$this, 'addButtonsFromTemplate'], ['is_safe' => ['all']]), | |
| ]; | |
| } | |
| public function reset(string $location, string $groupType = ButtonHelper::TYPE_GROUP, $item = null): void | |
| { | |
| $this->buttonHelper->reset( | |
| $this->requestStack->getCurrentRequest(), | |
| $location, | |
| $groupType, | |
| $item | |
| ); | |
| } | |
| /** | |
| * @param array<string,mixed> $button | |
| */ | |
| public function addButton(array $button): void | |
| { | |
| $this->buttonHelper->addButton($button); | |
| } | |
| public function setMenuLink(?string $menuLink): void | |
| { | |
| $this->buttonHelper->setMenuLink($menuLink); | |
| } | |
| public function setWrappingTags(?string $wrapOpeningTag, ?string $wrapClosingTag): void | |
| { | |
| $this->buttonHelper->setWrappingTags($wrapOpeningTag, $wrapClosingTag); | |
| } | |
| public function setGroupType(string $groupType): void | |
| { | |
| $this->buttonHelper->setGroupType($groupType); | |
| } | |
| public function getButtonCount(): int | |
| { | |
| return $this->buttonHelper->getButtonCount(); | |
| } | |
| /** | |
| * @param array<array<string,mixed>> $buttons | |
| */ | |
| public function addButtons(array $buttons): void | |
| { | |
| $this->buttonHelper->addButtons($buttons); | |
| } | |
| public function render(string $dropdownHtml = '', string $closingDropdownHtml = ''): string | |
| { | |
| return $this->buttonHelper->renderButtons($dropdownHtml, $closingDropdownHtml); | |
| } | |
| /** | |
| * @param array<string,bool> $templateButtons | |
| * @param array<string,string> $query | |
| * @param array<string,string> $editAttr | |
| * @param array<string,string> $routeVars | |
| * @param mixed $item | |
| */ | |
| public function addButtonsFromTemplate( | |
| array $templateButtons, | |
| array $query, | |
| string $actionRoute, | |
| string $indexRoute, | |
| string $langVar, | |
| string $nameGetter, | |
| array $editAttr = [], | |
| array $routeVars = [], | |
| $item = null, | |
| ?string $tooltip = null | |
| ): void { | |
| foreach ($templateButtons as $action => $enabled) { | |
| if (!$enabled) { | |
| continue; | |
| } | |
| $path = false; | |
| $primary = false; | |
| $priority = 0; | |
| switch ($action) { | |
| case 'clone': | |
| case 'abtest': | |
| $actionQuery = [ | |
| /** | |
| * If the item has the getVariantParent(), it probably implements VariantEntityInterface, | |
| * but that doesn't have a getId() method so we can't do $item instanceof VariantEntityInterface here. | |
| */ | |
| 'objectId' => ('abtest' == $action && method_exists($item, 'getVariantParent') && $item->getVariantParent()) | |
| ? $item->getVariantParent()->getId() : $item->getId(), | |
| ]; | |
| $icon = ('clone' == $action) ? 'file-copy-line' : 'a-b'; | |
| $path = $this->router->generate($actionRoute, array_merge(['objectAction' => $action], $actionQuery, $query)); | |
| break; | |
| case 'close': | |
| $closeParameters = $routeVars['close'] ?? []; | |
| $icon = 'close-line'; | |
| $path = $this->router->generate($indexRoute, $closeParameters); | |
| $primary = true; | |
| $priority = 200; | |
| break; | |
| case 'new': | |
| case 'edit': | |
| $actionQuery = ('edit' == $action) ? ['objectId' => $item->getId()] : []; | |
| $icon = ('edit' == $action) ? 'edit-line' : 'add-line'; | |
| $path = $this->router->generate($actionRoute, array_merge(['objectAction' => $action], $actionQuery, $query)); | |
| $primary = true; | |
| break; | |
| case 'delete': | |
| $this->buttonHelper->addButton( | |
| [ | |
| 'confirm' => [ | |
| 'message' => $this->translator->trans( | |
| 'mautic.'.$langVar.'.form.confirmdelete', | |
| ['%name%' => $item->$nameGetter().' ('.$item->getId().')'] | |
| ), | |
| 'confirmAction' => $this->router->generate( | |
| $actionRoute, | |
| array_merge(['objectAction' => 'delete', 'objectId' => $item->getId()], $query) | |
| ), | |
| 'template' => 'delete', | |
| 'btnClass' => false, | |
| ], | |
| 'priority' => -1, | |
| ] | |
| ); | |
| break; | |
| } | |
| if ($path) { | |
| $mergeAttr = (!in_array($action, ['edit', 'new'])) ? [] : $editAttr; | |
| $this->buttonHelper->addButton( | |
| [ | |
| 'attr' => array_merge( | |
| [ | |
| 'class' => 'btn btn-default', | |
| 'href' => $path, | |
| 'data-toggle' => 'ajax', | |
| ], | |
| $mergeAttr | |
| ), | |
| 'iconClass' => 'ri-'.$icon, | |
| 'btnText' => $this->translator->trans('mautic.core.form.'.$action), | |
| 'priority' => $priority, | |
| 'primary' => $primary, | |
| 'tooltip' => $tooltip, | |
| ] | |
| ); | |
| } | |
| } | |
| } | |
| } | |