settingsRepository = $settingsRepository; $this->tasksRepository = $scheduledTasksRepository; $this->formsRepository = $formsRepository; } public function get($key, $default = null) { $this->ensureLoaded(); $keyParts = explode('.', $key); $setting = $this->settings; if ($default === null) { $default = $this->getDefaultValue($keyParts); } foreach ($keyParts as $keyPart) { if (is_array($setting) && array_key_exists($keyPart, $setting)) { $setting = $setting[$keyPart]; } else { return $default; } } if (is_array($setting) && is_array($default)) { return array_replace_recursive($default, $setting); } return $setting; } public function getAllDefaults() { if ($this->defaults === null) { $this->defaults = [ 'mta_group' => self::DEFAULT_SENDING_METHOD_GROUP, 'mta' => [ 'method' => self::DEFAULT_SENDING_METHOD, 'frequency' => [ 'emails' => self::DEFAULT_SENDING_FREQUENCY_EMAILS, 'interval' => self::DEFAULT_SENDING_FREQUENCY_INTERVAL, ], ], CronTrigger::SETTING_NAME => [ 'method' => CronTrigger::DEFAULT_METHOD, ], 'signup_confirmation' => [ 'enabled' => true, 'subject' => sprintf(__('Confirm your subscription to %1$s', 'mailpoet'), WPFunctions::get()->getOption('blogname')), 'body' => WPFunctions::get()->__("Hello,\n\nWelcome to our newsletter!\n\nPlease confirm your subscription to our list by clicking the link below: \n\n[activation_link]I confirm my subscription![/activation_link]\n\nThank you,\n\nThe Team", 'mailpoet'), ], 'tracking' => [ 'enabled' => true, ], 'analytics' => [ 'enabled' => false, ], 'display_nps_poll' => true, 'deactivate_subscriber_after_inactive_days' => self::DEFAULT_DEACTIVATE_SUBSCRIBER_AFTER_INACTIVE_DAYS, ]; } return $this->defaults; } /** * Fetches the value from DB and update in cache * This is required for sync settings between parallel processes e.g. cron */ public function fetch($key, $default = null) { $keys = explode('.', $key); $mainKey = $keys[0]; $this->settings[$mainKey] = $this->fetchValue($mainKey); return $this->get($key, $default); } public function getAll() { $this->ensureLoaded(); return array_replace_recursive($this->getAllDefaults(), $this->settings); } public function set($key, $value) { $this->ensureLoaded(); $keyParts = explode('.', $key); $mainKey = $keyParts[0]; $lastKey = array_pop($keyParts); $setting =& $this->settings; foreach ($keyParts as $keyPart) { $setting =& $setting[$keyPart]; if (!is_array($setting)) { $setting = []; } } $setting[$lastKey] = $value; $this->settingsRepository->createOrUpdateByName($mainKey, $this->settings[$mainKey]); } public function delete($key) { $setting = $this->settingsRepository->findOneByName($key); if ($setting) { $this->settingsRepository->remove($setting); $this->settingsRepository->flush(); } unset($this->settings[$key]); } public function onSubscribeOldWoocommerceCustomersChange(): void { $task = $this->tasksRepository->findOneBy([ 'type' => WooCommerceSync::TASK_TYPE, 'status' => ScheduledTaskEntity::STATUS_SCHEDULED, ]); if (!($task instanceof ScheduledTaskEntity)) { $task = $this->createScheduledTask(WooCommerceSync::TASK_TYPE); } $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp')); $task->setScheduledAt($datetime->subMinute()); $this->tasksRepository->persist($task); $this->tasksRepository->flush(); } public function onInactiveSubscribersIntervalChange(): void { $task = $this->tasksRepository->findOneBy([ 'type' => InactiveSubscribers::TASK_TYPE, 'status' => ScheduledTaskEntity::STATUS_SCHEDULED, ]); if (!($task instanceof ScheduledTaskEntity)) { $task = $this->createScheduledTask(InactiveSubscribers::TASK_TYPE); } $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp')); $task->setScheduledAt($datetime->subMinute()); $this->tasksRepository->persist($task); $this->tasksRepository->flush(); } public function updateSuccessMessages(): void { $rightMessage = $this->getDefaultSuccessMessage(); $wrongMessage = ( $rightMessage === __('Check your inbox or spam folder to confirm your subscription.', 'mailpoet') ? __('You’ve been successfully subscribed to our newsletter!', 'mailpoet') : __('Check your inbox or spam folder to confirm your subscription.', 'mailpoet') ); /** @var FormEntity[] $forms */ $forms = $this->formsRepository->findAll(); foreach ($forms as $form) { $settings = $form->getSettings(); if (isset($settings['success_message']) && $settings['success_message'] === $wrongMessage) { $settings['success_message'] = $rightMessage; $form->setSettings($settings); $this->settingsRepository->flush(); } } } public function getDefaultSuccessMessage(): string { if ($this->get('signup_confirmation.enabled')) { return __('Check your inbox or spam folder to confirm your subscription.', 'mailpoet'); } return __('You’ve been successfully subscribed to our newsletter!', 'mailpoet'); } private function createScheduledTask(string $type): ScheduledTaskEntity { $task = new ScheduledTaskEntity(); $task->setType($type); $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); return $task; } private function ensureLoaded() { if ($this->loaded) { return; } $this->settings = []; foreach ($this->settingsRepository->findAll() as $setting) { $this->settings[$setting->getName()] = $setting->getValue(); } $this->loaded = true; } private function getDefaultValue($keys) { $default = $this->getAllDefaults(); foreach ($keys as $key) { if (array_key_exists($key, $default)) { $default = $default[$key]; } else { return null; } } return $default; } private function fetchValue($key) { $setting = $this->settingsRepository->findOneByName($key); return $setting ? $setting->getValue() : null; } public function resetCache() { $this->settings = []; $this->loaded = false; } public static function setInstance($instance) { self::$instance = $instance; } /** @return SettingsController */ public static function getInstance() { if (isset(self::$instance)) return self::$instance; return ContainerWrapper::getInstance()->get(SettingsController::class); } }