PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / trunk
MailPoet – Newsletters, Email Marketing, and Automation vtrunk
5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Subscribers / ImportExport / ImportExportFactory.php
mailpoet / lib / Subscribers / ImportExport Last commit date
Export 3 months ago Import 1 hour ago PersonalDataExporters 3 months ago ImportExportFactory.php 1 hour ago ImportExportRepository.php 1 hour ago index.php 3 years ago
ImportExportFactory.php
201 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Subscribers\ImportExport;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\CustomFields\CustomFieldsRepository;
9 use MailPoet\DI\ContainerWrapper;
10 use MailPoet\Entities\SegmentEntity;
11 use MailPoet\Entities\TagEntity;
12 use MailPoet\Segments\SegmentsSimpleListRepository;
13 use MailPoet\Tags\TagRepository;
14 use MailPoet\Util\Helpers;
15
16 class ImportExportFactory {
17 const IMPORT_ACTION = 'import';
18 const EXPORT_ACTION = 'export';
19
20 /** @var string|null */
21 public $action;
22
23 /** @var SegmentsSimpleListRepository */
24 private $segmentsListRepository;
25
26 /** @var CustomFieldsRepository */
27 private $customFieldsRepository;
28
29 /** @var TagRepository */
30 private $tagRepository;
31
32 public function __construct(
33 $action = null
34 ) {
35 $this->action = $action;
36 $this->segmentsListRepository = ContainerWrapper::getInstance()->get(SegmentsSimpleListRepository::class);
37 $this->customFieldsRepository = ContainerWrapper::getInstance()->get(CustomFieldsRepository::class);
38 $this->tagRepository = ContainerWrapper::getInstance()->get(TagRepository::class);
39 }
40
41 public function getSegments() {
42 if ($this->action === self::IMPORT_ACTION) {
43 $segments = $this->segmentsListRepository->getListWithSubscribedSubscribersCounts([SegmentEntity::TYPE_DEFAULT]);
44 } else {
45 $segments = $this->segmentsListRepository->getListWithAssociatedSubscribersCounts();
46 $segments = $this->segmentsListRepository->addVirtualSubscribersWithoutListSegment($segments);
47 $segments = array_values(array_filter($segments, function($segment) {
48 return $segment['subscribers'] > 0;
49 }));
50 }
51
52 return array_map(function($segment) {
53 return [
54 'id' => $segment['id'],
55 'name' => esc_attr($segment['name']),
56 'count' => $segment['subscribers'],
57 ];
58 }, $segments);
59 }
60
61 public function getSubscriberFields() {
62 $fields = [
63 'email' => __('Email', 'mailpoet'),
64 'first_name' => __('First name', 'mailpoet'),
65 'last_name' => __('Last name', 'mailpoet'),
66 'subscribed_ip' => __('Subscription IP', 'mailpoet'),
67 'created_at' => __('Subscription time', 'mailpoet'),
68 'confirmed_at' => __('Confirmation time', 'mailpoet'),
69 'confirmed_ip' => __('Confirmation IP', 'mailpoet'),
70 'tracking_consent' => __('Tracking consent', 'mailpoet'),
71 'tracking_consent_method' => __('Tracking consent method', 'mailpoet'),
72 'tracking_consent_copy' => __('Tracking consent wording', 'mailpoet'),
73 ];
74 if ($this->action === 'export') {
75 $fields = array_merge(
76 $fields,
77 [
78 // Export only: the plugin always stamps this itself, it is never taken from an import.
79 'tracking_consent_updated_at' => __('Tracking consent updated', 'mailpoet'),
80 'last_subscribed_at' => __('Last subscribed on', 'mailpoet'),
81 'list_status' => _x('List status', 'Subscription status', 'mailpoet'),
82 'global_status' => _x('Global status', 'Subscription status', 'mailpoet'),
83 ]
84 );
85 }
86 return $fields;
87 }
88
89 public function formatSubscriberFields($subscriberFields) {
90 return array_map(function($fieldId, $fieldName) {
91 return [
92 'id' => $fieldId,
93 'name' => $fieldName,
94 'text' => $fieldName, // Required for select2 default functionality
95 'type' => in_array($fieldId, ['confirmed_at', 'created_at', 'last_subscribed_at', 'tracking_consent_updated_at'], true) ? 'date' : null,
96 'custom' => false,
97 ];
98 }, array_keys($subscriberFields), $subscriberFields);
99 }
100
101 public function getSubscriberCustomFields() {
102 return $this->customFieldsRepository->findAllAsArray();
103 }
104
105 public function formatSubscriberCustomFields($subscriberCustomFields) {
106 return array_map(function($field) {
107 return [
108 'id' => $field['id'],
109 'name' => $field['name'],
110 'text' => $field['name'], // Required for select2 default functionality
111 'type' => $field['type'],
112 'params' => unserialize($field['params']),
113 'custom' => true,
114 ];
115 }, $subscriberCustomFields);
116 }
117
118 public function formatFieldsForSelect2(
119 $subscriberFields,
120 $subscriberCustomFields
121 ) {
122 $actions = ($this->action === 'import') ?
123 [
124 [
125 'id' => 'ignore',
126 'name' => __('Ignore field...', 'mailpoet'),
127 'text' => __('Ignore field...', 'mailpoet'), // Required for select2 default functionality
128 ],
129 [
130 'id' => 'create',
131 'name' => __('Create new field...', 'mailpoet'),
132 'text' => __('Create new field...', 'mailpoet'), // Required for select2 default functionality
133 ],
134 ] :
135 [
136 [
137 'id' => 'select',
138 'name' => __('Select all...', 'mailpoet'),
139 'text' => __('Select all...', 'mailpoet'), // Required for select2 default functionality
140 ],
141 [
142 'id' => 'deselect',
143 'name' => __('Deselect all...', 'mailpoet'),
144 'text' => __('Deselect all...', 'mailpoet'), // Required for select2 default functionality
145 ],
146 ];
147 $select2Fields = [
148 [
149 'name' => __('Actions', 'mailpoet'),
150 'text' => __('Actions', 'mailpoet'), // Required for select2 default functionality
151 'children' => $actions,
152 ],
153 [
154 'name' => __('System fields', 'mailpoet'),
155 'text' => __('System fields', 'mailpoet'), // Required for select2 default functionality
156 'children' => $this->formatSubscriberFields($subscriberFields),
157 ],
158 ];
159 if ($subscriberCustomFields) {
160 array_push($select2Fields, [
161 'name' => __('User fields', 'mailpoet'),
162 'text' => __('User fields', 'mailpoet'), // Required for select2 default functionality
163 'children' => $this->formatSubscriberCustomFields(
164 $subscriberCustomFields
165 ),
166 ]);
167 }
168 return $select2Fields;
169 }
170
171 public function bootstrap() {
172 $subscriberFields = $this->getSubscriberFields();
173 $subscriberCustomFields = $this->getSubscriberCustomFields();
174 $data['segments'] = json_encode($this->getSegments());
175 $data['subscriberFieldsSelect2'] = json_encode(
176 $this->formatFieldsForSelect2(
177 $subscriberFields,
178 $subscriberCustomFields
179 )
180 );
181 if ($this->action === 'import') {
182 $data['subscriberFields'] = json_encode(
183 array_merge(
184 $this->formatSubscriberFields($subscriberFields),
185 $this->formatSubscriberCustomFields($subscriberCustomFields)
186 )
187 );
188 $data['maxPostSizeBytes'] = Helpers::getMaxPostSize('bytes');
189 $data['maxPostSize'] = Helpers::getMaxPostSize();
190 $data['tags'] = array_map(function (TagEntity $tag): array {
191 return [
192 'id' => $tag->getId(),
193 'name' => $tag->getName(),
194 ];
195 }, $this->tagRepository->findAll());
196 }
197 $data['zipExtensionLoaded'] = extension_loaded('zip');
198 return $data;
199 }
200 }
201