PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.2.2
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.2.2
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
acymailing / front / FrontControllers / FrontusersController.php

FrontusersController.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.2.2, at front/FrontControllers/FrontusersController.php

878 lines 30.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\FrontControllers;
4
5 use AcyMailing\Classes\FieldClass;
6 use AcyMailing\Classes\ListClass;
7 use AcyMailing\Classes\MailClass;
8 use AcyMailing\Classes\UserClass;
9 use AcyMailing\Controllers\UsersController;
10 use AcyMailing\Helpers\CaptchaHelper;
11 use AcyMailing\Helpers\EntitySelectHelper;
12 use AcyMailing\Helpers\ToolbarHelper;
13 use AcyMailing\Helpers\UserHelper;
14 use AcyMailing\Core\AcymParameter;
15
16 class FrontusersController extends UsersController
17 {
18 public function __construct()
19 {
20 parent::__construct();
21
22 if (ACYM_CMS == 'joomla') {
23 $menu = acym_getMenu();
24 if (is_object($menu)) {
25 $params = method_exists($menu, 'getParams') ? $menu->getParams() : $menu->params;
26 $menuParams = new AcymParameter($params);
27 $this->menuClass = $menuParams->get('pageclass_sfx', '');
28 }
29 }
30
31 $this->publicFrontTasks = [
32 'subscribe',
33 'unsubscribe',
34 'unsubscribeAll',
35 'saveSubscriptions',
36 'unsubscribePage',
37 'confirm',
38 'profile',
39 'savechanges',
40 'exportdata',
41 'ajaxGetEnqueuedMessages',
42 'gdprDelete',
43 ];
44
45 }
46
47
48 private function displayMessage(string $message, bool $ajax, string $type = 'error'): void
49 {
50 if ($ajax) {
51 echo '{"message":"'.acym_translation($message, true).'","type":"'.$type.'","code":"1"}';
52 } else {
53 acym_header('Content-type:text/html; charset=utf-8');
54 echo '<script>alert("'.acym_translation($message, true).'"); window.history.go(-1);</script>';
55 }
56 exit;
57 }
58
59 public function subscribe(): void
60 {
61 acym_checkRobots();
62
63 if (!acym_getVar('string', 'acy_source') && !empty($_GET['user'])) {
64 acym_setVar('acy_source', 'url');
65 }
66
67 $ajax = acym_getVar('int', 'ajax', 0);
68 if ($ajax) {
69 @ob_end_clean();
70 acym_header('Content-type:text/html; charset=utf-8');
71 }
72
73 $currentUserid = acym_currentUserId();
74 if ((int)$this->config->get('allow_visitor', 1) != 1 && empty($currentUserid)) {
75 if ($ajax) {
76 echo '{"message":"'.acym_translation('ACYM_ONLY_LOGGED', true).'","type":"error","code":"0"}';
77 exit;
78 } else {
79 acym_askLog(false, 'ACYM_ONLY_LOGGED');
80
81 return;
82 }
83 }
84
85 if (empty($currentUserid) && $this->config->get('captcha', 'none') !== 'none' && acym_level(ACYM_ESSENTIAL)) {
86 $captchaHelper = new CaptchaHelper();
87 if (!$captchaHelper->check()) {
88 $this->displayMessage('ACYM_WRONG_CAPTCHA', $ajax);
89 }
90 }
91
92 $formData = acym_getVar('array', 'user', [], '');
93 $user = new \stdClass();
94 if (!empty($formData['email'])) {
95 $user->email = $formData['email'];
96 }
97
98 $userClass = new UserClass();
99 if (empty($user->email)) {
100 $connectedUser = $userClass->identify(true, 'userId', 'userKey');
101 if (!empty($connectedUser->email)) {
102 $user->email = $connectedUser->email;
103 }
104 }
105 $user->email = trim($user->email);
106
107 if (empty($user->email) || !acym_isValidEmail($user->email, true)) {
108 $this->displayMessage('ACYM_VALID_EMAIL', $ajax);
109 }
110
111 $alreadyExists = $userClass->getOneByEmail($user->email);
112 if (!empty($alreadyExists->id)) {
113 $user->id = $alreadyExists->id;
114 }
115
116 $result = $userClass->saveForm($ajax);
117 $user->id = acym_getVar('int', 'userId');
118
119 if (!empty($userClass->errors)) {
120 $this->displayMessage(implode('<br /><br />', $userClass->errors), $ajax);
121 }
122
123 if ($result === false || empty($user->id)) {
124 $this->displayMessage('ACYM_ERROR_SAVE_USER', $ajax);
125 }
126
127 $myuser = $userClass->getOneById($user->id);
128 if (empty($myuser->id)) {
129 $this->displayMessage('ACYM_ERROR_SAVE_USER', $ajax);
130 }
131
132 $msgtype = 'success';
133 $extraMsg = '';
134 if (empty($myuser->confirmed) && $this->config->get('require_confirmation', 1) == 1) {
135 $extraMsg = strip_tags(acym_getVar('string', 'confirmation_message'));
136 if ($userClass->confirmationSentSuccess || empty($userClass->confirmationSentError)) {
137 $msg = !empty($extraMsg) ? $extraMsg : 'ACYM_CONFIRMATION_SENT';
138 $code = 2;
139 } else {
140 $msg = $userClass->confirmationSentError;
141 $code = 7;
142 $msgtype = 'error';
143 }
144 } else {
145 if ($userClass->subscribed) {
146 $msg = strip_tags(acym_getVar('string', 'confirmation_message'));
147 if (empty($msg)) $msg = 'ACYM_SUBSCRIPTION_OK';
148 $code = 3;
149 } else {
150 $msg = 'ACYM_ALREADY_SUBSCRIBED';
151 $code = 5;
152 $enqueueMsgType = 'info';
153 }
154 }
155
156 $replace = [];
157 foreach ($myuser as $oneProp => $oneVal) {
158 $replace['{user:'.$oneProp.'}'] = $oneVal;
159 }
160
161 $msg = str_replace(array_keys($replace), $replace, acym_translation($msg));
162 if (!empty($extraMsg)) {
163 $msg = str_replace(array_keys($replace), $replace, acym_translation($extraMsg)).'<br />'.$msg;
164 }
165
166 if ($ajax) {
167 $msg = str_replace(["\n", "\r", '"', '\\'], [' ', ' ', "'", '\\\\'], $msg);
168 echo '{"message":"'.$msg.'","type":"'.$msgtype.'","code":"'.$code.'"}';
169 exit;
170 } else {
171 acym_enqueueMessage($msg, !empty($enqueueMsgType) ? $enqueueMsgType : $msgtype);
172 }
173
174 $redirectUrl = urldecode(acym_getVar('string', 'redirect', ''));
175 $redirectUrl = str_replace(array_keys($replace), $replace, $redirectUrl);
176 if (empty($redirectUrl)) {
177 $redirectUrl = acym_rootURI();
178 }
179
180 acym_redirect($redirectUrl, '', 'message', true);
181 }
182
183 private function unsubscribeDirectly(object $alreadyExists, bool $ajax): void
184 {
185 $userClass = new UserClass();
186 if ($this->config->get('allow_modif', 'data') === 'none') {
187 $currentUser = $userClass->identify(true, 'userId', 'userKey');
188 if (empty($currentUser->email)) {
189 $this->endUnsubscribe('ACYM_LOGIN', $ajax, 'error');
190
191 return;
192 }
193 }
194
195 $visibleSubscription = acym_getVar('array', 'subscription', []);
196 $hiddenLists = trim(acym_getVar('string', 'hiddenlists', ''));
197 $hiddenSubscription = empty($hiddenLists) ? [] : explode(',', $hiddenLists);
198 $unsubscribeLists = array_merge($visibleSubscription, $hiddenSubscription);
199
200 $mailId = acym_getVar('int', 'mail_id', 0);
201 if (!empty($mailId)) {
202 $mailClass = new MailClass();
203 $unsubscribeLists = array_keys($mailClass->getAllListsByMailId($mailId));
204 }
205
206 if (empty($unsubscribeLists)) {
207 $msg = 'ACYM_NO_SUBSCRIPTION_LINKED_EMAIL';
208 } elseif (false === $userClass->unsubscribe($alreadyExists->id, $unsubscribeLists)) {
209 $msg = 'ACYM_UNSUBSCRIPTION_NOT_IN_LIST';
210 } else {
211 $msg = 'ACYM_UNSUBSCRIPTION_OK';
212 }
213
214 $this->endUnsubscribe($msg, $ajax);
215 }
216
217 private function endUnsubscribe(string $msg, bool $ajax, string $type = 'success'): void
218 {
219 $msg = acym_translation($msg);
220
221 if ($ajax) {
222 echo '{"message":"'.str_replace('"', '\"', $msg).'","type":"'.$type.'","code":"10"}';
223 exit;
224 }
225 acym_enqueueMessage($msg, $type);
226
227 $redirectUrl = urldecode(acym_getVar('string', 'redirectunsub', ''));
228 if (empty($redirectUrl)) {
229 $redirectUrl = acym_rootURI();
230 }
231
232 acym_redirect($redirectUrl);
233 }
234
235 public function unsubscribe(): void
236 {
237 acym_checkRobots();
238 $userClass = new UserClass();
239
240 $redirectToUnsubPage = $this->config->get('unsubscribe_page', 1);
241
242 $ajax = acym_getVar('int', 'ajax', 0);
243 if ($ajax) {
244 @ob_end_clean();
245 acym_header('Content-type:text/html; charset=utf-8');
246 }
247
248 $currentUserid = acym_currentUserId();
249 $user = $userClass->identify(true, 'userId', 'userKey');
250 if (empty($user) && empty($currentUserid) && $this->config->get('captcha', 'none') !== 'none' && acym_level(ACYM_ESSENTIAL)) {
251 $captchaClass = new CaptchaHelper();
252 if (!$captchaClass->check()) {
253 $this->displayMessage('ACYM_WRONG_CAPTCHA', $ajax);
254 }
255 }
256
257 $formData = acym_getVar('array', 'user', []);
258
259 if (empty($formData['email'])) {
260 if (empty($user)) {
261 return;
262 }
263
264 if (!empty($user->email)) {
265 $email = $user->email;
266 }
267 } else {
268 $email = trim(strip_tags($formData['email']));
269 }
270
271 $currentEmail = acym_currentUserEmail();
272 if (empty($email) && !empty($currentEmail)) {
273 $email = $currentEmail;
274 }
275
276 if (empty($email) || !acym_isValidEmail($email)) {
277 $this->displayMessage('ACYM_VALID_EMAIL', $ajax);
278 }
279
280 $alreadyExists = $userClass->getOneByEmail($email);
281
282 if (empty($alreadyExists->id)) {
283 $this->displayMessage('ACYM_SUB_NOT_IN_LIST', $ajax);
284 }
285
286 $fromModuleOrWidget = acym_getVar('string', 'acysubmode', '');
287 if (!empty($fromModuleOrWidget) && in_array($fromModuleOrWidget, ['form_acym', 'mod_acym', 'widget_acym'])) {
288 $this->unsubscribeDirectly($alreadyExists, $ajax);
289 } elseif ($redirectToUnsubPage && !$ajax) {
290 $this->unsubscribePage($alreadyExists);
291 } else {
292 $this->unsubscribeDirectly($alreadyExists, $ajax);
293 }
294 }
295
296 private function getUserFromUnsubPage(): object
297 {
298 $userID = acym_getVar('int', 'user_id');
299 $userClass = new UserClass();
300
301 $user = $userClass->getOneById($userID);
302
303 if (empty($user)) {
304 acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
305
306 acym_redirect(acym_rootURI());
307 }
308
309 return $user;
310 }
311
312 private function unsubscribeAllInner(bool $update = false): void
313 {
314 $userClass = new UserClass();
315 $user = $this->getUserFromUnsubPage();
316 $redirectUrl = $this->config->get('unsub_redirect_url', acym_rootURI());
317
318 $allLists = $userClass->getUserSubscriptionById($user->id);
319 if (empty($allLists)) {
320 acym_enqueueMessage(acym_translation('ACYM_NOT_SUBSCRIBED_ANY_LIST'), 'info');
321 acym_redirect(!empty($redirectUrl) ? $redirectUrl : acym_rootURI());
322 }
323
324 $lists = [];
325 foreach ($allLists as $list) {
326 if (!$update || $list->visible == 1) {
327 $lists[] = $list->id;
328 }
329 }
330
331 $userClass->sendNotification($user->id, 'acy_notification_unsuball');
332 $userClass->blockNotifications = true;
333 $userClass->unsubscribe($user->id, $lists);
334 }
335
336 private function redirectUnsubWorked(): void
337 {
338 acym_enqueueMessage(acym_translation('ACYM_SUBSCRIPTION_UPDATED_OK'));
339 $redirectUrl = $this->config->get('unsub_redirect_url');
340 if (!empty($redirectUrl)) {
341 acym_redirect($redirectUrl);
342 } else {
343 acym_redirect(acym_rootURI());
344 }
345 }
346
347 public function unsubscribeAll(): void
348 {
349 $userClass = new UserClass();
350 if ($userClass->identify(true, 'user_id', 'user_key') === false) {
351 acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
352
353 acym_redirect(acym_rootURI());
354 }
355
356 $displayCheckedLists = acym_getVar('string', 'displayed_checked_lists', '');
357 if (!empty($displayCheckedLists)) {
358 $user = $this->getUserFromUnsubPage();
359 $userClass->unsubscribe($user->id, explode(',', $displayCheckedLists));
360 } else {
361 $this->unsubscribeAllInner();
362 }
363
364 $ajax = acym_getVar('int', 'ajax', 0);
365 if (!$ajax) {
366 $this->redirectUnsubWorked();
367 }
368 }
369
370 public function saveSubscriptions(): void
371 {
372 $userClass = new UserClass();
373 if ($userClass->identify(true, 'user_id', 'user_key') === false) {
374 $this->displayMessage('ACYM_USER_NOT_FOUND', false);
375 }
376
377 $user = $this->getUserFromUnsubPage();
378 $listsChecked = acym_getVar('array', 'lists', []);
379 $listsChecked = array_filter($listsChecked, function ($status) {
380 return intval($status) === 1;
381 });
382 $listsChecked = array_keys($listsChecked);
383 $displayedCheckedLists = explode(',', acym_getVar('string', 'displayed_checked_lists', ''));
384 $userSubscriptions = $userClass->getUserSubscriptionById($user->id);
385
386 $userClass->subscribe($user->id, $listsChecked);
387
388 $listsToUnsub = [];
389 foreach ($userSubscriptions as $subscription) {
390 if (!in_array($subscription->id, $listsChecked)
391 && in_array($subscription->id, $displayedCheckedLists)
392 && intval($subscription->status) === 1) {
393 $listsToUnsub[] = $subscription->id;
394 }
395 }
396
397 $userClass->unsubscribe($user->id, $listsToUnsub);
398 $this->redirectUnsubWorked();
399 }
400
401 public function unsubscribePage(object $alreadyExists): void
402 {
403 $userClass = new UserClass();
404 $lang = acym_getVar('string', 'language', acym_getLanguageTag());
405 $mailId = acym_getVar('int', 'mail_id', 0);
406 $campaignListOnly = $this->config->get('unsubscribe_campaign_list_only', '0') === '1';
407 $displaySurvey = $this->config->get('unsubpage_survey', '0') === '1';
408 $surveyAnswers = $this->config->get('unsub_survey', '[]');
409 $unsubscribeColor = $this->config->get('unsubscribe_color', '#00a4ff');
410 $hoverColor = $this->darkenRGBColor($unsubscribeColor, 20);
411
412 $surveyAnswers = json_decode($surveyAnswers, true);
413
414 if (ACYM_CMS === 'joomla' && !empty($_GET['language'])) $lang = $_GET['language'];
415 acym_setLanguage($lang);
416 acym_loadLanguage($lang);
417
418 $userSubscriptions = $userClass->getUserSubscriptionById($alreadyExists->id, 'id', false, false, true, false, $mailId, $campaignListOnly);
419
420 $data = [
421 'user' => $alreadyExists,
422 'mail_id' => $mailId,
423 'subscriptions' => $userSubscriptions,
424 'lang' => $lang,
425 ];
426
427 if (acym_isMultilingual()) {
428 $allLanguages = acym_getLanguages(false, true);
429 if ($this->config->get('unsubpage_languages_multi_only', '0') === '1') {
430 $allLanguages = acym_getMultilingualLanguages();
431 }
432
433 $data['languages'] = [];
434 foreach ($allLanguages as $key => $language) {
435 $data['languages'][$key] = $language->name;
436 }
437
438 $surveyAnswersTranslations = $this->config->get('unsub_survey_translation', '');
439
440 if (!empty($surveyAnswersTranslations)) {
441 $surveyAnswersTranslations = json_decode($surveyAnswersTranslations, true);
442 if (isset($surveyAnswersTranslations[$data['lang']])) {
443 $surveyAnswers = $surveyAnswersTranslations[$data['lang']]['unsub_survey'];
444 }
445 }
446 }
447
448 if ($displaySurvey) {
449 $data['surveyAnswers'] = $surveyAnswers;
450 array_unshift($data['surveyAnswers'], acym_translation('ACYM_SELECT_REASON'));
451 $data['surveyAnswers'][] = acym_translation('ACYM_OTHER');
452 $data['surveyAnswers'] = array_combine($data['surveyAnswers'], $data['surveyAnswers']);
453 }
454
455 if (!empty($this->config->get('unsubscribe_color'))) {
456 $unsubscribeColor = $this->config->get('unsubscribe_color');
457 $hoverColor = $this->darkenRGBColor($unsubscribeColor, 20);
458 $data['unsubscribeColor'] = $unsubscribeColor;
459 $data['hoverColor'] = $hoverColor;
460 }
461 $data['svgImage'] = $this->getSVGImage($unsubscribeColor, $hoverColor);
462
463 acym_setVar('layout', 'unsubscribepage');
464 parent::display($data);
465 }
466
467 private function getSVGImage(string $unsubscribeColor, string $hoverColor): string
468 {
469 if ($this->config->get('display_unsub_image') === '1') {
470 $svgPath = ACYM_IMAGES.'unsubscribe/unsub_image.svg';
471
472 $svgContent = acym_fileGetContent($svgPath);
473
474 return str_replace(
475 ['#B118C8', '#C794CF'],
476 [$unsubscribeColor, $hoverColor],
477 $svgContent
478 );
479 }
480
481 return '';
482 }
483
484 public function hexToRGB(string $hexColor): array
485 {
486 $hexColor = ltrim($hexColor, '#');
487
488 if (strlen($hexColor) === 3) {
489 $hexColor = $hexColor[0].$hexColor[0].$hexColor[1].$hexColor[1].$hexColor[2].$hexColor[2];
490 }
491
492 $r = hexdec(substr($hexColor, 0, 2));
493 $g = hexdec(substr($hexColor, 2, 2));
494 $b = hexdec(substr($hexColor, 4, 2));
495
496 return [$r, $g, $b];
497 }
498
499 public function darkenRGBColor(string $hexColor, int $percent): string
500 {
501 $rgbValues = $this->hexToRGB($hexColor);
502
503 $darkenedRGB = array_map(function ($value) use ($percent) {
504 return max(0, $value - ($value * $percent / 100));
505 }, $rgbValues);
506
507 return sprintf('rgb(%d, %d, %d)', $darkenedRGB[0], $darkenedRGB[1], $darkenedRGB[2]);
508 }
509
510 public function confirm(): void
511 {
512 if (acym_isRobot()) {
513 return;
514 }
515
516 $userClass = new UserClass();
517 $user = $userClass->identify(true, 'userId', 'userKey');
518 if (empty($user)) {
519 acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
520 acym_redirect(acym_rootURI());
521
522 return;
523 }
524
525 if ($this->config->get('confirmation_message', 1)) {
526 if ($user->confirmed) {
527 acym_enqueueMessage(acym_translation('ACYM_ALREADY_CONFIRMED'), 'info');
528 } else {
529 acym_enqueueMessage(acym_translation('ACYM_SUBSCRIPTION_CONFIRMED'), 'success');
530 }
531 }
532
533 if (!$user->confirmed) {
534 $userClass->confirm($user->id);
535 }
536
537 $redirectUrl = $this->config->get('confirm_redirect');
538 if (!empty($redirectUrl)) {
539 $replace = [];
540 foreach ($user as $key => $val) {
541 $replace['{user:'.$key.'}'] = $val;
542 }
543 $redirectUrl = str_replace(array_keys($replace), $replace, $redirectUrl);
544 acym_redirect($redirectUrl);
545
546 return;
547 }
548
549 acym_redirect(acym_rootURI());
550 }
551
552 public function profile(): void
553 {
554 $userClass = new UserClass();
555 $user = $userClass->identify(true);
556
557 if (empty($user)) {
558 $allowvisitor = $this->config->get('allow_visitor', 1);
559 if (empty($allowvisitor)) {
560 acym_askLog(true, 'ACYM_ONLY_LOGGED', 'message');
561
562 return;
563 }
564 }
565
566 global $acymEmailMisspelledLoaded;
567 $spellChecker = empty($acymEmailMisspelledLoaded) && !empty($this->config->get('email_spellcheck'));
568 if ($spellChecker) $acymEmailMisspelledLoaded = true;
569
570 if ($spellChecker) {
571 acym_addStyle(false, ACYM_CSS.'libraries/email-misspelled.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'libraries'.DS.'email-misspelled.min.css'));
572 acym_addScript(false, ACYM_JS.'libraries/email-misspelled.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'libraries'.DS.'email-misspelled.min.js'));
573 }
574 acym_addScript(false, ACYM_JS.'module.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'module.min.js'));
575
576 $params = new \stdClass();
577 $menu = acym_getMenu();
578 if (is_object($menu)) {
579 $params->source = 'Menu n°'.$menu->id;
580 $menuParameters = method_exists($menu, 'getParams') ? $menu->getParams() : $menu->params;
581 $menuparams = new AcymParameter($menuParameters);
582
583 if (!empty($menuparams)) {
584 $params->suffix = $menuparams->get('pageclass_sfx', '');
585 $params->page_heading = $menuparams->get('page_heading');
586 $params->show_page_heading = $menuparams->get('show_page_heading', 0);
587
588 if ($menuparams->get('menu-meta_description')) {
589 acym_addMetadata('description', $menuparams->get('menu-meta_description'));
590 }
591 if ($menuparams->get('menu-meta_keywords')) {
592 acym_addMetadata('keywords', $menuparams->get('menu-meta_keywords'));
593 }
594 if ($menuparams->get('robots')) {
595 acym_addMetadata('robots', $menuparams->get('robots'));
596 }
597
598 $params->lists = $menuparams->get('lists', 'none');
599 $params->listschecked = $menuparams->get('listschecked', 'none');
600 $params->dropdown = $menuparams->get('dropdown');
601 $params->hiddenlists = $menuparams->get('hiddenlists', 'None');
602 $params->fields = $menuparams->get('fields');
603 $params->introtext = $menuparams->get('introtext');
604 $params->posttext = $menuparams->get('posttext');
605 $params->page_title = $menuparams->get('page_title', '');
606 }
607 }
608 $data = $this->prepareParams($params);
609
610 if (empty($data['user']->language)) {
611 $cmsUserLanguage = acym_getCmsUserLanguage();
612 $data['user']->language = empty($cmsUserLanguage) ? acym_getLanguageTag() : $cmsUserLanguage;
613 }
614
615 $data['captchaHelper'] = new CaptchaHelper();
616
617 acym_setVar('layout', 'profile');
618 parent::display($data);
619 }
620
621 public function prepareParams(object $values): array
622 {
623 if (!isset($values->lists)) {
624 $values->lists = 'none';
625 }
626 if (!isset($values->listschecked)) {
627 $values->listschecked = 'none';
628 }
629 if (!isset($values->dropdown)) {
630 $values->dropdown = 0;
631 }
632 if (!isset($values->hiddenlists)) {
633 $values->hiddenlists = 'None';
634 }
635 if (empty($values->fields)) {
636 $values->fields = ['1', '2'];
637 }
638 if (!in_array('2', $values->fields) && !in_array(2, $values->fields)) {
639 $values->fields[] = '2';
640 }
641 if (!isset($values->introtext)) {
642 $values->introtext = '';
643 }
644 if (!isset($values->posttext)) {
645 $values->posttext = '';
646 }
647
648 foreach (['lists', 'listschecked', 'hiddenlists', 'fields'] as $option) {
649 if (is_string($values->$option)) {
650 $values->$option = explode(',', $values->$option);
651 }
652 }
653
654 if ((empty($values->lists) || in_array('None', $values->lists)) && (empty($values->hiddenlists) || strtolower(implode('', $values->hiddenlists)) == 'none')) {
655 $values->lists[] = 'All';
656 }
657
658 $userClass = new UserClass();
659 $user = $userClass->identify(true);
660 if (empty($user)) {
661 $listClass = new ListClass();
662 $subscription = $listClass->getAll('id');
663
664 if (acym_isMultilingual()) {
665 $subscription = $listClass->getTranslatedNameDescription($subscription);
666 }
667
668 $user = new \stdClass();
669 $user->id = 0;
670 $user->key = 0;
671
672 if (!empty($subscription)) {
673 foreach ($subscription as $id => $onesub) {
674 $subscription[$id]->status = 1;
675 if (strtolower(implode('', $values->listschecked)) != 'all' && !in_array($id, $values->listschecked)) {
676 $subscription[$id]->status = -1;
677 }
678 }
679 }
680
681 acym_addBreadcrumb(acym_translation('ACYM_SUBSCRIPTION'));
682 if (empty($menu)) {
683 acym_setPageTitle(acym_translation('ACYM_SUBSCRIPTION'));
684 }
685 } else {
686 $subscription = $userClass->getAllListsUserSubscriptionById($user->id, 'id', true);
687
688 acym_addBreadcrumb(acym_translation('ACYM_MODIFY_SUBSCRIPTION'));
689 if (empty($menu)) {
690 acym_setPageTitle(acym_translation('ACYM_MODIFY_SUBSCRIPTION'));
691 }
692 }
693
694 if (!empty($values->page_title)) {
695 acym_addBreadcrumb($values->page_title);
696 if (empty($menu)) {
697 acym_setPageTitle($values->page_title);
698 }
699 }
700
701 $allLists = $subscription;
702
703 acym_initModule();
704
705 if (!empty($values->lists) && strtolower(implode('', $values->lists)) != 'all') {
706 if (in_array('None', $values->lists)) {
707 $subscription = [];
708 } else {
709 $newSubscription = [];
710 foreach ($subscription as $id => $onesub) {
711 if (in_array($id, $values->lists)) {
712 $newSubscription[$id] = $onesub;
713 }
714 }
715 $subscription = $newSubscription;
716 }
717 }
718
719 if (!empty($values->hiddenlists)) {
720 $hiddenListsArray = [];
721 if (strtolower(implode('', $values->hiddenlists)) == 'all') {
722 $subscription = [];
723 foreach ($allLists as $oneList) {
724 if (!empty($oneList->active)) {
725 $hiddenListsArray[] = $oneList->id;
726 }
727 }
728 } elseif (strtolower(implode('', $values->hiddenlists)) != 'none') {
729 foreach ($allLists as $oneList) {
730 if (!$oneList->active || !in_array($oneList->id, $values->hiddenlists)) {
731 continue;
732 }
733 $hiddenListsArray[] = $oneList->id;
734 unset($subscription[$oneList->id]);
735 }
736 }
737 $values->hiddenlists = $hiddenListsArray;
738 }
739
740 $defaultSubscription = $subscription;
741 $forceLists = acym_getVar('string', 'listid', '');
742 if (!empty($forceLists)) {
743 $subscription = [];
744 $forceLists = explode(',', $forceLists);
745 foreach ($forceLists as $oneList) {
746 if (!empty($defaultSubscription[$oneList])) {
747 $subscription[$oneList] = $defaultSubscription[$oneList];
748 }
749 }
750 }
751 $forceHiddenLists = acym_getVar('string', 'hiddenlist', '');
752 if (!empty($forceHiddenLists)) {
753 $forceHiddenLists = explode(',', $forceHiddenLists);
754 $tmpList = [];
755 foreach ($forceHiddenLists as $oneList) {
756 if (!empty($defaultSubscription[$oneList]) || in_array($oneList, $values->hiddenlists)) {
757 $tmpList[] = $oneList;
758 }
759 }
760 $values->hiddenlists = $tmpList;
761 }
762
763 $displayLists = false;
764 foreach ($subscription as $oneSub) {
765 if (!empty($oneSub->active) && $oneSub->visible) {
766 $displayLists = true;
767 break;
768 }
769 }
770
771 $fieldClass = new FieldClass();
772 $allfields = $fieldClass->getFieldsByID($values->fields);
773 $fields = [];
774 foreach ($allfields as $field) {
775 if (intval($field->active) === 0) continue;
776 $fields[$field->id] = $field;
777 }
778 $values->fields = $fields;
779
780 $data = [
781 'config' => $this->config,
782 'displayLists' => $displayLists,
783 'user' => $user,
784 'subscription' => $subscription,
785 'fieldClass' => $fieldClass,
786 ];
787
788 foreach ($values as $key => $value) {
789 $data[$key] = $value;
790 }
791
792 return $data;
793 }
794
795 public function savechanges(): void
796 {
797 acym_checkToken();
798 acym_checkRobots();
799
800 $userClass = new UserClass();
801
802
803 $status = $userClass->saveForm();
804 if ($status) {
805 if ($userClass->confirmationSentSuccess) {
806 $this->displayMessage('ACYM_CONFIRMATION_SENT', true, 'success');
807 } elseif ($userClass->newUser) {
808 $this->displayMessage('ACYM_SUBSCRIPTION_OK', true, 'success');
809 } else {
810 $this->displayMessage('ACYM_SUBSCRIPTION_UPDATED_OK', true, 'success');
811 }
812 } elseif (!empty($userClass->requireId)) {
813 $this->displayMessage('ACYM_IDENTIFICATION_SENT', true, 'success');
814 } elseif (!empty($userClass->errors)) {
815 $this->displayMessage(implode('<br/>', $userClass->errors), true);
816 } else {
817 $this->displayMessage('ACYM_ERROR_SAVING', true);
818 }
819
820 exit;
821 }
822
823 public function exportdata(): void
824 {
825 acym_checkToken();
826
827 $userClass = new UserClass();
828 $user = $userClass->identify(true, 'userId', 'userKey');
829
830 if (empty($user->id)) {
831 acym_redirect(acym_rootURI());
832 }
833
834 $userHelper = new UserHelper();
835 $userHelper->exportdata((int)$user->id);
836 }
837
838 public function gdprDelete(): void
839 {
840 acym_checkToken();
841
842 $userClass = new UserClass();
843 $user = $userClass->identify(true, 'userId', 'userKey');
844 if (empty($user->id)) {
845 acym_redirect(acym_rootURI());
846 }
847
848 $userClass->delete([$user->id], true);
849 }
850
851 public function ajaxGetEnqueuedMessages(): void
852 {
853 acym_session();
854
855 $output = '';
856 $types = ['success', 'info', 'warning', 'error'];
857 foreach ($types as $type) {
858 if (empty($_SESSION['acymessage'.$type])) continue;
859
860 $messages = $_SESSION['acymessage'.$type];
861 if (!is_array($messages)) {
862 $messages = [$messages];
863 }
864
865 $output .= '<div class="acym_callout acym__callout__front__'.$type.'" role="alert">';
866 $output .= '<div>'.implode(' ', $messages).'</div>';
867 $output .= '<button class="acym_callout_close" aria-label="'.acym_escape(acym_translation('ACYM_CLOSE_NOTIFICATION')).'">x</button></div>';
868
869 unset($_SESSION['acymessage'.$type]);
870 }
871
872 if (!empty($output)) {
873 $output = '<div id="acym__callout__container">'.$output.'</div>';
874 }
875 acym_sendAjaxResponse('', ['messages' => $output]);
876 }
877 }
878