роHвм╚Джм                                                        @ЬBвм    K8$╘ чА8уRгм    j^Rь╔НУ░Ё[гм        шЬBвм                                                            xЬBвм    n╖9yмцАвBвмw·└∙,Рьп?ZU@В╘>ZUPBиЭ\гмр~╡емЁ│╖емААом╨┼Bвм└}╡емy{роHвм@\Ьвм                                                        @┼Bвм    K8$╘ чА8уRгм    j^Rь╔НУ░Ё[гм                                                            РЭBвм                                                                  ЭBвм    СЭ╣г+╓Hвм        роHвмpыЪгм                                                        ╚ЭBвм    K8$╘ чА8уRгм    j^Rь╔НУ░Ё[гм        роHвмx╥mгм                                                        8ЮBвм    K8$╘ чА8уRгм    j^Rь╔НУ░Ё[гм                                                            рЮBвм     ( (int)$subscriber->getId(), StatisticsUnsubscribeEntity::SOURCE_MANAGE ); } if ($subscriber && $this->linkTokens->verifyToken($subscriber, $token)) { if ($subscriberData['email'] !== Pages::DEMO_EMAIL) { $subscriber = $this->subscriberSaveController->createOrUpdate($subscriberData, $subscriber); $this->subscriberSaveController->updateCustomFields($this->filterOutEmptyMandatoryFields($subscriberData), $subscriber); $this->updateSubscriptions($subscriber, $subscriberData); } } $result = ['success' => true]; } $this->urlHelper->redirectBack($result); } private function updateSubscriptions(SubscriberEntity $subscriber, array $subscriberData): void { $segmentsIds = []; if (isset($subscriberData['segments']) && is_array($subscriberData['segments'])) { $segmentsIds = $subscriberData['segments']; } // Unsubscribe from all other segments already subscribed to // but don't change disallowed segments foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) { $segment = $subscriberSegment->getSegment(); if (!$segment) { continue; } if (empty($segment->getDisplayInManageSubscriptionPage())) { continue; } if (!in_array($segment->getId(), $segmentsIds)) { $this->subscriberSegmentRepository->createOrUpdate( $subscriber, $segment, SubscriberEntity::STATUS_UNSUBSCRIBED ); } } // Store new segments for notifications $subscriberSegments = $this->subscriberSegmentRepository->findBy([ 'status' => SubscriberEntity::STATUS_SUBSCRIBED, 'subscriber' => $subscriber, ]); $currentSegmentIds = array_filter(array_map(function (SubscriberSegmentEntity $subscriberSegment): ?string { $segment = $subscriberSegment->getSegment(); return $segment ? (string)$segment->getId() : null; }, $subscriberSegments)); $newSegmentIds = array_diff($segmentsIds, $currentSegmentIds); foreach ($segmentsIds as $segmentId) { $segment = $this->segmentsRepository->findOneById($segmentId); if (!$segment) { continue; } // Allow subscribing only to allowed segments if (empty($segment->getDisplayInManageSubscriptionPage())) { continue; } $this->subscriberSegmentRepository->createOrUpdate( $subscriber, $segment, SubscriberEntity::STATUS_SUBSCRIBED ); } if ($subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $newSegmentIds) { $newSegments = $this->segmentsRepository->findBy(['id' => $newSegmentIds]); $this->newSubscriberNotificationMailer->send($subscriber, $newSegments); $this->welcomeScheduler->scheduleSubscriberWelcomeNotification( $subscriber->getId(), $newSegmentIds ); } } private function filterOutEmptyMandatoryFields(array $subscriberData): array { $mandatory = $this->getMandatory(); foreach ($mandatory as $name) { if (!isset($subscriberData[$name])) { continue; } if (is_array($subscriberData[$name]) && count(array_filter($subscriberData[$name])) === 0) { unset($subscriberData[$name]); } if (is_string($subscriberData[$name]) && strlen(trim($subscriberData[$name])) === 0) { unset($subscriberData[$name]); } } return $subscriberData; } /** * @return string[] */ private function getMandatory(): array { $mandatory = []; $requiredCustomFields = $this->customFieldsRepository->findAll(); foreach ($requiredCustomFields as $customField) { $params = $customField->getParams(); if ( is_array($params) && isset($params['required']) && $params['required'] ) { $mandatory[] = 'cf_' . $customField->getId(); } } return $mandatory; } }