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 / Automation / Integrations / MailPoet / Fields / SubscriberCustomFieldsFactory.php
mailpoet / lib / Automation / Integrations / MailPoet / Fields Last commit date
NewsletterLinkFieldsFactory.php 2 years ago SubscriberAutomationFieldsFactory.php 1 year ago SubscriberCustomFieldsFactory.php 2 months ago SubscriberFieldsFactory.php 2 months ago SubscriberStatisticFieldsFactory.php 2 years ago index.php 3 years ago
SubscriberCustomFieldsFactory.php
173 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Integrations\MailPoet\Fields;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use DateTimeImmutable;
9 use MailPoet\Automation\Engine\Data\Field;
10 use MailPoet\Automation\Engine\Exceptions\InvalidStateException;
11 use MailPoet\Automation\Engine\WordPress;
12 use MailPoet\Automation\Integrations\MailPoet\Payloads\SubscriberPayload;
13 use MailPoet\CustomFields\CustomFieldsRepository;
14 use MailPoet\Entities\CustomFieldEntity;
15 use MailPoet\Entities\SubscriberCustomFieldEntity;
16 use MailPoet\Util\DateConverter;
17
18 class SubscriberCustomFieldsFactory {
19 /** @var CustomFieldsRepository */
20 private $customFieldsRepository;
21
22 /** @var WordPress */
23 private $wordPress;
24
25 public function __construct(
26 CustomFieldsRepository $customFieldsRepository,
27 WordPress $wordPress
28 ) {
29 $this->customFieldsRepository = $customFieldsRepository;
30 $this->wordPress = $wordPress;
31 }
32
33 /** @return Field[] */
34 public function getFields(): array {
35 return array_map(function (CustomFieldEntity $customField) {
36 return $this->getField($customField);
37 }, $this->customFieldsRepository->findAllActive());
38 }
39
40 private function getField(CustomFieldEntity $customField): Field {
41 switch ($customField->getType()) {
42 case CustomFieldEntity::TYPE_TEXT:
43 case CustomFieldEntity::TYPE_TEXTAREA:
44 $validate = $customField->getParams()['validate'] ?? null;
45 return $validate === 'number'
46 ? $this->createNumberField($customField)
47 : $this->createStringField($customField);
48 case CustomFieldEntity::TYPE_CHECKBOX:
49 return $this->createBooleanField($customField);
50 case CustomFieldEntity::TYPE_RADIO:
51 case CustomFieldEntity::TYPE_SELECT:
52 return $this->createEnumField($customField);
53 case CustomFieldEntity::TYPE_DATE:
54 $type = $customField->getParams()['date_type'] ?? null;
55 if ($type === 'year_month_day' || $type === 'year_month') {
56 return $this->createDateTimeField($customField);
57 } elseif ($type === 'year') {
58 return $this->createYearField($customField);
59 } elseif ($type === 'month') {
60 return $this->createMonthField($customField);
61 } elseif ($type === 'day') {
62 return $this->createDayField($customField);
63 } else {
64 throw new InvalidStateException(sprintf('Unknown date type "%s"', $type));
65 }
66 default:
67 throw new InvalidStateException(sprintf('Unknown custom field type "%s"', $customField->getType()));
68 }
69 }
70
71 private function createStringField(CustomFieldEntity $customField): Field {
72 $factory = function (SubscriberPayload $payload) use ($customField) {
73 return $this->getCustomFieldValue($payload, $customField);
74 };
75 return $this->createField($customField, Field::TYPE_STRING, $factory);
76 }
77
78 private function createNumberField(CustomFieldEntity $customField): Field {
79 $factory = function (SubscriberPayload $payload) use ($customField) {
80 $value = $this->getCustomFieldValue($payload, $customField);
81 return is_numeric($value) ? (float)$value : null;
82 };
83 return $this->createField($customField, Field::TYPE_NUMBER, $factory);
84 }
85
86 private function createBooleanField(CustomFieldEntity $customField): Field {
87 $factory = function (SubscriberPayload $payload) use ($customField) {
88 $value = $this->getCustomFieldValue($payload, $customField);
89 return $value === null ? null : (bool)$value;
90 };
91 return $this->createField($customField, Field::TYPE_BOOLEAN, $factory);
92 }
93
94 private function createEnumField(CustomFieldEntity $customField): Field {
95 $factory = function (SubscriberPayload $payload) use ($customField) {
96 $value = $this->getCustomFieldValue($payload, $customField);
97 return $value === null ? null : $value;
98 };
99 return $this->createField($customField, Field::TYPE_ENUM, $factory, [
100 'options' => array_map(function (array $value) {
101 return ['id' => $value['value'], 'name' => $value['value']];
102 }, $customField->getParams()['values'] ?? []),
103 ]);
104 }
105
106 private function createDateTimeField(CustomFieldEntity $customField): Field {
107 $factory = function (SubscriberPayload $payload) use ($customField) {
108 return $this->getDateTimeValue($customField, $this->getCustomFieldValue($payload, $customField) ?? '');
109 };
110 return $this->createField($customField, Field::TYPE_DATETIME, $factory);
111 }
112
113 private function createYearField(CustomFieldEntity $customField): Field {
114 $factory = function (SubscriberPayload $payload) use ($customField) {
115 $value = $this->getDateTimeValue($customField, $this->getCustomFieldValue($payload, $customField) ?? '');
116 return $value ? (int)$value->format('Y') : null;
117 };
118 return $this->createField($customField, Field::TYPE_INTEGER, $factory);
119 }
120
121 private function createMonthField(CustomFieldEntity $customField): Field {
122 $factory = function (SubscriberPayload $payload) use ($customField) {
123 $value = $this->getDateTimeValue($customField, $this->getCustomFieldValue($payload, $customField) ?? '');
124 return $value ? (int)$value->format('n') : null;
125 };
126 return $this->createField($customField, Field::TYPE_ENUM, $factory, [
127 'options' => array_map(function (int $value) {
128 return ['id' => $value, 'name' => $this->wordPress->getWpLocale()->get_month($value)];
129 }, range(1, 12)),
130 ]);
131 }
132
133 private function createDayField(CustomFieldEntity $customField): Field {
134 $factory = function (SubscriberPayload $payload) use ($customField) {
135 $value = $this->getDateTimeValue($customField, $this->getCustomFieldValue($payload, $customField) ?? '');
136 return $value ? (int)$value->format('j') : null;
137 };
138 return $this->createField($customField, Field::TYPE_ENUM, $factory, [
139 'options' => array_map(function (int $value) {
140 return ['id' => $value, 'name' => "$value"];
141 }, range(1, 31)),
142 ]);
143 }
144
145 private function getCustomFieldValue(SubscriberPayload $payload, CustomFieldEntity $customField): ?string {
146 $subscriberCustomField = $payload->getSubscriber()->getSubscriberCustomFields()->filter(
147 function (?SubscriberCustomFieldEntity $subscriberCustomField = null) use ($customField) {
148 return $subscriberCustomField && $subscriberCustomField->getCustomField() === $customField;
149 }
150 )->first() ?: null;
151 return $subscriberCustomField ? $subscriberCustomField->getValue() : null;
152 }
153
154 private function createField(CustomFieldEntity $customField, string $type, callable $factory, array $args = []): Field {
155 $key = 'mailpoet:subscriber:custom-field:' . $customField->getName();
156 $name = sprintf(
157 // translators: %s is the name of the custom field
158 __('Custom field: %s', 'mailpoet'),
159 $customField->getParams()['label'] ?? $customField->getName()
160 );
161 return new Field($key, $type, $name, $factory, $args);
162 }
163
164 private function getDateTimeValue(CustomFieldEntity $customField, ?string $value): ?DateTimeImmutable {
165 $dateFormat = $customField->getParams()['date_format'] ?? null;
166 if (!$dateFormat || !$value) {
167 return null;
168 }
169 $dateString = (new DateConverter())->convertDateToDatetime($value, $dateFormat) ?: null;
170 return $dateString ? new DateTimeImmutable($dateString, $this->wordPress->wpTimezone()) : null;
171 }
172 }
173