PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/Classes/FormClass.php +741 -0 10.2.0 → 11.1.0 View file →
@@ -1,0 +1,741 @@
1 +<?php
2 +
3 +namespace AcyMailing\Classes;
4 +
5 +use AcyMailing\Helpers\PaginationHelper;
6 +use AcyMailing\Core\AcymClass;
7 +
8 +class FormClass extends AcymClass
9 +{
10 + const SUB_FORM_TYPE_SHORTCODE = 'shortcode';
11 + const SUB_FORM_TYPE_POPUP = 'popup';
12 + const SUB_FORM_TYPE_HEADER = 'header';
13 + const SUB_FORM_TYPE_FOOTER = 'footer';
14 +
15 + private array $settings = [];
16 +
17 + public function __construct()
18 + {
19 + parent::__construct();
20 +
21 + $this->table = 'form';
22 + $this->pkey = 'id';
23 + }
24 +
25 + private function initSettings()
26 + {
27 + if (!empty($this->settings)) {
28 + return;
29 + }
30 +
31 + $listClass = new ListClass();
32 + $lists = $listClass->getAllForSelect(false);
33 +
34 + $fieldClass = new FieldClass();
35 + $allFields = $fieldClass->getAll();
36 + $fields = [];
37 + foreach ($allFields as $field) {
38 + if ($field->id == 2 || intval($field->active) === 0) {
39 + continue;
40 + }
41 + $fields[$field->id] = acym_translation($field->name);
42 + }
43 +
44 + $this->settings = [
45 + 'options' => [
46 + 'display' => [
47 + 'display_action' => [
48 + 'label' => 'ACYM_DISPLAY_ON_CLICK',
49 + 'description' => 'ACYM_DISPLAY_ON_CLICK_DESC',
50 + 'type' => 'select',
51 + 'options' => [
52 + 'yes' => acym_translation('ACYM_YES'),
53 + 'no' => acym_translation('ACYM_NO'),
54 + ],
55 + 'default' => 'no',
56 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
57 + ],
58 + 'button' => [
59 + 'label' => 'ACYM_BUTTON_ID',
60 + 'description' => 'ACYM_BUTTON_ID_DESC',
61 + 'type' => 'text',
62 + 'default' => '',
63 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
64 + ],
65 + 'delay' => [
66 + 'label' => 'ACYM_DELAY',
67 + 'description' => 'ACYM_DELAY_DESC',
68 + 'type' => 'number',
69 + 'unit' => acym_translation('ACYM_SECONDS'),
70 + 'default' => 0,
71 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
72 + ],
73 + 'scroll' => [
74 + 'label' => 'ACYM_SCROLL',
75 + 'description' => 'ACYM_SCROLL_DESC',
76 + 'type' => 'number',
77 + 'unit' => '%',
78 + 'max' => 100,
79 + 'default' => 0,
80 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
81 + ],
82 + 'popup_position' => [
83 + 'label' => 'ACYM_POPUP_POSITION',
84 + 'type' => 'select',
85 + 'options' => [
86 + 'center' => acym_translation('ACYM_CENTER'),
87 + 'top_left' => acym_translation('ACYM_POSITION_LEFT_TOP'),
88 + 'top_center' => acym_translation('ACYM_POSITION_TOP_CENTER'),
89 + 'top_right' => acym_translation('ACYM_POSITION_RIGHT_TOP'),
90 + 'middle_left' => acym_translation('ACYM_POSITION_LEFT_MIDDLE'),
91 + 'middle_right' => acym_translation('ACYM_POSITION_RIGHT_MIDDLE'),
92 + 'bottom_left' => acym_translation('ACYM_POSITION_LEFT_BOTTOM'),
93 + 'bottom_center' => acym_translation('ACYM_POSITION_BOTTOM_CENTER'),
94 + 'bottom_right' => acym_translation('ACYM_POSITION_RIGHT_BOTTOM'),
95 + ],
96 + 'default' => 'center',
97 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
98 + ],
99 + ],
100 + 'lists' => [
101 + 'automatic_subscribe' => [
102 + 'label' => 'ACYM_AUTO_SUBSCRIBE_TO',
103 + 'description' => 'ACYM_AUTO_SUBSCRIBE_TO_DESC',
104 + 'type' => 'multiselect',
105 + 'options' => $lists,
106 + 'default' => [],
107 + ],
108 + 'displayed' => [
109 + 'label' => 'ACYM_DISPLAYED_LISTS',
110 + 'description' => 'ACYM_DISPLAYED_LISTS_DESC',
111 + 'type' => 'multiselect',
112 + 'options' => $lists,
113 + 'default' => [],
114 + ],
115 + 'checked' => [
116 + 'label' => 'ACYM_LISTS_CHECKED_DEFAULT',
117 + 'description' => 'ACYM_LISTS_CHECKED_DEFAULT_DESC',
118 + 'type' => 'multiselect',
119 + 'options' => $lists,
120 + 'default' => [],
121 + ],
122 + 'display_position' => [
123 + 'label' => 'ACYM_DISPLAY_LISTS',
124 + 'type' => 'select',
125 + 'options' => [
126 + 'after' => acym_translation('ACYM_AFTER_FIELDS'),
127 + 'before' => acym_translation('ACYM_BEFORE_FIELDS'),
128 + ],
129 + 'default' => 'after',
130 + ],
131 + ],
132 + 'fields' => [
133 + 'displayed' => [
134 + 'label' => 'ACYM_FIELDS_TO_DISPLAY',
135 + 'type' => 'multiselect',
136 + 'options' => $fields,
137 + 'default' => [],
138 + ],
139 + 'display_mode' => [
140 + 'label' => 'ACYM_DISPLAY_FIELDS_LABEL',
141 + 'type' => 'select',
142 + 'options' => [
143 + 'inside' => acym_translation('ACYM_TEXT_INSIDE'),
144 + 'outside' => acym_translation('ACYM_TEXT_OUTSIDE'),
145 + ],
146 + 'default' => 'inside',
147 + ],
148 + 'fields_width' => [
149 + 'label' => 'ACYM_FIELDS_WIDTH',
150 + 'description' => 'ACYM_FIELDS_WIDTH_DESC',
151 + 'type' => 'number',
152 + 'unit' => '%',
153 + // Set to 65% by default to fit with the default size of the email field
154 + 'default' => 65,
155 + ],
156 + ],
157 + 'termspolicy' => [
158 + 'terms_type' => [
159 + 'label' => 'ACYM_TERMS_TYPE',
160 + 'type' => 'select',
161 + 'options' => [
162 + 'article' => acym_translation('ACYM_ARTICLE'),
163 + 'url' => acym_translation('ACYM_LINK'),
164 + ],
165 + 'default' => 'article',
166 + ],
167 + 'termscond' => [
168 + 'label' => 'ACYM_TERMS_CONDITIONS',
169 + 'type' => 'article',
170 + 'default' => 0,
171 + 'conditional' => ['terms_type' => 'article'],
172 + ],
173 + 'terms_url' => [
174 + 'label' => 'ACYM_TERMS_CONDITIONS_URL',
175 + 'description' => 'ACYM_TERMS_CONDITIONS_URL_DESC',
176 + 'type' => 'text',
177 + 'default' => '',
178 + 'conditional' => ['terms_type' => 'url'],
179 + ],
180 + 'privacy_type' => [
181 + 'label' => 'ACYM_PRIVACY_TYPE',
182 + 'type' => 'select',
183 + 'options' => [
184 + 'article' => acym_translation('ACYM_ARTICLE'),
185 + 'url' => acym_translation('ACYM_LINK'),
186 + ],
187 + 'default' => 'article',
188 + ],
189 + 'privacy' => [
190 + 'label' => 'ACYM_PRIVACY_POLICY',
191 + 'type' => 'article',
192 + 'default' => 0,
193 + 'conditional' => ['privacy_type' => 'article'],
194 + ],
195 + 'privacy_url' => [
196 + 'label' => 'ACYM_PRIVACY_POLICY_URL',
197 + 'description' => 'ACYM_PRIVACY_POLICY_URL_DESC',
198 + 'type' => 'text',
199 + 'default' => '',
200 + 'conditional' => ['privacy_type' => 'url'],
201 + ],
202 + 'tracking_consent' => [
203 + 'label' => 'ACYM_DISPLAY_TRACKING_CONSENT',
204 + 'description' => 'ACYM_DISPLAY_TRACKING_CONSENT_DESC',
205 + 'type' => 'select',
206 + 'options' => [
207 + 'no' => acym_translation('ACYM_NO'),
208 + 'yes' => acym_translation('ACYM_YES'),
209 + ],
210 + 'default' => 'no',
211 + ],
212 + ],
213 + 'message' => [
214 + 'text' => [
215 + 'label' => 'ACYM_CUSTOM_MESSAGE_DISPLAY',
216 + 'type' => 'textarea',
217 + 'default' => '',
218 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
219 + ],
220 + 'position' => [
221 + 'label' => 'ACYM_MESSAGE_POSITION',
222 + 'type' => 'select',
223 + 'options' => [
224 + 'before-image' => acym_translation('ACYM_BEFORE_IMAGE'),
225 + 'before-fields' => acym_translation('ACYM_BEFORE_FIELDS'),
226 + 'before-lists' => acym_translation('ACYM_BEFORE_LISTS'),
227 + 'before-button' => acym_translation('ACYM_BEFORE_BUTTON'),
228 + ],
229 + 'default' => 'before-fields',
230 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
231 + ],
232 + 'color' => [
233 + 'label' => 'ACYM_COLOR',
234 + 'type' => 'color',
235 + 'default' => '#000000',
236 + ],
237 + ],
238 + 'cookie' => [
239 + 'cookie_expiration' => [
240 + 'label' => 'ACYM_COOKIE_EXPIRATION',
241 + 'type' => 'number',
242 + 'min' => 1,
243 + 'unit' => acym_translation('ACYM_DAYS'),
244 + 'default' => 1,
245 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP, self::SUB_FORM_TYPE_HEADER, self::SUB_FORM_TYPE_FOOTER],
246 + ],
247 + ],
248 + 'redirection' => [
249 + 'after_subscription' => [
250 + 'label' => 'ACYM_AFTER_SUBSCRIPTION',
251 + 'description' => 'ACYM_REDIRECT_LINK_DESC',
252 + 'type' => 'text',
253 + 'default' => '',
254 + ],
255 + 'confirmation_message' => [
256 + 'label' => 'ACYM_CONFIRMATION_MESSAGE',
257 + 'description' => 'ACYM_CONFIRMATION_MESSAGE_DESC',
258 + 'type' => 'text',
259 + 'default' => '',
260 + ],
261 + ],
262 + 'miscellaneous' => [
263 + 'js_loading' => [
264 + 'label' => 'ACYM_JS_LOADING',
265 + 'description' => 'ACYM_MODULE_JS_DESC',
266 + 'type' => 'select',
267 + 'options' => [
268 + 'form' => acym_translation('ACYM_IN_FORM'),
269 + 'head' => acym_translation('ACYM_WP_ENQUEUE_SCRIPT'),
270 + ],
271 + 'default' => 'form',
272 + 'allowed_types' => [self::SUB_FORM_TYPE_SHORTCODE],
273 + ],
274 + ],
275 + ],
276 + 'styles' => [
277 + 'image' => [
278 + 'url' => [
279 + 'label' => 'ACYM_CHOOSE_IMAGE',
280 + 'type' => 'media',
281 + 'default' => '',
282 + ],
283 + 'size' => [
284 + 'label' => 'ACYM_SIZE',
285 + 'type' => 'dimensions',
286 + 'default' => ['width' => 100, 'height' => 100],
287 + ],
288 + ],
289 + 'button' => [
290 + 'background_color' => [
291 + 'label' => 'ACYM_BACKGROUND_COLOR',
292 + 'type' => 'color',
293 + 'default' => '#000000',
294 + ],
295 + 'text_color' => [
296 + 'label' => 'ACYM_TEXT_COLOR',
297 + 'type' => 'color',
298 + 'default' => '#ffffff',
299 + ],
300 + 'border_color' => [
301 + 'label' => 'ACYM_BORDER_COLOR',
302 + 'type' => 'color',
303 + 'default' => '#000000',
304 + ],
305 + 'border_type' => [
306 + 'label' => 'ACYM_BORDER_TYPE',
307 + 'type' => 'select',
308 + 'options' => [
309 + 'solid' => acym_translation('ACYM_SOLID'),
310 + 'dotted' => acym_translation('ACYM_DOTTED'),
311 + 'dashed' => acym_translation('ACYM_DASHED'),
312 + 'double' => acym_translation('ACYM_DOUBLE'),
313 + 'groove' => acym_translation('ACYM_GROOVE'),
314 + 'ridge' => acym_translation('ACYM_RIDGE'),
315 + 'inset' => acym_translation('ACYM_INSET'),
316 + 'outset' => acym_translation('ACYM_OUTSET'),
317 + ],
318 + 'default' => 'solid',
319 + ],
320 + 'border_size' => [
321 + 'label' => 'ACYM_BORDER_SIZE',
322 + 'type' => 'number',
323 + 'default' => 0,
324 + ],
325 + 'border_radius' => [
326 + 'label' => 'ACYM_RADIUS',
327 + 'type' => 'number',
328 + 'default' => 0,
329 + ],
330 + 'size' => [
331 + 'label' => 'ACYM_SIZE',
332 + 'type' => 'dimensions',
333 + 'default' => ['width' => 20, 'height' => 10],
334 + ],
335 + 'text' => [
336 + 'label' => 'ACYM_SUBSCRIBE_TEXT',
337 + 'type' => 'text',
338 + 'placeholder' => acym_translation('ACYM_SUBSCRIBE'),
339 + 'default' => '',
340 + ],
341 + ],
342 + 'style' => [
343 + 'position' => [
344 + 'label' => 'ACYM_DISPLAY_FIELDS_LABEL',
345 + 'type' => 'position',
346 + 'default' => 'image-top',
347 + 'allowed_types' => [self::SUB_FORM_TYPE_HEADER, self::SUB_FORM_TYPE_POPUP, self::SUB_FORM_TYPE_FOOTER],
348 + ],
349 + 'background_color' => [
350 + 'label' => 'ACYM_BACKGROUND_COLOR',
351 + 'type' => 'color',
352 + 'default' => '#ffffff',
353 + ],
354 + 'background_image' => [
355 + 'label' => 'ACYM_BACKGROUND_IMAGE',
356 + 'type' => 'media',
357 + 'default' => '',
358 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
359 + ],
360 + 'background_position' => [
361 + 'label' => 'ACYM_POSITION',
362 + 'type' => 'select',
363 + 'options' => [
364 + 'center' => acym_translation('ACYM_CENTER'),
365 + 'top' => acym_translation('ACYM_POSITION_TOP'),
366 + 'right' => acym_translation('ACYM_RIGHT'),
367 + 'right_bottom' => acym_translation('ACYM_POSITION_RIGHT_BOTTOM'),
368 + 'right_top' => acym_translation('ACYM_POSITION_RIGHT_TOP'),
369 + 'bottom' => acym_translation('ACYM_POSITION_BOTTOM'),
370 + 'left' => acym_translation('ACYM_LEFT'),
371 + 'left_top' => acym_translation('ACYM_POSITION_LEFT_TOP'),
372 + 'left_bottom' => acym_translation('ACYM_POSITION_LEFT_BOTTOM'),
373 + ],
374 + 'default' => 'center',
375 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
376 + ],
377 + 'background_size' => [
378 + 'label' => 'ACYM_BACKGROUND_SIZE',
379 + 'type' => 'select',
380 + 'options' => [
381 + 'contain' => acym_translation('ACYM_BG_CONTAIN'),
382 + 'cover' => acym_translation('ACYM_BG_COVER'),
383 + ],
384 + 'default' => 'contain',
385 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
386 + ],
387 + 'background_repeat' => [
388 + 'label' => 'ACYM_BACKGROUND_REPEAT',
389 + 'type' => 'select',
390 + 'options' => [
391 + 'repeat' => acym_translation('ACYM_YES'),
392 + 'no-repeat' => acym_translation('ACYM_NO'),
393 + ],
394 + 'default' => 'no-repeat',
395 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
396 + ],
397 + 'border_radius' => [
398 + 'label' => 'ACYM_RADIUS',
399 + 'type' => 'number',
400 + 'unit' => 'px',
401 + 'default' => 0,
402 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
403 + ],
404 + 'shadow_color' => [
405 + 'label' => 'ACYM_SHADOW_COLOR',
406 + 'type' => 'color',
407 + 'default' => '#000000',
408 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
409 + ],
410 + 'shadow_blur' => [
411 + 'label' => 'ACYM_SHADOW_BLUR',
412 + 'type' => 'number',
413 + 'unit' => 'px',
414 + 'default' => 0,
415 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
416 + ],
417 + 'shadow_x' => [
418 + 'label' => 'ACYM_SHADOW_OFFSET_X',
419 + 'type' => 'number',
420 + 'unit' => 'px',
421 + 'default' => 0,
422 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
423 + ],
424 + 'shadow_y' => [
425 + 'label' => 'ACYM_SHADOW_OFFSET_Y',
426 + 'type' => 'number',
427 + 'unit' => 'px',
428 + 'default' => 0,
429 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
430 + ],
431 + 'text_color' => [
432 + 'label' => 'ACYM_TEXT_COLOR',
433 + 'type' => 'color',
434 + 'default' => '#000000',
435 + ],
436 + 'padding' => [
437 + 'label' => 'ACYM_PADDING',
438 + 'type' => 'dimensions',
439 + 'default' => ['width' => 20, 'height' => 20],
440 + 'allowed_types' => [self::SUB_FORM_TYPE_POPUP],
441 + ],
442 + 'size' => [
443 + 'label' => 'ACYM_SIZE',
444 + 'type' => 'dimensions',
445 + 'units' => [
446 + self::SUB_FORM_TYPE_HEADER => ['width' => '%', 'height' => 'px'],
447 + self::SUB_FORM_TYPE_FOOTER => ['width' => '%', 'height' => 'px'],
448 + ],
449 + 'default' => ['width' => 400, 'height' => 300],
450 + 'allowed_types' => [self::SUB_FORM_TYPE_HEADER, self::SUB_FORM_TYPE_SHORTCODE, self::SUB_FORM_TYPE_FOOTER],
451 + ],
452 + ],
453 + ],
454 + ];
455 +
456 + if (!acym_isMultilingual()) {
457 + return;
458 + }
459 +
460 + $languageTexts = [];
461 + foreach (acym_getMultilingualLanguages() as $key => $languages) {
462 + $languageTexts[$key] = '';
463 + }
464 + unset($this->settings['options']['redirection']['confirmation_message']);
465 + $this->settings['options']['redirection']['langConfirm'] = [
466 + 'label' => 'ACYM_CONFIRMATION_MESSAGE',
467 + 'description' => 'ACYM_CONFIRMATION_MESSAGE_DESC',
468 + 'type' => 'language',
469 + 'default' => $languageTexts,
470 + ];
471 +
472 + unset($this->settings['styles']['button']['text']);
473 + $this->settings['styles']['button']['lang'] = [
474 + 'label' => 'ACYM_SUBSCRIBE_TEXT',
475 + 'type' => 'language',
476 + 'default' => $languageTexts,
477 + ];
478 + }
479 +
480 + private function getSectionTranslations(): array
481 + {
482 + return [
483 + 'display' => 'ACYM_DISPLAY',
484 + 'lists' => 'ACYM_LISTS',
485 + 'fields' => 'ACYM_FIELDS',
486 + 'termspolicy' => 'ACYM_ARTICLE',
487 + 'cookie' => 'ACYM_COOKIE_SETTINGS',
488 + 'redirection' => 'ACYM_REDIRECTIONS',
489 + 'miscellaneous' => 'ACYM_MISCELLANEOUS',
490 + 'message' => 'ACYM_MESSAGE',
491 + 'image' => 'ACYM_IMAGE',
492 + 'button' => 'ACYM_BUTTON',
493 + 'style' => 'ACYM_STYLE',
494 + 'links' => 'ACYM_LINKS',
495 + ];
496 + }
497 +
498 + public function getMatchingElements(array $settings = []): array
499 + {
500 + $query = 'SELECT form.* FROM #__acym_form AS form';
501 + $queryCount = 'SELECT COUNT(form.id) AS total, SUM(active) AS totalActive FROM #__acym_form AS form';
502 +
503 + if (!empty($settings['search'])) {
504 + $filters[] = 'name LIKE '.acym_escapeDB('%'.$settings['search'].'%');
505 + }
506 +
507 + if (!empty($filters)) {
508 + $query .= ' WHERE ('.implode(') AND (', $filters).')';
509 + $queryCount .= ' WHERE ('.implode(') AND (', $filters).')';
510 + }
511 +
512 + if (!empty($settings['status'])) {
513 + $query .= empty($filters) ? ' WHERE ' : ' AND ';
514 + $query .= 'active = '.($settings['status'] == 'active' ? '1' : '0');
515 + }
516 +
517 + if (!empty($settings['ordering']) && !empty($settings['ordering_sort_order'])) {
518 + $query .= ' ORDER BY '.acym_secureDBColumn($settings['ordering']).' '.acym_secureDBColumn(strtoupper($settings['ordering_sort_order']));
519 + } else {
520 + $query .= ' ORDER BY id asc';
521 + }
522 +
523 + if (empty($settings['offset']) || $settings['offset'] < 0) {
524 + $settings['offset'] = 0;
525 + }
526 +
527 + if (empty($settings['elementsPerPage']) || $settings['elementsPerPage'] < 1) {
528 + $pagination = new PaginationHelper();
529 + $settings['elementsPerPage'] = $pagination->getListLimit();
530 + }
531 +
532 + return [
533 + 'elements' => acym_loadObjectList($query, '', $settings['offset'], $settings['elementsPerPage']),
534 + 'total' => acym_loadObject($queryCount),
535 + ];
536 + }
537 +
538 + public function getTranslatedTypes(): array
539 + {
540 + return [
541 + self::SUB_FORM_TYPE_FOOTER => acym_translation('ACYM_FOOTER'),
542 + self::SUB_FORM_TYPE_HEADER => acym_translation('ACYM_HEADER'),
543 + self::SUB_FORM_TYPE_POPUP => acym_translation('ACYM_POPUP'),
544 + self::SUB_FORM_TYPE_SHORTCODE => acym_translation('ACYM_SHORTCODE'),
545 + ];
546 + }
547 +
548 + public function getOneById(int $id): ?object
549 + {
550 + $form = parent::getOneById($id);
551 +
552 + if (empty($form)) {
553 + return null;
554 + }
555 +
556 + $form->pages = json_decode($form->pages, true);
557 + $form->settings = json_decode($form->settings, true);
558 + $form->display_languages = json_decode($form->display_languages, true);
559 +
560 + return $form;
561 + }
562 +
563 + public function getAllFormsToDisplay(): array
564 + {
565 + $forms = acym_loadObjectList('SELECT * FROM #__acym_form WHERE active = 1 AND type != '.acym_escapeDB(self::SUB_FORM_TYPE_SHORTCODE));
566 + foreach ($forms as $form) {
567 + $form->pages = json_decode($form->pages, true);
568 + $form->settings = json_decode($form->settings, true);
569 + $form->display_languages = json_decode($form->display_languages, true);
570 + }
571 +
572 + return $forms;
573 + }
574 +
575 + public function initEmptyForm(string $type): object
576 + {
577 + $this->initSettings();
578 +
579 + $newForm = new \stdClass();
580 + $newForm->id = 0;
581 + $newForm->name = '';
582 + $newForm->creation_date = acym_date('now', 'Y-m-d H:i:s');
583 + $newForm->active = 1;
584 + $newForm->type = $type;
585 + $newForm->pages = ['all'];
586 + $newForm->display_languages = ['all'];
587 +
588 + $newForm->settings = [];
589 + foreach ($this->settings['options'] as $category => $options) {
590 + foreach ($options as $name => $oneOption) {
591 + $newForm->settings[$category][$name] = $oneOption['default'];
592 + }
593 + }
594 + foreach ($this->settings['styles'] as $category => $options) {
595 + foreach ($options as $name => $oneOption) {
596 + $newForm->settings[$category][$name] = $oneOption['default'];
597 + }
598 + }
599 +
600 + if ($type === self::SUB_FORM_TYPE_HEADER) {
601 + $newForm->settings['style']['position'] = 'button-left';
602 + $newForm->settings['style']['size'] = ['height' => '', 'width' => ''];
603 + } elseif ($type === self::SUB_FORM_TYPE_FOOTER) {
604 + $newForm->settings['style']['position'] = 'button-left';
605 + $newForm->settings['style']['size'] = ['width' => '100%', 'height' => '50'];
606 + }
607 +
608 + return $newForm;
609 + }
610 +
611 + public function getFormWithMissingParams(array $formArray): object
612 + {
613 + $form = new \stdClass();
614 + $formEmpty = $this->initEmptyForm($formArray['type']);
615 +
616 + if (!empty($formArray['id'])) {
617 + $form->id = $formArray['id'];
618 + }
619 +
620 + foreach ($formEmpty as $key => $value) {
621 + if ($key === 'settings') {
622 + continue;
623 + }
624 +
625 + if (isset($formArray[$key])) {
626 + $form->$key = $formArray[$key];
627 + } else {
628 + $form->$key = $value;
629 + }
630 + }
631 +
632 + $form->settings = $formEmpty->settings;
633 + foreach ($formArray['settings'] as $category => $options) {
634 + foreach ($options as $optionName => $value) {
635 + $form->settings[$category][$optionName] = $value;
636 + }
637 + }
638 +
639 + return $form;
640 + }
641 +
642 + public function prepareMenuHtml(object $form, string $type): void
643 + {
644 + $this->initSettings();
645 +
646 + $sections = $this->getSectionTranslations();
647 + foreach ($this->settings[$type] as $category => $options) {
648 + $hasOptions = false;
649 +
650 + foreach ($options as $key => $option) {
651 + if (!empty($option['allowed_types']) && !in_array($form->type, $option['allowed_types'])) {
652 + continue;
653 + }
654 +
655 + if (!$hasOptions) {
656 + $hasOptions = true;
657 + echo '<h3 class="cell acym__forms__menu__title acym__title acym__title__tertiary">'.esc_html(acym_translation($sections[$category])).'</h3>';
658 + }
659 +
660 + $id = 'form_'.$category.'_'.$key;
661 + $name = 'form[settings]['.$category.']['.$key.']';
662 + $vModel = 'form.settings.'.$category.'.'.$key;
663 + $value = $form->settings[$category][$key] ?? $option['default'];
664 +
665 + echo '<div class="cell grid-x acym__forms__menu__options grid-margin-x acym_vcenter">';
666 +
667 + echo '<label class="cell" for="'.esc_attr($id).'">'.esc_html(acym_translation($option['label']));
668 + if (!empty($option['description'])) {
669 + acym_info(['textShownInTooltip' => $option['description']]);
670 + }
671 + echo '</label>';
672 +
673 + include acym_getPartial('fields', $option['type']);
674 + echo '</div>';
675 + }
676 + }
677 + }
678 +
679 + public function renderForm(object $form, bool $edition = false, bool $isShortcode = false): string
680 + {
681 + if (!empty($form->display_languages) && !in_array('all', $form->display_languages) && !$edition) {
682 + if (!in_array(acym_getLanguageTag(), $form->display_languages)) {
683 + return '';
684 + }
685 + }
686 + $loadJsInModule = $isShortcode;
687 + if ($isShortcode && isset($form->settings['miscellaneous']['js_loading']) && $form->settings['miscellaneous']['js_loading'] === 'head') {
688 + $loadJsInModule = false;
689 + }
690 + acym_initModule(null, ['loadJsInModule' => $loadJsInModule]);
691 + $fieldClass = new FieldClass();
692 + $listClass = new ListClass();
693 +
694 + $form = $this->getFormWithMissingParams(get_object_vars($form));
695 +
696 + $form->settings['fields']['displayed'][] = 2;
697 + $form->settings['fields']['displayed'] = $fieldClass->getFieldsByID($form->settings['fields']['displayed']);
698 + foreach ($form->settings['fields']['displayed'] as $key => $field) {
699 + $field->option = json_decode($field->option ?? '');
700 + $fieldDB = empty($field->option->fieldDB) ? '' : json_decode($field->option->fieldDB);
701 + $field->value = empty($field->value) ? '' : json_decode($field->value);
702 + $valuesArray = [];
703 +
704 + if (!empty($field->value)) {
705 + foreach ($field->value as $value) {
706 + $valueTmp = new \stdClass();
707 + $valueTmp->text = $value->title;
708 + $valueTmp->value = $value->value;
709 + if ($value->disabled == 'y') {
710 + $valueTmp->disable = true;
711 + }
712 + $valuesArray[$value->value] = $valueTmp;
713 + }
714 + }
715 +
716 + if (!empty($fieldDB) && !empty($fieldDB->value)) {
717 + $fromDB = $fieldClass->getValueFromDB($fieldDB);
718 + foreach ($fromDB as $value) {
719 + $valuesArray[$value->value] = $value->title;
720 + }
721 + }
722 +
723 + $form->settings['fields']['displayed'][$key]->valuesArray = $valuesArray;
724 + }
725 + $form->fieldClass = $fieldClass;
726 + $form->lists = $listClass->getAllForSelect(false, 0, true, true);
727 + $form->form_tag_name = 'formAcym'.$form->id;
728 + $form->form_tag_action = htmlspecialchars_decode(ACYM_CMS == 'wordpress' ? acym_frontendLink('frontusers') : acym_completeLink('frontusers', true, true));
729 + $form->formClass = $this;
730 +
731 + $formFieldRender = acym_getPartial('forms', $form->type);
732 + if (!file_exists($formFieldRender)) return '';
733 +
734 + acym_initModule(null, ['loadJsInModule' => $loadJsInModule]);
735 +
736 + ob_start();
737 + include $formFieldRender;
738 +
739 + return ob_get_clean();
740 + }
741 +}