TreeController   A
last analyzed

Complexity

Total Complexity 21

Size/Duplication

Total Lines 191
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 84
dl 0
loc 191
rs 10
c 0
b 0
f 0
wmc 21

4 Methods

Rating   Name   Duplication   Size   Complexity  
A printTree() 0 18 3
A adjustTabsForTree() 0 9 6
A __construct() 0 17 2
B printTreeJSON() 0 65 10
1
<?php
2
3
/**
4
 * PHPPgAdmin 6.1.3
5
 */
6
7
namespace PHPPgAdmin\Controller;
8
9
use PHPPgAdmin\Decorators\Decorator;
10
11
/**
12
 * Base TreeController controller class.
13
 */
14
class TreeController extends BaseController
15
{
16
    use \PHPPgAdmin\Traits\HelperTrait;
17
18
    public $form = '';
19
20
    public $href = '';
21
22
    public $lang = [];
23
24
    public $action = '';
25
26
    public $controller_name = 'TreeController';
27
28
    public $controller_title = 'base';
29
30
    public $misc;
31
32
    public $conf;
33
34
    public $appThemes;
35
36
    public $view;
37
38
    public $appVersion;
39
40
    public $appLangFiles;
41
42
    protected $container;
43
44
    // Constructor
45
    public function __construct(\PHPPgAdmin\ContainerUtils $container, $controller_name = null)
46
    {
47
        $this->container = $container;
48
        $this->lang = $container->get('lang');
49
        //$this->conf           = $container->get('conf');
50
        $this->view = $container->get('view');
51
52
        $this->appName = $container->get('settings')['appName'];
53
        $this->appVersion = $container->get('settings')['appVersion'];
54
        $this->appLangFiles = $container->get('appLangFiles');
55
        $this->misc = $container->get('misc');
56
        $this->conf = $this->misc->getConf();
57
        $this->appThemes = $container->get('appThemes');
58
        $this->action = $container->get('action');
59
60
        if (null !== $controller_name) {
61
            $this->controller_name = $controller_name;
62
        }
63
    }
64
65
    /**
66
     * Produce JSON data for the browser tree.
67
     *
68
     * @param \PHPPgAdmin\ArrayRecordSet $_treedata a set of records to populate the tree
69
     * @param array                      $attrs     Attributes for tree items
70
     *                                              'text' - the text for the tree node
71
     *                                              'icon' - an icon for node
72
     *                                              'openIcon' - an alternative icon when the node is expanded
73
     *                                              'toolTip' - tool tip text for the node
74
     *                                              'action' - URL to visit when single clicking the node
75
     *                                              'iconAction' - URL to visit when single clicking the icon node
76
     *                                              'branch' - URL for child nodes (tree XML)
77
     *                                              'expand' - the action to return XML for the subtree
78
     *                                              'nodata' - message to display when node has no children
79
     * @param string                     $section   The section where the branch is linked in the tree
80
     * @param bool                       $print     either to return or echo the result
81
     *
82
     * @return \Slim\Http\Response|string the json rendered tree
83
     */
84
    public function printTree(&$_treedata, &$attrs, $section, $print = true)
85
    {
86
        $treedata = [];
87
88
        if (0 < $_treedata->recordCount()) {
89
            while (!$_treedata->EOF) {
90
                $treedata[] = $_treedata->fields;
91
                $_treedata->moveNext();
92
            }
93
        }
94
95
        $tree_params = [
0 ignored issues
show
Unused Code introduced by
The assignment to $tree_params is dead and can be removed.
Loading history...
96
            'treedata' => &$treedata,
97
            'attrs' => &$attrs,
98
            'section' => $section,
99
        ];
100
101
        return $this->printTreeJSON($treedata, $attrs, $print);
102
    }
103
104
    /**
105
     * Hides or show tree tabs according to their properties.
106
     *
107
     * @param array $tabs The tabs
108
     *
109
     * @return \PHPPgAdmin\ArrayRecordSet filtered tabs in the form of an ArrayRecordSet
110
     */
111
    public function adjustTabsForTree(&$tabs)
112
    {
113
        foreach ($tabs as $i => $tab) {
114
            if ((isset($tab['hide']) && true === $tab['hide']) || (isset($tab['tree']) && false === $tab['tree'])) {
115
                unset($tabs[$i]);
116
            }
117
        }
118
119
        return new \PHPPgAdmin\ArrayRecordSet($tabs);
120
    }
121
122
    /**
123
     * Produce JSON data for the browser tree.
124
     *
125
     * @param array $treedata a set of records to populate the tree
126
     * @param array $attrs    Attributes for tree items
127
     *                        'text' - the text for the tree node
128
     *                        'icon' - an icon for node
129
     *                        'openIcon' - an alternative icon when the node is expanded
130
     *                        'toolTip' - tool tip text for the node
131
     *                        'action' - URL to visit when single clicking the node
132
     *                        'iconAction' - URL to visit when single clicking the icon node
133
     *                        'branch' - URL for child nodes (tree JSON)
134
     *                        'expand' - the action to return JSON for the subtree
135
     *                        'nodata' - message to display when node has no children
136
     * @param bool  $print    either to return or echo the result
137
     *
138
     * @return array<int|string, array<string, mixed>|bool|string> the json rendered tree
139
     */
140
    private function printTreeJSON(&$treedata, &$attrs, $print = true)
141
    {
142
        $parent = [];
143
144
        if (isset($attrs['is_root'])) {
145
            $parent = [
146
                'id' => 'root',
147
                'children' => true,
148
                'icon' => \containerInstance()->subFolder . '/assets/images/themes/default/Servers.png',
149
                'state' => ['opened' => true],
150
                'a_attr' => ['href' => \str_replace('//', '/', \containerInstance()->subFolder . '/src/views/servers')],
151
                'url' => \str_replace('//', '/', \containerInstance()->subFolder . '/src/views/servers?action=tree'),
152
                'text' => 'Servers',
153
            ];
154
        } elseif (0 < \count($treedata)) {
155
            foreach ($treedata as $rec) {
156
                $icon = $this->view->icon(Decorator::get_sanitized_value($attrs['icon'], $rec));
157
158
                if (!empty($attrs['openicon'])) {
159
                    $icon = $this->view->icon(Decorator::get_sanitized_value($attrs['openIcon'], $rec));
160
                }
161
162
                $tree = [
163
                    'text' => Decorator::get_sanitized_value($attrs['text'], $rec),
164
                    'id' => \sha1(Decorator::get_sanitized_value($attrs['action'], $rec)),
165
                    'icon' => Decorator::get_sanitized_value($icon, $rec),
166
                    'iconaction' => Decorator::get_sanitized_value($attrs['iconAction'], $rec),
167
                    'openicon' => Decorator::get_sanitized_value($icon, $rec),
168
                    'tooltip' => Decorator::get_sanitized_value($attrs['toolTip'], $rec),
169
                    'a_attr' => ['href' => Decorator::get_sanitized_value($attrs['action'], $rec)],
170
                    'children' => false,
171
                ];
172
                $url = Decorator::get_sanitized_value($attrs['branch'], $rec);
173
174
                if ($url && false === \mb_strpos($url, '/src/views')) {
175
                    $url = \str_replace('//', '/', \containerInstance()->subFolder . '/src/views/' . $url);
176
                }
177
178
                if ($url) {
179
                    $tree['url'] = $url;
180
                    $tree['children'] = true;
181
                }
182
183
                //$tree['text'] = '<a href="' . $tree['id'] . '" target="detail">' . $tree['text'] . '</a>';
184
185
                $parent[] = $tree;
186
            }
187
        } else {
188
            $parent = ['children' => false];
189
        }
190
191
        if (true === $print) {
192
            if (isset($_REQUEST['children'])) {
193
                $children = $parent;
194
                $parent = ['children' => $children];
195
            }
196
197
            return $this
198
                ->container
199
                ->response
200
                ->withStatus(200)
201
                ->withJson($parent);
202
        }
203
204
        return $parent;
205
    }
206
}
207