Issues (3627)

Form/Type/MailchimpType.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 MauticPlugin\MauticEmailMarketingBundle\Form\Type;
13
14
use Mautic\CoreBundle\Form\Type\YesNoButtonGroupType;
15
use Mautic\CoreBundle\Helper\CoreParametersHelper;
16
use Mautic\PluginBundle\Form\Type\FieldsType;
17
use Mautic\PluginBundle\Helper\IntegrationHelper;
18
use Mautic\PluginBundle\Model\PluginModel;
19
use Symfony\Component\Form\AbstractType;
20
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
21
use Symfony\Component\Form\FormBuilderInterface;
22
use Symfony\Component\Form\FormError;
23
use Symfony\Component\Form\FormEvent;
24
use Symfony\Component\Form\FormEvents;
25
use Symfony\Component\Form\FormInterface;
26
use Symfony\Component\HttpFoundation\Session\Session;
27
use Symfony\Component\OptionsResolver\OptionsResolver;
28
29
/**
30
 * Class MailchimpType.
31
 */
32
class MailchimpType extends AbstractType
33
{
34
    /**
35
     * @var IntegrationHelper
36
     */
37
    private $integrationHelper;
38
39
    /** @var PluginModel */
40
    private $pluginModel;
41
42
    /**
43
     * @var Session
44
     */
45
    protected $session;
46
47
    /**
48
     * @var CoreParametersHelper
49
     */
50
    protected $coreParametersHelper;
51
52
    public function __construct(IntegrationHelper $integrationHelper, PluginModel $pluginModel, Session $session, CoreParametersHelper $coreParametersHelper)
53
    {
54
        $this->integrationHelper    = $integrationHelper;
55
        $this->pluginModel          = $pluginModel;
56
        $this->session              = $session;
57
        $this->coreParametersHelper = $coreParametersHelper;
58
    }
59
60
    public function buildForm(FormBuilderInterface $builder, array $options)
61
    {
62
        /** @var \MauticPlugin\MauticEmailMarketingBundle\Integration\MailchimpIntegration $mailchimp */
63
        $mailchimp = $this->integrationHelper->getIntegrationObject('Mailchimp');
64
65
        $api = $mailchimp->getApiHelper();
66
        try {
67
            $lists   = $api->getLists();
68
            $choices = [];
69
            if (!empty($lists)) {
70
                if ($lists['total_items']) {
71
                    foreach ($lists['lists'] as $list) {
72
                        $choices[$list['id']] = $list['name'];
73
                    }
74
                }
75
76
                asort($choices);
77
            }
78
        } catch (\Exception $e) {
79
            $choices = [];
80
            $error   = $e->getMessage();
81
        }
82
83
        $builder->add('list', ChoiceType::class, [
84
            'choices'           => array_flip($choices), // Choice type expects labels as keys
85
            'label'             => 'mautic.emailmarketing.list',
86
            'required'          => false,
87
            'attr'              => [
88
                'tooltip'  => 'mautic.emailmarketing.list.tooltip',
89
                'onchange' => 'Mautic.getIntegrationLeadFields(\'Mailchimp\', this, {"list": this.value});',
90
            ],
91
        ]);
92
93
        $builder->add('doubleOptin', YesNoButtonGroupType::class, [
94
            'label' => 'mautic.mailchimp.double_optin',
95
            'data'  => (!isset($options['data']['doubleOptin'])) ? true : $options['data']['doubleOptin'],
96
        ]);
97
98
        $builder->add('sendWelcome', YesNoButtonGroupType::class, [
99
            'label' => 'mautic.emailmarketing.send_welcome',
100
            'data'  => (!isset($options['data']['sendWelcome'])) ? true : $options['data']['sendWelcome'],
101
        ]);
102
103
        if (!empty($error)) {
104
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($error) {
105
                $form = $event->getForm();
106
107
                if ($error) {
108
                    $form['list']->addError(new FormError($error));
109
                }
110
            });
111
        }
112
113
        if (isset($options['form_area']) && 'integration' == $options['form_area']) {
114
            $leadFields = $this->pluginModel->getLeadFields();
115
116
            $formModifier = function (FormInterface $form, $data) use ($mailchimp, $leadFields) {
117
                $integrationName = $mailchimp->getName();
118
                $session         = $this->session;
119
                $limit           = $session->get(
120
                    'mautic.plugin.'.$integrationName.'.lead.limit',
121
                    $this->coreParametersHelper->get('default_pagelimit')
122
                );
123
                $page     = $session->get('mautic.plugin.'.$integrationName.'.lead.page', 1);
124
                $settings = [
125
                    'silence_exceptions' => false,
126
                    'feature_settings'   => [
127
                        'list_settings' => $data,
128
                    ],
129
                    'ignore_field_cache' => (1 == $page && 'POST' !== $_SERVER['REQUEST_METHOD']) ? true : false,
130
                ];
131
                try {
132
                    $fields = $mailchimp->getFormLeadFields($settings);
133
134
                    if (!is_array($fields)) {
0 ignored issues
show
The condition is_array($fields) is always true.
Loading history...
135
                        $fields = [];
136
                    }
137
                    $error = '';
138
                } catch (\Exception $e) {
139
                    $fields = [];
140
                    $error  = $e->getMessage();
141
                    $page   = 1;
142
                }
143
144
                list($specialInstructions) = $mailchimp->getFormNotes('leadfield_match');
145
                $form->add('leadFields', FieldsType::class, [
146
                    'label'                => 'mautic.integration.leadfield_matches',
147
                    'required'             => true,
148
                    'mautic_fields'        => $leadFields,
149
                    'integration'          => $mailchimp->getName(),
150
                    'integration_object'   => $mailchimp,
151
                    'limit'                => $limit,
152
                    'page'                 => $page,
153
                    'data'                 => $data,
154
                    'integration_fields'   => $fields,
155
                    'special_instructions' => $specialInstructions,
156
                    'mapped'               => true,
157
                    'error_bubbling'       => false,
158
                ]);
159
160
                if ($error) {
161
                    $form->addError(new FormError($error));
162
                }
163
            };
164
165
            $builder->addEventListener(FormEvents::PRE_SET_DATA,
166
                function (FormEvent $event) use ($formModifier) {
167
                    $data = $event->getData();
168
                    if (isset($data['leadFields']['leadFields'])) {
169
                        $data['leadFields'] = $data['leadFields']['leadFields'];
170
                    }
171
                    $formModifier($event->getForm(), $data);
172
                }
173
            );
174
175
            $builder->addEventListener(FormEvents::PRE_SUBMIT,
176
                function (FormEvent $event) use ($formModifier) {
177
                    $data = $event->getData();
178
                    if (isset($data['leadFields']['leadFields'])) {
179
                        $data['leadFields'] = $data['leadFields']['leadFields'];
180
                    }
181
                    $formModifier($event->getForm(), $data);
182
                }
183
            );
184
        }
185
    }
186
187
    /**
188
     * {@inheritdoc}
189
     */
190
    public function configureOptions(OptionsResolver $resolver)
191
    {
192
        $resolver->setDefined(['form_area']);
193
    }
194
195
    /**
196
     * @return string
197
     */
198
    public function getBlockPrefix()
199
    {
200
        return 'emailmarketing_mailchimp';
201
    }
202
}
203