Issues (3627)

bundles/PluginBundle/Controller/AjaxController.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\PluginBundle\Controller;
13
14
use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController;
15
use Mautic\PluginBundle\Form\Type\CompanyFieldsType;
16
use Mautic\PluginBundle\Form\Type\FieldsType;
17
use Mautic\PluginBundle\Form\Type\IntegrationCampaignsType;
18
use Mautic\PluginBundle\Form\Type\IntegrationConfigType;
19
use Mautic\PluginBundle\Model\PluginModel;
20
use Symfony\Component\HttpFoundation\Request;
21
22
class AjaxController extends CommonAjaxController
23
{
24
    /**
25
     * @return \Symfony\Component\HttpFoundation\JsonResponse
26
     */
27
    protected function setIntegrationFilterAction(Request $request)
28
    {
29
        $session      = $this->get('session');
30
        $pluginFilter = (int) $this->request->get('plugin');
31
        $session->set('mautic.integrations.filter', $pluginFilter);
32
33
        return $this->sendJsonResponse(['success' => 1]);
34
    }
35
36
    /**
37
     * Get the HTML for list of fields.
38
     *
39
     * @return \Symfony\Component\HttpFoundation\JsonResponse
40
     */
41
    protected function getIntegrationFieldsAction(Request $request)
42
    {
43
        $integration = $request->request->get('integration');
44
        $settings    = $request->request->get('settings');
45
        $page        = $request->request->get('page');
46
47
        $dataArray = ['success' => 0];
48
49
        if (!empty($integration) && !empty($settings)) {
50
            /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */
51
            $helper = $this->get('mautic.helper.integration');
52
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $integrationObject */
53
            $integrationObject = $helper->getIntegrationObject($integration);
54
55
            if ($integrationObject) {
56
                if (!$object = $request->attributes->get('object')) {
57
                    $object = (isset($settings['object'])) ? $settings['object'] : 'lead';
58
                }
59
60
                $isLead            = ('lead' === $object);
61
                $integrationFields = ($isLead)
62
                    ? $integrationObject->getFormLeadFields($settings)
63
                    : $integrationObject->getFormCompanyFields(
64
                        $settings
65
                    );
66
67
                if (!empty($integrationFields)) {
68
                    $session = $this->get('session');
69
                    $session->set('mautic.plugin.'.$integration.'.'.$object.'.page', $page);
70
71
                    /** @var PluginModel $pluginModel */
72
                    $pluginModel = $this->getModel('plugin');
73
74
                    // Get a list of custom form fields
75
                    $mauticFields       = ($isLead) ? $pluginModel->getLeadFields() : $pluginModel->getCompanyFields();
76
                    $featureSettings    = $integrationObject->getIntegrationSettings()->getFeatureSettings();
77
                    $enableDataPriority = $integrationObject->getDataPriority();
78
                    $formType           = $isLead ? FieldsType::class : CompanyFieldsType::class;
79
                    $form               = $this->createForm(
80
                        $formType,
81
                        isset($featureSettings[$object.'Fields']) ? $featureSettings[$object.'Fields'] : [],
82
                        [
83
                            'mautic_fields'        => $mauticFields,
84
                            'data'                 => $featureSettings,
85
                            'integration_fields'   => $integrationFields,
86
                            'csrf_protection'      => false,
87
                            'integration_object'   => $integrationObject,
88
                            'enable_data_priority' => $enableDataPriority,
89
                            'integration'          => $integration,
90
                            'page'                 => $page,
91
                            'limit'                => $this->get('mautic.helper.core_parameters')->get('default_pagelimit'),
92
                        ]
93
                    );
94
95
                    $html = $this->render(
96
                        'MauticCoreBundle:Helper:blank_form.html.php',
97
                        [
98
                            'form' => $this->setFormTheme(
99
                                $form,
100
                                'MauticCoreBundle:Helper:blank_form.html.php',
101
                                'MauticPluginBundle:FormTheme\Integration'
102
                            ),
103
                            'function' => 'row',
104
                        ]
105
                    )->getContent();
106
107
                    if (!isset($settings['prefix'])) {
108
                        $prefix = 'integration_details[featureSettings]['.$object.'Fields]';
109
                    } else {
110
                        $prefix = $settings['prefix'];
111
                    }
112
113
                    $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
114
                    if ('_' == substr($idPrefix, -1)) {
115
                        $idPrefix = substr($idPrefix, 0, -1);
116
                    }
117
                    $html                 = preg_replace('/'.$form->getName().'\[(.*?)\]/', $prefix.'[$1]', $html);
118
                    $html                 = str_replace($form->getName(), $idPrefix, $html);
119
                    $dataArray['success'] = 1;
120
                    $dataArray['html']    = $html;
121
                }
122
            }
123
        }
124
125
        return $this->sendJsonResponse($dataArray);
126
    }
127
128
    /**
129
     * Get the HTML for integration properties.
130
     *
131
     * @return \Symfony\Component\HttpFoundation\JsonResponse
132
     */
133
    protected function getIntegrationConfigAction(Request $request)
134
    {
135
        $integration = $request->request->get('integration');
136
        $settings    = $request->request->get('settings');
137
        $dataArray   = ['success' => 0];
138
139
        if (!empty($integration) && !empty($settings)) {
140
            /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */
141
            $helper = $this->factory->getHelper('integration');
142
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
143
            $object = $helper->getIntegrationObject($integration);
144
145
            if ($object) {
146
                $data           = $statusData           = [];
0 ignored issues
show
The assignment to $statusData is dead and can be removed.
Loading history...
147
                $objectSettings = $object->getIntegrationSettings();
148
                $defaults       = $objectSettings->getFeatureSettings();
149
                if (method_exists($object, 'getCampaigns')) {
150
                    $campaigns = $object->getCampaigns();
151
                    if (isset($campaigns['records']) && !empty($campaigns['records'])) {
152
                        foreach ($campaigns['records'] as $campaign) {
153
                            $data[$campaign['Id']] = $campaign['Name'];
154
                        }
155
                    }
156
                }
157
                $form = $this->createForm(IntegrationConfigType::class, $defaults, [
158
                    'integration'     => $object,
159
                    'csrf_protection' => false,
160
                    'campaigns'       => $data,
161
                ]);
162
163
                $form = $this->setFormTheme($form, 'MauticCoreBundle:Helper:blank_form.html.php', 'MauticPluginBundle:FormTheme\Integration');
164
165
                $html = $this->render('MauticCoreBundle:Helper:blank_form.html.php', [
166
                    'form'      => $form,
167
                    'function'  => 'widget',
168
                    'variables' => [
169
                        'integration' => $object,
170
                    ],
171
                ])->getContent();
172
173
                $prefix   = str_replace('[integration]', '[config]', $settings['name']);
174
                $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
175
                if ('_' == substr($idPrefix, -1)) {
176
                    $idPrefix = substr($idPrefix, 0, -1);
177
                }
178
179
                $html = preg_replace('/integration_config\[(.*?)\]/', $prefix.'[$1]', $html);
180
                $html = str_replace('integration_config', $idPrefix, $html);
181
182
                $dataArray['success'] = 1;
183
                $dataArray['html']    = $html;
184
            }
185
        }
186
187
        return $this->sendJsonResponse($dataArray);
188
    }
189
190
    protected function getIntegrationCampaignStatusAction(Request $request)
191
    {
192
        $integration = $request->request->get('integration');
193
        $campaign    = $request->request->get('campaign');
194
        $settings    = $request->request->get('settings');
195
        $dataArray   = ['success' => 0];
196
        $statusData  = [];
197
        if (!empty($integration) && !empty($campaign)) {
198
            /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */
199
            $helper = $this->factory->getHelper('integration');
200
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
201
            $object = $helper->getIntegrationObject($integration);
202
203
            if ($object) {
204
                if (method_exists($object, 'getCampaignMemberStatus')) {
205
                    $campaignMemberStatus = $object->getCampaignMemberStatus($campaign);
206
                    if (isset($campaignMemberStatus['records']) && !empty($campaignMemberStatus['records'])) {
207
                        foreach ($campaignMemberStatus['records'] as $status) {
208
                            $statusData[$status['Label']] = $status['Label'];
209
                        }
210
                    }
211
                }
212
                $form = $this->createForm(IntegrationCampaignsType::class, $statusData, [
213
                    'csrf_protection'       => false,
214
                    'campaignContactStatus' => $statusData,
215
                ]);
216
217
                $form = $this->setFormTheme($form, 'MauticCoreBundle:Helper:blank_form.html.php', 'MauticPluginBundle:FormTheme\Integration');
218
219
                $html = $this->render('MauticCoreBundle:Helper:blank_form.html.php', [
220
                    'form'      => $form,
221
                    'function'  => 'widget',
222
                    'variables' => [
223
                        'integration' => $object,
224
                    ],
225
                ])->getContent();
226
227
                $prefix = str_replace('[integration]', '[campaign_member_status][campaign_member_status]', $settings['name']);
228
229
                $idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
230
231
                if ('_' == substr($idPrefix, -1)) {
232
                    $idPrefix = substr($idPrefix, 0, -1);
233
                }
234
235
                $html = preg_replace('/integration_campaign_status_campaign_member_status\[(.*?)\]/', $prefix.'[$1]', $html);
236
                $html = str_replace('integration_campaign_status_campaign_member_status', $idPrefix, $html);
237
                $html = str_replace('integration_campaign_status[campaign_member_status]', $prefix, $html);
238
239
                $dataArray['success'] = 1;
240
                $dataArray['html']    = $html;
241
            }
242
        }
243
244
        return $this->sendJsonResponse($dataArray);
245
    }
246
247
    /**
248
     * @return \Symfony\Component\HttpFoundation\JsonResponse
249
     */
250
    protected function getIntegrationCampaignsAction(Request $request)
251
    {
252
        $integration = $request->request->get('integration');
253
        $dataArray   = ['success' => 0];
254
255
        if (!empty($integration)) {
256
            /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */
257
            $helper = $this->factory->getHelper('integration');
258
            /** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
259
            $object = $helper->getIntegrationObject($integration);
260
            $data   = [];
261
            if ($object) {
262
                $campaigns = $object->getCampaigns();
263
                if (isset($campaigns['records']) && !empty($campaigns['records'])) {
264
                    foreach ($campaigns['records'] as $campaign) {
265
                        $data[$campaign['Id']] = $campaign['Name'];
266
                    }
267
                }
268
                $form = $this->createForm('integration_campaigns', $data, [
269
                    'integration'     => $integration,
270
                    'campaigns'       => $data,
271
                    'csrf_protection' => false,
272
                ]);
273
274
                $form = $this->setFormTheme($form, 'MauticCoreBundle:Helper:blank_form.html.php', 'MauticPluginBundle:FormTheme\Integration');
275
276
                $html = $this->render('MauticCoreBundle:Helper:blank_form.html.php', [
277
                    'form'      => $form,
278
                    'function'  => 'row',
279
                    'variables' => [
280
                        'campaigns'   => $data,
281
                        'integration' => $object,
282
                    ],
283
                ])->getContent();
284
285
                $dataArray['success'] = 1;
286
                $dataArray['html']    = $html;
287
            }
288
        }
289
290
        return $this->sendJsonResponse($dataArray);
291
    }
292
293
    protected function matchFieldsAction(Request $request)
294
    {
295
        $integration       = $request->request->get('integration');
296
        $integration_field = $request->request->get('integrationField');
297
        $mautic_field      = $request->request->get('mauticField');
298
        $update_mautic     = $request->request->get('updateMautic');
299
        $object            = $request->request->get('object');
300
301
        $helper             = $this->factory->getHelper('integration');
302
        $integration_object = $helper->getIntegrationObject($integration);
303
        $entity             = $integration_object->getIntegrationSettings();
304
        $featureSettings    = $entity->getFeatureSettings();
305
        $doNotMatchField    = ('-1' === $mautic_field || '' === $mautic_field);
306
        if ('lead' == $object) {
307
            $fields       = 'leadFields';
308
            $updateFields = 'update_mautic';
309
        } else {
310
            $fields       = 'companyFields';
311
            $updateFields = 'update_mautic_company';
312
        }
313
        $newFeatureSettings = [];
314
        if ($doNotMatchField) {
315
            if (isset($featureSettings[$updateFields]) && array_key_exists($integration_field, $featureSettings[$updateFields])) {
316
                unset($featureSettings[$updateFields][$integration_field]);
317
            }
318
            if (isset($featureSettings[$fields]) && array_key_exists($integration_field, $featureSettings[$fields])) {
319
                unset($featureSettings[$fields][$integration_field]);
320
            }
321
            $dataArray = ['success' => 0];
322
        } else {
323
            $newFeatureSettings[$integration_field] = $update_mautic;
324
            if (isset($featureSettings[$updateFields])) {
325
                $featureSettings[$updateFields] = array_merge($featureSettings[$updateFields], $newFeatureSettings);
326
            } else {
327
                $featureSettings[$updateFields] = $newFeatureSettings;
328
            }
329
            $newFeatureSettings[$integration_field] = $mautic_field;
330
            if (isset($featureSettings[$fields])) {
331
                $featureSettings[$fields] = array_merge($featureSettings[$fields], $newFeatureSettings);
332
            } else {
333
                $featureSettings[$fields] = $newFeatureSettings;
334
            }
335
336
            $dataArray = ['success' => 1];
337
        }
338
        $entity->setFeatureSettings($featureSettings);
339
340
        $this->getModel('plugin')->saveFeatureSettings($entity);
341
342
        return $this->sendJsonResponse($dataArray);
343
    }
344
}
345