Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Event; | |
use Mautic\CoreBundle\Twig\Helper\ButtonHelper; | |
use Symfony\Component\HttpFoundation\Request; | |
class CustomButtonEvent extends AbstractCustomRequestEvent | |
{ | |
/** | |
* @var array | |
*/ | |
protected $buttons = []; | |
public function __construct( | |
protected $location, | |
Request $request, | |
array $buttons = [], | |
protected $item = null | |
) { | |
parent::__construct($request); | |
foreach ($buttons as $button) { | |
$this->buttons[$this->generateButtonKey($button)] = $button; | |
} | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getLocation() | |
{ | |
return $this->location; | |
} | |
/** | |
* @return array | |
*/ | |
public function getButtons() | |
{ | |
return $this->buttons; | |
} | |
/** | |
* Add an array of buttons. | |
* | |
* @return $this | |
*/ | |
public function addButtons(array $buttons, $location = null, $route = null) | |
{ | |
if (!$this->checkLocationContext($location) || !$this->checkRouteContext($route)) { | |
return $this; | |
} | |
foreach ($buttons as $button) { | |
if (!isset($button['priority'])) { | |
$button['priority'] = 0; | |
} | |
$this->buttons[$this->generateButtonKey($button)] = $button; | |
} | |
return $this; | |
} | |
/** | |
* Add a single button. | |
* | |
* @param string|null $location | |
* @param string|null $route | |
* | |
* @return $this | |
*/ | |
public function addButton(array $button, $location = null, $route = null) | |
{ | |
if (!$this->checkLocationContext($location) || !$this->checkRouteContext($route)) { | |
return $this; | |
} | |
if (!isset($button['priority'])) { | |
$button['priority'] = 0; | |
} | |
$this->buttons[$this->generateButtonKey($button)] = $button; | |
return $this; | |
} | |
public function removeButton($button): void | |
{ | |
$buttonKey = $this->generateButtonKey($button); | |
if (isset($this->buttons[$buttonKey])) { | |
unset($this->buttons[$buttonKey]); | |
} | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getItem() | |
{ | |
return $this->item; | |
} | |
public function checkLocationContext($location): bool | |
{ | |
if (null !== $location) { | |
if ((is_array($location) && !in_array($this->location, $location)) || (is_string($location) && $location !== $this->location)) { | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Generate a button ID that can be overridden by other plugins. | |
*/ | |
protected function generateButtonKey($button): string | |
{ | |
$buttonKey = ''; | |
if (!empty($button['btnText'])) { | |
$buttonKey .= $button['btnText']; | |
} elseif (isset($button['confirm'])) { | |
if (!empty($button['confirm']['btnText'])) { | |
$buttonKey .= $button['confirm']['btnText']; | |
} | |
if (!empty($button['confirm']['template'])) { | |
$buttonKey .= $button['confirm']['template']; | |
} | |
if (!empty($button['confirm']['iconClass'])) { | |
$buttonKey .= $button['confirm']['iconClass']; | |
} | |
} | |
if (!empty($button['iconClass'])) { | |
$buttonKey .= $button['iconClass']; | |
} | |
// Ensure buttons aren't overwritten unintentionally | |
if (empty($buttonKey)) { | |
$buttonKey = uniqid(time()); | |
} | |
if (ButtonHelper::LOCATION_NAVBAR !== $this->location) { | |
// Include the request | |
[$currentRoute, $routeParams] = $this->getRoute(true); | |
$buttonKey .= $currentRoute; | |
foreach ($routeParams as $paramKey => $paramValue) { | |
$buttonKey .= $paramKey.$paramValue; | |
} | |
} | |
return $buttonKey; | |
} | |
} | |