PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.33.1
MailPoet – Newsletters, Email Marketing, and Automation v5.33.1
5.37.0 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 / Subscription / ManageSubscriptionFormRenderer.php
mailpoet / lib / Subscription Last commit date
AdminUserSubscription.php 3 months ago Blacklist.php 1 year ago Comment.php 3 months ago Form.php 1 month ago Manage.php 1 month ago ManageSubscriptionFormRenderer.php 3 months ago Pages.php 1 month ago Registration.php 3 months ago SubscriptionUrlFactory.php 3 months ago Throttling.php 3 months ago index.php 3 years ago
ManageSubscriptionFormRenderer.php
355 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 private function getBasicFields(SubscriberEntity $subscriber, bool $isModernStyle): array {
229 $statusParams = [
230 'required' => true,
231 'label' => $isModernStyle ? __('Email subscription status', 'mailpoet') : __('Status', 'mailpoet'),
232 'values' => [
233 [
234 'value' => [
235 SubscriberEntity::STATUS_SUBSCRIBED => __('Subscribed', 'mailpoet'),
236 ],
237 'is_checked' => (
238 $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED
239 ),
240 ],
241 [
242 'value' => [
243 SubscriberEntity::STATUS_UNSUBSCRIBED => __('Unsubscribed', 'mailpoet'),
244 ],
245 'is_checked' => (
246 $subscriber->getStatus() === SubscriberEntity::STATUS_UNSUBSCRIBED
247 ),
248 ],
249 [
250 'value' => [
251 SubscriberEntity::STATUS_BOUNCED => __('Bounced', 'mailpoet'),
252 ],
253 'is_checked' => (
254 $subscriber->getStatus() === SubscriberEntity::STATUS_BOUNCED
255 ),
256 'is_disabled' => true,
257 'is_hidden' => (
258 $subscriber->getStatus() !== SubscriberEntity::STATUS_BOUNCED
259 ),
260 ],
261 [
262 'value' => [
263 SubscriberEntity::STATUS_INACTIVE => __('Inactive', 'mailpoet'),
264 ],
265 'is_checked' => (
266 $subscriber->getStatus() === SubscriberEntity::STATUS_INACTIVE
267 ),
268 'is_hidden' => (
269 $subscriber->getStatus() !== SubscriberEntity::STATUS_INACTIVE
270 ),
271 ],
272 ],
273 ];
274 if ($isModernStyle) {
275 $statusParams['description'] = __('This controls whether you receive emails overall. Your list choices below control which public lists you receive.', 'mailpoet');
276 $statusParams['class_name'] = 'mailpoet-manage-subscription-status';
277 $statusParams['input_id'] = 'mailpoet_manage_subscription_status';
278 }
279
280 return [
281 [
282 'id' => 'first_name',
283 'type' => 'text',
284 'params' => [
285 'label' => __('First name', 'mailpoet'),
286 'value' => $subscriber->getFirstName(),
287 'disabled' => ($subscriber->isWPUser() || $subscriber->getIsWoocommerceUser()),
288 ],
289 ],
290 [
291 'id' => 'last_name',
292 'type' => 'text',
293 'params' => [
294 'label' => __('Last name', 'mailpoet'),
295 'value' => $subscriber->getLastName(),
296 'disabled' => ($subscriber->isWPUser() || $subscriber->getIsWoocommerceUser()),
297 ],
298 ],
299 [
300 'id' => 'status',
301 'type' => 'select',
302 'params' => $statusParams,
303 ],
304 ];
305 }
306
307 private function getSegmentField(SubscriberEntity $subscriber, bool $isModernStyle): array {
308 // Get default segments
309 $criteria = [
310 'type' => SegmentEntity::TYPE_DEFAULT,
311 'deletedAt' => null,
312 'displayInManageSubscriptionPage' => true,
313 ];
314 $segments = $this->segmentsRepository->findBy($criteria, ['name' => Criteria::ASC]);
315
316 $subscribedSegmentIds = [];
317 foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) {
318 $segment = $subscriberSegment->getSegment();
319 if (!$segment) continue;
320
321 if ($subscriberSegment->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED) {
322 $subscribedSegmentIds[] = $segment->getId();
323 }
324 }
325
326 $segments = array_map(function (SegmentEntity $segment) use ($subscribedSegmentIds, $isModernStyle) {
327 $segmentData = [
328 'id' => $segment->getId(),
329 'name' => $segment->getName(),
330 'is_checked' => in_array($segment->getId(), $subscribedSegmentIds),
331 ];
332 if ($isModernStyle) {
333 $segmentData['public_description'] = $segment->getPublicDescription();
334 }
335 return $segmentData;
336 }, $segments);
337
338 $params = [
339 'label' => __('Your lists', 'mailpoet'),
340 'class_name' => 'mailpoet-manage-subscription-list-fields',
341 'values' => $segments,
342 ];
343 if ($isModernStyle) {
344 $params['description'] = __('Choose Yes for lists you want to receive and No for lists you do not want to receive.', 'mailpoet');
345 $params['display_mode'] = 'manage_subscription_choices';
346 }
347
348 return [
349 'id' => 'segments',
350 'type' => 'segment',
351 'params' => $params,
352 ];
353 }
354 }
355