Passed
Push — develop ( f6f5f6...710bfb )
by Paul
14:13
created

SiteReviewsFormShortcode   A

Complexity

Total Complexity 27

Size/Duplication

Total Lines 208
Duplicated Lines 0 %

Test Coverage

Coverage 9.35%

Importance

Changes 0
Metric Value
wmc 27
eloc 109
c 0
b 0
f 0
dl 0
loc 208
ccs 13
cts 139
cp 0.0935
rs 10

15 Methods

Rating   Name   Duplication   Size   Complexity  
A buildTemplate() 0 9 3
A description() 0 3 1
A filterRegisterUrl() 0 6 2
A loginUrl() 0 6 1
A loginOrRegister() 0 11 3
A loginLink() 0 5 1
A hideOptions() 0 9 1
A registerUrl() 0 9 2
A config() 0 52 1
A filterLoginUrl() 0 12 4
A debug() 0 13 3
A registerLink() 0 9 2
A normalizeAssignedPosts() 0 6 1
A enqueue() 0 3 1
A name() 0 3 1
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Shortcodes;
4
5
use GeminiLabs\SiteReviews\Modules\Html\Builder;
6
use GeminiLabs\SiteReviews\Modules\Html\ReviewForm;
7
use GeminiLabs\SiteReviews\Modules\Html\Template;
8
9
class SiteReviewsFormShortcode extends Shortcode
10
{
11
    public function buildTemplate(): string
12
    {
13
        if (!is_user_logged_in() && glsr_get_option('general.require.login', false, 'bool')) {
14
            $this->debug();
15
            return $this->loginOrRegister();
16
        }
17
        $form = new ReviewForm($this->args);
18
        $this->debug(compact('form'));
19
        return $form->build();
20
    }
21
22 8
    public function description(): string
23
    {
24 8
        return esc_html_x('Display a review form', 'admin-text', 'site-reviews');
25
    }
26
27
    public function enqueue(): void
28
    {
29
        wp_enqueue_style('site-reviews-form-style');
30
    }
31
32
    /**
33
     * @param string $url
34
     * @param string $redirect
35
     * @param bool   $forceReauth
36
     *
37
     * @filter login_url
38
     */
39
    public function filterLoginUrl($url, $redirect, $forceReauth): string
40
    {
41
        if ($loginUrl = glsr_get_option('general.require.login_url')) {
42
            if (!empty($redirect)) {
43
                $loginUrl = add_query_arg('redirect_to', urlencode($redirect), $loginUrl);
44
            }
45
            if ($forceReauth) {
46
                $loginUrl = add_query_arg('reauth', '1', $loginUrl);
47
            }
48
            return $loginUrl;
49
        }
50
        return $url;
51
    }
52
53
    /**
54
     * @param string $url
55
     *
56
     * @filter register_url
57
     */
58
    public function filterRegisterUrl($url): string
59
    {
60
        if ($registerUrl = glsr_get_option('general.require.register_url')) {
61
            return $registerUrl;
62
        }
63
        return $url;
64
    }
65
66
    public function loginLink(): string
67
    {
68
        return glsr(Builder::class)->a([
69
            'href' => $this->loginUrl(),
70
            'text' => __('logged in', 'site-reviews'),
71
        ]);
72
    }
73
74
    public function loginOrRegister(): string
75
    {
76
        $loginText = sprintf(__('You must be %s to submit a review.', 'site-reviews'), $this->loginLink());
77
        $registerLink = $this->registerLink();
78
        $registerText = '';
79
        if (glsr_get_option('general.require.register', false, 'bool') && !empty($registerLink)) {
80
            $registerText = sprintf(__('You may also %s for an account.', 'site-reviews'), $registerLink);
81
        }
82
        return glsr(Template::class)->build('templates/login-register', [
83
            'context' => [
84
                'text' => trim("{$loginText} {$registerText}"),
85
            ],
86
        ]);
87
    }
88
89
    public function loginUrl(): string
90
    {
91
        add_filter('login_url', [$this, 'filterLoginUrl'], 20, 3);
92
        $url = wp_login_url(strval(get_permalink()));
93
        remove_filter('login_url', [$this, 'filterLoginUrl'], 20);
94
        return $url;
95
    }
96
97 8
    public function name(): string
98
    {
99 8
        return esc_html_x('Review Form', 'admin-text', 'site-reviews');
100
    }
101
102
    public function registerLink(): string
103
    {
104
        $registerUrl = $this->registerUrl();
105
        if (empty($registerUrl)) {
106
            return '';
107
        }
108
        return glsr(Builder::class)->a([
109
            'href' => $registerUrl,
110
            'text' => __('register', 'site-reviews'),
111
        ]);
112
    }
113
114
    public function registerUrl(): string
115
    {
116
        if (!get_option('users_can_register')) {
117
            return '';
118
        }
119
        add_filter('register_url', [$this, 'filterRegisterUrl'], 20);
120
        $url = wp_registration_url();
121
        remove_filter('register_url', [$this, 'filterRegisterUrl'], 20);
122
        return $url;
123
    }
124
125
    protected function config(): array
126
    {
127
        return [ // order is intentional
128
            'assigned_posts' => [
129
                'group' => 'general',
130
                'label' => esc_html_x('Assign Reviews to Pages', 'admin-text', 'site-reviews'),
131
                'multiple' => true,
132
                'placeholder' => esc_html_x('Select a Page...', 'admin-text', 'site-reviews'),
133
                'type' => 'select',
134
            ],
135
            'assigned_terms' => [
136
                'group' => 'general',
137
                'label' => esc_html_x('Assign Reviews to Categories', 'admin-text', 'site-reviews'),
138
                'multiple' => true,
139
                'placeholder' => esc_html_x('Select a Category...', 'admin-text', 'site-reviews'),
140
                'type' => 'select',
141
            ],
142
            'assigned_users' => [
143
                'group' => 'general',
144
                'label' => esc_html_x('Assign Reviews to Users', 'admin-text', 'site-reviews'),
145
                'multiple' => true,
146
                'placeholder' => esc_html_x('Select a User...', 'admin-text', 'site-reviews'),
147
                'type' => 'select',
148
            ],
149
            'hide' => [
150
                'group' => 'hide',
151
                'options' => $this->options('hide'),
152
                'type' => 'checkbox',
153
            ],
154
            'reviews_id' => [
155
                'description' => esc_html_x('Enter the Custom ID of a Latest Reviews block or shortcode where the review should be displayed after submission.', 'admin-text', 'site-reviews'),
156
                'group' => 'advanced',
157
                'label' => esc_html_x('Latest Reviews ID', 'admin-text', 'site-reviews'),
158
                'type' => 'text',
159
            ],
160
            'summary_id' => [
161
                'description' => esc_html_x('Enter the Custom ID of a Rating Summary block or shortcode where the rating values should be updated after submission.', 'admin-text', 'site-reviews'),
162
                'group' => 'advanced',
163
                'label' => esc_html_x('Rating Summary ID', 'admin-text', 'site-reviews'),
164
                'type' => 'text',
165
            ],
166
            'id' => [
167
                'description' => esc_html_x('This should be a unique value.', 'admin-text', 'site-reviews'),
168
                'group' => 'advanced',
169
                'label' => esc_html_x('Custom ID', 'admin-text', 'site-reviews'),
170
                'type' => 'text',
171
            ],
172
            'class' => [
173
                'description' => esc_html_x('Separate multiple classes with spaces.', 'admin-text', 'site-reviews'),
174
                'group' => 'advanced',
175
                'label' => esc_html_x('Additional CSS classes', 'admin-text', 'site-reviews'),
176
                'type' => 'text',
177
            ],
178
        ];
179
    }
180
181
    protected function debug(array $data = []): void
182
    {
183
        if (!empty($this->args['debug']) && !empty($data['form'])) {
184
            $form = $data['form'];
185
            $data = [
186
                'fields' => [
187
                    'hidden' => $form->hidden(),
188
                    'visible' => $form->visible(),
189
                ],
190
                'session' => $form->session()->toArray(),
191
            ];
192
        }
193
        parent::debug($data);
194
    }
195
196 8
    protected function hideOptions(): array
197
    {
198 8
        return [
199 8
            'rating' => _x('Hide the rating field', 'admin-text', 'site-reviews'),
200 8
            'title' => _x('Hide the title field', 'admin-text', 'site-reviews'),
201 8
            'content' => _x('Hide the review field', 'admin-text', 'site-reviews'),
202 8
            'name' => _x('Hide the name field', 'admin-text', 'site-reviews'),
203 8
            'email' => _x('Hide the email field', 'admin-text', 'site-reviews'),
204 8
            'terms' => _x('Hide the terms field', 'admin-text', 'site-reviews'),
205 8
        ];
206
    }
207
208
    /**
209
     * @param string $value
210
     */
211
    protected function normalizeAssignedPosts($value): string
212
    {
213
        $postIds = parent::normalizeAssignedPosts($value);
214
        $postIds = explode(',', $postIds);
215
        $postIds = array_filter($postIds, 'is_numeric'); // don't use post_types here
216
        return implode(',', $postIds);
217
    }
218
}
219