PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / Subscription / ManageSubscriptionFormRenderer.php
mailpoet / lib / Subscription Last commit date
AdminUserSubscription.php 2 months ago Blacklist.php 1 year ago Comment.php 2 months ago Form.php 2 weeks ago Manage.php 5 days ago ManageSubscriptionFormRenderer.php 5 days ago Pages.php 5 days ago Registration.php 2 months ago SubscriptionUrlFactory.php 5 days ago Throttling.php 2 months ago index.php 3 years ago
ManageSubscriptionFormRenderer.php
372 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Subscription;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Config\Renderer as TemplateRenderer;
9 use MailPoet\CustomFields\CustomFieldsRepository;
10 use MailPoet\Entities\CustomFieldEntity;
11 use MailPoet\Entities\SegmentEntity;
12 use MailPoet\Entities\SubscriberEntity;
13 use MailPoet\Form\Block\Date as FormBlockDate;
14 use MailPoet\Form\Renderer as FormRenderer;
15 use MailPoet\Segments\SegmentsRepository;
16 use MailPoet\Settings\SettingsController;
17 use MailPoet\Subscribers\LinkTokens;
18 use MailPoet\Util\Helpers;
19 use MailPoet\Util\Url as UrlHelper;
20 use MailPoet\WP\Functions as WPFunctions;
21 use MailPoetVendor\Doctrine\Common\Collections\Criteria;
22
23 class ManageSubscriptionFormRenderer {
24 const FORM_STATE_SUCCESS = 'success';
25 const FORM_STATE_ERROR = 'error';
26 const FORM_STATE_NOT_SUBMITTED = 'not_submitted';
27
28 /** @var UrlHelper */
29 private $urlHelper;
30
31 /** @var WPFunctions */
32 private $wp;
33
34 /** @var LinkTokens */
35 private $linkTokens;
36
37 /** @var FormRenderer */
38 private $formRenderer;
39
40 /** @var FormBlockDate */
41 private $dateBlock;
42
43 /** @var TemplateRenderer */
44 private $templateRenderer;
45
46 /** @var CustomFieldsRepository */
47 private $customFieldsRepository;
48
49 /** @var SegmentsRepository */
50 private $segmentsRepository;
51
52 /** @var SettingsController */
53 private $settings;
54
55 public function __construct(
56 WPFunctions $wp,
57 UrlHelper $urlHelper,
58 LinkTokens $linkTokens,
59 FormRenderer $formRenderer,
60 FormBlockDate $dateBlock,
61 TemplateRenderer $templateRenderer,
62 CustomFieldsRepository $customFieldsRepository,
63 SegmentsRepository $segmentsRepository,
64 SettingsController $settings
65 ) {
66 $this->wp = $wp;
67 $this->urlHelper = $urlHelper;
68 $this->linkTokens = $linkTokens;
69 $this->formRenderer = $formRenderer;
70 $this->dateBlock = $dateBlock;
71 $this->templateRenderer = $templateRenderer;
72 $this->customFieldsRepository = $customFieldsRepository;
73 $this->segmentsRepository = $segmentsRepository;
74 $this->settings = $settings;
75 }
76
77 public function renderForm(SubscriberEntity $subscriber, string $formState = self::FORM_STATE_NOT_SUBMITTED): string {
78 $isModernStyle = $this->isModernStyle();
79 $basicFields = $this->getBasicFields($subscriber, $isModernStyle);
80 $customFields = $this->getCustomFields($subscriber);
81 $segmentField = $this->getSegmentField($subscriber, $isModernStyle);
82 $submitField = [
83 'id' => 'submit',
84 'type' => 'submit',
85 'params' => [
86 'label' => $isModernStyle ? __('Save changes', 'mailpoet') : __('Save', 'mailpoet'),
87 ],
88 ];
89
90 $form = array_merge(
91 $basicFields,
92 $customFields,
93 [
94 $segmentField,
95 $submitField,
96 ]
97 );
98
99 $filteredForm = $this->wp->applyFilters('mailpoet_manage_subscription_page_form_fields', $form);
100 if (is_array($filteredForm)) {
101 $form = $filteredForm;
102 }
103
104 $templateData = [
105 'actionUrl' => admin_url('admin-post.php'),
106 'redirectUrl' => $this->urlHelper->getCurrentUrl(),
107 'email' => $subscriber->getEmail(),
108 'token' => $this->linkTokens->getToken($subscriber),
109 'editEmailInfo' => __('Need to change your email address? Unsubscribe using the form below, then simply sign up again.', 'mailpoet'),
110 'isModernStyle' => $isModernStyle,
111 'isGloballyUnsubscribed' => $subscriber->getStatus() === SubscriberEntity::STATUS_UNSUBSCRIBED,
112 'formState' => $formState,
113 ];
114
115 if ($isModernStyle) {
116 $formSections = $this->splitFormSections($form);
117 $templateData['identityFieldsHtml'] = $this->formRenderer->renderBlocks($formSections['identityFields'], [], null, $honeypot = false, $captcha = false);
118 $templateData['additionalIdentityFieldsHtml'] = $this->formRenderer->renderBlocks($formSections['additionalIdentityFields'], [], null, $honeypot = false, $captcha = false);
119 $templateData['listFieldsHtml'] = $this->formRenderer->renderBlocks($formSections['listFields'], [], null, $honeypot = false, $captcha = false);
120 $templateData['submitHtml'] = $this->formRenderer->renderBlocks($formSections['submitFields'], [], null, $honeypot = false, $captcha = false);
121 $templateData['hasVisibleLists'] = $formSections['hasVisibleLists'];
122 } else {
123 $templateData['formHtml'] = $this->formRenderer->renderBlocks($form, [], null, $honeypot = false, $captcha = false);
124 }
125
126 if ($subscriber->isWPUser() || $subscriber->getIsWoocommerceUser()) {
127 $wpCurrentUser = $this->wp->wpGetCurrentUser();
128 if ($wpCurrentUser->user_email === $subscriber->getEmail()) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
129 $templateData['editEmailInfo'] = Helpers::replaceLinkTags(
130 __('[link]Edit your profile[/link] to update your email.', 'mailpoet'),
131 $this->wp->getEditProfileUrl(),
132 ['target' => '_blank']
133 );
134 } else {
135 $templateData['editEmailInfo'] = Helpers::replaceLinkTags(
136 __('[link]Log in to your account[/link] to update your email.', 'mailpoet'),
137 $this->wp->wpLoginUrl(),
138 ['target' => '_blank']
139 );
140 }
141 }
142
143 return $this->templateRenderer->render('subscription/manage_subscription.html', $templateData);
144 }
145
146 private function isModernStyle(): bool {
147 return $this->settings->get('subscription.manage_subscription_page_style') === SettingsController::MANAGE_SUBSCRIPTION_PAGE_STYLE_MODERN;
148 }
149
150 private function splitFormSections(array $form): array {
151 $identityFields = [];
152 $additionalIdentityFields = [];
153 $listFields = [];
154 $submitFields = [];
155 $hasVisibleLists = false;
156 $placeAdditionalIdentityFieldsAfterNoListNotice = false;
157
158 foreach ($form as $field) {
159 if (!is_array($field)) {
160 continue;
161 }
162 $params = isset($field['params']) && is_array($field['params']) ? $field['params'] : [];
163
164 if (($field['type'] ?? null) === 'submit') {
165 $submitFields[] = $field;
166 continue;
167 }
168
169 if (($field['type'] ?? null) === 'segment' && (($params['display_mode'] ?? null) === 'manage_subscription_choices')) {
170 if (!empty($params['values']) && is_array($params['values'])) {
171 $hasVisibleLists = true;
172 $listFields[] = $field;
173 }
174 continue;
175 }
176
177 if ($placeAdditionalIdentityFieldsAfterNoListNotice) {
178 $additionalIdentityFields[] = $field;
179 } else {
180 $identityFields[] = $field;
181 }
182 if (($field['id'] ?? null) === 'status') {
183 $placeAdditionalIdentityFieldsAfterNoListNotice = true;
184 }
185 }
186
187 return [
188 'identityFields' => $identityFields,
189 'additionalIdentityFields' => $additionalIdentityFields,
190 'listFields' => $listFields,
191 'submitFields' => $submitFields,
192 'hasVisibleLists' => $hasVisibleLists,
193 ];
194 }
195
196 private function getCustomFields(SubscriberEntity $subscriber): array {
197 $customFieldValues = [];
198 foreach ($subscriber->getSubscriberCustomFields() as $subscriberCustomField) {
199 $customField = $subscriberCustomField->getCustomField();
200 if (!$customField) continue;
201
202 $customFieldValues[$customField->getId()] = $subscriberCustomField->getValue();
203 }
204 return array_map(function (CustomFieldEntity $customFieldEntity) use ($customFieldValues) {
205 $customField = [
206 'id' => 'cf_' . $customFieldEntity->getId(),
207 'name' => $customFieldEntity->getName(),
208 'type' => $customFieldEntity->getType(),
209 'params' => $customFieldEntity->getParams(),
210 ];
211
212 $customField['params']['value'] = $customFieldValues[$customFieldEntity->getId()] ?? null;
213
214 if ($customField['type'] === 'date') {
215 $dateFormats = $this->dateBlock->getDateFormats();
216 $customField['params']['date_format'] = array_shift(
217 $dateFormats[$customField['params']['date_type']]
218 );
219 }
220 if (!isset($customField['params']['label'])) {
221 $customField['params']['label'] = $customField['name'];
222 }
223
224 return $customField;
225 }, $this->customFieldsRepository->findAllActive());
226 }
227
228 public static function getTrackingConsentCopy(): string {
229 return __('Allow tracking of email opens and link clicks', 'mailpoet');
230 }
231
232 private function getBasicFields(SubscriberEntity $subscriber, bool $isModernStyle): array {
233 $statusParams = [
234 'required' => true,
235 'label' => $isModernStyle ? __('Email subscription status', 'mailpoet') : __('Status', 'mailpoet'),
236 'values' => [
237 [
238 'value' => [
239 SubscriberEntity::STATUS_SUBSCRIBED => __('Subscribed', 'mailpoet'),
240 ],
241 'is_checked' => (
242 $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED
243 ),
244 ],
245 [
246 'value' => [
247 SubscriberEntity::STATUS_UNSUBSCRIBED => __('Unsubscribed', 'mailpoet'),
248 ],
249 'is_checked' => (
250 $subscriber->getStatus() === SubscriberEntity::STATUS_UNSUBSCRIBED
251 ),
252 ],
253 [
254 'value' => [
255 SubscriberEntity::STATUS_BOUNCED => __('Bounced', 'mailpoet'),
256 ],
257 'is_checked' => (
258 $subscriber->getStatus() === SubscriberEntity::STATUS_BOUNCED
259 ),
260 'is_disabled' => true,
261 'is_hidden' => (
262 $subscriber->getStatus() !== SubscriberEntity::STATUS_BOUNCED
263 ),
264 ],
265 [
266 'value' => [
267 SubscriberEntity::STATUS_INACTIVE => __('Inactive', 'mailpoet'),
268 ],
269 'is_checked' => (
270 $subscriber->getStatus() === SubscriberEntity::STATUS_INACTIVE
271 ),
272 'is_hidden' => (
273 $subscriber->getStatus() !== SubscriberEntity::STATUS_INACTIVE
274 ),
275 ],
276 ],
277 ];
278 if ($isModernStyle) {
279 $statusParams['description'] = __('This controls whether you receive emails overall. Your list choices below control which public lists you receive.', 'mailpoet');
280 $statusParams['class_name'] = 'mailpoet-manage-subscription-status';
281 $statusParams['input_id'] = 'mailpoet_manage_subscription_status';
282 }
283
284 return [
285 [
286 'id' => 'first_name',
287 'type' => 'text',
288 'params' => [
289 'label' => __('First name', 'mailpoet'),
290 'value' => $subscriber->getFirstName(),
291 'disabled' => ($subscriber->isWPUser() || $subscriber->getIsWoocommerceUser()),
292 ],
293 ],
294 [
295 'id' => 'last_name',
296 'type' => 'text',
297 'params' => [
298 'label' => __('Last name', 'mailpoet'),
299 'value' => $subscriber->getLastName(),
300 'disabled' => ($subscriber->isWPUser() || $subscriber->getIsWoocommerceUser()),
301 ],
302 ],
303 [
304 'id' => 'status',
305 'type' => 'select',
306 'params' => $statusParams,
307 ],
308 [
309 'id' => 'tracking_consent',
310 'type' => 'checkbox',
311 'params' => [
312 'label' => __('Email activity tracking', 'mailpoet'),
313 'values' => [
314 [
315 'value' => self::getTrackingConsentCopy(),
316 'is_checked' => $subscriber->getTrackingConsent() === SubscriberEntity::TRACKING_CONSENT_GRANTED,
317 ],
318 ],
319 ],
320 ],
321 ];
322 }
323
324 private function getSegmentField(SubscriberEntity $subscriber, bool $isModernStyle): array {
325 // Get default segments
326 $criteria = [
327 'type' => SegmentEntity::TYPE_DEFAULT,
328 'deletedAt' => null,
329 'displayInManageSubscriptionPage' => true,
330 ];
331 $segments = $this->segmentsRepository->findBy($criteria, ['name' => Criteria::ASC]);
332
333 $subscribedSegmentIds = [];
334 foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) {
335 $segment = $subscriberSegment->getSegment();
336 if (!$segment) continue;
337
338 if ($subscriberSegment->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED) {
339 $subscribedSegmentIds[] = $segment->getId();
340 }
341 }
342
343 $segments = array_map(function (SegmentEntity $segment) use ($subscribedSegmentIds, $isModernStyle) {
344 $segmentData = [
345 'id' => $segment->getId(),
346 'name' => $segment->getName(),
347 'is_checked' => in_array($segment->getId(), $subscribedSegmentIds),
348 ];
349 if ($isModernStyle) {
350 $segmentData['public_description'] = $segment->getPublicDescription();
351 }
352 return $segmentData;
353 }, $segments);
354
355 $params = [
356 'label' => __('Your lists', 'mailpoet'),
357 'class_name' => 'mailpoet-manage-subscription-list-fields',
358 'values' => $segments,
359 ];
360 if ($isModernStyle) {
361 $params['description'] = __('Choose Yes for lists you want to receive and No for lists you do not want to receive.', 'mailpoet');
362 $params['display_mode'] = 'manage_subscription_choices';
363 }
364
365 return [
366 'id' => 'segments',
367 'type' => 'segment',
368 'params' => $params,
369 ];
370 }
371 }
372