PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.3.1
GiveWP – Donation Plugin and Fundraising Platform v2.3.1
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / shortcodes / abstract-shortcode-generator.php
give / includes / admin / shortcodes Last commit date
abstract-shortcode-generator.php 7 years ago admin-shortcodes.js 7 years ago class-shortcode-button.php 7 years ago mce-plugin.js 8 years ago shortcode-give-donation-grid.php 7 years ago shortcode-give-donation-history.php 7 years ago shortcode-give-donor-wall.php 7 years ago shortcode-give-form.php 7 years ago shortcode-give-goal.php 7 years ago shortcode-give-login.php 7 years ago shortcode-give-profile-editor.php 7 years ago shortcode-give-receipt.php 7 years ago shortcode-give-register.php 7 years ago shortcode-give-totals.php 7 years ago
abstract-shortcode-generator.php
425 lines
1 <?php
2 /**
3 * Shortcode Dialog Generator abstract class
4 *
5 * @package Give/Admin
6 * @author Paul Ryley
7 * @copyright Copyright (c) 2016, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @version 1.0
10 * @since 1.3
11 */
12
13 // Exit if accessed directly.
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 /**
19 * Class Give_Shortcode_Generator
20 */
21 abstract class Give_Shortcode_Generator {
22
23 /**
24 * The current class name
25 *
26 * @since 1.0
27 */
28 public $self;
29
30 /**
31 * The current shortcode
32 *
33 * @since 1.0
34 */
35 public $shortcode;
36
37 /**
38 * The current shortcode tag
39 *
40 * @since 1.0
41 */
42 public $shortcode_tag;
43
44 /**
45 * Shortcode field errors
46 *
47 * @since 1.0
48 */
49 protected $errors;
50
51 /**
52 * Required shortcode fields
53 *
54 * @since 1.0
55 */
56 protected $required;
57
58 /**
59 * Class constructor
60 *
61 * @param string $shortcode The shortcode tag
62 *
63 * @since 1.0
64 */
65 public function __construct( $shortcode ) {
66
67 $this->shortcode_tag = $shortcode;
68
69 add_action( 'admin_init', array( $this, 'init' ) );
70
71 }
72
73 /**
74 * Kick things off for the shortcode generator
75 *
76 * @since 1.3.0.2
77 */
78 public function init() {
79
80 if ( $this->shortcode_tag ) {
81
82 $this->self = get_class( $this );
83
84 $this->errors = array();
85 $this->required = array();
86
87 // Generate the fields, errors, and requirements
88 $fields = $this->get_fields();
89
90 $defaults = array(
91 'btn_close' => esc_html__( 'Close', 'give' ),
92 'btn_okay' => esc_html__( 'Insert Shortcode', 'give' ),
93 'errors' => $this->errors,
94 'fields' => $fields,
95 'label' => '[' . $this->shortcode_tag . ']',
96 'required' => $this->required,
97 'title' => esc_html__( 'Insert Shortcode', 'give' ),
98 );
99
100 if ( user_can_richedit() ) {
101
102 Give_Shortcode_Button::$shortcodes[ $this->shortcode_tag ] = wp_parse_args( $this->shortcode, $defaults );
103
104 }
105 }
106
107 }
108
109
110 /**
111 * Define the shortcode attribute fields
112 *
113 * @return false|array
114 *
115 * @since 1.0
116 */
117 public function define_fields() {
118
119 return false;
120 }
121
122 /**
123 * Generate the shortcode dialog fields
124 *
125 * @param array $defined_fields
126 *
127 * @return array
128 *
129 * @since 1.0
130 */
131 protected function generate_fields( $defined_fields ) {
132
133 $fields = array();
134
135 if ( is_array( $defined_fields ) ) {
136
137 foreach ( $defined_fields as $field ) {
138
139 $defaults = array(
140 'label' => false,
141 'name' => false,
142 'options' => array(),
143 'placeholder' => false,
144 'tooltip' => false,
145 'type' => '',
146 );
147
148 $field = wp_parse_args( (array) $field, $defaults );
149 $method = 'generate_' . strtolower( $field['type'] );
150
151 if ( method_exists( $this, $method ) ) {
152
153 $field = call_user_func( array( $this, $method ), $field );
154
155 if ( $field ) {
156 $fields[] = $field;
157 }
158 }
159 }
160 }
161
162 return $fields;
163 }
164
165 /**
166 * Get the generated shortcode dialog fields
167 *
168 * @return array
169 *
170 * @since 1.0
171 */
172 protected function get_fields() {
173
174 $defined_fields = $this->define_fields();
175 $generated_fields = $this->generate_fields( $defined_fields );
176
177 $errors = array();
178
179 if ( ! empty( $this->errors ) ) {
180 foreach ( $this->required as $name => $alert ) {
181 // Using WordPress function in place of array_column wp_list_pluck as it support older version as well.
182 if ( false === array_search( $name, give_list_pluck( $generated_fields, 'name' ) ) ) {
183
184 $errors[] = $this->errors[ $name ];
185 }
186 }
187
188 $this->errors = $errors;
189 }
190
191 if ( ! empty( $errors ) ) {
192
193 return $errors;
194 }
195
196 return $generated_fields;
197 }
198
199 /**
200 * Generate a TinyMCE container field
201 *
202 * @param array $field
203 *
204 * @return array|false
205 *
206 * @since 1.0
207 */
208 protected function generate_container( $field ) {
209
210 if ( array_key_exists( 'html', $field ) ) {
211
212 return array(
213 'type' => $field['type'],
214 'html' => $field['html'],
215 );
216 }
217
218 return false;
219 }
220
221 /**
222 * Generate a TinyMCE listbox field
223 *
224 * @param array $field
225 *
226 * @return array|false
227 *
228 * @since 1.0
229 */
230 protected function generate_listbox( $field ) {
231
232 $listbox = shortcode_atts( array(
233 'label' => '',
234 'minWidth' => '',
235 'name' => false,
236 'tooltip' => '',
237 'type' => '',
238 'value' => '',
239 'classes' => ''
240 ), $field );
241
242 if ( $this->validate( $field ) ) {
243
244 $new_listbox = array();
245
246 foreach ( $listbox as $key => $value ) {
247
248 if ( $key == 'value' && empty( $value ) ) {
249 $new_listbox[ $key ] = $listbox['name'];
250 } else if ( $value ) {
251 $new_listbox[ $key ] = $value;
252 }
253 }
254
255 // do not reindex array!
256 $field['options'] = array(
257 '' => ( $field['placeholder'] ? $field['placeholder'] : esc_attr__( '- Select -', 'give' ) ),
258 ) + $field['options'];
259
260 foreach ( $field['options'] as $value => $text ) {
261 $new_listbox['values'][] = array(
262 'text' => $text,
263 'value' => $value,
264 );
265 }
266
267 return $new_listbox;
268 }
269
270 return false;
271 }
272
273 /**
274 * Generate a TinyMCE listbox field for a post_type.
275 *
276 * @param array $field
277 *
278 * @return array|false
279 *
280 * @since 1.0
281 */
282 protected function generate_post( $field ) {
283
284 $args = array(
285 'post_type' => 'post',
286 'orderby' => 'title',
287 'order' => 'ASC',
288 'posts_per_page' => 30,
289 'suppress_filters' => false,
290 );
291
292 $args = wp_parse_args( (array) $field['query_args'], $args );
293
294 $posts = get_posts( $args );
295 $options = array();
296
297 if ( ! empty( $posts ) ) {
298 foreach ( $posts as $post ) {
299 $options[ absint( $post->ID ) ] = empty( $post->post_title )
300 ? sprintf( __( 'Untitled (#%s)', 'give' ), $post->ID )
301 /** This filter is documented in wp-includes/post-template.php */
302 : apply_filters( 'the_title', $post->post_title, $post->ID );
303 }
304
305 $field['type'] = 'listbox';
306 $field['options'] = $options;
307
308 return $this->generate_listbox( $field );
309 }
310
311 // perform validation here before returning false
312 $this->validate( $field );
313
314 return false;
315 }
316
317 /**
318 * Generate a TinyMCE textbox field
319 *
320 * @param array $field
321 *
322 * @return array|false
323 *
324 * @since 1.0
325 */
326 protected function generate_textbox( $field ) {
327
328 $textbox = shortcode_atts( array(
329 'label' => '',
330 'maxLength' => '',
331 'minHeight' => '',
332 'minWidth' => '',
333 'multiline' => false,
334 'name' => false,
335 'tooltip' => '',
336 'type' => '',
337 'value' => '',
338 'classes' => '',
339 'placeholder' => ''
340 ), $field );
341
342 // Remove empty placeholder.
343 if( empty( $textbox['placeholder'] ) ) {
344 unset( $textbox['placeholder'] );
345 }
346
347 if ( $this->validate( $field ) ) {
348 return array_filter( $textbox, array( $this, 'return_textbox_value' ) );
349 }
350
351 return false;
352 }
353
354 /**
355 * Validate Textbox Value
356 *
357 * @param $value
358 *
359 * @return bool
360 */
361 function return_textbox_value( $value ) {
362 return $value !== '';
363 }
364
365 /**
366 * Perform validation for a single field
367 *
368 * Returns true or false depending on whether the field has a 'name' attribute.
369 * This method also populates the shortcode's $errors and $required arrays.
370 *
371 * @param array $field
372 *
373 * @return bool
374 *
375 * @since 1.0
376 */
377 protected function validate( $field ) {
378
379 extract( shortcode_atts(
380 array(
381 'name' => false,
382 'required' => false,
383 'label' => '',
384 ), $field )
385 );
386
387 if ( $name ) {
388
389 if ( isset( $required['error'] ) ) {
390
391 $error = array(
392 'type' => 'container',
393 'html' => $required['error'],
394 );
395
396 $this->errors[ $name ] = $this->generate_container( $error );
397 }
398
399 if ( ! ! $required || is_array( $required ) ) {
400
401 $alert = esc_html__( 'Some of the shortcode options are required.', 'give' );
402
403 if ( isset( $required['alert'] ) ) {
404
405 $alert = $required['alert'];
406
407 } else if ( ! empty( $label ) ) {
408
409 $alert = sprintf(
410 /* translators: %s: option label */
411 esc_html__( 'The "%s" option is required.', 'give' ),
412 str_replace( ':', '', $label )
413 );
414 }
415
416 $this->required[ $name ] = $alert;
417 }
418
419 return true;
420 }
421
422 return false;
423 }
424 }
425