Issues (3627)

CampaignBundle/Controller/EventController.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\CampaignBundle\Controller;
13
14
use Mautic\CampaignBundle\Entity\Event;
15
use Mautic\CampaignBundle\EventCollector\EventCollector;
16
use Mautic\CampaignBundle\Form\Type\EventType;
17
use Mautic\CoreBundle\Controller\FormController as CommonFormController;
18
use Symfony\Component\HttpFoundation\JsonResponse;
19
20
class EventController extends CommonFormController
0 ignored issues
show
Deprecated Code introduced by
The class Mautic\CoreBundle\Controller\FormController has been deprecated: 2.3 - to be removed in 3.0; use AbstractFormController instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

20
class EventController extends /** @scrutinizer ignore-deprecated */ CommonFormController
Loading history...
21
{
22
    private $supportedEventTypes = [
23
        Event::TYPE_DECISION,
24
        Event::TYPE_ACTION,
25
        Event::TYPE_CONDITION,
26
    ];
27
28
    /**
29
     * Generates new form and processes post data.
30
     *
31
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
32
     */
33
    public function newAction()
34
    {
35
        $success = 0;
36
        $valid   = $cancelled   = false;
37
        $method  = $this->request->getMethod();
38
        $session = $this->get('session');
39
        if ('POST' == $method) {
40
            $event                = $this->request->request->get('campaignevent');
41
            $type                 = $event['type'];
42
            $eventType            = $event['eventType'];
43
            $campaignId           = $event['campaignId'];
44
            $anchorName           = $event['anchor'];
45
            $event['triggerDate'] = (!empty($event['triggerDate'])) ? $this->factory->getDate($event['triggerDate'])->getDateTime() : null;
46
        } else {
47
            $type       = $this->request->query->get('type');
48
            $eventType  = $this->request->query->get('eventType');
49
            $campaignId = $this->request->query->get('campaignId');
50
            $anchorName = $this->request->query->get('anchor', '');
51
            $event      = [
52
                'type'            => $type,
53
                'eventType'       => $eventType,
54
                'campaignId'      => $campaignId,
55
                'anchor'          => $anchorName,
56
                'anchorEventType' => $this->request->query->get('anchorEventType', ''),
57
            ];
58
        }
59
60
        //set the eventType key for events
61
        if (!in_array($eventType, $this->supportedEventTypes)) {
62
            return $this->modalAccessDenied();
63
        }
64
65
        //ajax only for form fields
66
        if (!$type
67
            || !$this->request->isXmlHttpRequest()
68
            || !$this->get('mautic.security')->isGranted(
69
                [
70
                    'campaign:campaigns:edit',
71
                    'campaign:campaigns:create',
72
                ],
73
                'MATCH_ONE'
74
            )
75
        ) {
76
            return $this->modalAccessDenied();
77
        }
78
79
        /** @var EventCollector $eventCollector */
80
        $eventCollector = $this->get('mautic.campaign.event_collector');
81
82
        //fire the builder event
83
        $events = $eventCollector->getEventsArray();
84
        $form   = $this->get('form.factory')->create(
85
            EventType::class,
86
            $event,
87
            [
88
                'action'   => $this->generateUrl('mautic_campaignevent_action', ['objectAction' => 'new']),
89
                'settings' => $events[$eventType][$type],
90
            ]
91
        );
92
        $event['settings'] = $events[$eventType][$type];
93
94
        $form->get('campaignId')->setData($campaignId);
95
96
        //Check for a submitted form and process it
97
        if ('POST' == $method) {
98
            if (!$cancelled = $this->isFormCancelled($form)) {
99
                if ($valid = $this->isFormValid($form)) {
100
                    $success = 1;
101
102
                    //form is valid so process the data
103
                    $keyId = 'new'.hash('sha1', uniqid(mt_rand()));
104
105
                    //save the properties to session
106
                    $modifiedEvents = $session->get('mautic.campaign.'.$campaignId.'.events.modified');
107
                    $formData       = $form->getData();
108
                    $event          = array_merge($event, $formData);
109
                    $event['id']    = $event['tempId']    = $keyId;
110
                    if (empty($event['name'])) {
111
                        //set it to the event default
112
                        $event['name'] = $this->get('translator')->trans($event['settings']['label']);
113
                    }
114
                    $modifiedEvents[$keyId] = $event;
115
                    $session->set('mautic.campaign.'.$campaignId.'.events.modified', $modifiedEvents);
116
                } else {
117
                    $success = 0;
118
                }
119
            }
120
        }
121
122
        $viewParams = ['type' => $type];
123
        if ($cancelled || $valid) {
124
            $closeModal = true;
125
        } else {
126
            $closeModal = false;
127
            $formThemes = ['MauticCampaignBundle:FormTheme\Event'];
128
            if (isset($event['settings']['formTheme'])) {
129
                $formThemes[] = $event['settings']['formTheme'];
130
            }
131
132
            $viewParams['form']             = $this->setFormTheme($form, 'MauticCampaignBundle:Campaign:index.html.php', $formThemes);
133
            $viewParams['eventHeader']      = $this->get('translator')->trans($event['settings']['label']);
134
            $viewParams['eventDescription'] = (!empty($event['settings']['description'])) ? $this->get('translator')->trans(
135
                $event['settings']['description']
136
            ) : '';
137
        }
138
139
        $viewParams['hideTriggerMode'] = isset($event['settings']['hideTriggerMode']) && $event['settings']['hideTriggerMode'];
140
141
        $passthroughVars = [
142
            'mauticContent' => 'campaignEvent',
143
            'success'       => $success,
144
            'route'         => false,
145
        ];
146
147
        if (!empty($keyId)) {
148
            //prevent undefined errors
149
            $entity = new Event();
150
            $blank  = $entity->convertToArray();
151
            $event  = array_merge($blank, $event);
152
153
            $template = (empty($event['settings']['template'])) ? 'MauticCampaignBundle:Event:generic.html.php'
154
                : $event['settings']['template'];
155
156
            $passthroughVars['event']     = $event;
157
            $passthroughVars['eventId']   = $keyId;
158
            $passthroughVars['eventHtml'] = $this->renderView(
159
                $template,
160
                [
161
                    'event'      => $event,
162
                    'id'         => $keyId,
163
                    'campaignId' => $campaignId,
164
                ]
165
            );
166
            $passthroughVars['eventType'] = $eventType;
167
168
            $translator = $this->translator;
169
            if ('interval' == $event['triggerMode']) {
170
                $label = 'mautic.campaign.connection.trigger.interval.label';
171
                if ('no' == $anchorName) {
172
                    $label .= '_inaction';
173
                }
174
                $passthroughVars['label'] = $translator->trans(
175
                    $label,
176
                    [
177
                        '%number%' => $event['triggerInterval'],
178
                        '%unit%'   => $translator->transChoice(
179
                            'mautic.campaign.event.intervalunit.'.$event['triggerIntervalUnit'],
180
                            $event['triggerInterval']
181
                        ),
182
                    ]
183
                );
184
            } elseif ('date' == $event['triggerMode']) {
185
                /** @var \Mautic\CoreBundle\Templating\Helper\DateHelper $dh */
186
                $dh    = $this->factory->getHelper('template.date');
187
                $label = 'mautic.campaign.connection.trigger.date.label';
188
                if ('no' == $anchorName) {
189
                    $label .= '_inaction';
190
                }
191
                $passthroughVars['label'] = $translator->trans(
192
                    $label,
193
                    [
194
                        '%full%' => $dh->toFull($event['triggerDate']),
195
                        '%time%' => $dh->toTime($event['triggerDate']),
196
                        '%date%' => $dh->toShort($event['triggerDate']),
197
                    ]
198
                );
199
            }
200
        }
201
202
        if ($closeModal) {
203
            //just close the modal
204
            $passthroughVars['closeModal'] = 1;
205
206
            return new JsonResponse($passthroughVars);
207
        } else {
208
            return $this->ajaxAction(
209
                [
210
                    'contentTemplate' => 'MauticCampaignBundle:Event:form.html.php',
211
                    'viewParameters'  => $viewParams,
212
                    'passthroughVars' => $passthroughVars,
213
                ]
214
            );
215
        }
216
    }
217
218
    /**
219
     * Generates edit form and processes post data.
220
     *
221
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
222
     */
223
    public function editAction($objectId)
224
    {
225
        $session       = $this->get('session');
226
        $valid         = $cancelled = false;
227
        $method        = $this->request->getMethod();
228
        $campaignEvent = $this->request->request->get('campaignevent', []);
229
        $campaignId    = 'POST' === $method
230
            ? ($campaignEvent['campaignId'] ?? '')
231
            : $this->request->query->get('campaignId');
232
        $modifiedEvents = $session->get('mautic.campaign.'.$campaignId.'.events.modified', []);
233
        $event          = array_key_exists($objectId, $modifiedEvents) ? $modifiedEvents[$objectId] : [];
234
235
        if ('POST' === $method) {
236
            $event = array_merge($event, [
237
                'anchor'          => $campaignEvent['anchor'] ?? '',
238
                'anchorEventType' => $campaignEvent['anchorEventType'] ?? '',
239
            ]);
240
        } else {
241
            if (!isset($event['anchor']) && !empty($event['decisionPath'])) {
242
                // Used to generate label
243
                $event['anchor'] = $event['decisionPath'];
244
            }
245
246
            if ($this->request->query->has('anchor')) {
247
                // Override the anchor
248
                $event['anchor'] = $this->request->get('anchor');
249
            }
250
251
            if ($this->request->query->has('anchorEventType')) {
252
                // Override the anchorEventType
253
                $event['anchorEventType'] = $this->request->get('anchorEventType');
254
            }
255
        }
256
257
        /*
258
         * If we don't have an event, don't support the event type, this is not an
259
         * AJAX request, or we are not granted campaign edit/create, deny access.
260
         */
261
        if (empty($event)
262
            || empty($event['eventType'])
263
            || !in_array($event['eventType'], $this->supportedEventTypes)
264
            || !isset($event['type'])
265
            || !$this->request->isXmlHttpRequest()
266
            || !$this->get('mautic.security')->isGranted(
267
                    [
268
                    'campaign:campaigns:edit',
269
                    'campaign:campaigns:create',
270
                ],
271
                'MATCH_ONE'
272
            )
273
        ) {
274
            return $this->modalAccessDenied();
275
        }
276
277
        /**
278
         * Fire the CampaignBuilderEvent event to get all events.
279
         *
280
         * We can directly dereference the return value here to get
281
         * the supported events for this type because we already made
282
         * sure that we're accessing a supported event type above.
283
         *
284
         * Method getEventsArray() returns translated labels & descriptions
285
         */
286
287
        /** @var EventCollector $eventCollector */
288
        $eventCollector  = $this->get('mautic.campaign.event_collector');
289
        $supportedEvents = $eventCollector->getEventsArray()[$event['eventType']];
290
        $form            = $this->get('form.factory')->create(
291
            EventType::class,
292
            $event,
293
            [
294
                'action'   => $this->generateUrl('mautic_campaignevent_action', ['objectAction' => 'edit', 'objectId' => $objectId]),
295
                'settings' => $supportedEvents[$event['type']],
296
            ]
297
        );
298
        $event['settings'] = $supportedEvents[$event['type']];
299
300
        $form->get('campaignId')->setData($campaignId);
301
302
        // Check for a submitted form and process it
303
        if ('POST' === $method) {
304
            if (!$cancelled = $this->isFormCancelled($form)) {
305
                if ($valid = $this->isFormValid($form)) {
306
                    $formData = $form->getData();
307
                    $event    = array_merge($event, $formData);
308
309
                    // Set the name to the event default if not known.
310
                    if (empty($event['name'])) {
311
                        $event['name'] = $event['settings']['label'];
312
                    }
313
314
                    $modifiedEvents[$objectId] = $event;
315
316
                    // Save the modified event properties to session
317
                    $session->set('mautic.campaign.'.$campaignId.'.events.modified', $modifiedEvents);
318
                }
319
            }
320
        }
321
322
        $viewParams = [
323
            'type'            => $event['type'],
324
            'hideTriggerMode' => isset($event['settings']['hideTriggerMode']) && $event['settings']['hideTriggerMode'],
325
        ];
326
327
        $passthroughVars = [
328
            'mauticContent' => 'campaignEvent',
329
            'success'       => !$cancelled && $valid,
330
            'route'         => false,
331
        ];
332
333
        if (!$cancelled && !$valid) {
334
            $formThemes = ['MauticCampaignBundle:FormTheme\Event'];
335
336
            if (isset($event['settings']['formTheme'])) {
337
                $formThemes[] = $event['settings']['formTheme'];
338
            }
339
340
            $viewParams = array_merge($viewParams, [
341
                'form'             => $this->setFormTheme($form, 'MauticCampaignBundle:Campaign:index.html.php', $formThemes),
342
                'eventHeader'      => $event['settings']['label'],
343
                'eventDescription' => $event['settings']['description'],
344
            ]);
345
346
            return $this->ajaxAction(
347
                [
348
                    'contentTemplate' => 'MauticCampaignBundle:Event:form.html.php',
349
                    'viewParameters'  => $viewParams,
350
                    'passthroughVars' => $passthroughVars,
351
                ]
352
            );
353
        }
354
355
        if (!$cancelled && $valid) {
356
            // Prevent undefined errors
357
            $event    = array_merge((new Event())->convertToArray(), $event);
358
            $template = isset($event['settings']['template'])
359
                ? $event['settings']['template']
360
                : 'MauticCampaignBundle:Event:generic.html.php';
361
362
            $passthroughVars = array_merge($passthroughVars, [
363
                'event'      => $event,
364
                'eventId'    => $objectId,
365
                'eventType'  => $event['eventType'],
366
                'updateHtml' => $this->renderView(
367
                    $template,
368
                    [
369
                        'event'      => $event,
370
                        'id'         => $objectId,
371
                        'update'     => true,
372
                        'campaignId' => $campaignId,
373
                    ]
374
                ),
375
            ]);
376
377
            if (Event::TRIGGER_MODE_INTERVAL === $event['triggerMode']) {
378
                $label = 'mautic.campaign.connection.trigger.interval.label';
379
380
                if (Event::PATH_INACTION === $event['anchor']) {
381
                    $label .= '_inaction';
382
                }
383
384
                $passthroughVars['label'] = $this->translator->trans(
385
                    $label,
386
                    [
387
                        '%number%' => $event['triggerInterval'],
388
                        '%unit%'   => $this->translator->transChoice(
389
                            'mautic.campaign.event.intervalunit.'.$event['triggerIntervalUnit'],
390
                            $event['triggerInterval']
391
                        ),
392
                    ]
393
                );
394
            }
395
396
            if (Event::TRIGGER_MODE_DATE === $event['triggerMode']) {
397
                $label = 'mautic.campaign.connection.trigger.date.label';
398
399
                if (Event::PATH_INACTION === $event['anchor']) {
400
                    $label .= '_inaction';
401
                }
402
403
                /** @var \Mautic\CoreBundle\Templating\Helper\DateHelper $dh */
404
                $dh                       = $this->get('mautic.helper.template.date');
405
                $passthroughVars['label'] = $this->translator->trans(
406
                    $label,
407
                    [
408
                        '%full%' => $dh->toFull($event['triggerDate']),
409
                        '%time%' => $dh->toTime($event['triggerDate']),
410
                        '%date%' => $dh->toShort($event['triggerDate']),
411
                    ]
412
                );
413
            }
414
        }
415
416
        // Just close the modal
417
        $passthroughVars['closeModal'] = 1;
418
419
        return new JsonResponse($passthroughVars);
420
    }
421
422
    /**
423
     * Deletes the entity.
424
     *
425
     * @param $objectId
426
     *
427
     * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
428
     */
429
    public function deleteAction($objectId)
430
    {
431
        $campaignId     = $this->request->query->get('campaignId');
432
        $session        = $this->get('session');
433
        $modifiedEvents = $session->get('mautic.campaign.'.$campaignId.'.events.modified', []);
434
        $deletedEvents  = $session->get('mautic.campaign.'.$campaignId.'.events.deleted', []);
435
436
        //ajax only for form fields
437
        if (!$this->request->isXmlHttpRequest()
438
            || !$this->get('mautic.security')->isGranted(
439
                [
440
                    'campaign:campaigns:edit',
441
                    'campaign:campaigns:create',
442
                ],
443
                'MATCH_ONE'
444
            )
445
        ) {
446
            return $this->accessDenied();
447
        }
448
449
        $event = (array_key_exists($objectId, $modifiedEvents)) ? $modifiedEvents[$objectId] : null;
450
451
        if ('POST' == $this->request->getMethod() && null !== $event) {
452
            /** @var EventCollector $eventCollector */
453
            $eventCollector    = $this->get('mautic.campaign.event_collector');
454
            $events            = $eventCollector->getEventsArray();
455
            $event['settings'] = $events[$event['eventType']][$event['type']];
456
457
            // Add the field to the delete list
458
            if (!in_array($objectId, $deletedEvents)) {
459
                //If event is new don't add to deleted list
460
                if (false === strpos($objectId, 'new')) {
461
                    $deletedEvents[] = $objectId;
462
                    $session->set('mautic.campaign.'.$campaignId.'.events.deleted', $deletedEvents);
463
                }
464
465
                //Always remove from modified list if deleted
466
                if (isset($modifiedEvents[$objectId])) {
467
                    unset($modifiedEvents[$objectId]);
468
                    $session->set('mautic.campaign.'.$campaignId.'.events.modified', $modifiedEvents);
469
                }
470
            }
471
472
            $dataArray = [
473
                'mauticContent' => 'campaignEvent',
474
                'success'       => 1,
475
                'route'         => false,
476
                'eventId'       => $objectId,
477
                'deleted'       => 1,
478
                'event'         => $event,
479
            ];
480
        } else {
481
            $dataArray = ['success' => 0];
482
        }
483
484
        return new JsonResponse($dataArray);
485
    }
486
487
    /**
488
     * Undeletes the entity.
489
     *
490
     * @param $objectId
491
     *
492
     * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
493
     */
494
    public function undeleteAction($objectId)
495
    {
496
        $campaignId     = $this->request->query->get('campaignId');
497
        $session        = $this->get('session');
498
        $modifiedEvents = $session->get('mautic.campaign.'.$campaignId.'.events.modified', []);
499
        $deletedEvents  = $session->get('mautic.campaign.'.$campaignId.'.events.deleted', []);
500
501
        //ajax only for form fields
502
        if (!$this->request->isXmlHttpRequest()
503
            || !$this->get('mautic.security')->isGranted(
504
                [
505
                    'campaign:campaigns:edit',
506
                    'campaign:campaigns:create',
507
                ],
508
                'MATCH_ONE'
509
            )
510
        ) {
511
            return $this->accessDenied();
512
        }
513
514
        $event = (array_key_exists($objectId, $modifiedEvents)) ? $modifiedEvents[$objectId] : null;
515
516
        if ('POST' == $this->request->getMethod() && null !== $event) {
517
            /** @var EventCollector $eventCollector */
518
            $eventCollector    = $this->get('mautic.campaign.event_collector');
519
            $events            = $eventCollector->getEventsArray();
520
            $event['settings'] = $events[$event['eventType']][$event['type']];
521
522
            //add the field to the delete list
523
            if (in_array($objectId, $deletedEvents)) {
524
                $key = array_search($objectId, $deletedEvents);
525
                unset($deletedEvents[$key]);
526
                $session->set('mautic.campaign.'.$campaignId.'.events.deleted', $deletedEvents);
527
            }
528
529
            $template = (empty($event['settings']['template'])) ? 'MauticCampaignBundle:Event:generic.html.php'
530
                : $event['settings']['template'];
531
532
            //prevent undefined errors
533
            $entity = new Event();
534
            $blank  = $entity->convertToArray();
535
            $event  = array_merge($blank, $event);
536
537
            $dataArray = [
538
                'mauticContent' => 'campaignEvent',
539
                'success'       => 1,
540
                'route'         => false,
541
                'eventId'       => $objectId,
542
                'eventHtml'     => $this->renderView(
543
                    $template,
544
                    [
545
                        'event'      => $event,
546
                        'id'         => $objectId,
547
                        'campaignId' => $campaignId,
548
                    ]
549
                ),
550
            ];
551
        } else {
552
            $dataArray = ['success' => 0];
553
        }
554
555
        return new JsonResponse($dataArray);
556
    }
557
}
558