Passed
Push — master ( ea4f63...197c27 )
by Paul
20:35 queued 09:52
created

MenuController::renderToolsMenu()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 26
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 20
c 0
b 0
f 0
dl 0
loc 26
ccs 0
cts 19
cp 0
rs 9.6
cc 2
nc 2
nop 0
crap 6
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Controllers;
4
5
use GeminiLabs\SiteReviews\Database\SqlSchema;
6
use GeminiLabs\SiteReviews\Helper;
7
use GeminiLabs\SiteReviews\Helpers\Arr;
8
use GeminiLabs\SiteReviews\Helpers\Str;
9
use GeminiLabs\SiteReviews\Modules\Console;
10
use GeminiLabs\SiteReviews\Modules\Html\Builder;
11
use GeminiLabs\SiteReviews\Modules\Html\Settings;
12
use GeminiLabs\SiteReviews\Modules\Html\Template;
13
use GeminiLabs\SiteReviews\Modules\Notice;
14
use GeminiLabs\SiteReviews\Modules\SystemInfo;
15
16
class MenuController extends Controller
17
{
18
    /**
19
     * @return void
20
     * @action admin_menu
21
     */
22
    public function registerMenuCount()
23
    {
24
        global $menu, $typenow;
25
        foreach ($menu as $key => $value) {
26
            if (!isset($value[2]) || $value[2] != 'edit.php?post_type='.glsr()->post_type) {
27
                continue;
28
            }
29
            $postCount = wp_count_posts(glsr()->post_type);
30
            $pendingCount = glsr(Builder::class)->span(number_format_i18n($postCount->pending), [
31
                'class' => 'unapproved-count',
32
            ]);
33
            $awaitingModeration = glsr(Builder::class)->span($pendingCount, [
34
                'class' => 'awaiting-mod count-'.$postCount->pending,
35
            ]);
36
            $menu[$key][0] .= ' '.$awaitingModeration;
37
            if (glsr()->post_type === $typenow) {
38
                $menu[$key][4] .= ' current';
39
            }
40
            break;
41
        }
42
    }
43
44
    /**
45
     * @return void
46
     * @action admin_menu
47
     */
48
    public function registerSubMenus()
49
    {
50
        $pages = $this->parseWithFilter('submenu/pages', [
51
            'settings' => _x('Settings', 'admin-text', 'site-reviews'),
52
            'tools' => _x('Tools', 'admin-text', 'site-reviews'),
53
            'addons' => _x('Add-ons', 'admin-text', 'site-reviews'),
54
            'documentation' => _x('Help', 'admin-text', 'site-reviews'),
55
        ]);
56
        foreach ($pages as $slug => $title) {
57
            $method = Helper::buildMethodName('render-'.$slug.'-menu');
58
            if (!method_exists($this, $method)) {
59
                continue;
60
            }
61
            $callback = glsr()->filter('addon/submenu/callback', [$this, $method], $slug);
62
            if (!is_callable($callback)) {
63
                continue;
64
            }
65
            add_submenu_page('edit.php?post_type='.glsr()->post_type, $title, $title, glsr()->getPermission($slug), Str::dashCase(glsr()->prefix).$slug, $callback);
66
        }
67
    }
68
69
    /**
70
     * @return void
71
     * @action admin_menu
72
     */
73
    public function removeSubMenus()
74
    {
75
        global $submenu;
76
        $menuKey = 'edit.php?post_type='.glsr()->post_type;
77
        if (!isset($submenu[$menuKey])) {
78
            return;
79
        }
80
        $submenuKey = 'post-new.php?post_type='.glsr()->post_type;
81
        $index = array_search($submenuKey, wp_list_pluck($submenu[$menuKey], 2));
82
        if (false !== $index) {
83
            unset($submenu[$menuKey][$index]);
84
        }
85
    }
86
87
    /**
88
     * @return void
89
     * @see $this->registerSubMenus()
90
     * @callback add_submenu_page
91
     */
92
    public function renderAddonsMenu()
93
    {
94
        $this->renderPage('addons', [
95
            'template' => glsr(Template::class),
96
        ]);
97
    }
98
99
    /**
100
     * @return void
101
     * @see $this->registerSubMenus()
102
     * @callback add_submenu_page
103
     */
104
    public function renderDocumentationMenu()
105
    {
106
        $tabs = $this->parseWithFilter('documentation/tabs', [
107
            'support' => _x('Support', 'admin-text', 'site-reviews'),
108
            'faq' => _x('FAQ', 'admin-text', 'site-reviews'),
109
            'shortcodes' => _x('Shortcodes', 'admin-text', 'site-reviews'),
110
            'hooks' => _x('Hooks', 'admin-text', 'site-reviews'),
111
            'functions' => _x('Functions', 'admin-text', 'site-reviews'),
112
            'api' => _x('API', 'admin-text', 'site-reviews'),
113
            'addons' => _x('Addons', 'admin-text', 'site-reviews'),
114
        ]);
115
        $addons = glsr()->filterArray('addon/documentation', []);
116
        uksort($addons, function ($a, $b) {
117
            return strnatcasecmp(glsr($a)->name, glsr($b)->name);
118
        });
119
        if (empty($addons)) {
120
            unset($tabs['addons']);
121
        }
122
        $this->renderPage('documentation', [
123
            'addons' => $addons,
124
            'tabs' => $tabs,
125
        ]);
126
    }
127
128
    /**
129
     * @return void
130
     * @see $this->registerSubMenus()
131
     * @callback add_submenu_page
132
     */
133
    public function renderSettingsMenu()
134
    {
135
        $tabs = $this->parseWithFilter('settings/tabs', [
136
            'general' => _x('General', 'admin-text', 'site-reviews'),
137
            'reviews' => _x('Reviews', 'admin-text', 'site-reviews'),
138
            'submissions' => _x('Submissions', 'admin-text', 'site-reviews'),
139
            'schema' => _x('Schema', 'admin-text', 'site-reviews'),
140
            'translations' => _x('Strings', 'admin-text', 'site-reviews'),
141
            'addons' => _x('Addons', 'admin-text', 'site-reviews'),
142
            'licenses' => _x('Licenses', 'admin-text', 'site-reviews'),
143
        ]);
144
        if (empty(Arr::get(glsr()->defaults, 'settings.addons'))) {
145
            unset($tabs['addons']);
146
        }
147
        if (empty(Arr::get(glsr()->defaults, 'settings.licenses'))) {
148
            unset($tabs['licenses']);
149
        }
150
        $this->renderPage('settings', [
151
            'settings' => glsr(Settings::class),
152
            'tabs' => $tabs,
153
        ]);
154
    }
155
156
    /**
157
     * @return void
158
     * @see $this->registerSubMenus()
159
     * @callback add_submenu_page
160
     */
161
    public function renderToolsMenu()
162
    {
163
        $tabs = $this->parseWithFilter('tools/tabs', [
164
            'general' => _x('General', 'admin-text', 'site-reviews'),
165
            'scheduled' => _x('Scheduled Actions', 'admin-text', 'site-reviews'),
166
            'sync' => _x('Sync Reviews', 'admin-text', 'site-reviews'),
167
            'console' => _x('Console', 'admin-text', 'site-reviews'),
168
            'system-info' => _x('System Info', 'admin-text', 'site-reviews'),
169
        ]);
170
        if (!glsr()->filterBool('addon/sync/enable', false)) {
171
            unset($tabs['sync']);
172
        }
173
        $this->renderPage('tools', [
174
            'data' => [
175
                'console_level' => glsr(Console::class)->getLevel(),
176
                'context' => [
177
                    'base_url' => glsr_admin_url(),
178
                    'console' => glsr(Console::class)->get(),
179
                    'id' => glsr()->id,
180
                    'system' => glsr(SystemInfo::class)->get(),
181
                ],
182
                'myisam_tables' => Arr::get(glsr(SqlSchema::class)->tableEngines(), 'MyISAM', []),
183
                'services' => glsr()->filterArray('addon/sync/services', []),
184
            ],
185
            'tabs' => $tabs,
186
            'template' => glsr(Template::class),
187
        ]);
188
    }
189
190
    /**
191
     * @return void
192
     * @action admin_init
193
     */
194 7
    public function setCustomPermissions()
195
    {
196 7
        foreach (wp_roles()->roles as $role => $value) {
197 7
            wp_roles()->remove_cap($role, 'create_'.glsr()->post_type);
198
        }
199 7
    }
200
201
    /**
202
     * @return string
203
     */
204
    protected function getNotices()
205
    {
206
        return glsr(Builder::class)->div(glsr(Notice::class)->get(), [
207
            'id' => 'glsr-notices',
208
        ]);
209
    }
210
211
    /**
212
     * @param string $hookSuffix
213
     * @return array
214
     */
215
    protected function parseWithFilter($hookSuffix, array $args = [])
216
    {
217
        if (Str::endsWith('/tabs', $hookSuffix)) {
218
            $page = str_replace('/tabs', '', $hookSuffix);
219
            foreach ($args as $tab => $title) {
220
                if (!glsr()->hasPermission($page, $tab)) {
221
                    unset($args[$tab]);
222
                }
223
            }
224
        }
225
        return glsr()->filterArray('addon/'.$hookSuffix, $args);
226
    }
227
228
    /**
229
     * @param string $page
230
     * @return void
231
     */
232
    protected function renderPage($page, array $data = [])
233
    {
234
        $data['http_referer'] = (string) wp_get_referer();
235
        $data['notices'] = $this->getNotices();
236
        glsr()->render('pages/'.$page.'/index', $data);
237
    }
238
}
239