File size: 14,743 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
<?php

namespace Mautic\PluginBundle\Controller;

use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController;
use Mautic\PluginBundle\Form\Type\CompanyFieldsType;
use Mautic\PluginBundle\Form\Type\FieldsType;
use Mautic\PluginBundle\Form\Type\IntegrationCampaignsType;
use Mautic\PluginBundle\Form\Type\IntegrationConfigType;
use Mautic\PluginBundle\Helper\IntegrationHelper;
use Mautic\PluginBundle\Model\PluginModel;
use Symfony\Component\HttpFoundation\Request;

class AjaxController extends CommonAjaxController
{
    public function setIntegrationFilterAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $session      = $request->getSession();
        $pluginFilter = (int) $request->get('plugin');
        $session->set('mautic.integrations.filter', $pluginFilter);

        return $this->sendJsonResponse(['success' => 1]);
    }

    /**
     * Get the HTML for list of fields.
     */
    public function getIntegrationFieldsAction(Request $request, IntegrationHelper $helper): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $integration = $request->query->get('integration');
        $settings    = $request->query->all()['settings'] ?? [];
        $page        = $request->query->get('page');

        $dataArray = ['success' => 0];

        if (!empty($integration) && !empty($settings)) {
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $integrationObject */
            $integrationObject = $helper->getIntegrationObject($integration);

            if ($integrationObject) {
                if (!$object = $request->attributes->get('object')) {
                    $object = $settings['object'] ?? 'lead';
                }

                $isLead            = ('lead' === $object);
                $integrationFields = ($isLead)
                    ? $integrationObject->getFormLeadFields($settings)
                    : $integrationObject->getFormCompanyFields(
                        $settings
                    );

                if (!empty($integrationFields)) {
                    $session = $request->getSession();
                    $session->set('mautic.plugin.'.$integration.'.'.$object.'.page', $page);

                    /** @var PluginModel $pluginModel */
                    $pluginModel = $this->getModel('plugin');

                    // Get a list of custom form fields
                    $mauticFields       = ($isLead) ? $pluginModel->getLeadFields() : $pluginModel->getCompanyFields();
                    $featureSettings    = $integrationObject->getIntegrationSettings()->getFeatureSettings();
                    $enableDataPriority = $integrationObject->getDataPriority();
                    $formType           = $isLead ? 'integration_fields' : 'integration_company_fields';
                    $form               = $this->createForm(
                        $isLead ? FieldsType::class : CompanyFieldsType::class,
                        $featureSettings[$object.'Fields'] ?? [],
                        [
                            'mautic_fields'        => $mauticFields,
                            'data'                 => $featureSettings,
                            'integration_fields'   => $integrationFields,
                            'csrf_protection'      => false,
                            'integration_object'   => $integrationObject,
                            'enable_data_priority' => $enableDataPriority,
                            'integration'          => $integration,
                            'page'                 => $page,
                            'limit'                => $this->coreParametersHelper->get('default_pagelimit'),
                        ]
                    );

                    $html = $this->render('@MauticCore/Helper/blank_form.html.twig', [
                        'form'      => $form->createView(),
                        'formTheme' => '@MauticPlugin/FormTheme/Integration/layout.html.twig',
                        'function'  => 'row',
                    ]
                    )->getContent();

                    if (!isset($settings['prefix'])) {
                        $prefix = 'integration_details[featureSettings]['.$object.'Fields]';
                    } else {
                        $prefix = $settings['prefix'];
                    }

                    $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
                    if (str_ends_with($idPrefix, '_')) {
                        $idPrefix = substr($idPrefix, 0, -1);
                    }
                    $html                 = preg_replace('/'.$form->getName().'\[(.*?)\]/', $prefix.'[$1]', $html);
                    $html                 = str_replace($form->getName(), $idPrefix, $html);
                    $dataArray['success'] = 1;
                    $dataArray['html']    = $html;
                }
            }
        }

        return $this->sendJsonResponse($dataArray);
    }

    /**
     * Get the HTML for integration properties.
     */
    public function getIntegrationConfigAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $integration = $request->query->get('integration');
        $settings    = $request->query->all()['settings'] ?? [];
        $dataArray   = ['success' => 0];

        if (!empty($integration) && !empty($settings)) {
            /** @var IntegrationHelper $helper */
            $helper = $this->factory->getHelper('integration');
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
            $object = $helper->getIntegrationObject($integration);

            if ($object) {
                $data           = $statusData           = [];
                $objectSettings = $object->getIntegrationSettings();
                $defaults       = $objectSettings->getFeatureSettings();
                if (method_exists($object, 'getCampaigns')) {
                    $campaigns = $object->getCampaigns();
                    if (isset($campaigns['records']) && !empty($campaigns['records'])) {
                        foreach ($campaigns['records'] as $campaign) {
                            $data[$campaign['Id']] = $campaign['Name'];
                        }
                    }
                }
                $form = $this->createForm(IntegrationConfigType::class, $defaults, [
                    'integration'     => $object,
                    'csrf_protection' => false,
                    'campaigns'       => $data,
                ]);

                $html = $this->render('@MauticCore/Helper/blank_form.html.twig', [
                    'form'      => $form->createView(),
                    'function'  => 'widget',
                    'formTheme' => '@MauticPlugin/FormTheme/Integration/layout.html.twig',
                    'variables' => [
                        'integration' => $object,
                    ],
                ])->getContent();

                $prefix   = str_replace('[integration]', '[config]', $settings['name']);
                $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
                if (str_ends_with($idPrefix, '_')) {
                    $idPrefix = substr($idPrefix, 0, -1);
                }

                $html = preg_replace('/integration_config\[(.*?)\]/', $prefix.'[$1]', $html);
                $html = str_replace('integration_config', $idPrefix, $html);

                $dataArray['success'] = 1;
                $dataArray['html']    = $html;
            }
        }

        return $this->sendJsonResponse($dataArray);
    }

    public function getIntegrationCampaignStatusAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $integration = $request->query->get('integration');
        $campaign    = $request->query->get('campaign');
        $settings    = $request->query->all()['settings'] ?? [];
        $dataArray   = ['success' => 0];
        $statusData  = [];
        if (!empty($integration) && !empty($campaign)) {
            /** @var IntegrationHelper $helper */
            $helper = $this->factory->getHelper('integration');
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
            $object = $helper->getIntegrationObject($integration);

            if ($object) {
                if (method_exists($object, 'getCampaignMemberStatus')) {
                    $campaignMemberStatus = $object->getCampaignMemberStatus($campaign);
                    if (isset($campaignMemberStatus['records']) && !empty($campaignMemberStatus['records'])) {
                        foreach ($campaignMemberStatus['records'] as $status) {
                            $statusData[$status['Label']] = $status['Label'];
                        }
                    }
                }
                $form = $this->createForm(IntegrationCampaignsType::class, $statusData, [
                    'csrf_protection'       => false,
                    'campaignContactStatus' => $statusData,
                ]);

                $html = $this->render('@MauticCore/Helper/blank_form.html.twig', [
                    'form'      => $form->createView(),
                    'formTheme' => '@MauticPlugin/FormTheme/Integration/layout.html.twig',
                    'function'  => 'widget',
                    'variables' => [
                        'integration' => $object,
                    ],
                ])->getContent();

                $prefix = str_replace('[integration]', '[campaign_member_status][campaign_member_status]', $settings['name']);

                $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);

                if (str_ends_with($idPrefix, '_')) {
                    $idPrefix = substr($idPrefix, 0, -1);
                }

                $html = preg_replace('/integration_campaign_status_campaign_member_status\[(.*?)\]/', $prefix.'[$1]', $html);
                $html = str_replace('integration_campaign_status_campaign_member_status', $idPrefix, $html);
                $html = str_replace('integration_campaign_status[campaign_member_status]', $prefix, $html);

                $dataArray['success'] = 1;
                $dataArray['html']    = $html;
            }
        }

        return $this->sendJsonResponse($dataArray);
    }

    public function getIntegrationCampaignsAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $integration = $request->query->get('integration');
        $dataArray   = ['success' => 0];

        if (!empty($integration)) {
            /** @var IntegrationHelper $helper */
            $helper = $this->factory->getHelper('integration');
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
            $object = $helper->getIntegrationObject($integration);
            $data   = [];
            if ($object) {
                $campaigns = $object->getCampaigns();
                if (isset($campaigns['records']) && !empty($campaigns['records'])) {
                    foreach ($campaigns['records'] as $campaign) {
                        $data[$campaign['Id']] = $campaign['Name'];
                    }
                }
                $form = $this->createForm('integration_campaigns', $data, [
                    'integration'     => $integration,
                    'campaigns'       => $data,
                    'csrf_protection' => false,
                ]);

                $html = $this->render('@MauticCore/Helper/blank_form.html.twig', [
                    'form'      => $form->createView(),
                    'formTheme' => '@MauticPlugin/FormTheme/Integration/layout.html.twig',
                    'function'  => 'row',
                    'variables' => [
                        'campaigns'   => $data,
                        'integration' => $object,
                    ],
                ])->getContent();

                $dataArray['success'] = 1;
                $dataArray['html']    = $html;
            }
        }

        return $this->sendJsonResponse($dataArray);
    }

    public function matchFieldsAction(Request $request): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $integration       = $request->request->get('integration');
        $integration_field = $request->request->get('integrationField');
        $mautic_field      = $request->request->get('mauticField');
        $update_mautic     = $request->request->get('updateMautic');
        $object            = $request->request->get('object');

        $helper             = $this->factory->getHelper('integration');
        $integration_object = $helper->getIntegrationObject($integration);
        $entity             = $integration_object->getIntegrationSettings();
        $featureSettings    = $entity->getFeatureSettings();
        $doNotMatchField    = ('-1' === $mautic_field || '' === $mautic_field);
        if ('lead' == $object) {
            $fields       = 'leadFields';
            $updateFields = 'update_mautic';
        } else {
            $fields       = 'companyFields';
            $updateFields = 'update_mautic_company';
        }
        $newFeatureSettings = [];
        if ($doNotMatchField) {
            if (isset($featureSettings[$updateFields]) && array_key_exists($integration_field, $featureSettings[$updateFields])) {
                unset($featureSettings[$updateFields][$integration_field]);
            }
            if (isset($featureSettings[$fields]) && array_key_exists($integration_field, $featureSettings[$fields])) {
                unset($featureSettings[$fields][$integration_field]);
            }
            $dataArray = ['success' => 0];
        } else {
            $newFeatureSettings[$integration_field] = $update_mautic;
            if (isset($featureSettings[$updateFields])) {
                $featureSettings[$updateFields] = array_merge($featureSettings[$updateFields], $newFeatureSettings);
            } else {
                $featureSettings[$updateFields] = $newFeatureSettings;
            }
            $newFeatureSettings[$integration_field] = $mautic_field;
            if (isset($featureSettings[$fields])) {
                $featureSettings[$fields] = array_merge($featureSettings[$fields], $newFeatureSettings);
            } else {
                $featureSettings[$fields] = $newFeatureSettings;
            }

            $dataArray = ['success' => 1];
        }
        $entity->setFeatureSettings($featureSettings);

        $pluginModel = $this->getModel('plugin');
        \assert($pluginModel instanceof PluginModel);
        $pluginModel->saveFeatureSettings($entity);

        return $this->sendJsonResponse($dataArray);
    }
}