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 / Engine / Registry.php
mailpoet / lib / Automation / Engine Last commit date
API 3 years ago Builder 2 months ago Control 3 weeks ago Data 2 months ago Endpoints 1 month ago Exceptions 1 year ago Integration 11 months ago Mappers 9 months ago Storage 1 month ago Templates 2 years ago Utils 8 months ago Validation 2 months ago Engine.php 1 month ago Exceptions.php 1 month ago Hooks.php 2 months ago Integration.php 4 years ago Registry.php 2 months ago WordPress.php 2 months ago index.php 3 years ago
Registry.php
280 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Engine;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Automation\Engine\Control\RootStep;
9 use MailPoet\Automation\Engine\Data\AutomationTemplate;
10 use MailPoet\Automation\Engine\Data\AutomationTemplateCategory;
11 use MailPoet\Automation\Engine\Data\Field;
12 use MailPoet\Automation\Engine\Exceptions\InvalidStateException;
13 use MailPoet\Automation\Engine\Integration\Action;
14 use MailPoet\Automation\Engine\Integration\Filter;
15 use MailPoet\Automation\Engine\Integration\Payload;
16 use MailPoet\Automation\Engine\Integration\Step;
17 use MailPoet\Automation\Engine\Integration\Subject;
18 use MailPoet\Automation\Engine\Integration\SubjectTransformer;
19 use MailPoet\Automation\Engine\Integration\Trigger;
20
21 class Registry {
22 /** @var array<string, AutomationTemplate> */
23 private $templates;
24
25 /** @var array<string, AutomationTemplateCategory> */
26 private $templateCategories = [];
27
28 /** @var array<string, Step> */
29 private $steps = [];
30
31 /** @var array<string, Subject<Payload>> */
32 private $subjects = [];
33
34 /** @var SubjectTransformer[] */
35 private $subjectTransformers = [];
36
37 /** @var array<string, Field>|null */
38 private $fields = null;
39
40 /** @var array<string, Filter> */
41 private $filters = [];
42
43 /** @var array<string, Trigger> */
44 private $triggers = [];
45
46 /** @var array<string, Action> */
47 private $actions = [];
48
49 /** @var array<string, callable> */
50 private $contextFactories = [];
51
52 /** @var WordPress */
53 private $wordPress;
54
55 public function __construct(
56 RootStep $rootStep,
57 WordPress $wordPress
58 ) {
59 $this->wordPress = $wordPress;
60 $this->steps[$rootStep->getKey()] = $rootStep;
61 }
62
63 public function setupTemplateCategories(): void {
64 $this->templateCategories = [
65 'welcome' => new AutomationTemplateCategory('welcome', _x('Welcome', 'automation template category title', 'mailpoet')),
66 'abandoned-cart' => new AutomationTemplateCategory('abandoned-cart', _x('Abandoned Cart', 'automation template category title', 'mailpoet')),
67 'reengagement' => new AutomationTemplateCategory('reengagement', _x('Re-engagement', 'automation template category title', 'mailpoet')),
68 'purchase' => new AutomationTemplateCategory('purchase', _x('Post-purchase', 'automation template category title', 'mailpoet')),
69 'review' => new AutomationTemplateCategory('review', _x('Review', 'automation template category title', 'mailpoet')),
70 'subscriptions' => new AutomationTemplateCategory('subscriptions', _x('Subscriptions', 'automation template category title', 'mailpoet')),
71 'bookings' => new AutomationTemplateCategory('bookings', _x('Bookings', 'automation template category title', 'mailpoet')),
72 'celebrations' => new AutomationTemplateCategory('celebrations', _x('Celebrations', 'automation template category title', 'mailpoet')),
73 ];
74 }
75
76 public function addTemplate(AutomationTemplate $template): void {
77 $category = $template->getCategory();
78 $templateCategories = $this->getTemplateCategories();
79
80 if (!isset($templateCategories[$category])) {
81 throw InvalidStateException::create()->withMessage(
82 sprintf("Category '%s' was not registered", $category)
83 );
84 }
85
86 $this->templates[$template->getSlug()] = $template;
87
88 // keep coming soon templates at the end
89 uasort(
90 $this->templates,
91 function (AutomationTemplate $a, AutomationTemplate $b): int {
92 if ($a->getType() === AutomationTemplate::TYPE_COMING_SOON) {
93 return 1;
94 }
95 if ($b->getType() === AutomationTemplate::TYPE_COMING_SOON) {
96 return -1;
97 }
98 return 0;
99 }
100 );
101 }
102
103 public function getTemplate(string $slug): ?AutomationTemplate {
104 return $this->getTemplates()[$slug] ?? null;
105 }
106
107 /** @return array<string, AutomationTemplate> */
108 public function getTemplates(?string $category = null): array {
109 return $category
110 ? array_filter(
111 $this->templates,
112 function(AutomationTemplate $template) use ($category): bool {
113 return $template->getCategory() === $category;
114 }
115 )
116 : $this->templates;
117 }
118
119 public function removeTemplate(string $slug): void {
120 unset($this->templates[$slug]);
121 }
122
123 /** @return array<string, AutomationTemplateCategory> */
124 public function getTemplateCategories(): array {
125 if (empty($this->templateCategories)) {
126 $this->setupTemplateCategories();
127 }
128 return $this->templateCategories;
129 }
130
131 /** @param Subject<Payload> $subject */
132 public function addSubject(Subject $subject): void {
133 $key = $subject->getKey();
134 if (isset($this->subjects[$key])) {
135 throw new \Exception(); // TODO
136 }
137 $this->subjects[$key] = $subject;
138
139 // reset fields cache
140 $this->fields = null;
141 }
142
143 /** @return Subject<Payload>|null */
144 public function getSubject(string $key): ?Subject {
145 return $this->subjects[$key] ?? null;
146 }
147
148 /** @return array<string, Subject<Payload>> */
149 public function getSubjects(): array {
150 return $this->subjects;
151 }
152
153 public function addSubjectTransformer(SubjectTransformer $transformer): void {
154 $this->subjectTransformers[] = $transformer;
155 }
156
157 public function getSubjectTransformers(): array {
158 return $this->subjectTransformers;
159 }
160
161 public function getField(string $key): ?Field {
162 return $this->getFields()[$key] ?? null;
163 }
164
165 /** @return array<string, Field> */
166 public function getFields(): array {
167 // add fields lazily (on the first call)
168 if ($this->fields === null) {
169 $this->fields = [];
170 foreach ($this->subjects as $subject) {
171 foreach ($subject->getFields() as $field) {
172 $this->addField($field);
173 }
174 }
175 }
176 return $this->fields ?? [];
177 }
178
179 public function addFilter(Filter $filter): void {
180 $fieldType = $filter->getFieldType();
181 if (isset($this->filters[$fieldType])) {
182 throw new \Exception(); // TODO
183 }
184 $this->filters[$fieldType] = $filter;
185 }
186
187 public function getFilter(string $fieldType): ?Filter {
188 return $this->filters[$fieldType] ?? null;
189 }
190
191 /** @return array<string, Filter> */
192 public function getFilters(): array {
193 return $this->filters;
194 }
195
196 public function addStep(Step $step): void {
197 if ($step instanceof Trigger) {
198 $this->addTrigger($step);
199 } elseif ($step instanceof Action) {
200 $this->addAction($step);
201 }
202
203 // TODO: allow adding any other step implementations?
204 }
205
206 public function getStep(string $key): ?Step {
207 return $this->steps[$key] ?? null;
208 }
209
210 /** @return array<string, Step> */
211 public function getSteps(): array {
212 return $this->steps;
213 }
214
215 public function addTrigger(Trigger $trigger): void {
216 $key = $trigger->getKey();
217 if (isset($this->steps[$key]) || isset($this->triggers[$key])) {
218 throw new \Exception(); // TODO
219 }
220 $this->steps[$key] = $trigger;
221 $this->triggers[$key] = $trigger;
222 }
223
224 public function getTrigger(string $key): ?Trigger {
225 return $this->triggers[$key] ?? null;
226 }
227
228 /** @return array<string, Trigger> */
229 public function getTriggers(): array {
230 return $this->triggers;
231 }
232
233 public function addAction(Action $action): void {
234 $key = $action->getKey();
235 if (isset($this->steps[$key]) || isset($this->actions[$key])) {
236 throw new \Exception(); // TODO
237 }
238 $this->steps[$key] = $action;
239 $this->actions[$key] = $action;
240 }
241
242 public function getAction(string $key): ?Action {
243 return $this->actions[$key] ?? null;
244 }
245
246 /** @return array<string, Action> */
247 public function getActions(): array {
248 return $this->actions;
249 }
250
251 public function addContextFactory(string $key, callable $factory): void {
252 $this->contextFactories[$key] = $factory;
253 }
254
255 /** @return callable[] */
256 public function getContextFactories(): array {
257 return $this->contextFactories;
258 }
259
260 public function onBeforeAutomationSave(callable $callback, int $priority = 10): void {
261 $this->wordPress->addAction(Hooks::AUTOMATION_BEFORE_SAVE, $callback, $priority);
262 }
263
264 public function onBeforeAutomationStepSave(callable $callback, ?string $key = null, int $priority = 10): void {
265 $keyPart = $key ? "/key=$key" : '';
266 $this->wordPress->addAction(Hooks::AUTOMATION_STEP_BEFORE_SAVE . $keyPart, $callback, $priority, 2);
267 }
268
269 /**
270 * This is used only internally. Fields are added lazily from subjects.
271 */
272 private function addField(Field $field): void {
273 $key = $field->getKey();
274 if (isset($this->fields[$key])) {
275 throw new \Exception(); // TODO
276 }
277 $this->fields[$key] = $field;
278 }
279 }
280