Test Failed
Push — develop ( c6b569...7a7654 )
by Paul
09:40
created

SiteReviewsFormShortcode   A

Complexity

Total Complexity 26

Size/Duplication

Total Lines 191
Duplicated Lines 0 %

Test Coverage

Coverage 11.25%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 26
eloc 97
dl 0
loc 191
ccs 9
cts 80
cp 0.1125
rs 10
c 3
b 0
f 0

14 Methods

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