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 / API / JSON / v1 / Forms.php
mailpoet / lib / API / JSON / v1 Last commit date
Analytics.php 3 years ago AutomatedLatestContent.php 2 months ago AutomaticEmails.php 3 years ago Captcha.php 1 year ago Coupons.php 2 years ago CustomFields.php 2 months ago DynamicProducts.php 1 year ago DynamicSegments.php 2 months ago FeatureFlags.php 3 years ago Forms.php 2 months ago Help.php 1 year ago ImportExport.php 2 months ago Mailer.php 1 year ago NewsletterLinks.php 2 months ago NewsletterTemplates.php 2 months ago Newsletters.php 2 months ago Premium.php 10 months ago RedirectResponse.php 1 year ago Segments.php 2 months ago SendingQueue.php 2 months ago Services.php 6 months ago Settings.php 2 months ago Setup.php 1 year ago StatisticsExport.php 3 months ago SubscriberStats.php 1 month ago Subscribers.php 2 months ago Tags.php 3 years ago UserFlags.php 2 years ago WoocommerceProductVariations.php 2 months ago WoocommerceSettings.php 3 years ago index.php 3 years ago
Forms.php
315 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\API\JSON\v1;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use Exception;
9 use MailPoet\API\JSON\Endpoint as APIEndpoint;
10 use MailPoet\API\JSON\Error;
11 use MailPoet\API\JSON\Error as APIError;
12 use MailPoet\API\JSON\Response;
13 use MailPoet\API\JSON\ResponseBuilders\FormsResponseBuilder;
14 use MailPoet\Config\AccessControl;
15 use MailPoet\Entities\FormEntity;
16 use MailPoet\Form\ApiDataSanitizer;
17 use MailPoet\Form\DisplayFormInWPContent;
18 use MailPoet\Form\FormSaveController;
19 use MailPoet\Form\FormsRepository;
20 use MailPoet\Form\PreviewPage;
21 use MailPoet\Form\Templates\TemplateRepository;
22 use MailPoet\Settings\UserFlagsController;
23 use MailPoet\Tags\TagRepository;
24 use MailPoet\WP\Emoji;
25 use MailPoet\WP\Functions as WPFunctions;
26
27 class Forms extends APIEndpoint {
28 public $permissions = [
29 'global' => AccessControl::PERMISSION_MANAGE_FORMS,
30 ];
31
32 /** @var UserFlagsController */
33 private $userFlags;
34
35 /** @var FormsResponseBuilder */
36 private $formsResponseBuilder;
37
38 /** @var WPFunctions */
39 private $wp;
40
41 /** @var FormsRepository */
42 private $formsRepository;
43
44 /** @var TemplateRepository */
45 private $templateRepository;
46
47 /** @var Emoji */
48 private $emoji;
49
50 /** @var ApiDataSanitizer */
51 private $dataSanitizer;
52
53 /** @var TagRepository */
54 private $tagRepository;
55
56 /** @var FormSaveController */
57 private $formSaveController;
58
59 public function __construct(
60 UserFlagsController $userFlags,
61 FormsRepository $formsRepository,
62 TemplateRepository $templateRepository,
63 FormsResponseBuilder $formsResponseBuilder,
64 WPFunctions $wp,
65 Emoji $emoji,
66 ApiDataSanitizer $dataSanitizer,
67 TagRepository $tagRepository,
68 FormSaveController $formSaveController
69 ) {
70 $this->userFlags = $userFlags;
71 $this->wp = $wp;
72 $this->formsRepository = $formsRepository;
73 $this->templateRepository = $templateRepository;
74 $this->formsResponseBuilder = $formsResponseBuilder;
75 $this->emoji = $emoji;
76 $this->dataSanitizer = $dataSanitizer;
77 $this->tagRepository = $tagRepository;
78 $this->formSaveController = $formSaveController;
79 }
80
81 public function get($data = []) {
82 $id = (isset($data['id']) ? (int)$data['id'] : false);
83 $form = $this->formsRepository->findOneById($id);
84 if ($form instanceof FormEntity) {
85 return $this->successResponse($this->formsResponseBuilder->build($form));
86 }
87 return $this->errorResponse([
88 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
89 ]);
90 }
91
92 public function setStatus($data = []) {
93 $status = (isset($data['status']) ? $data['status'] : null);
94
95 if (!$status) {
96 return $this->badRequest([
97 APIError::BAD_REQUEST => __('You need to specify a status.', 'mailpoet'),
98 ]);
99 }
100
101 $id = (isset($data['id'])) ? (int)$data['id'] : false;
102 $form = $this->formsRepository->findOneById($id);
103
104 if (!$form instanceof FormEntity) {
105 return $this->errorResponse([
106 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
107 ]);
108 }
109
110 if (!in_array($status, [FormEntity::STATUS_ENABLED, FormEntity::STATUS_DISABLED])) {
111 return $this->badRequest([
112 APIError::BAD_REQUEST =>
113 sprintf(
114 // translators: %1$s is a comma-separated list of allowed values, %2$s the status the user specified.
115 __('Invalid status. Allowed values are (%1$s), you specified %2$s', 'mailpoet'),
116 join(', ', [FormEntity::STATUS_ENABLED, FormEntity::STATUS_DISABLED]),
117 $status
118 ),
119 ]);
120 }
121
122 $form->setStatus($status);
123 $this->formsRepository->flush();
124
125 if ($status === FormEntity::STATUS_ENABLED) {
126 $this->wp->deleteTransient(DisplayFormInWPContent::NO_FORM_TRANSIENT_KEY);
127 }
128
129 $form = $this->formsRepository->findOneById($id);
130 if (!$form instanceof FormEntity) return $this->errorResponse();
131 return $this->successResponse(
132 $form->toArray()
133 );
134 }
135
136 public function previewEditor($data = []) {
137 // We want to allow preview for unsaved forms
138 $formId = $data['id'] ?? 0;
139 $this->wp->setTransient(PreviewPage::PREVIEW_DATA_TRANSIENT_PREFIX . $formId, $data, PreviewPage::PREVIEW_DATA_EXPIRATION);
140 return $this->successResponse();
141 }
142
143 public function saveEditor($data = []) {
144 $formId = (isset($data['id']) ? (int)$data['id'] : 0);
145 $initialForm = $this->getFormTemplateData(TemplateRepository::INITIAL_FORM_TEMPLATE);
146 $name = ($data['name'] ?? __('New form', 'mailpoet'));
147 $body = ($data['body'] ?? $initialForm['body']);
148 $body = $this->dataSanitizer->sanitizeBody($body);
149 $settings = ($data['settings'] ?? $initialForm['settings']);
150 $styles = ($data['styles'] ?? $initialForm['styles']);
151 $status = ($data['status'] ?? FormEntity::STATUS_ENABLED);
152
153 // check if the form is used as a widget
154 $isWidget = false;
155 $widgets = $this->wp->getOption('widget_mailpoet_form');
156 if (!empty($widgets)) {
157 foreach ($widgets as $widget) {
158 if (isset($widget['form']) && (int)$widget['form'] === $formId) {
159 $isWidget = true;
160 break;
161 }
162 }
163 }
164
165 // Reset no form cache
166 $this->wp->deleteTransient(DisplayFormInWPContent::NO_FORM_TRANSIENT_KEY);
167
168 // check if the user gets to pick his own lists
169 // or if it's selected by the admin
170 $formEntity = new FormEntity($name);
171 $formEntity->setBody($body);
172 $listSelection = $formEntity->getSegmentBlocksSegmentIds();
173
174 // check list selection
175 if (count($listSelection)) {
176 $settings['segments_selected_by'] = 'user';
177 $settings['segments'] = $listSelection;
178 } else {
179 $settings['segments_selected_by'] = 'admin';
180 }
181
182 // check tags and create them if they don't exist
183 if (isset($settings['tags'])) {
184 $this->createTagsIfDoNotExist($settings['tags']);
185 }
186
187 // Check Custom HTML block permissions
188 $customHtmlBlocks = $formEntity->getBlocksByTypes([FormEntity::HTML_BLOCK_TYPE]);
189 if (count($customHtmlBlocks) && !$this->wp->currentUserCan('administrator')) {
190 return $this->errorResponse([
191 Error::FORBIDDEN => __('Only administrator can edit forms containing Custom HTML block.', 'mailpoet'),
192 ], [], Response::STATUS_FORBIDDEN);
193 }
194
195 if ($body !== null) {
196 $body = $this->emoji->sanitizeEmojisInFormBody($body);
197 }
198
199 $form = $this->getForm($data);
200
201 if (!$form instanceof FormEntity) {
202 $form = new FormEntity($name);
203 }
204 $form->setName($name);
205 $form->setBody($body);
206 $form->setSettings($settings);
207 $form->setStyles($styles);
208 $form->setStatus($status);
209 $this->formsRepository->persist($form);
210
211 try {
212 $this->formsRepository->flush();
213 } catch (\Exception $e) {
214 return $this->badRequest();
215 }
216
217 if (isset($data['editor_version']) && $data['editor_version'] === "2") {
218 $this->userFlags->set('display_new_form_editor_nps_survey', true);
219 }
220
221 $form = $this->getForm(['id' => $form->getId()]);
222 if(!$form instanceof FormEntity) return $this->errorResponse();
223 return $this->successResponse(
224 $this->formsResponseBuilder->build($form),
225 ['is_widget' => $isWidget]
226 );
227 }
228
229 public function restore($data = []) {
230 $form = $this->getForm($data);
231
232 if ($form instanceof FormEntity) {
233 $this->formsRepository->restore($form);
234 return $this->successResponse(
235 $form->toArray(),
236 ['count' => 1]
237 );
238 } else {
239 return $this->errorResponse([
240 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
241 ]);
242 }
243 }
244
245 public function trash($data = []) {
246 $form = $this->getForm($data);
247
248 if ($form instanceof FormEntity) {
249 $this->formsRepository->trash($form);
250 return $this->successResponse(
251 $form->toArray(),
252 ['count' => 1]
253 );
254 } else {
255 return $this->errorResponse([
256 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
257 ]);
258 }
259 }
260
261 public function delete($data = []) {
262 $form = $this->getForm($data);
263
264 if ($form instanceof FormEntity) {
265 $this->formsRepository->delete($form);
266
267 return $this->successResponse(null, ['count' => 1]);
268 } else {
269 return $this->errorResponse([
270 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
271 ]);
272 }
273 }
274
275 public function duplicate($data = []) {
276 $form = $this->getForm($data);
277
278 if ($form instanceof FormEntity) {
279 try {
280 $duplicate = $this->formSaveController->duplicate($form);
281 } catch (Exception $e) {
282 return $this->errorResponse([
283 APIError::UNKNOWN => __('Duplicating form failed.', 'mailpoet'),
284 ], [], Response::STATUS_UNKNOWN);
285 }
286 return $this->successResponse(
287 $this->formsResponseBuilder->build($duplicate),
288 ['count' => 1]
289 );
290 } else {
291 return $this->errorResponse([
292 APIError::NOT_FOUND => __('This form does not exist.', 'mailpoet'),
293 ]);
294 }
295 }
296
297 private function getForm(array $data): ?FormEntity {
298 return isset($data['id'])
299 ? $this->formsRepository->findOneById((int)$data['id'])
300 : null;
301 }
302
303 private function getFormTemplateData(string $templateId): array {
304 $formTemplate = $this->templateRepository->getFormTemplate($templateId);
305 $form = $formTemplate->toFormEntity();
306 return $form->toArray();
307 }
308
309 private function createTagsIfDoNotExist(array $tagNames): void {
310 foreach ($tagNames as $tagName) {
311 $this->tagRepository->createOrUpdate(['name' => $tagName]);
312 }
313 }
314 }
315