Initial commit: CloudOps infrastructure platform
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController;
|
||||
use Mautic\CoreBundle\Helper\InputHelper;
|
||||
use Mautic\PointBundle\Form\Type\PointActionType;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
class AjaxController extends CommonAjaxController
|
||||
{
|
||||
public function reorderTriggerEventsAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
|
||||
{
|
||||
$dataArray = ['success' => 0];
|
||||
$session = $request->getSession();
|
||||
$triggerId = InputHelper::clean($request->request->get('triggerId'));
|
||||
$sessionName = 'mautic.point.'.$triggerId.'.triggerevents.modified';
|
||||
$order = InputHelper::clean($request->request->get('triggerEvent'));
|
||||
$components = $session->get($sessionName);
|
||||
|
||||
if (!empty($order) && !empty($components)) {
|
||||
$components = array_replace(array_flip($order), $components);
|
||||
$session->set($sessionName, $components);
|
||||
$dataArray['success'] = 1;
|
||||
}
|
||||
|
||||
return $this->sendJsonResponse($dataArray);
|
||||
}
|
||||
|
||||
public function getActionFormAction(Request $request, FormFactoryInterface $formFactory): \Symfony\Component\HttpFoundation\JsonResponse
|
||||
{
|
||||
$type = InputHelper::clean($request->request->get('actionType'));
|
||||
$dataArray = [
|
||||
'success' => 0,
|
||||
'html' => '',
|
||||
];
|
||||
|
||||
if (!empty($type)) {
|
||||
// get the HTML for the form
|
||||
/** @var \Mautic\PointBundle\Model\PointModel $model */
|
||||
$model = $this->getModel('point');
|
||||
$actions = $model->getPointActions();
|
||||
|
||||
if (isset($actions['actions'][$type])) {
|
||||
$themes = ['@MauticPoint/FormTheme/Action/_pointaction_properties_row.html.twig'];
|
||||
|
||||
if (!empty($actions['actions'][$type]['formTheme'])) {
|
||||
$themes[] = $actions['actions'][$type]['formTheme'];
|
||||
}
|
||||
|
||||
$formType = (!empty($actions['actions'][$type]['formType'])) ? $actions['actions'][$type]['formType'] : null;
|
||||
$formTypeOptions = (!empty($actions['actions'][$type]['formTypeOptions'])) ? $actions['actions'][$type]['formTypeOptions'] : [];
|
||||
$form = $formFactory->create(PointActionType::class, [], ['formType' => $formType, 'formTypeOptions' => $formTypeOptions]);
|
||||
$html = $this->renderView('@MauticPoint/Point/actionform.html.twig', [
|
||||
'form' => $form->createView(),
|
||||
'formThemes' => $themes,
|
||||
]);
|
||||
|
||||
// replace pointaction with point
|
||||
$html = str_replace('pointaction', 'point', $html);
|
||||
$dataArray['html'] = $html;
|
||||
$dataArray['success'] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->sendJsonResponse($dataArray);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller\Api;
|
||||
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
use Mautic\ApiBundle\Controller\CommonApiController;
|
||||
use Mautic\ApiBundle\Helper\EntityResultHelper;
|
||||
use Mautic\CoreBundle\Factory\ModelFactory;
|
||||
use Mautic\CoreBundle\Helper\AppVersion;
|
||||
use Mautic\CoreBundle\Helper\CoreParametersHelper;
|
||||
use Mautic\CoreBundle\Helper\InputHelper;
|
||||
use Mautic\CoreBundle\Helper\IpLookupHelper;
|
||||
use Mautic\CoreBundle\Security\Permissions\CorePermissions;
|
||||
use Mautic\CoreBundle\Translation\Translator;
|
||||
use Mautic\LeadBundle\Controller\LeadAccessTrait;
|
||||
use Mautic\LeadBundle\Model\LeadModel;
|
||||
use Mautic\PointBundle\Entity\Point;
|
||||
use Mautic\PointBundle\Model\PointModel;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\RouterInterface;
|
||||
|
||||
/**
|
||||
* @extends CommonApiController<Point>
|
||||
*/
|
||||
class PointApiController extends CommonApiController
|
||||
{
|
||||
use LeadAccessTrait;
|
||||
|
||||
protected LeadModel $leadModel;
|
||||
|
||||
/**
|
||||
* @var PointModel|null
|
||||
*/
|
||||
protected $model;
|
||||
|
||||
public function __construct(CorePermissions $security, Translator $translator, EntityResultHelper $entityResultHelper, RouterInterface $router, FormFactoryInterface $formFactory, AppVersion $appVersion, RequestStack $requestStack, ManagerRegistry $doctrine, ModelFactory $modelFactory, EventDispatcherInterface $dispatcher, CoreParametersHelper $coreParametersHelper)
|
||||
{
|
||||
$leadModel = $modelFactory->getModel('lead');
|
||||
\assert($leadModel instanceof LeadModel);
|
||||
|
||||
$pointModel = $modelFactory->getModel('point');
|
||||
\assert($pointModel instanceof PointModel);
|
||||
|
||||
$this->model = $pointModel;
|
||||
$this->leadModel = $leadModel;
|
||||
$this->entityClass = Point::class;
|
||||
$this->entityNameOne = 'point';
|
||||
$this->entityNameMulti = 'points';
|
||||
$this->serializerGroups = ['pointDetails', 'categoryList', 'publishDetails'];
|
||||
|
||||
parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of available point action types.
|
||||
*/
|
||||
public function getPointActionTypesAction()
|
||||
{
|
||||
if (!$this->security->isGranted([$this->permissionBase.':view', $this->permissionBase.':viewown'])) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$actionTypes = $this->model->getPointActions();
|
||||
$view = $this->view(['pointActionTypes' => $actionTypes['list']]);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract points from a lead.
|
||||
*
|
||||
* @param int $leadId
|
||||
* @param string $operator
|
||||
* @param int $delta
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function adjustPointsAction(Request $request, IpLookupHelper $ipLookupHelper, $leadId, $operator, $delta)
|
||||
{
|
||||
$lead = $this->checkLeadAccess($leadId, 'edit');
|
||||
if ($lead instanceof Response) {
|
||||
return $lead;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->logApiPointChange($request, $ipLookupHelper, $lead, $delta, $operator);
|
||||
} catch (\Exception $e) {
|
||||
return $this->returnError($e->getMessage(), Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
return $this->handleView($this->view(['success' => 1], Response::HTTP_OK));
|
||||
}
|
||||
|
||||
/**
|
||||
* Log the lead points change.
|
||||
*
|
||||
* @param int $delta
|
||||
*/
|
||||
protected function logApiPointChange(Request $request, IpLookupHelper $ipLookupHelper, $lead, $delta, $operator)
|
||||
{
|
||||
$trans = $this->translator;
|
||||
$ip = $ipLookupHelper->getIpAddress();
|
||||
$eventName = InputHelper::clean($request->request->get('eventName', $trans->trans('mautic.lead.lead.submitaction.operator_'.$operator)));
|
||||
$actionName = InputHelper::clean($request->request->get('actionName', $trans->trans('mautic.lead.event.api')));
|
||||
|
||||
$lead->adjustPoints($delta, $operator);
|
||||
$lead->addPointsChangeLogEntry('API', $eventName, $actionName, $delta, $ip);
|
||||
$this->leadModel->saveEntity($lead, false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Mautic\PointBundle\Controller\Api;
|
||||
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
use Mautic\ApiBundle\Controller\CommonApiController;
|
||||
use Mautic\ApiBundle\Helper\EntityResultHelper;
|
||||
use Mautic\CoreBundle\Factory\ModelFactory;
|
||||
use Mautic\CoreBundle\Helper\AppVersion;
|
||||
use Mautic\CoreBundle\Helper\CoreParametersHelper;
|
||||
use Mautic\CoreBundle\Helper\InputHelper;
|
||||
use Mautic\CoreBundle\Helper\IpLookupHelper;
|
||||
use Mautic\CoreBundle\Security\Permissions\CorePermissions;
|
||||
use Mautic\CoreBundle\Translation\Translator;
|
||||
use Mautic\LeadBundle\Model\LeadModel;
|
||||
use Mautic\PointBundle\Entity\Group;
|
||||
use Mautic\PointBundle\Model\PointGroupModel;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\RouterInterface;
|
||||
|
||||
/**
|
||||
* @extends CommonApiController<Group>
|
||||
*/
|
||||
class PointGroupsApiController extends CommonApiController
|
||||
{
|
||||
/**
|
||||
* @var PointGroupModel
|
||||
*/
|
||||
protected $model;
|
||||
|
||||
public function __construct(CorePermissions $security, Translator $translator, EntityResultHelper $entityResultHelper, RouterInterface $router, FormFactoryInterface $formFactory, AppVersion $appVersion, RequestStack $requestStack, ManagerRegistry $doctrine, ModelFactory $modelFactory, EventDispatcherInterface $dispatcher, CoreParametersHelper $coreParametersHelper, PointGroupModel $pointGroupModel, private LeadModel $leadModel)
|
||||
{
|
||||
$this->model = $pointGroupModel;
|
||||
$this->entityClass = Group::class;
|
||||
$this->entityNameOne = 'pointGroup';
|
||||
$this->entityNameMulti = 'pointGroups';
|
||||
$this->serializerGroups = ['pointGroupDetails', 'pointGroupList', 'publishDetails'];
|
||||
|
||||
parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper);
|
||||
}
|
||||
|
||||
public function getContactPointGroupsAction(int $contactId): Response
|
||||
{
|
||||
$contact = $this->leadModel->getEntity($contactId);
|
||||
|
||||
if (null === $contact) {
|
||||
return $this->notFound($this->translator->trans('mautic.lead.event.api.lead.not.found'));
|
||||
}
|
||||
|
||||
if (!$this->checkEntityAccess($contact)) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$groupScores = $contact->getGroupScores();
|
||||
$view = $this->view(
|
||||
[
|
||||
'total' => count($groupScores),
|
||||
'groupScores' => $groupScores,
|
||||
],
|
||||
Response::HTTP_OK
|
||||
);
|
||||
|
||||
$context = $view->getContext()->setGroups(['groupContactScoreDetails', 'pointGroupDetails']);
|
||||
$view->setContext($context);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
|
||||
public function getContactPointGroupAction(int $contactId, int $groupId): Response
|
||||
{
|
||||
$contact = $this->leadModel->getEntity($contactId);
|
||||
|
||||
if (null === $contact) {
|
||||
return $this->notFound($this->translator->trans('mautic.lead.event.api.lead.not.found'));
|
||||
}
|
||||
|
||||
if (!$this->checkEntityAccess($contact)) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$pointGroup = $this->model->getEntity($groupId);
|
||||
if (null === $pointGroup) {
|
||||
return $this->notFound($this->translator->trans('mautic.lead.event.api.point.group.not.found'));
|
||||
}
|
||||
|
||||
$groupScore = $contact->getGroupScore($pointGroup);
|
||||
$view = $this->view(
|
||||
[
|
||||
'groupScore' => $groupScore,
|
||||
],
|
||||
Response::HTTP_OK
|
||||
);
|
||||
|
||||
$context = $view->getContext()->setGroups(['groupContactScoreDetails', 'pointGroupDetails']);
|
||||
$view->setContext($context);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
|
||||
public function adjustGroupPointsAction(Request $request, IpLookupHelper $ipLookupHelper, int $contactId, int $groupId, string $operator, int $value): Response
|
||||
{
|
||||
$contact = $this->leadModel->getEntity($contactId);
|
||||
|
||||
if (null === $contact) {
|
||||
return $this->notFound($this->translator->trans('mautic.lead.event.api.lead.not.found'));
|
||||
}
|
||||
|
||||
if (!$this->checkEntityAccess($contact)) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$pointGroup = $this->model->getEntity($groupId);
|
||||
if (null === $pointGroup) {
|
||||
return $this->notFound($this->translator->trans('mautic.lead.event.api.point.group.not.found'));
|
||||
}
|
||||
|
||||
if (!PointGroupModel::isAllowedPointOperation($operator)) {
|
||||
return $this->badRequest($this->translator->trans('mautic.lead.event.api.operation.not.allowed'));
|
||||
}
|
||||
|
||||
$oldScore = $contact->getGroupScore($pointGroup)?->getScore();
|
||||
$contact = $this->model->adjustPoints($contact, $pointGroup, $value, $operator);
|
||||
$newScore = $contact->getGroupScore($pointGroup)->getScore();
|
||||
$delta = $newScore - ($oldScore ?? 0);
|
||||
|
||||
$eventName = InputHelper::clean($request->request->get('eventName', $this->translator->trans('mautic.point.event.manual_change')));
|
||||
$actionName = InputHelper::clean($request->request->get('actionName', $this->translator->trans('mautic.lead.event.api')));
|
||||
$contact->addPointsChangeLogEntry(
|
||||
type: 'API',
|
||||
name: $eventName,
|
||||
action: $actionName,
|
||||
pointChanges: $delta,
|
||||
ip: $ipLookupHelper->getIpAddress(),
|
||||
group: $pointGroup
|
||||
);
|
||||
$this->leadModel->saveEntity($contact, false);
|
||||
|
||||
$view = $this->view(['groupScore' => $contact->getGroupScore($pointGroup)], Response::HTTP_OK);
|
||||
$context = $view->getContext()->setGroups(['groupContactScoreDetails', 'pointGroupDetails']);
|
||||
$view->setContext($context);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller\Api;
|
||||
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
use Mautic\ApiBundle\Controller\CommonApiController;
|
||||
use Mautic\ApiBundle\Helper\EntityResultHelper;
|
||||
use Mautic\CoreBundle\Factory\ModelFactory;
|
||||
use Mautic\CoreBundle\Helper\AppVersion;
|
||||
use Mautic\CoreBundle\Helper\CoreParametersHelper;
|
||||
use Mautic\CoreBundle\Security\Permissions\CorePermissions;
|
||||
use Mautic\CoreBundle\Translation\Translator;
|
||||
use Mautic\PointBundle\Entity\Trigger;
|
||||
use Mautic\PointBundle\Model\TriggerEventModel;
|
||||
use Mautic\PointBundle\Model\TriggerModel;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\RouterInterface;
|
||||
|
||||
/**
|
||||
* @extends CommonApiController<Trigger>
|
||||
*/
|
||||
class TriggerApiController extends CommonApiController
|
||||
{
|
||||
/**
|
||||
* @var TriggerModel|null
|
||||
*/
|
||||
protected $model;
|
||||
|
||||
public function __construct(
|
||||
CorePermissions $security,
|
||||
Translator $translator,
|
||||
EntityResultHelper $entityResultHelper,
|
||||
RouterInterface $router,
|
||||
FormFactoryInterface $formFactory,
|
||||
AppVersion $appVersion,
|
||||
private ?RequestStack $requestStack,
|
||||
ManagerRegistry $doctrine,
|
||||
ModelFactory $modelFactory,
|
||||
EventDispatcherInterface $dispatcher,
|
||||
CoreParametersHelper $coreParametersHelper,
|
||||
) {
|
||||
$triggerModel = $modelFactory->getModel('point.trigger');
|
||||
\assert($triggerModel instanceof TriggerModel);
|
||||
|
||||
$this->model = $triggerModel;
|
||||
$this->entityClass = Trigger::class;
|
||||
$this->entityNameOne = 'trigger';
|
||||
$this->entityNameMulti = 'triggers';
|
||||
$this->serializerGroups = ['triggerDetails', 'categoryList', 'publishDetails'];
|
||||
|
||||
parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper);
|
||||
}
|
||||
|
||||
protected function preSaveEntity(&$entity, $form, $parameters, $action = 'edit')
|
||||
{
|
||||
$method = $this->requestStack->getCurrentRequest()->getMethod();
|
||||
$triggerEventModel = $this->getModel('point.triggerevent');
|
||||
$isNew = false;
|
||||
|
||||
// Set timestamps
|
||||
$this->model->setTimestamps($entity, true, false);
|
||||
|
||||
if (!$entity->getId()) {
|
||||
$isNew = true;
|
||||
|
||||
// Save the entitz first to get the ID.
|
||||
// Using the repository function to not trigger the listeners twice.
|
||||
$this->model->getRepository()->saveEntity($entity);
|
||||
}
|
||||
|
||||
$requestTriggerIds = [];
|
||||
$currentEvents = $entity->getEvents();
|
||||
|
||||
// Add events from the request
|
||||
if (!empty($parameters['events']) && is_array($parameters['events'])) {
|
||||
foreach ($parameters['events'] as &$eventParams) {
|
||||
if (empty($eventParams['id'])) {
|
||||
// Create an unique ID if not set - the following code requires one
|
||||
$eventParams['id'] = 'new'.hash('sha1', uniqid(mt_rand()));
|
||||
$triggerEventEntity = $triggerEventModel->getEntity();
|
||||
} else {
|
||||
$triggerEventEntity = $triggerEventModel->getEntity($eventParams['id']);
|
||||
$requestTriggerIds[] = $eventParams['id'];
|
||||
}
|
||||
|
||||
$triggerEventForm = $this->createTriggerEventEntityForm($triggerEventEntity);
|
||||
$triggerEventForm->submit($eventParams, 'PATCH' !== $method);
|
||||
|
||||
if (!($triggerEventForm->isSubmitted() && $triggerEventForm->isValid())) {
|
||||
$formErrors = $this->getFormErrorMessages($triggerEventForm);
|
||||
$msg = $this->getFormErrorMessage($formErrors);
|
||||
|
||||
return $this->returnError('Trigger events: '.$msg, Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
|
||||
$this->model->setEvents($entity, $parameters['events']);
|
||||
}
|
||||
|
||||
// Remove events which weren't in the PUT request
|
||||
if (!$isNew && 'PUT' === $method) {
|
||||
foreach ($currentEvents as $currentEvent) {
|
||||
if (!in_array($currentEvent->getId(), $requestTriggerIds)) {
|
||||
$entity->removeTriggerEvent($currentEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return FormInterface<mixed>
|
||||
*/
|
||||
protected function createTriggerEventEntityForm($entity): FormInterface
|
||||
{
|
||||
$triggerEventModel = $this->getModel('point.triggerevent');
|
||||
\assert($triggerEventModel instanceof TriggerEventModel);
|
||||
|
||||
return $triggerEventModel->createForm(
|
||||
$entity,
|
||||
$this->formFactory,
|
||||
null,
|
||||
[
|
||||
'csrf_protection' => false,
|
||||
'allow_extra_fields' => true,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of available point trigger event types.
|
||||
*/
|
||||
public function getPointTriggerEventTypesAction()
|
||||
{
|
||||
if (!$this->security->isGranted([$this->permissionBase.':view', $this->permissionBase.':viewown'])) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$eventTypesRaw = $this->model->getEvents();
|
||||
$eventTypes = [];
|
||||
|
||||
foreach ($eventTypesRaw as $key => $type) {
|
||||
$eventTypes[$key] = $type['label'];
|
||||
}
|
||||
|
||||
$view = $this->view(['eventTypes' => $eventTypes]);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete events from a point trigger.
|
||||
*
|
||||
* @param int $triggerId
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function deletePointTriggerEventsAction($triggerId)
|
||||
{
|
||||
if (!$this->security->isGranted([$this->permissionBase.':editown', $this->permissionBase.':editother'], 'MATCH_ONE')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$entity = $this->model->getEntity($triggerId);
|
||||
|
||||
if (null === $entity) {
|
||||
return $this->notFound();
|
||||
}
|
||||
|
||||
$eventsToDelete = $this->requestStack->getCurrentRequest()->get('events');
|
||||
$currentEvents = $entity->getEvents();
|
||||
|
||||
if (!is_array($eventsToDelete)) {
|
||||
return $this->badRequest('The events attribute must be array.');
|
||||
}
|
||||
|
||||
foreach ($currentEvents as $currentEvent) {
|
||||
if (in_array($currentEvent->getId(), $eventsToDelete)) {
|
||||
$entity->removeTriggerEvent($currentEvent);
|
||||
}
|
||||
}
|
||||
|
||||
$view = $this->view([$this->entityNameOne => $entity]);
|
||||
|
||||
return $this->handleView($view);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\AbstractStandardFormController;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class GroupController extends AbstractStandardFormController
|
||||
{
|
||||
protected function getTemplateBase(): string
|
||||
{
|
||||
return '@MauticPoint/Group';
|
||||
}
|
||||
|
||||
protected function getModelName(): string
|
||||
{
|
||||
return 'point.group';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $page
|
||||
*/
|
||||
public function indexAction(Request $request, $page = 1): Response
|
||||
{
|
||||
return parent::indexStandard($request, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new form and processes post data.
|
||||
*
|
||||
* @return JsonResponse|Response
|
||||
*/
|
||||
public function newAction(Request $request)
|
||||
{
|
||||
return parent::newStandard($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates edit form and processes post data.
|
||||
*
|
||||
* @param int $objectId
|
||||
* @param bool $ignorePost
|
||||
*
|
||||
* @return JsonResponse|Response
|
||||
*/
|
||||
public function editAction(Request $request, $objectId, $ignorePost = false)
|
||||
{
|
||||
return parent::editStandard($request, $objectId, $ignorePost);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return JsonResponse|RedirectResponse
|
||||
*/
|
||||
public function deleteAction(Request $request, $objectId)
|
||||
{
|
||||
return parent::deleteStandard($request, $objectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a group of entities.
|
||||
*
|
||||
* @return JsonResponse|RedirectResponse
|
||||
*/
|
||||
public function batchDeleteAction(Request $request)
|
||||
{
|
||||
return parent::batchDeleteStandard($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\AbstractFormController;
|
||||
use Mautic\CoreBundle\Factory\PageHelperFactoryInterface;
|
||||
use Mautic\PointBundle\Entity\Point;
|
||||
use Mautic\PointBundle\Model\PointModel;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class PointController extends AbstractFormController
|
||||
{
|
||||
/**
|
||||
* @param int $page
|
||||
*
|
||||
* @return JsonResponse|Response
|
||||
*/
|
||||
public function indexAction(Request $request, PageHelperFactoryInterface $pageHelperFactory, $page = 1)
|
||||
{
|
||||
// set some permissions
|
||||
$permissions = $this->security->isGranted([
|
||||
'point:points:view',
|
||||
'point:points:create',
|
||||
'point:points:edit',
|
||||
'point:points:delete',
|
||||
'point:points:publish',
|
||||
], 'RETURN_ARRAY');
|
||||
|
||||
if (!$permissions['point:points:view']) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$this->setListFilters();
|
||||
|
||||
$pageHelper = $pageHelperFactory->make('mautic.point', $page);
|
||||
|
||||
$limit = $pageHelper->getLimit();
|
||||
$start = $pageHelper->getStart();
|
||||
$search = $request->get('search', $request->getSession()->get('mautic.point.filter', ''));
|
||||
$filter = ['string' => $search, 'force' => []];
|
||||
$orderBy = $request->getSession()->get('mautic.point.orderby', 'p.name');
|
||||
$orderByDir = $request->getSession()->get('mautic.point.orderbydir', 'ASC');
|
||||
$pointModel = $this->getModel('point');
|
||||
\assert($pointModel instanceof PointModel);
|
||||
$points = $pointModel->getEntities([
|
||||
'start' => $start,
|
||||
'limit' => $limit,
|
||||
'filter' => $filter,
|
||||
'orderBy' => $orderBy,
|
||||
'orderByDir' => $orderByDir,
|
||||
]);
|
||||
|
||||
$request->getSession()->set('mautic.point.filter', $search);
|
||||
|
||||
$count = count($points);
|
||||
if ($count && $count < ($start + 1)) {
|
||||
$lastPage = $pageHelper->countPage($count);
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', ['page' => $lastPage]);
|
||||
$pageHelper->rememberPage($lastPage);
|
||||
|
||||
return $this->postActionRedirect([
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $lastPage],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\PointController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
$pageHelper->rememberPage($page);
|
||||
|
||||
// get the list of actions
|
||||
$actions = $pointModel->getPointActions();
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'searchValue' => $search,
|
||||
'items' => $points,
|
||||
'actions' => $actions['actions'],
|
||||
'page' => $page,
|
||||
'limit' => $limit,
|
||||
'permissions' => $permissions,
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Point/list.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
'route' => $this->generateUrl('mautic_point_index', ['page' => $page]),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new form and processes post data.
|
||||
*
|
||||
* @param Point $entity
|
||||
*
|
||||
* @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function newAction(Request $request, FormFactoryInterface $formFactory, $entity = null)
|
||||
{
|
||||
$model = $this->getModel('point');
|
||||
\assert($model instanceof PointModel);
|
||||
|
||||
if (!($entity instanceof Point)) {
|
||||
/** @var Point $entity */
|
||||
$entity = $model->getEntity();
|
||||
}
|
||||
|
||||
if (!$this->security->isGranted('point:points:create')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
// set the page we came from
|
||||
$page = $request->getSession()->get('mautic.point.page', 1);
|
||||
$method = $request->getMethod();
|
||||
$point = $request->request->all()['point'] ?? [];
|
||||
$actionType = 'POST' === $method ? ($point['type'] ?? '') : '';
|
||||
$action = $this->generateUrl('mautic_point_action', ['objectAction' => 'new']);
|
||||
$actions = $model->getPointActions();
|
||||
$form = $model->createForm($entity, $formFactory, $action, [
|
||||
'pointActions' => $actions,
|
||||
'actionType' => $actionType,
|
||||
]);
|
||||
$viewParameters = ['page' => $page];
|
||||
|
||||
// /Check for a submitted form and process it
|
||||
if (Request::METHOD_POST === $method) {
|
||||
$valid = false;
|
||||
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
// form is valid so process the data
|
||||
$model->saveEntity($entity);
|
||||
|
||||
$this->addFlashMessage('mautic.core.notice.created', [
|
||||
'%name%' => $entity->getName(),
|
||||
'%menu_link%' => 'mautic_point_index',
|
||||
'%url%' => $this->generateUrl('mautic_point_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(),
|
||||
]),
|
||||
]);
|
||||
|
||||
if ($this->getFormButton($form, ['buttons', 'save'])->isClicked()) {
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\PointController::indexAction';
|
||||
} else {
|
||||
// return edit view so that all the session stuff is loaded
|
||||
return $this->editAction($request, $formFactory, $entity->getId(), true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\PointController::indexAction';
|
||||
}
|
||||
|
||||
if ($cancelled || ($valid && $this->getFormButton($form, ['buttons', 'save'])->isClicked())) {
|
||||
return $this->postActionRedirect([
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => $viewParameters,
|
||||
'contentTemplate' => $template,
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$themes = ['@MauticPoint/FormTheme/Action/_pointaction_properties_row.html.twig'];
|
||||
if ($actionType && !empty($actions['actions'][$actionType]['formTheme'])) {
|
||||
$themes[] = $actions['actions'][$actionType]['formTheme'];
|
||||
}
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
'entity' => $entity,
|
||||
'form' => $form->createView(),
|
||||
'actions' => $actions['actions'],
|
||||
'formThemes' => $themes,
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Point/form.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
'route' => $this->generateUrl('mautic_point_action', [
|
||||
'objectAction' => (!empty($valid) ? 'edit' : 'new'), // valid means a new form was applied
|
||||
'objectId' => $entity->getId(),
|
||||
]
|
||||
),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates edit form and processes post data.
|
||||
*
|
||||
* @param int $objectId
|
||||
* @param bool $ignorePost
|
||||
*
|
||||
* @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function editAction(Request $request, FormFactoryInterface $formFactory, $objectId, $ignorePost = false)
|
||||
{
|
||||
$model = $this->getModel('point');
|
||||
\assert($model instanceof PointModel);
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
// set the page we came from
|
||||
$page = $request->getSession()->get('mautic.point.page', 1);
|
||||
|
||||
$viewParameters = ['page' => $page];
|
||||
|
||||
// set the return URL
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', ['page' => $page]);
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => $viewParameters,
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\PointController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
],
|
||||
];
|
||||
|
||||
// form not found
|
||||
if (null === $entity) {
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => [
|
||||
[
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
],
|
||||
],
|
||||
])
|
||||
);
|
||||
} elseif (!$this->security->isGranted('point:points:edit')) {
|
||||
return $this->accessDenied();
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
// deny access if the entity is locked
|
||||
return $this->isLocked($postActionVars, $entity, 'point');
|
||||
}
|
||||
|
||||
$method = $request->getMethod();
|
||||
$point = $request->request->all()['point'] ?? [];
|
||||
$actionType = 'POST' === $method ? ($point['type'] ?? '') : $entity->getType();
|
||||
|
||||
$action = $this->generateUrl('mautic_point_action', ['objectAction' => 'edit', 'objectId' => $objectId]);
|
||||
$actions = $model->getPointActions();
|
||||
$form = $model->createForm($entity, $formFactory, $action, [
|
||||
'pointActions' => $actions,
|
||||
'actionType' => $actionType,
|
||||
]);
|
||||
|
||||
// /Check for a submitted form and process it
|
||||
if (!$ignorePost && 'POST' === $method) {
|
||||
$valid = false;
|
||||
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
// form is valid so process the data
|
||||
$model->saveEntity($entity, $this->getFormButton($form, ['buttons', 'save'])->isClicked());
|
||||
|
||||
$this->addFlashMessage('mautic.core.notice.updated', [
|
||||
'%name%' => $entity->getName(),
|
||||
'%menu_link%' => 'mautic_point_index',
|
||||
'%url%' => $this->generateUrl('mautic_point_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(),
|
||||
]),
|
||||
]);
|
||||
|
||||
if ($this->getFormButton($form, ['buttons', 'save'])->isClicked()) {
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\PointController::indexAction';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// unlock the entity
|
||||
$model->unlockEntity($entity);
|
||||
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\PointController::indexAction';
|
||||
}
|
||||
|
||||
if ($cancelled || ($valid && $this->getFormButton($form, ['buttons', 'save'])->isClicked())) {
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => $viewParameters,
|
||||
'contentTemplate' => $template,
|
||||
])
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// lock the entity
|
||||
$model->lockEntity($entity);
|
||||
}
|
||||
|
||||
$themes = ['@MauticPoint/FormTheme/Action/_pointaction_properties_row.html.twig'];
|
||||
if (!empty($actions['actions'][$actionType]['formTheme'])) {
|
||||
$themes[] = $actions['actions'][$actionType]['formTheme'];
|
||||
}
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
'entity' => $entity,
|
||||
'form' => $form->createView(),
|
||||
'actions' => $actions['actions'],
|
||||
'formThemes' => $themes,
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Point/form.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
'route' => $this->generateUrl('mautic_point_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(),
|
||||
]
|
||||
),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone an entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return array|JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function cloneAction(Request $request, FormFactoryInterface $formFactory, $objectId)
|
||||
{
|
||||
$model = $this->getModel('point');
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
if (null != $entity) {
|
||||
if (!$this->security->isGranted('point:points:create')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$entity = clone $entity;
|
||||
$entity->setIsPublished(false);
|
||||
}
|
||||
|
||||
return $this->newAction($request, $formFactory, $entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function deleteAction(Request $request, $objectId)
|
||||
{
|
||||
$page = $request->getSession()->get('mautic.point.page', 1);
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', ['page' => $page]);
|
||||
$flashes = [];
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\PointController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
],
|
||||
];
|
||||
|
||||
if (Request::METHOD_POST === $request->getMethod()) {
|
||||
$model = $this->getModel('point');
|
||||
\assert($model instanceof PointModel);
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
if (null === $entity) {
|
||||
$flashes[] = [
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
];
|
||||
} elseif (!$this->security->isGranted('point:points:delete')) {
|
||||
return $this->accessDenied();
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
return $this->isLocked($postActionVars, $entity, 'point');
|
||||
}
|
||||
|
||||
$model->deleteEntity($entity);
|
||||
|
||||
$identifier = $this->translator->trans($entity->getName());
|
||||
$flashes[] = [
|
||||
'type' => 'notice',
|
||||
'msg' => 'mautic.core.notice.deleted',
|
||||
'msgVars' => [
|
||||
'%name%' => $identifier,
|
||||
'%id%' => $objectId,
|
||||
],
|
||||
];
|
||||
} // else don't do anything
|
||||
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => $flashes,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a group of entities.
|
||||
*/
|
||||
public function batchDeleteAction(Request $request): Response
|
||||
{
|
||||
$page = $request->getSession()->get('mautic.point.page', 1);
|
||||
$returnUrl = $this->generateUrl('mautic_point_index', ['page' => $page]);
|
||||
$flashes = [];
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\PointController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_point_index',
|
||||
'mauticContent' => 'point',
|
||||
],
|
||||
];
|
||||
|
||||
if (Request::METHOD_POST === $request->getMethod()) {
|
||||
$model = $this->getModel('point');
|
||||
\assert($model instanceof PointModel);
|
||||
$ids = json_decode($request->query->get('ids', '{}'));
|
||||
$deleteIds = [];
|
||||
|
||||
// Loop over the IDs to perform access checks pre-delete
|
||||
foreach ($ids as $objectId) {
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
if (null === $entity) {
|
||||
$flashes[] = [
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
];
|
||||
} elseif (!$this->security->isGranted('point:points:delete')) {
|
||||
$flashes[] = $this->accessDenied(true);
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
$flashes[] = $this->isLocked($postActionVars, $entity, 'point', true);
|
||||
} else {
|
||||
$deleteIds[] = $objectId;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete everything we are able to
|
||||
if (!empty($deleteIds)) {
|
||||
$entities = $model->deleteEntities($deleteIds);
|
||||
|
||||
$flashes[] = [
|
||||
'type' => 'notice',
|
||||
'msg' => 'mautic.point.notice.batch_deleted',
|
||||
'msgVars' => [
|
||||
'%count%' => count($entities),
|
||||
],
|
||||
];
|
||||
}
|
||||
} // else don't do anything
|
||||
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => $flashes,
|
||||
])
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,626 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\FormController;
|
||||
use Mautic\CoreBundle\Factory\PageHelperFactoryInterface;
|
||||
use Mautic\PointBundle\Entity\Trigger;
|
||||
use Mautic\PointBundle\Model\TriggerEventModel;
|
||||
use Mautic\PointBundle\Model\TriggerModel;
|
||||
use Symfony\Component\Form\FormError;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class TriggerController extends FormController
|
||||
{
|
||||
/**
|
||||
* @param int $page
|
||||
*
|
||||
* @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function indexAction(Request $request, PageHelperFactoryInterface $pageHelperFactory, $page = 1)
|
||||
{
|
||||
// set some permissions
|
||||
$permissions = $this->security->isGranted([
|
||||
'point:triggers:view',
|
||||
'point:triggers:create',
|
||||
'point:triggers:edit',
|
||||
'point:triggers:delete',
|
||||
'point:triggers:publish',
|
||||
], 'RETURN_ARRAY');
|
||||
|
||||
if (!$permissions['point:triggers:view']) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$this->setListFilters();
|
||||
|
||||
$pageHelper = $pageHelperFactory->make('mautic.point.trigger', $page);
|
||||
|
||||
$limit = $pageHelper->getLimit();
|
||||
$start = $pageHelper->getStart();
|
||||
$search = $request->get('search', $request->getSession()->get('mautic.point.trigger.filter', ''));
|
||||
$filter = ['string' => $search, 'force' => []];
|
||||
$orderBy = $request->getSession()->get('mautic.point.trigger.orderby', 't.name');
|
||||
$orderByDir = $request->getSession()->get('mautic.point.trigger.orderbydir', 'ASC');
|
||||
$triggers = $this->getModel('point.trigger')->getEntities(
|
||||
[
|
||||
'start' => $start,
|
||||
'limit' => $limit,
|
||||
'filter' => $filter,
|
||||
'orderBy' => $orderBy,
|
||||
'orderByDir' => $orderByDir,
|
||||
]
|
||||
);
|
||||
|
||||
$request->getSession()->set('mautic.point.trigger.filter', $search);
|
||||
|
||||
$count = count($triggers);
|
||||
if ($count && $count < ($start + 1)) {
|
||||
$lastPage = $pageHelper->countPage($count);
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', ['page' => $lastPage]);
|
||||
$pageHelper->rememberPage($lastPage);
|
||||
|
||||
return $this->postActionRedirect([
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $lastPage],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\TriggerController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
$pageHelper->rememberPage($page);
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'searchValue' => $search,
|
||||
'items' => $triggers,
|
||||
'page' => $page,
|
||||
'limit' => $limit,
|
||||
'permissions' => $permissions,
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Trigger/list.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
'route' => $this->generateUrl('mautic_pointtrigger_index', ['page' => $page]),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* View a specific trigger.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return array|JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function viewAction(Request $request, $objectId)
|
||||
{
|
||||
$entity = $this->getModel('point.trigger')->getEntity($objectId);
|
||||
|
||||
// set the page we came from
|
||||
$page = $request->getSession()->get('mautic.point.trigger.page', 1);
|
||||
|
||||
$permissions = $this->security->isGranted([
|
||||
'point:triggers:view',
|
||||
'point:triggers:create',
|
||||
'point:triggers:edit',
|
||||
'point:triggers:delete',
|
||||
'point:triggers:publish',
|
||||
], 'RETURN_ARRAY');
|
||||
|
||||
if (null === $entity) {
|
||||
// set the return URL
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', ['page' => $page]);
|
||||
|
||||
return $this->postActionRedirect([
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\TriggerController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
'flashes' => [
|
||||
[
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.trigger.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
],
|
||||
],
|
||||
]);
|
||||
} elseif (!$permissions['point:triggers:view']) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'entity' => $entity,
|
||||
'page' => $page,
|
||||
'permissions' => $permissions,
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Trigger/details.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
'route' => $this->generateUrl('mautic_pointtrigger_action', [
|
||||
'objectAction' => 'view',
|
||||
'objectId' => $entity->getId(), ]
|
||||
),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new form and processes post data.
|
||||
*
|
||||
* @param array<mixed> $triggerEvents
|
||||
*/
|
||||
public function newAction(Request $request, ?Trigger $entity = null, array $triggerEvents = []): Response
|
||||
{
|
||||
/** @var TriggerModel $model */
|
||||
$model = $this->getModel('point.trigger');
|
||||
|
||||
if (!($entity instanceof Trigger)) {
|
||||
/** @var Trigger $entity */
|
||||
$entity = $model->getEntity();
|
||||
}
|
||||
|
||||
$session = $request->getSession();
|
||||
$sessionId = $this->getSessionBase();
|
||||
|
||||
if (!$this->security->isGranted('point:triggers:create')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
// set the page we came from
|
||||
$page = $request->getSession()->get('mautic.point.trigger.page', 1);
|
||||
|
||||
// set added/updated events
|
||||
$addEvents = $session->get('mautic.point.'.$sessionId.'.triggerevents.modified', []);
|
||||
if (!empty($triggerEvents)) {
|
||||
$addEvents += $triggerEvents;
|
||||
$session->set('mautic.point.'.$sessionId.'.triggerevents.modified', $triggerEvents);
|
||||
}
|
||||
$deletedEvents = $session->get('mautic.point.'.$sessionId.'.triggerevents.deleted', []);
|
||||
|
||||
$action = $this->generateUrl('mautic_pointtrigger_action', ['objectAction' => 'new']);
|
||||
$form = $model->createForm($entity, $this->formFactory, $action);
|
||||
$form->get('sessionId')->setData($sessionId);
|
||||
|
||||
// Check for a submitted form and process it
|
||||
if ('POST' == $request->getMethod()) {
|
||||
$valid = false;
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
// only save events that are not to be deleted
|
||||
$events = array_diff_key($addEvents, array_flip($deletedEvents));
|
||||
|
||||
// make sure that at least one action is selected
|
||||
if (empty($events)) {
|
||||
// set the error
|
||||
$form->addError(new FormError(
|
||||
$this->translator->trans('mautic.core.value.required', [], 'validators')
|
||||
));
|
||||
$valid = false;
|
||||
} else {
|
||||
$model->setEvents($entity, $events);
|
||||
|
||||
$model->saveEntity($entity);
|
||||
|
||||
$this->addFlashMessage('mautic.core.notice.created', [
|
||||
'%name%' => $entity->getName(),
|
||||
'%menu_link%' => 'mautic_pointtrigger_index',
|
||||
'%url%' => $this->generateUrl('mautic_pointtrigger_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(),
|
||||
]),
|
||||
]);
|
||||
|
||||
if (!$this->getFormButton($form, ['buttons', 'save'])->isClicked()) {
|
||||
// unset the clone session.
|
||||
$this->clearSessionComponents($request, $sessionId);
|
||||
|
||||
// return edit view so that all the session stuff is loaded
|
||||
return $this->editAction($request, $entity->getId(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($cancelled || ($valid && $this->getFormButton($form, ['buttons', 'save'])->isClicked())) {
|
||||
$viewParameters = ['page' => $page];
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\TriggerController::indexAction';
|
||||
|
||||
// clear temporary fields
|
||||
$this->clearSessionComponents($request, $sessionId);
|
||||
|
||||
return $this->postActionRedirect([
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => $viewParameters,
|
||||
'contentTemplate' => $template,
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
]);
|
||||
}
|
||||
} elseif (!empty($triggerEvents)) {
|
||||
// The clone part, no need to clear session here.
|
||||
$addEvents = $triggerEvents;
|
||||
$deletedEvents = [];
|
||||
} else {
|
||||
// clear out existing fields in case the form was refreshed, browser closed, etc
|
||||
$this->clearSessionComponents($request, $sessionId);
|
||||
}
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'events' => $model->getEventGroups(),
|
||||
'triggerEvents' => $addEvents,
|
||||
'deletedEvents' => $deletedEvents,
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
'entity' => $entity,
|
||||
'form' => $form->createView(),
|
||||
'sessionId' => $sessionId,
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Trigger/form.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
'route' => $this->generateUrl('mautic_pointtrigger_action', [
|
||||
'objectAction' => (!empty($valid) ? 'edit' : 'new'), // valid means a new form was applied
|
||||
'objectId' => $entity->getId(), ]
|
||||
),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates edit form and processes post data.
|
||||
*
|
||||
* @param int $objectId
|
||||
* @param bool $ignorePost
|
||||
*
|
||||
* @return JsonResponse|Response
|
||||
*/
|
||||
public function editAction(Request $request, $objectId, $ignorePost = false)
|
||||
{
|
||||
/** @var TriggerModel $model */
|
||||
$model = $this->getModel('point.trigger');
|
||||
$entity = $model->getEntity($objectId);
|
||||
$session = $request->getSession();
|
||||
$cleanSlate = true;
|
||||
|
||||
// set the page we came from
|
||||
$page = $request->getSession()->get('mautic.point.trigger.page', 1);
|
||||
|
||||
// set the return URL
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', ['page' => $page]);
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\TriggerController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
];
|
||||
|
||||
// form not found
|
||||
if (null === $entity) {
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => [
|
||||
[
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.trigger.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
],
|
||||
],
|
||||
])
|
||||
);
|
||||
} elseif (!$this->security->isGranted('point:triggers:edit')) {
|
||||
return $this->accessDenied();
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
// deny access if the entity is locked
|
||||
return $this->isLocked($postActionVars, $entity, 'point.trigger');
|
||||
}
|
||||
|
||||
$action = $this->generateUrl('mautic_pointtrigger_action', ['objectAction' => 'edit', 'objectId' => $objectId]);
|
||||
$form = $model->createForm($entity, $this->formFactory, $action);
|
||||
$form->get('sessionId')->setData($objectId);
|
||||
|
||||
// /Check for a submitted form and process it
|
||||
if (!$ignorePost && 'POST' == $request->getMethod()) {
|
||||
$valid = false;
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
// set added/updated events
|
||||
$addEvents = $session->get('mautic.point.'.$objectId.'.triggerevents.modified', []);
|
||||
$deletedEvents = $session->get('mautic.point.'.$objectId.'.triggerevents.deleted', []);
|
||||
$events = array_diff_key($addEvents, array_flip($deletedEvents));
|
||||
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
// make sure that at least one field is selected
|
||||
if (empty($events)) {
|
||||
// set the error
|
||||
$form->addError(new FormError(
|
||||
$this->translator->trans('mautic.core.value.required', [], 'validators')
|
||||
));
|
||||
$valid = false;
|
||||
} else {
|
||||
$model->setEvents($entity, $events);
|
||||
|
||||
// form is valid so process the data
|
||||
$model->saveEntity($entity, $this->getFormButton($form, ['buttons', 'save'])->isClicked());
|
||||
|
||||
// delete entities
|
||||
if (count($deletedEvents)) {
|
||||
$triggerEventModel = $this->getModel('point.triggerevent');
|
||||
\assert($triggerEventModel instanceof TriggerEventModel);
|
||||
$triggerEventModel->deleteEntities($deletedEvents);
|
||||
}
|
||||
|
||||
$session->set('mautic.point.'.$objectId.'.triggerevents.modified', $events);
|
||||
$session->set('mautic.point.'.$objectId.'.triggerevents.deleted', []);
|
||||
|
||||
$this->addFlashMessage('mautic.core.notice.updated', [
|
||||
'%name%' => $entity->getName(),
|
||||
'%menu_link%' => 'mautic_pointtrigger_index',
|
||||
'%url%' => $this->generateUrl('mautic_pointtrigger_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// unlock the entity
|
||||
$model->unlockEntity($entity);
|
||||
}
|
||||
|
||||
if ($cancelled || ($valid && $this->getFormButton($form, ['buttons', 'save'])->isClicked())) {
|
||||
$viewParameters = ['page' => $page];
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', $viewParameters);
|
||||
$template = 'Mautic\PointBundle\Controller\TriggerController::indexAction';
|
||||
|
||||
// remove fields from session
|
||||
$this->clearSessionComponents($request, $objectId);
|
||||
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => $viewParameters,
|
||||
'contentTemplate' => $template,
|
||||
])
|
||||
);
|
||||
} elseif ($form->get('buttons')->get('apply')->isClicked()) {
|
||||
// do not clear session, just reload view with updated session
|
||||
$cleanSlate = false;
|
||||
}
|
||||
} else {
|
||||
$cleanSlate = true;
|
||||
|
||||
// lock the entity
|
||||
$model->lockEntity($entity);
|
||||
}
|
||||
|
||||
$triggerEvents = [];
|
||||
|
||||
if ($cleanSlate) {
|
||||
// clean slate
|
||||
$this->clearSessionComponents($request, $objectId);
|
||||
|
||||
// load existing events into session
|
||||
$existingActions = $entity->getEvents()->toArray();
|
||||
foreach ($existingActions as $a) {
|
||||
$id = $a->getId();
|
||||
$action = $a->convertToArray();
|
||||
unset($action['form']);
|
||||
$triggerEvents[$id] = $action;
|
||||
}
|
||||
$session->set('mautic.point.'.$objectId.'.triggerevents.modified', $triggerEvents);
|
||||
$deletedEvents = [];
|
||||
}
|
||||
|
||||
return $this->delegateView([
|
||||
'viewParameters' => [
|
||||
'events' => $model->getEventGroups(),
|
||||
'triggerEvents' => $triggerEvents,
|
||||
'deletedEvents' => $deletedEvents,
|
||||
'tmpl' => $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index',
|
||||
'entity' => $entity,
|
||||
'form' => $form->createView(),
|
||||
'sessionId' => $objectId,
|
||||
],
|
||||
'contentTemplate' => '@MauticPoint/Trigger/form.html.twig',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
'route' => $this->generateUrl('mautic_pointtrigger_action', [
|
||||
'objectAction' => 'edit',
|
||||
'objectId' => $entity->getId(), ]
|
||||
),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone an entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return array|JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response
|
||||
*/
|
||||
public function cloneAction(Request $request, $objectId)
|
||||
{
|
||||
/** @var TriggerModel $model */
|
||||
$model = $this->getModel('point.trigger');
|
||||
/** @var Trigger $entity */
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
$triggerEvents = [];
|
||||
|
||||
if (null != $entity) {
|
||||
if (!$this->security->isGranted('point:triggers:create')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$existingActions = $entity->getEvents()->toArray();
|
||||
|
||||
$entity = clone $entity;
|
||||
$entity->setIsPublished(false);
|
||||
foreach ($existingActions as $key => $action) {
|
||||
$action = clone $action;
|
||||
$action->setTrigger($entity);
|
||||
$entity->addTriggerEvent($key, $action);
|
||||
$actionArray = $action->convertToArray();
|
||||
unset($actionArray['form']);
|
||||
$triggerEvents[] = $actionArray;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->newAction($request, $entity, $triggerEvents);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the entity.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function deleteAction(Request $request, $objectId)
|
||||
{
|
||||
$page = $request->getSession()->get('mautic.point.trigger.page', 1);
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', ['page' => $page]);
|
||||
$flashes = [];
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\TriggerController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
];
|
||||
|
||||
if (Request::METHOD_POST === $request->getMethod()) {
|
||||
$model = $this->getModel('point.trigger');
|
||||
\assert($model instanceof TriggerModel);
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
if (null === $entity) {
|
||||
$flashes[] = [
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.trigger.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
];
|
||||
} elseif (!$this->security->isGranted('point:triggers:delete')) {
|
||||
return $this->accessDenied();
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
return $this->isLocked($postActionVars, $entity, 'point.trigger');
|
||||
}
|
||||
|
||||
$model->deleteEntity($entity);
|
||||
|
||||
$identifier = $this->translator->trans($entity->getName());
|
||||
$flashes[] = [
|
||||
'type' => 'notice',
|
||||
'msg' => 'mautic.core.notice.deleted',
|
||||
'msgVars' => [
|
||||
'%name%' => $identifier,
|
||||
'%id%' => $objectId,
|
||||
],
|
||||
];
|
||||
} // else don't do anything
|
||||
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => $flashes,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a group of entities.
|
||||
*/
|
||||
public function batchDeleteAction(Request $request): Response
|
||||
{
|
||||
$page = $request->getSession()->get('mautic.point.trigger.page', 1);
|
||||
$returnUrl = $this->generateUrl('mautic_pointtrigger_index', ['page' => $page]);
|
||||
$flashes = [];
|
||||
|
||||
$postActionVars = [
|
||||
'returnUrl' => $returnUrl,
|
||||
'viewParameters' => ['page' => $page],
|
||||
'contentTemplate' => 'Mautic\PointBundle\Controller\TriggerController::indexAction',
|
||||
'passthroughVars' => [
|
||||
'activeLink' => '#mautic_pointtrigger_index',
|
||||
'mauticContent' => 'pointTrigger',
|
||||
],
|
||||
];
|
||||
|
||||
if (Request::METHOD_POST === $request->getMethod()) {
|
||||
$model = $this->getModel('point.trigger');
|
||||
\assert($model instanceof TriggerModel);
|
||||
$ids = json_decode($request->query->get('ids', '{}'));
|
||||
$deleteIds = [];
|
||||
|
||||
// Loop over the IDs to perform access checks pre-delete
|
||||
foreach ($ids as $objectId) {
|
||||
$entity = $model->getEntity($objectId);
|
||||
|
||||
if (null === $entity) {
|
||||
$flashes[] = [
|
||||
'type' => 'error',
|
||||
'msg' => 'mautic.point.trigger.error.notfound',
|
||||
'msgVars' => ['%id%' => $objectId],
|
||||
];
|
||||
} elseif (!$this->security->isGranted('point:triggers:delete')) {
|
||||
$flashes[] = $this->accessDenied(true);
|
||||
} elseif ($model->isLocked($entity)) {
|
||||
$flashes[] = $this->isLocked($postActionVars, $entity, 'point.trigger', true);
|
||||
} else {
|
||||
$deleteIds[] = $objectId;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete everything we are able to
|
||||
if (!empty($deleteIds)) {
|
||||
$entities = $model->deleteEntities($deleteIds);
|
||||
|
||||
$flashes[] = [
|
||||
'type' => 'notice',
|
||||
'msg' => 'mautic.point.trigger.notice.batch_deleted',
|
||||
'msgVars' => [
|
||||
'%count%' => count($entities),
|
||||
],
|
||||
];
|
||||
}
|
||||
} // else don't do anything
|
||||
|
||||
return $this->postActionRedirect(
|
||||
array_merge($postActionVars, [
|
||||
'flashes' => $flashes,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear field and events from the session.
|
||||
*/
|
||||
private function clearSessionComponents(Request $request, $sessionId): void
|
||||
{
|
||||
$session = $request->getSession();
|
||||
$session->remove('mautic.point.'.$sessionId.'.triggerevents.modified');
|
||||
$session->remove('mautic.point.'.$sessionId.'.triggerevents.deleted');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,384 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\PointBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\FormController as CommonFormController;
|
||||
use Mautic\PointBundle\Entity\TriggerEvent;
|
||||
use Mautic\PointBundle\Form\Type\TriggerEventType;
|
||||
use Mautic\PointBundle\Model\TriggerModel;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class TriggerEventController extends CommonFormController
|
||||
{
|
||||
/**
|
||||
* Generates new form and processes post data.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function newAction(Request $request)
|
||||
{
|
||||
$success = 0;
|
||||
$valid = $cancelled = false;
|
||||
$method = $request->getMethod();
|
||||
$session = $request->getSession();
|
||||
|
||||
if ('POST' == $method) {
|
||||
$triggerEvent = $request->request->all()['pointtriggerevent'] ?? [];
|
||||
$eventType = $triggerEvent['type'];
|
||||
$triggerId = $triggerEvent['triggerId'];
|
||||
} else {
|
||||
$eventType = $request->query->get('type');
|
||||
$triggerId = $request->query->get('triggerId');
|
||||
|
||||
$triggerEvent = [
|
||||
'type' => $eventType,
|
||||
'triggerId' => $triggerId,
|
||||
];
|
||||
}
|
||||
|
||||
// ajax only for form fields
|
||||
if (!$eventType
|
||||
|| !$request->isXmlHttpRequest()
|
||||
|| !$this->security->isGranted([
|
||||
'point:triggers:edit',
|
||||
'point:triggers:create',
|
||||
], 'MATCH_ONE')
|
||||
) {
|
||||
return $this->modalAccessDenied();
|
||||
}
|
||||
|
||||
// fire the builder event
|
||||
/** @var TriggerModel $pointTriggerModel */
|
||||
$pointTriggerModel = $this->getModel('point.trigger');
|
||||
\assert($pointTriggerModel instanceof TriggerModel);
|
||||
$events = $pointTriggerModel->getEvents();
|
||||
$form = $this->formFactory->create(TriggerEventType::class, $triggerEvent, [
|
||||
'action' => $this->generateUrl('mautic_pointtriggerevent_action', ['objectAction' => 'new']),
|
||||
'settings' => $events[$eventType],
|
||||
]);
|
||||
$form->get('triggerId')->setData($triggerId);
|
||||
$triggerEvent['settings'] = $events[$eventType];
|
||||
|
||||
// Check for a submitted form and process it
|
||||
if ('POST' == $method) {
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
$success = 1;
|
||||
|
||||
// form is valid so process the data
|
||||
$keyId = 'new'.hash('sha1', uniqid(mt_rand()));
|
||||
|
||||
// save the properties to session
|
||||
$actions = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified');
|
||||
$formData = $form->getData();
|
||||
$triggerEvent = array_merge($triggerEvent, $formData);
|
||||
$triggerEvent['id'] = $keyId;
|
||||
if (empty($triggerEvent['name'])) {
|
||||
// set it to the event default
|
||||
$triggerEvent['name'] = $this->translator->trans($triggerEvent['settings']['label']);
|
||||
}
|
||||
$actions[$keyId] = $triggerEvent;
|
||||
$session->set('mautic.point.'.$triggerId.'.triggerevents.modified', $actions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$viewParams = ['type' => $eventType];
|
||||
if ($cancelled || $valid) {
|
||||
$closeModal = true;
|
||||
} else {
|
||||
if (isset($triggerEvent['settings']['formTheme'])) {
|
||||
$viewParams['formTheme'] = $triggerEvent['settings']['formTheme'];
|
||||
}
|
||||
|
||||
$closeModal = false;
|
||||
$viewParams['form'] = $form->createView();
|
||||
$header = $triggerEvent['settings']['label'];
|
||||
$viewParams['eventHeader'] = $this->translator->trans($header);
|
||||
}
|
||||
|
||||
$passthroughVars = [
|
||||
'mauticContent' => 'pointTriggerEvent',
|
||||
'success' => $success,
|
||||
'route' => false,
|
||||
];
|
||||
|
||||
if (!empty($keyId)) {
|
||||
// prevent undefined errors
|
||||
$entity = new TriggerEvent();
|
||||
$blank = $entity->convertToArray();
|
||||
$triggerEvent = array_merge($blank, $triggerEvent);
|
||||
|
||||
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig'
|
||||
: $triggerEvent['settings']['template'];
|
||||
|
||||
$passthroughVars['eventId'] = $keyId;
|
||||
$passthroughVars['eventHtml'] = $this->renderView($template, [
|
||||
'event' => $triggerEvent,
|
||||
'id' => $keyId,
|
||||
'sessionId' => $triggerId,
|
||||
]);
|
||||
}
|
||||
|
||||
if ($closeModal) {
|
||||
// just close the modal
|
||||
$passthroughVars['closeModal'] = 1;
|
||||
|
||||
return new JsonResponse($passthroughVars);
|
||||
}
|
||||
|
||||
return $this->ajaxAction($request, [
|
||||
'contentTemplate' => '@MauticPoint/Event/form.html.twig',
|
||||
'viewParameters' => $viewParams,
|
||||
'passthroughVars' => $passthroughVars,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates edit form and processes post data.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function editAction(Request $request, $objectId)
|
||||
{
|
||||
$session = $request->getSession();
|
||||
$method = $request->getMethod();
|
||||
$triggerEvent = $request->request->all()['pointtriggerevent'] ?? [];
|
||||
$triggerId = 'POST' === $method ? ($triggerEvent['triggerId'] ?? '') : $request->query->get('triggerId');
|
||||
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []);
|
||||
$success = 0;
|
||||
$valid = $cancelled = false;
|
||||
$triggerEvent = array_key_exists($objectId, $events) ? $events[$objectId] : null;
|
||||
|
||||
if (null !== $triggerEvent) {
|
||||
$eventType = $triggerEvent['type'];
|
||||
$pointTriggerModel = $this->getModel('point.trigger');
|
||||
\assert($pointTriggerModel instanceof TriggerModel);
|
||||
$events = $pointTriggerModel->getEvents();
|
||||
$triggerEvent['settings'] = $events[$eventType];
|
||||
|
||||
// ajax only for form fields
|
||||
if (!$eventType
|
||||
|| !$request->isXmlHttpRequest()
|
||||
|| !$this->security->isGranted([
|
||||
'point:triggers:edit',
|
||||
'point:triggers:create',
|
||||
], 'MATCH_ONE')
|
||||
) {
|
||||
return $this->modalAccessDenied();
|
||||
}
|
||||
|
||||
$form = $this->formFactory->create(TriggerEventType::class, $triggerEvent, [
|
||||
'action' => $this->generateUrl('mautic_pointtriggerevent_action', ['objectAction' => 'edit', 'objectId' => $objectId]),
|
||||
'settings' => $triggerEvent['settings'],
|
||||
]);
|
||||
$form->get('triggerId')->setData($triggerId);
|
||||
// Check for a submitted form and process it
|
||||
if ('POST' == $method) {
|
||||
if (!$cancelled = $this->isFormCancelled($form)) {
|
||||
if ($valid = $this->isFormValid($form)) {
|
||||
$success = 1;
|
||||
|
||||
// form is valid so process the data
|
||||
|
||||
// save the properties to session
|
||||
$session = $request->getSession();
|
||||
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified');
|
||||
/** @var array<mixed> $formData */
|
||||
$formData = $form->getData();
|
||||
// overwrite with updated data
|
||||
$triggerEvent = array_merge($events[$objectId], $formData);
|
||||
if (empty($triggerEvent['name'])) {
|
||||
// set it to the event default
|
||||
$triggerEvent['name'] = $this->translator->trans($triggerEvent['settings']['label']);
|
||||
}
|
||||
$events[$objectId] = $triggerEvent;
|
||||
$session->set('mautic.point.'.$triggerId.'.triggerevents.modified', $events);
|
||||
|
||||
// generate HTML for the field
|
||||
$keyId = $objectId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$viewParams = ['type' => $eventType];
|
||||
if ($cancelled || $valid) {
|
||||
$closeModal = true;
|
||||
} else {
|
||||
if (isset($triggerEvent['settings']['formTheme'])) {
|
||||
$viewParams['formTheme'] = $triggerEvent['settings']['formTheme'];
|
||||
}
|
||||
|
||||
$closeModal = false;
|
||||
$viewParams['form'] = $form->createView();
|
||||
$viewParams['eventHeader'] = $this->translator->trans($triggerEvent['settings']['label']);
|
||||
}
|
||||
|
||||
$passthroughVars = [
|
||||
'mauticContent' => 'pointTriggerEvent',
|
||||
'success' => $success,
|
||||
'route' => false,
|
||||
];
|
||||
|
||||
if (!empty($keyId)) {
|
||||
$passthroughVars['eventId'] = $keyId;
|
||||
|
||||
// prevent undefined errors
|
||||
$entity = new TriggerEvent();
|
||||
$blank = $entity->convertToArray();
|
||||
$triggerEvent = array_merge($blank, $triggerEvent);
|
||||
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig'
|
||||
: $triggerEvent['settings']['template'];
|
||||
|
||||
$passthroughVars['eventId'] = $keyId;
|
||||
$passthroughVars['eventHtml'] = $this->renderView($template, [
|
||||
'event' => $triggerEvent,
|
||||
'id' => $keyId,
|
||||
'sessionId' => $triggerId,
|
||||
]);
|
||||
}
|
||||
|
||||
if ($closeModal) {
|
||||
// just close the modal
|
||||
$passthroughVars['closeModal'] = 1;
|
||||
|
||||
return new JsonResponse($passthroughVars);
|
||||
}
|
||||
|
||||
return $this->ajaxAction($request, [
|
||||
'contentTemplate' => '@MauticPoint/Event/form.html.twig',
|
||||
'viewParameters' => $viewParams,
|
||||
'passthroughVars' => $passthroughVars,
|
||||
]);
|
||||
}
|
||||
|
||||
return new JsonResponse(['success' => 0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function deleteAction(Request $request, $objectId)
|
||||
{
|
||||
$session = $request->getSession();
|
||||
$triggerId = $request->get('triggerId');
|
||||
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []);
|
||||
$delete = $session->get('mautic.point.'.$triggerId.'.triggerevents.deleted', []);
|
||||
|
||||
// ajax only for form fields
|
||||
if (!$request->isXmlHttpRequest()
|
||||
|| !$this->security->isGranted([
|
||||
'point:triggers:edit',
|
||||
'point:triggers:create',
|
||||
], 'MATCH_ONE')
|
||||
) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$triggerEvent = (array_key_exists($objectId, $events)) ? $events[$objectId] : null;
|
||||
|
||||
if ('POST' == $request->getMethod() && null !== $triggerEvent) {
|
||||
// add the field to the delete list
|
||||
if (!in_array($objectId, $delete)) {
|
||||
$delete[] = $objectId;
|
||||
$session->set('mautic.point.'.$triggerId.'.triggerevents.deleted', $delete);
|
||||
}
|
||||
|
||||
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig'
|
||||
: $triggerEvent['settings']['template'];
|
||||
|
||||
// prevent undefined errors
|
||||
$entity = new TriggerEvent();
|
||||
$blank = $entity->convertToArray();
|
||||
$triggerEvent = array_merge($blank, $triggerEvent);
|
||||
|
||||
$dataArray = [
|
||||
'mauticContent' => 'pointTriggerEvent',
|
||||
'success' => 1,
|
||||
'target' => '#triggerEvent'.$objectId,
|
||||
'route' => false,
|
||||
'eventId' => $objectId,
|
||||
'eventHtml' => $this->renderView($template, [
|
||||
'event' => $triggerEvent,
|
||||
'id' => $objectId,
|
||||
'deleted' => true,
|
||||
'sessionId' => $triggerId,
|
||||
]),
|
||||
];
|
||||
} else {
|
||||
$dataArray = ['success' => 0];
|
||||
}
|
||||
|
||||
return new JsonResponse($dataArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undeletes the entity.
|
||||
*
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function undeleteAction(Request $request, $objectId)
|
||||
{
|
||||
$session = $request->getSession();
|
||||
$triggerId = $request->get('triggerId');
|
||||
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []);
|
||||
$delete = $session->get('mautic.point.'.$triggerId.'.triggerevents.deleted', []);
|
||||
|
||||
// ajax only for form fields
|
||||
if (!$request->isXmlHttpRequest()
|
||||
|| !$this->security->isGranted([
|
||||
'point:triggers:edit',
|
||||
'point:triggers:create',
|
||||
], 'MATCH_ONE')
|
||||
) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
$triggerEvent = (array_key_exists($objectId, $events)) ? $events[$objectId] : null;
|
||||
|
||||
if ('POST' === $request->getMethod() && null !== $triggerEvent) {
|
||||
// add the field to the delete list
|
||||
if (in_array($objectId, $delete)) {
|
||||
$key = array_search($objectId, $delete);
|
||||
unset($delete[$key]);
|
||||
$session->set('mautic.point.'.$triggerId.'.triggerevents.deleted', $delete);
|
||||
}
|
||||
|
||||
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig'
|
||||
: $triggerEvent['settings']['template'];
|
||||
|
||||
// prevent undefined errors
|
||||
$entity = new TriggerEvent();
|
||||
$blank = $entity->convertToArray();
|
||||
$triggerEvent = array_merge($blank, $triggerEvent);
|
||||
|
||||
$dataArray = [
|
||||
'mauticContent' => 'pointTriggerEvent',
|
||||
'success' => 1,
|
||||
'target' => '#triggerEvent'.$objectId,
|
||||
'route' => false,
|
||||
'eventId' => $objectId,
|
||||
'eventHtml' => $this->renderView($template, [
|
||||
'event' => $triggerEvent,
|
||||
'id' => $objectId,
|
||||
'deleted' => false,
|
||||
'triggerId' => $triggerId,
|
||||
]),
|
||||
];
|
||||
} else {
|
||||
$dataArray = ['success' => 0];
|
||||
}
|
||||
|
||||
return new JsonResponse($dataArray);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user