PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.10.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.10.1
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / classes / WpMatomo / Admin / TrackingSettings / Forms.php
matomo / classes / WpMatomo / Admin / TrackingSettings Last commit date
Forms.php 2 months ago
Forms.php
272 lines
1 <?php
2 /**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 * @package matomo
8 * Code Based on
9 * @author Andr&eacute; Br&auml;kling
10 * https://github.com/braekling/matomo
11 *
12 */
13
14 namespace WpMatomo\Admin\TrackingSettings;
15
16 use Piwik\Config;
17 use WpMatomo;
18 use WpMatomo\Admin\TrackingSettings;
19 use WpMatomo\Bootstrap;
20 use WpMatomo\Settings;
21
22 if ( ! defined( 'ABSPATH' ) ) {
23 exit; // if accessed directly
24 }
25
26 /**
27 * phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
28 */
29 class Forms {
30 /**
31 * @var Settings
32 */
33 private $settings;
34
35 public function __construct( $settings ) {
36 $this->settings = $settings;
37 }
38
39 /**
40 * Show an option's description
41 *
42 * @param string $id option id
43 * @param string $description option description
44 * @param boolean $hide_description set to false to show description initially (default: false)
45 *
46 * @return string full description HTML
47 */
48 public function get_description( $id, $description, $hide_description = false ) {
49 return sprintf( '<p class="description' . ( $hide_description ? ' hidden' : '' ) . '" id="%1$s-desc">%2$s</p>', esc_attr( $id ), $description );
50 }
51
52 /**
53 * Show a checkbox option
54 *
55 * @param string $id option id
56 * @param string $name descriptive option name
57 * @param string $description option description
58 * @param boolean $is_hidden set to true to initially hide the option (default: false)
59 * @param string $group_name define a class name to access a group of option rows by javascript (default: empty)
60 * @param boolean $hide_description $hideDescription set to false to show description initially (default: true)
61 * @param string $on_change javascript for onchange event (default: empty)
62 * @param boolean $is_global whether the option is global or blog specific
63 */
64 public function show_checkbox( $id, $name, $description, $is_hidden = false, $group_name = '', $hide_description = false, $on_change = '', $is_global = true ) {
65 $value = $is_global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
66
67 printf(
68 '<tr id="' . esc_attr( $id ) . '-field" class="' . esc_attr( $group_name ) . ( $is_hidden ? ' hidden' : '' ) . '">'
69 . '<th scope="row"><label for="%2$s">%s:</label></th>'
70 . '<td>'
71 . '<label class="matomo-toggle">'
72 . '<input type="checkbox" value="1"' . ( $value ? ' checked="checked"' : '' ) . ' onchange="jQuery(\'#%s\').val(this.checked?1:0);%s" />'
73 . '<span class="slider"></span>'
74 . '</label>'
75 . '<input id="%2$s" type="hidden" name="' . esc_attr( TrackingSettings::FORM_NAME ) . '[%2$s]" value="' . (int) $this->settings->get_global_option( $id ) . '" /> %s'
76 . '</td>'
77 . '</tr>',
78 esc_html( $name ),
79 esc_attr( $id ),
80 $on_change,
81 $this->get_description( $id, $description, $hide_description )
82 );
83 }
84
85 /**
86 * Show a textarea option
87 *
88 * @param string $id option id
89 * @param string $name descriptive option name
90 * @param int $rows number of rows to show
91 * @param string $description option description
92 * @param boolean $is_hidden set to true to initially hide the option (default: false)
93 * @param string $group_name define a class name to access a group of option rows by javascript (default: empty)
94 * @param boolean $hide_description $hideDescription set to false to show description initially (default: false)
95 * @param string $on_change javascript for onchange event (default: empty)
96 * @param boolean $is_readonly set textarea to read only (default: false)
97 * @param boolean $global set to false if the textarea shows a site-specific option (default: true)
98 */
99 public function show_textarea( $id, $name, $rows, $description, $is_hidden, $group_name, $hide_description = false, $on_change = '', $is_readonly = false, $global = true, $exclude_name = false ) {
100 $value = $global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
101 $value = $value ? $value : '';
102
103 printf(
104 '<tr id="' . esc_attr( $id ) . '-field" class="' . esc_attr( $group_name ) . ( $is_hidden ? ' hidden' : '' ) . '"><th scope="row"><label for="%2$s">%s:</label></th><td><textarea cols="80" rows="' . esc_attr( $rows ) . '" id="%s" ' . ( $exclude_name ? '' : 'name="' . esc_attr( TrackingSettings::FORM_NAME ) . '[%2$s]' ) . '" onchange="%s" spellcheck="false"' . ( $is_readonly ? ' readonly="readonly"' : '' ) . '>%s</textarea> %s</td></tr>',
105 esc_html( $name ),
106 esc_attr( $id ),
107 $on_change,
108 esc_textarea( $value ),
109 $this->get_description( $id, $description, $hide_description )
110 );
111 }
112
113 /**
114 * Show a simple text
115 *
116 * @param string $text Text to show
117 */
118 public function show_text( $text, $group_name = '' ) {
119 printf( '<tr class="%s"><td colspan="2"><p>%s</p></td></tr>', esc_attr( $group_name ), esc_html( $text ) );
120 }
121
122 /**
123 * Show a simple text
124 *
125 * @param string $text Text to show
126 */
127 public function show_headline( $text, $group_name = '' ) {
128 printf( '<tr class="%s"><td colspan="2"><h3>%s</h3></td></tr>', esc_attr( $group_name ), esc_html( $text ) );
129 }
130
131 /**
132 * Show an input option
133 *
134 * @param string $id option id
135 * @param string $name descriptive option name
136 * @param string $description option description
137 * @param boolean $is_hidden set to true to initially hide the option (default: false)
138 * @param string $group_name define a class name to access a group of option rows by javascript (default: empty)
139 * @param string $row_name define a class name to access the specific option row by javascript (default: empty)
140 * @param boolean $hide_description $hideDescription set to false to show description initially (default: false)
141 * @param boolean $wide Create a wide box (default: false)
142 */
143 public function show_input( $id, $name, $description, $is_hidden = false, $group_name = '', $row_name = false, $hide_description = false, $wide = false ) {
144 printf( '<tr id="' . esc_attr( $id ) . '-field" class="%s%s"%s><th scope="row"><label for="%5$s">%s:</label></th><td><input ' . ( $wide ? 'class="matomo-wide" ' : '' ) . 'name="' . esc_attr( TrackingSettings::FORM_NAME ) . '[%s]" id="%5$s" value="%s" /> %s</td></tr>', $is_hidden ? 'hidden ' : '', $group_name ? $group_name : '', $row_name ? ' id="' . $group_name . '-' . $row_name . '"' : '', esc_html( $name ), esc_attr( $id ), htmlentities( $this->settings->get_global_option( $id ), ENT_QUOTES, 'UTF-8', false ), ! empty( $description ) ? $this->get_description( $id, $description, $hide_description ) : '' );
145 }
146
147 /**
148 * Show a select box option
149 *
150 * @param string $id option id
151 * @param string $name descriptive option name
152 * @param array $options list of options to show array[](option id => descriptive name)
153 * @param string $description option description
154 * @param string $on_change javascript for onchange event (default: empty)
155 * @param boolean $is_hidden set to true to initially hide the option (default: false)
156 * @param string $group_name define a class name to access a group of option rows by javascript (default: empty)
157 * @param boolean $hide_description $hideDescription set to false to show description initially (default: false)
158 * @param boolean $global set to false if the textarea shows a site-specific option (default: true)
159 */
160 public function show_select( $id, $name, $options = [], $description = '', $on_change = '', $is_hidden = false, $group_name = '', $hide_description = false, $global = true ) {
161 $options_list = '';
162
163 if ( 'tracker_debug' === $id && ! WpMatomo::is_safe_mode() && ! $this->settings->is_network_enabled() ) {
164 Bootstrap::do_bootstrap();
165 if ( Config::getInstance()->Tracker['debug'] ) {
166 $default = 'always';
167 } elseif ( Config::getInstance()->Tracker['debug_on_demand'] ) {
168 $default = 'on_demand';
169 } else {
170 $default = 'disabled';
171 }
172 } else {
173 $default = $global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
174 }
175 if ( is_array( $options ) ) {
176 foreach ( $options as $key => $value ) {
177 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
178 $options_list .= sprintf( '<option value="%s"' . ( $key == $default ? ' selected="selected"' : '' ) . '>%s</option>', esc_attr( $key ), esc_html( $value ) );
179 }
180 }
181 $script_change = '';
182 if ( $on_change ) {
183 // we make sure it will select the right settings by default
184 $script_change .= '<script type="text/javascript">setTimeout(function () { jQuery("#' . esc_js( $id ) . '").change(); }, 800);</script>';
185 }
186 printf( '<tr id="' . esc_attr( $id ) . '-field" class="' . esc_attr( $group_name ) . ( $is_hidden ? ' hidden' : '' ) . '"><th scope="row"><label for="%3$s">%s:%s</label></th><td><select name="' . esc_attr( TrackingSettings::FORM_NAME ) . '[%s]" id="%3$s" onchange="%s">%s</select> %s</td></tr>', esc_html( $name ), $script_change, esc_attr( $id ), $on_change, $options_list, $this->get_description( $id, $description, $hide_description ) );
187 }
188
189 /**
190 * Show a set of radio buttons
191 *
192 * @param string $id option id
193 * @param string $name descriptive option name
194 * @param array $options list of options to show array[](option id => descriptive name)
195 * @param string|string[] $description option description
196 * @param string $on_change javascript for onchange event (default: empty)
197 * @param boolean $is_hidden set to true to initially hide the option (default: false)
198 * @param string $group_name define a class name to access a group of option rows by javascript (default: empty)
199 * @param boolean $hide_description $hideDescription set to false to show description initially (default: false)
200 * @param boolean $global set to false if the textarea shows a site-specific option (default: true)
201 */
202 public function show_radio( $id, $name, $options = [], $description = '', $on_change = '', $is_hidden = false, $group_name = '', $hide_description = false, $global = true ) {
203 $button_list = [];
204
205 $default = $global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
206 if ( is_array( $options ) ) {
207 foreach ( $options as $key => $info ) {
208 $label = $info;
209 $disabled = false;
210 $tooltip = null;
211
212 if ( is_array( $info ) ) {
213 $disabled = $info['disabled'];
214 $tooltip = isset( $info['tooltip'] ) ? $info['tooltip'] : null;
215 $label = $info['name'];
216 }
217
218 $radio_id = esc_attr( $id . '_' . $key );
219
220 $desc = '';
221 if ( is_array( $description ) && isset( $description[ $key ] ) ) {
222 $margin_bottom = array_key_last( $options ) === $key ? '' : 'margin-bottom:1em;';
223 $desc = '<p class="description" style="' . $margin_bottom . 'margin-left:1.5em;">' . $description[ $key ] . '</p>';
224 }
225
226 $button_list[] = sprintf(
227 '<span%s><input type="radio" id="%s" name="%s" value="%s" %s %s onchange="%s" />'
228 . '<label for="%s" style="vertical-align:baseline;font-weight:bold;">%s</label></span>'
229 . $desc,
230 ( $tooltip ? ' title="' . esc_attr( $tooltip ) . '"' : '' ),
231 $radio_id,
232 esc_attr( TrackingSettings::FORM_NAME ) . '[' . esc_attr( $id ) . ']',
233 esc_attr( $key ),
234 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
235 ( $key == $default ? 'checked="checked"' : '' ),
236 ( $disabled ? 'disabled="disabled"' : '' ),
237 esc_attr( $on_change ),
238 $radio_id,
239 esc_html( $label )
240 );
241 }
242 }
243 $script_change = '';
244 if ( $on_change ) {
245 // we make sure it will select the right settings by default
246 $script_change .= '<script type="text/javascript">setTimeout(function () { jQuery("#' . esc_js( $id ) . '").change(); }, 800);</script>';
247 }
248 printf(
249 '<tr id="' . esc_attr( $id ) . '-field" class="' . esc_attr( $group_name ) . ( $is_hidden ? ' hidden' : '' ) . '">'
250 . '<th scope="row"><label>%s:%s</label></th>'
251 . '<td><div id="%s" style="display:inline-block">%s</div> %s</td>'
252 . '</tr>',
253 esc_html( $name ),
254 $script_change,
255 esc_attr( $id ),
256 implode( is_array( $description ) ? '' : '<br/>', $button_list ),
257 is_array( $description ) ? '' : $this->get_description( $id, $description, $hide_description )
258 );
259 }
260
261 /**
262 * Show an info box
263 *
264 * @param string $type box style (e.g., updated, error)
265 * @param string $icon box icon, see https://developer.wordpress.org/resource/dashicons/
266 * @param string $content box message
267 */
268 public function show_box( $type, $icon, $content ) {
269 printf( '<tr><td colspan="2"><div class="%s"><p><span class="dashicons dashicons-%s"></span> %s</p></div></td></tr>', esc_attr( $type ), esc_attr( $icon ), esc_html( $content ) );
270 }
271 }
272