Files
piratepoet/lib/Settings/SettingsController.php
2021-03-11 11:46:16 +01:00

249 lines
7.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace MailPoet\Settings;
use MailPoet\Cron\CronTrigger;
use MailPoet\Cron\Workers\InactiveSubscribers;
use MailPoet\Cron\Workers\WooCommerceSync;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\FormEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Form\FormsRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
class SettingsController {
const DEFAULT_SENDING_METHOD_GROUP = 'website';
const DEFAULT_SENDING_METHOD = 'PHPMail';
const DEFAULT_SENDING_FREQUENCY_EMAILS = 25;
const DEFAULT_SENDING_FREQUENCY_INTERVAL = 5; // in minutes
const DEFAULT_DEACTIVATE_SUBSCRIBER_AFTER_INACTIVE_DAYS = 180;
private $loaded = false;
private $settings = [];
private $defaults = null;
/** @var SettingsRepository */
private $settingsRepository;
/** @var ScheduledTasksRepository */
private $tasksRepository;
/** @var FormsRepository */
private $formsRepository;
private static $instance;
public function __construct(
SettingsRepository $settingsRepository,
ScheduledTasksRepository $scheduledTasksRepository,
FormsRepository $formsRepository
) {
$this->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')
? __('Youve 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 __('Youve 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);
}
}