Passed
Push — master ( 73f0a8...2b6bea )
by Andreas
22:42
created

midgard_admin_asgard_handler_preferences   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Test Coverage

Coverage 81.13%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 53
c 1
b 0
f 0
dl 0
loc 128
ccs 43
cts 53
cp 0.8113
rs 10
wmc 14

4 Methods

Rating   Name   Duplication   Size   Complexity  
A _process_request_data() 0 10 2
A get_languages() 0 30 4
A _handler_ajax() 0 22 4
A _handler_preferences() 0 30 4
1
<?php
2
/**
3
 * @package midgard.admin.asgard
4
 * @author The Midgard Project, http://www.midgard-project.org
5
 * @copyright The Midgard Project, http://www.midgard-project.org
6
 * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
7
 */
8
9
use midcom\datamanager\datamanager;
10
use Symfony\Component\HttpFoundation\Request;
11
use Symfony\Component\Intl\Languages;
12
use Symfony\Component\Finder\Finder;
13
14
/**
15
 * Preferences interface
16
 *
17
 * @package midgard.admin.asgard
18
 */
19
class midgard_admin_asgard_handler_preferences extends midcom_baseclasses_components_handler
20
{
21
    use midgard_admin_asgard_handler;
22
23
    /**
24
     * User for the preferences page
25
     *
26
     * @var midcom_db_person
27
     */
28
    private $_person;
29
30
    /**
31
     * Process the UI information
32
     */
33 2
    private function _process_request_data(array &$data)
34
    {
35 2
        $data['view_title'] = $this->_l10n->get('user preferences');
36
37
        // Set the breadcrumb data
38 2
        $this->add_breadcrumb($this->router->generate('welcome'), $this->_l10n->get($this->_component));
39 2
        $this->add_breadcrumb($this->router->generate('preferences'), $this->_l10n->get('user preferences'));
40
41 2
        if ($this->_person->guid !== midcom::get()->auth->user->guid) {
42 1
            $this->add_breadcrumb('', $this->_person->name);
43
        }
44 2
    }
45
46
    /**
47
     * Handle the preference request
48
     *
49
     * @param Request $request The request object
50
     * @param array $data The local request data.
51
     * @param string $guid The person GUID
52
     */
53 2
    public function _handler_preferences(Request $request, array &$data, $guid = null)
54
    {
55 2
        midcom::get()->auth->require_valid_user();
56
57 2
        if (isset($guid)) {
58 1
            $this->_person = new midcom_db_person($guid);
59
        } else {
60 1
            $this->_person = new midcom_db_person(midcom_connection::get_user());
61
        }
62
63
        // Load the controller instance
64 2
        $data['controller'] = datamanager::from_schemadb($this->_config->get('schemadb_preferences'))
65 2
            ->set_storage($this->_person)
66 2
            ->get_controller();
67
68 2
        $return_page = $request->query->get('return_uri', '__mfa/asgard/');
69
        // Process the requested form
70 2
        switch ($data['controller']->handle($request)) {
71 2
            case 'save':
72
                midcom::get()->uimessages->add($this->_l10n->get($this->_component), $this->_l10n->get('preferences saved'));
73
                return new midcom_response_relocate($return_page);
74
75 2
            case 'cancel':
76
                midcom::get()->uimessages->add($this->_l10n->get($this->_component), $this->_l10n_midcom->get('cancelled'));
77
                return new midcom_response_relocate($return_page);
78
        }
79
80
        // Load the common data
81 2
        $this->_process_request_data($data);
82 2
        return $this->get_response('midgard_admin_asgard_preferences');
83
    }
84
85
    /**
86
     * Get the languages as identifier -> name pairs
87
     */
88 2
    public static function get_languages() : array
89
    {
90 2
        $current_lang = midcom::get()->i18n->get_current_language();
91
92 2
        $languages = [];
93 2
        $finder = new Finder;
94 2
        foreach ($finder->files()->in(dirname(__DIR__) . '/locale')->name('default.*.txt') as $file) {
95 2
            $identifier = str_replace('default.', '', $file->getBasename('.txt'));
96 2
            $languages[$identifier] = Languages::getName($identifier, $current_lang);
97 2
            $localname = Languages::getName($identifier, $identifier);
98 2
            if ($localname != $languages[$identifier]) {
99 2
                $languages[$identifier] .= ' (' . $localname . ')';
100
            }
101
        }
102
103 2
        if (!array_key_exists($current_lang, $languages)) {
104
            return $languages;
105
        }
106
107
        // Initialize a new array for the current language
108
        $prepend = [
109 2
            '' => midcom::get()->i18n->get_string('default setting'),
110 2
            $current_lang => $languages[$current_lang]
111
        ];
112
113
        // Remove the reference from the original array
114 2
        unset($languages[$current_lang]);
115
116
        // Join the arrays
117 2
        return array_merge($prepend, $languages);
118
    }
119
120
    /**
121
     * AJAX backend for saving data on the fly
122
     *
123
     * @param Request $request The request object
124
     */
125 1
    public function _handler_ajax(Request $request)
126
    {
127 1
        $this->_person = new midcom_db_person(midcom_connection::get_user());
128 1
        $this->_person->require_do('midgard:update');
129
130
        // Patch for Midgard ACL problem of setting person's own parameters
131 1
        midcom::get()->auth->request_sudo('midgard.admin.asgard');
132
133 1
        foreach ($request->request->all() as $key => $value) {
134
            if (is_array($value)) {
135
                $value = serialize($value);
136
            }
137
138
            if (!$this->_person->set_parameter('midgard.admin.asgard:preferences', $key, $value)) {
139
                midcom::get()->uimessages->add($this->_l10n->get($this->_component), sprintf($this->_l10n->get('failed to save the preference for %s'), $this->_l10n->get($key)));
140
            }
141
142
            debug_add("Added configuration key-value pair {$key} => {$value}");
143
        }
144
145 1
        midcom::get()->auth->drop_sudo();
146 1
        return new midcom_response_json;
147
    }
148
}
149