PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / Form / Block / Segment.php
mailpoet / lib / Form / Block Last commit date
BlockRendererHelper.php 3 weeks ago Checkbox.php 1 year ago Close.php 2 weeks ago Column.php 2 months ago Columns.php 2 months ago Date.php 1 year ago Divider.php 3 years ago Heading.php 2 months ago Html.php 1 year ago Image.php 10 months ago Paragraph.php 3 weeks ago Radio.php 1 year ago Segment.php 2 months ago Select.php 2 months ago Submit.php 1 year ago Text.php 1 year ago Textarea.php 1 year ago index.php 3 years ago
Segment.php
189 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Form\Block;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Form\BlockWrapperRenderer;
9 use MailPoet\Segments\SegmentsRepository;
10 use MailPoet\WP\Functions as WPFunctions;
11
12 class Segment {
13
14 /** @var BlockRendererHelper */
15 private $rendererHelper;
16
17 /** @var WPFunctions */
18 private $wp;
19
20 /** @var BlockWrapperRenderer */
21 private $wrapper;
22
23 /** @var SegmentsRepository */
24 private $segmentsRepository;
25
26 public function __construct(
27 BlockRendererHelper $rendererHelper,
28 BlockWrapperRenderer $wrapper,
29 WPFunctions $wp,
30 SegmentsRepository $segmentsRepository
31 ) {
32 $this->rendererHelper = $rendererHelper;
33 $this->wrapper = $wrapper;
34 $this->wp = $wp;
35 $this->segmentsRepository = $segmentsRepository;
36 }
37
38 public function render(array $block, array $formSettings, ?int $formId = null): string {
39 if (($block['params']['display_mode'] ?? null) === 'manage_subscription_choices') {
40 return $this->renderManageSubscriptionChoices($block, $formSettings, $formId);
41 }
42
43 $html = '';
44
45 $fieldName = 'data[' . $this->rendererHelper->getFieldName($block) . ']';
46 $fieldValidation = $this->rendererHelper->getInputValidation($block, [], $formId);
47
48 // Add fieldset around the checkboxes
49 $html .= '<fieldset>';
50 $html .= $this->rendererHelper->renderLegend($block, $formSettings);
51
52 $options = (!empty($block['params']['values'])
53 ? $block['params']['values']
54 : []
55 );
56
57 $options = array_map(function ($option) {
58 $option['id'] = intval($option['id']);
59 return $option;
60 }, $options);
61 $segmentsNamesMap = $this->getSegmentsNames($options);
62
63 foreach ($options as $option) {
64 if (!isset($option['id']) || !isset($segmentsNamesMap[$option['id']])) continue;
65
66 $id = $this->wp->wpUniqueId('mailpoet_segment_');
67 $isChecked = (isset($option['is_checked']) && $option['is_checked']) ? 'checked="checked"' : '';
68
69 $html .= '<label class="mailpoet_checkbox_label" for="' . $id . '" '
70 . $this->rendererHelper->renderFontStyle($formSettings)
71 . '>';
72 $html .= '<input type="checkbox" class="mailpoet_checkbox" ';
73 $html .= 'id="' . $id . '" ';
74 $html .= 'name="' . $fieldName . '[]" ';
75 $html .= 'value="' . $option['id'] . '" ' . $isChecked . ' ';
76 $html .= $fieldValidation;
77 $html .= ' /> ' . $this->wp->escAttr($segmentsNamesMap[$option['id']]);
78 $html .= '</label>';
79 }
80
81 $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
82
83 // End fieldset around checkboxes
84 $html .= '</fieldset>';
85
86 return $this->wrapper->render($block, $html);
87 }
88
89 private function renderManageSubscriptionChoices(array $block, array $formSettings, ?int $formId = null): string {
90 $options = $this->getManageSubscriptionOptions($block['params']['values'] ?? []);
91 if (!$options) {
92 return '';
93 }
94
95 $html = '<fieldset class="mailpoet-manage-subscription-lists" data-automation-id="manage_subscription_lists">';
96 $html .= $this->rendererHelper->renderLegend($block, $formSettings);
97 if (!empty($block['params']['description'])) {
98 $html .= '<p class="mailpoet-manage-subscription-lists-description">' . $this->wp->escHtml($block['params']['description']) . '</p>';
99 }
100
101 foreach ($options as $option) {
102 $segmentId = $option['id'];
103 $name = $option['name'];
104 $description = $option['public_description'];
105 $yesId = $this->wp->wpUniqueId('mailpoet_segment_choice_');
106 $noId = $this->wp->wpUniqueId('mailpoet_segment_choice_');
107 $fieldsetLabelId = 'mailpoet_segment_choice_' . $segmentId . '_label';
108 $fieldsetDescriptionId = 'mailpoet_segment_choice_' . $segmentId . '_description';
109 $describedBy = $description !== '' ? ' aria-describedby="' . $this->wp->escAttr($fieldsetDescriptionId) . '"' : '';
110 $yesChecked = $option['is_checked'] ? ' checked="checked"' : '';
111 $noChecked = $option['is_checked'] ? '' : ' checked="checked"';
112
113 $html .= '<div class="mailpoet-manage-subscription-list-row" data-automation-id="manage_subscription_list_' . $this->wp->escAttr($segmentId) . '">';
114 $html .= '<div class="mailpoet-manage-subscription-list-copy">';
115 $html .= '<div class="mailpoet-manage-subscription-list-name" id="' . $this->wp->escAttr($fieldsetLabelId) . '">' . $this->wp->escHtml($name) . '</div>';
116 if ($description !== '') {
117 $html .= '<div class="mailpoet-manage-subscription-list-description" id="' . $this->wp->escAttr($fieldsetDescriptionId) . '">' . $this->wp->escHtml($description) . '</div>';
118 }
119 $html .= '</div>';
120
121 $html .= '<fieldset class="mailpoet-manage-subscription-list-choice" aria-labelledby="' . $this->wp->escAttr($fieldsetLabelId) . '"' . $describedBy . '>';
122 $html .= '<legend class="mailpoet-manage-subscription-choice-legend">' . $this->wp->escHtml(sprintf(
123 // translators: %s is the name of a mailing list.
124 __('Receive %s?', 'mailpoet'),
125 $name
126 )) . '</legend>';
127
128 $html .= '<label class="mailpoet-manage-subscription-choice-label" for="' . $this->wp->escAttr($yesId) . '">';
129 $html .= '<input type="radio" class="mailpoet_radio" id="' . $this->wp->escAttr($yesId) . '" name="data[segment_choices][' . $this->wp->escAttr($segmentId) . ']" value="subscribed"' . $yesChecked . ' data-automation-id="manage_subscription_list_' . $this->wp->escAttr($segmentId) . '_yes" />';
130 $html .= '<span>' . $this->wp->escHtml(__('Yes', 'mailpoet')) . '</span>';
131 $html .= '</label>';
132
133 $html .= '<label class="mailpoet-manage-subscription-choice-label" for="' . $this->wp->escAttr($noId) . '">';
134 $html .= '<input type="radio" class="mailpoet_radio" id="' . $this->wp->escAttr($noId) . '" name="data[segment_choices][' . $this->wp->escAttr($segmentId) . ']" value="unsubscribed"' . $noChecked . ' data-automation-id="manage_subscription_list_' . $this->wp->escAttr($segmentId) . '_no" />';
135 $html .= '<span>' . $this->wp->escHtml(__('No', 'mailpoet')) . '</span>';
136 $html .= '</label>';
137 $html .= '</fieldset>';
138 $html .= '</div>';
139 }
140
141 $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
142 $html .= '</fieldset>';
143
144 return $this->wrapper->render($block, $html);
145 }
146
147 private function getManageSubscriptionOptions($values): array {
148 if (!is_array($values)) {
149 return [];
150 }
151
152 $options = [];
153 foreach ($values as $value) {
154 if (!is_array($value) || empty($value['id']) || !isset($value['name'])) {
155 continue;
156 }
157 $idValue = $value['id'];
158 $nameValue = $value['name'];
159 $descriptionValue = $value['public_description'] ?? '';
160
161 if ((!is_int($idValue) && !is_string($idValue)) || !is_scalar($nameValue)) {
162 continue;
163 }
164
165 $id = (int)$idValue;
166 if ($id <= 0) {
167 continue;
168 }
169 $options[] = [
170 'id' => $id,
171 'name' => (string)$nameValue,
172 'public_description' => is_scalar($descriptionValue) ? trim((string)$descriptionValue) : '',
173 'is_checked' => !empty($value['is_checked']),
174 ];
175 }
176 return $options;
177 }
178
179 private function getSegmentsNames($values): array {
180 $ids = array_column($values, 'id');
181 $segments = $this->segmentsRepository->findByIds($ids);
182 $namesMap = [];
183 foreach ($segments as $segment) {
184 $namesMap[$segment->getId()] = $segment->getName();
185 }
186 return $namesMap;
187 }
188 }
189