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 / Date.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
Date.php
227 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\BlockStylesRenderer;
9 use MailPoet\Form\BlockWrapperRenderer;
10 use MailPoet\WP\Functions as WPFunctions;
11 use MailPoetVendor\Carbon\CarbonImmutable;
12
13 class Date {
14
15 /** @var BlockRendererHelper */
16 private $rendererHelper;
17
18 /** @var BlockWrapperRenderer */
19 private $wrapper;
20
21 /** @var BlockStylesRenderer */
22 private $blockStylesRenderer;
23
24 /** @var WPFunctions */
25 private $wp;
26
27 public function __construct(
28 BlockRendererHelper $rendererHelper,
29 BlockStylesRenderer $blockStylesRenderer,
30 BlockWrapperRenderer $wrapper,
31 WPFunctions $wp
32 ) {
33 $this->rendererHelper = $rendererHelper;
34 $this->wrapper = $wrapper;
35 $this->blockStylesRenderer = $blockStylesRenderer;
36 $this->wp = $wp;
37 }
38
39 public function render(array $block, array $formSettings, ?int $formId = null): string {
40 $html = '';
41 $html .= $this->rendererHelper->renderLabel($block, $formSettings);
42 $html .= $this->renderDateSelect($formId, $block, $formSettings);
43 return $this->wrapper->render($block, $html);
44 }
45
46 private function renderDateSelect(?int $formId, array $block = [], $formSettings = []): string {
47 $html = '';
48
49 $fieldName = 'data[' . $this->rendererHelper->getFieldName($block) . ']';
50
51 $dateFormats = $this->getDateFormats();
52
53 // automatically select first date format
54 $dateFormat = $dateFormats[$block['params']['date_type']][0];
55
56 // set date format if specified
57 if (
58 isset($block['params']['date_format'])
59 && strlen(trim($block['params']['date_format'])) > 0
60 ) {
61 $dateFormat = $block['params']['date_format'];
62 }
63
64 // generate an array of selectors based on date format
65 $dateSelectors = explode('/', $dateFormat);
66
67 foreach ($dateSelectors as $dateSelector) {
68 if ($dateSelector === 'DD') {
69 $html .= '<select class="mailpoet_date_day" ';
70 $html .= ' style="' . $this->wp->escAttr($this->blockStylesRenderer->renderForSelect([], $formSettings)) . '"';
71 $html .= $this->rendererHelper->getInputValidation($block, [
72 'required-message' => $this->wp->escAttr(__('Please select a day', 'mailpoet')),
73 ], $formId);
74 $html .= 'name="' . $fieldName . '[day]" placeholder="' . $this->wp->escAttr(__('Day', 'mailpoet')) . '">';
75 $html .= $this->getDays($block);
76 $html .= '</select>';
77 } else if ($dateSelector === 'MM') {
78 $html .= '<select class="mailpoet_select mailpoet_date_month" data-automation-id="form_date_month" ';
79 $html .= ' style="' . $this->wp->escAttr($this->blockStylesRenderer->renderForSelect([], $formSettings)) . '"';
80 $html .= $this->rendererHelper->getInputValidation($block, [
81 'required-message' => $this->wp->escAttr(__('Please select a month', 'mailpoet')),
82 ], $formId);
83 $html .= 'name="' . $fieldName . '[month]" placeholder="' . $this->wp->escAttr(__('Month', 'mailpoet')) . '">';
84 $html .= $this->getMonths($block);
85 $html .= '</select>';
86 } else if ($dateSelector === 'YYYY') {
87 $html .= '<select class="mailpoet_date_year" data-automation-id="form_date_year" ';
88 $html .= ' style="' . $this->wp->escAttr($this->blockStylesRenderer->renderForSelect([], $formSettings)) . '"';
89 $html .= $this->rendererHelper->getInputValidation($block, [
90 'required-message' => $this->wp->escAttr(__('Please select a year', 'mailpoet')),
91 ], $formId);
92 $html .= 'name="' . $fieldName . '[year]" placeholder="' . $this->wp->escAttr(__('Year', 'mailpoet')) . '">';
93 $html .= $this->getYears($block);
94 $html .= '</select>';
95 }
96 }
97
98 $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
99
100 return $html;
101 }
102
103 public function getDateTypes(): array {
104 return [
105 'year_month_day' => $this->wp->escHtml(__('Year, month, day', 'mailpoet')),
106 'year_month' => $this->wp->escHtml(__('Year, month', 'mailpoet')),
107 'month' => $this->wp->escHtml(__('Month (January, February,...)', 'mailpoet')),
108 'year' => $this->wp->escHtml(__('Year', 'mailpoet')),
109 ];
110 }
111
112 public function getDateFormats(): array {
113 return [
114 'year_month_day' => ['MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY/MM/DD'],
115 'year_month' => ['MM/YYYY', 'YYYY/MM'],
116 'year' => ['YYYY'],
117 'month' => ['MM'],
118 ];
119 }
120
121 public function getMonthNames(): array {
122 return [__('January', 'mailpoet'), __('February', 'mailpoet'), __('March', 'mailpoet'), __('April', 'mailpoet'),
123 __('May', 'mailpoet'), __('June', 'mailpoet'), __('July', 'mailpoet'), __('August', 'mailpoet'), __('September', 'mailpoet'),
124 __('October', 'mailpoet'), __('November', 'mailpoet'), __('December', 'mailpoet'),
125 ];
126 }
127
128 private function getMonths(array $block = []): string {
129 $defaults = [
130 'selected' => null,
131 ];
132
133 if (!empty($block['params']['value'])) {
134 $date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
135 if ($date instanceof CarbonImmutable) {
136 $defaults['selected'] = (int)date('m', $date->getTimestamp());
137 }
138 } elseif (!empty($block['params']['is_default_today'])) {
139 // is default today
140 $defaults['selected'] = (int)date('m');
141 }
142 // merge block with defaults
143 $block = array_merge($defaults, $block);
144
145 $monthNames = $this->getMonthNames();
146
147 $html = '';
148
149 // empty value label
150 $html .= '<option value="">' . $this->wp->escHtml(__('Month', 'mailpoet')) . '</option>';
151
152 for ($i = 1; $i < 13; $i++) {
153 $isSelected = ($i === $block['selected']) ? 'selected="selected"' : '';
154 $html .= '<option value="' . $i . '" ' . $isSelected . '>';
155 $html .= $this->wp->escHtml($monthNames[$i - 1]);
156 $html .= '</option>';
157 }
158
159 return $html;
160 }
161
162 private function getYears(array $block = []): string {
163 $defaults = [
164 'selected' => null,
165 'from' => (int)date('Y') - 100,
166 'to' => (int)date('Y'),
167 ];
168
169 if (!empty($block['params']['value'])) {
170 $date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
171 if ($date instanceof CarbonImmutable) {
172 $defaults['selected'] = (int)date('Y', $date->getTimestamp());
173 }
174 } elseif (!empty($block['params']['is_default_today'])) {
175 // is default today
176 $defaults['selected'] = (int)date('Y');
177 }
178
179 // merge block with defaults
180 $block = array_merge($defaults, $block);
181
182 $html = '';
183
184 // empty value label
185 $html .= '<option value="">' . $this->wp->escHtml(__('Year', 'mailpoet')) . '</option>';
186
187 // return years as an array
188 for ($i = (int)$block['to']; $i > (int)($block['from'] - 1); $i--) {
189 $isSelected = ($i === $block['selected']) ? 'selected="selected"' : '';
190 $html .= '<option value="' . $i . '" ' . $isSelected . '>' . $i . '</option>';
191 }
192
193 return $html;
194 }
195
196 private function getDays(array $block = []): string {
197 $defaults = [
198 'selected' => null,
199 ];
200 if (!empty($block['params']['value'])) {
201 $date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
202 if ($date instanceof CarbonImmutable) {
203 $defaults['selected'] = (int)date('d', $date->getTimestamp());
204 }
205 } elseif (!empty($block['params']['is_default_today'])) {
206 // is default today
207 $defaults['selected'] = (int)date('d');
208 }
209
210 // merge block with defaults
211 $block = array_merge($defaults, $block);
212
213 $html = '';
214
215 // empty value label
216 $html .= '<option value="">' . $this->wp->escHtml(__('Day', 'mailpoet')) . '</option>';
217
218 // return days as an array
219 for ($i = 1; $i < 32; $i++) {
220 $isSelected = ($i === $block['selected']) ? 'selected="selected"' : '';
221 $html .= '<option value="' . $i . '" ' . $isSelected . '>' . $i . '</option>';
222 }
223
224 return $html;
225 }
226 }
227