Passed
Push — feature/rebusify ( 495106...67b08f )
by Paul
06:10 queued 02:03
created

SettingsController   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Test Coverage

Coverage 14.29%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 50
c 4
b 0
f 0
dl 0
loc 109
ccs 8
cts 56
cp 0.1429
rs 10
wmc 18

6 Methods

Rating   Name   Duplication   Size   Complexity  
A registerSettings() 0 4 1
A sanitizeGeneral() 0 11 3
A sanitizeTranslations() 0 18 4
A callbackRegisterSettings() 0 14 4
A hasMultilingualIntegration() 0 21 4
A sanitizeSubmissions() 0 7 2
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Controllers;
4
5
use GeminiLabs\SiteReviews\Application;
6
use GeminiLabs\SiteReviews\Database\OptionManager;
7
use GeminiLabs\SiteReviews\Helper;
8
use GeminiLabs\SiteReviews\Modules\Notice;
9
10
class SettingsController extends Controller
11
{
12
    /**
13
     * @param mixed $input
14
     * @return array
15
     * @callback register_setting
16
     */
17 1
    public function callbackRegisterSettings($input)
18
    {
19 1
        $settings = glsr(Helper::class)->consolidateArray($input);
20 1
        if (1 === count($settings) && array_key_exists('settings', $settings)) {
21
            $options = array_replace_recursive(glsr(OptionManager::class)->all(), $input);
22
            $options = $this->sanitizeGeneral($input, $options);
23
            $options = $this->sanitizeSubmissions($input, $options);
24
            $options = $this->sanitizeTranslations($input, $options);
25
            if (filter_input(INPUT_POST, 'option_page') == Application::ID.'-settings') {
26
                glsr(Notice::class)->addSuccess(__('Settings updated.', 'site-reviews'));
27
            }
28
            return $options;
29
        }
30 1
        return $input;
31
    }
32
33
    /**
34
     * @return void
35
     * @action admin_init
36
     */
37 1
    public function registerSettings()
38
    {
39 1
        register_setting(Application::ID.'-settings', OptionManager::databaseKey(), [
40 1
            'sanitize_callback' => [$this, 'callbackRegisterSettings'],
41
        ]);
42 1
    }
43
44
    /**
45
     * @return array
46
     */
47
    protected function sanitizeGeneral(array $input, array $options)
48
    {
49
        $inputForm = $input['settings']['general'];
50
        if (!$this->hasMultilingualIntegration($inputForm['support']['multilingual'])) {
51
            $options['settings']['general']['support']['multilingual'] = '';
52
        }
53
        if ('' == trim($inputForm['notification_message'])) {
54
            $options['settings']['general']['notification_message'] = glsr()->defaults['settings']['general']['notification_message'];
55
        }
56
        $options['settings']['general']['notifications'] = glsr_get($inputForm, 'notifications', []);
57
        return $options;
58
    }
59
60
    /**
61
     * @return array
62
     */
63
    protected function sanitizeSubmissions(array $input, array $options)
64
    {
65
        $inputForm = $input['settings']['submissions'];
66
        $options['settings']['submissions']['required'] = isset($inputForm['required'])
67
            ? $inputForm['required']
68
            : [];
69
        return $options;
70
    }
71
72
    /**
73
     * @return array
74
     */
75
    protected function sanitizeTranslations(array $input, array $options)
76
    {
77
        if (isset($input['settings']['strings'])) {
78
            $options['settings']['strings'] = array_values(array_filter($input['settings']['strings']));
79
            $allowedTags = [
80
                'a' => ['class' => [], 'href' => [], 'target' => []],
81
                'span' => ['class' => []],
82
            ];
83
            array_walk($options['settings']['strings'], function (&$string) use ($allowedTags) {
84
                if (isset($string['s2'])) {
85
                    $string['s2'] = wp_kses($string['s2'], $allowedTags);
86
                }
87
                if (isset($string['p2'])) {
88
                    $string['p2'] = wp_kses($string['p2'], $allowedTags);
89
                }
90
            });
91
        }
92
        return $options;
93
    }
94
95
    /**
96
     * @return bool
97
     */
98
    protected function hasMultilingualIntegration($integration)
99
    {
100
        if (!in_array($integration, ['polylang', 'wpml'])) {
101
            return false;
102
        }
103
        $integrationClass = 'GeminiLabs\SiteReviews\Modules\\'.ucfirst($integration);
104
        if (!glsr($integrationClass)->isActive()) {
105
            glsr(Notice::class)->addError(sprintf(
106
                __('Please install/activate the %s plugin to enable integration.', 'site-reviews'),
107
                constant($integrationClass.'::PLUGIN_NAME')
108
            ));
109
            return false;
110
        } elseif (!glsr($integrationClass)->isSupported()) {
111
            glsr(Notice::class)->addError(sprintf(
112
                __('Please update the %s plugin to v%s or greater to enable integration.', 'site-reviews'),
113
                constant($integrationClass.'::PLUGIN_NAME'),
114
                constant($integrationClass.'::SUPPORTED_VERSION')
115
            ));
116
            return false;
117
        }
118
        return true;
119
    }
120
}
121